综合测试题.docx
Document Details
Uploaded by DecentOpal641
Tags
Full Transcript
第五章 综合测试题 ================= 5.1 综合测试(1) ----------------- **一 、单选题** 1. 与数学公式[\$\\frac{3x\^{n}}{(2x - 1)}\$]{.math.inline}对应的C语言表达式是( )。 2. 设a为整型变量,不能正确表达数学关系10\ 5. 若int a\[\]={1,2,3,4,5,6,7,8,9,10},\*p=a;则值为3的表达式是( )。 6. 设i...
第五章 综合测试题 ================= 5.1 综合测试(1) ----------------- **一 、单选题** 1. 与数学公式[\$\\frac{3x\^{n}}{(2x - 1)}\$]{.math.inline}对应的C语言表达式是( )。 2. 设a为整型变量,不能正确表达数学关系10\ 5. 若int a\[\]={1,2,3,4,5,6,7,8,9,10},\*p=a;则值为3的表达式是( )。 6. 设int(\*ptr)\[10\]; 其中的ptr是( )。 7. 设有定义:double x;则以下正确的输入语句是( )。 8. 字符串常数"xiaoli" 在内存占用的字节数是( )。 9. C程序由函数组成, 关于C 语言函数的说法错误的是( )。 10. 以下调用scanf函数给变量a输入数值的方法是错误的,其原因是( )。 **二、填空题** 1. 2. 3. 4. 5. 6. 7. } 8. **三、阅读程序题** 1. \#include \ 3. (1)string\_to\_list 函数,根据一个字符串创建一个链表,每 一结点存储一个字符。 (2)print\_list 函数,用于输出链表。 (3)concatenate\_list 函数,功能为将两个链表连接在一起。 return 0; **五、程序设计题** 1.有移位编码算法函数,对一个无符号整数的各位数字按如下规则进行编码:0编码为1,1编码为2,...,8编码为9,9编码为0,如果最高位为9则保持其不变,编码后的数据作为返回值。请用流程图描述以上算法。 2.建立一个100人的人口普查信息表,其中包括姓名、年龄、性别、职业及地址,相应结构体类型定义如程序所示。要求在主函数中定义结构体数组,并实现以下指定功能的用户自定义函数: (1)定义read函数,读入普查人员的五项数据。 (2)定义udf\_cmpstr字符串比较函数(注:功能必须由自己具体定义实现,不要直接或间接通过调用库函数)。 (3)定义sort函数,按姓名以递升顺序排序。 (4)定义print 函数,将排序后的普查信息表输出到person\_list 文件长期保存。 (5)定义binarysearch 函数,以二分查找(亦称折半查找)方式实现按姓名查找该人员在人口普查信息表中的位置,若没有找到则返回-1, 表示查找失败。 编写main函数,依次调用以上各功能函数,完成具体应用编程。其中调用binarysearch 函数时,假设查找对象的姓名为"xiaoli" ,返回主函数后即打印输出该人员在信息表中的位置, 若没有找到则提示\"notfound!"信息。 \#include \ 1. 以下选项中,正确的标识符是( )。 2. 若变量c为char类型,能正确判断出c为小写字母的表达式是( )。 A. \'a\'\ 4. 若球体半径定义为:double r;,则求该球体体积的正确表达式为( )。 5. 若有定义:int a=3, b=2, c=1, z;,则表达式z=a\b\c的值为( )。 6. 下列关于return语句的表述中( )是正确的。 7. 若有定义int a\[3\]\[4\];则对a数组元素不正确的引用是( )。 8. 若有:int x,y; scanf(\"x=%d,y=%d\",&x,&y);,则能够使得x和y的值分别为3和4的正确输入方式为( )。 9. C程序中使用条件分支语句if\~else时, else应与( )组成配对关系。 10. 设有定义int k=0; 则以下k值不是1的是( )。 11. 有数组定义和函数fun调用语句int a\[3\]\[4\]; fun(a);,则在函数fun定义时,对形参array的错误定义方式为( )。 12. 以下选项中,操作数必须是整型或字符型的运算符是( )。 13. 关于C语言程序,以下叙述中正确的是( )。 14. 以下程序的运行结果是( ) 15. 若有定义: 则能够正确输入stu中num和name成员的语句是( )。 16. 若有语句int \*point,a=4; point=&a;下面均代表地址的一组选项是( )。 17. 关于break语句和continue语句,以下叙述中正确的是( )。 18. 若有程序如下: 19. 若有定义:char str\[8\]=\"Hello\",\*p=str;,则strlen(p)的值是( )。 20. 已知ch是字符型变量,下面不正确的赋值语句是( )。 21. 以下程序的运行结果是( )。 \#include \ 23. 以下程序的运行结果是( ) A. 1234 B. 4321 C. 10 D. 24 24. 若有程序片段如下: 二、不定项选择题 1.如果打开文件时选用的文件操作方式为\"wb+\",以下说法正确的是( )。 2.关于函数的定义,以下选项中正确的有( )。 3.以下选项中,当指针p为空指针时,其值为真的表达式有( )。 4.以下说法正确的是( )。 5.下列关于结构体类型和结构体变量的说法中,正确的是( )。 6.关于C语言中的switch语句,以下选项中正确的有( )。 三、填空题 1.定义 int a=0, b=0, c=0; 语句 c=2\1?(a=1):(b=2); 执行后,表达式 a+b+c 的值是**[(1)]** 。 2. 有100个数字从小到大排列,若使用二分法进行查找,则最多需要比较**[(2)]** 次。 3. 已知a是一个double型的正数,写出一个赋值表达式,在它执行后a四舍五入保留两位小数**[(3)]** 。(比如a的值原本是12.666666,执行完该表达式后a的值变为12.670000) 4\. 定义 char a\[\]=\"abcdef\"; 则语句printf(\"%s\",a+2); 的结果是**[(4)]** 。 5. 若希望一个函数返回多个不同类型的数值,可以将返回值定义为[**(5)**] 类型。 6\. 程序段: unsigned char x=100, y=200; do { x = x+y, y = x-y, x = x-y; } while (0); printf (\"%d %d\\n\", x, y); 运行后,输出结果应为:[**(6)**] [**(7)**] 。 7\. 程序段:int i,s=0; for (i=1; i\\'z\')) { case 1: **[(6)]** ; break; case 3: **[(7)]** ; break; } printf(\"%c\",c); } 3. 有如下结构体类型,完成函数,实现用冒泡法按score降序对结构体数组r的元素进行排序。 struct student { char name\[20\]; double score; }; void BubbleSort(struct student r\[\],int n) { //冒泡法排序 int i,j; **[(8)]** ; for(i=0;i\id=103; p-\>next=q; A)r-\>id B)r-\>next-\>id C)q-\>next-\>id D)p-\>next-\>next-\>id 13\. 以下代码的输出结果是( ) int a\[2\]\[3\]={1,2,3,4,5,6}; int (\*p)\[3\]=&a\[0\]; printf(\"%d,\",(\*++p)\[1\]); p=a; printf(\"%d\",(\*p)\[1\]); A)2,2 B)2,5 C)4,2 D)5,2 14\. int mystrlen(char \*s) { return n; } int main() { char s\[10\]=\"USTC\"; char \*p1=\"USTC\"; } 在主函数中\*\*\*处调用mystrlen函数的错误语句是( ) A)mystrlen(s); B)mystrlen(&s\[0\]); C)mystrlen(p1); D)mystrlen(\*p2); 15\. 已知char x\[\]=\"hello\", y\[\]={\'h\',\'e\',\'l\',\'l\',\'o\'}; 则关于两个数组长度的正确描述是( ) A)相同 B)x大于y C)x小于y D)以上答案都不对 16\. 已知学生记录及变量的定义如下 struct student { int no; char name\[20\]; char gender; struct{int year,month,day;}birth; } struct student s,\*ps; ps=&s; 以下能给s中的year成员赋值2005的语句是( ) A)s.year=2005; B)ps.year=2005; C)ps-\>year=2005; D)s.birth.year=2005; 17\. 当运行时输入:abcd\$abcde,下面程序的运行结果是( ) \#include\ int main() { while(putchar(getchar())!=\'\$\'); printf(\"end\"); } A)abcd\$abcde B)abcdend C)abcd\$end D)abcd\$abcdeend 18\. 下列语句中,将p定义成一个指针型变量的是( )。 A) double \*p\[5\]; B)double (\*p)\[5\]; C) double \*p(5); D)double \*p(); 19\. 以下程序的运行结果是( ) \#include \ void fun(int x) { if(x/2\>0) { fun(x/2-2); printf("%d ",x); } } int main() { fun(20); printf("\\n"); return 0; } A\) 20 8 2 -1 B)2 8 20 C)8 D)-1 2 8 20 20\. 以下代码运行后,i,j,k,m,n的输出结果为( ) \#include \ int main() { char \*ps="0123456789"; char buffer\[\]="Hello"; int i=sizeof(ps); int j=sizeof(\*ps); int k=strlen(ps); int m=strlen(buffer); int n=sizeof(buffer); printf(\"%d %d %d %d %d\\n\",i,j,k,m,n); return 0; } A) 8 1 10 5 6 B) 8 4 10 5 6 C) 1 1 11 6 5 D) 8 1 10 5 5 21\. 以下说法错误的是( ) A)指针是一种保存变量地址的变量。 B)一般情况下,同其它类型的变量一样,指针也可以初始化。 C)对指针有意义的初始化只能是表示地址的表达式。 D)指针若赋值NULL则指向0x0这个地址。 22\. 以下程序的运行结果是( ) \#include \ void fun(int \*p, int n) { int i,t; for(i=0;i\name\[1\]); A)E B)o C)p D)L 24\. 若有函数定义如下: 二、不定项选择题 1\. 以下表达式的值是整型的有( ) A: sizeof(double) B: 3.5-0.5 C: \'x\' D: 3.5\>0.5 2\. 设x、y和z是int型变量,且x=3,y=4,z=5,则下面表达式中值为0的是( ) A)'x'&&'y' B)x\>=y; C)x\|\|y+z&&y-z D)!((x\next; s-\>next=p; p-\>next=s B)p=(\*p).next; (\*s).next=(\*p).next; (\*p).next=s C)s-\>next=NULL; p=p-\>next; p-\>next=s D)p=p-\>next; s-\>next=p-\>next; p-\>next=s 6\. 以下说法正确的是( ) A)在函数之外定义的变量是全局变量 B\) 全局变量可以被本文件中的其他函数访问 C\) 局部变量仅仅在其所在的函数内部范围内有效 D\) 静态(static)变量的生存期贯穿于整个程序的运行期间 三、填空题 1. 已定义 float x = 213.82631; 语句 printf(\"%-4.2f\\n\",x); 的输出结果是 [(1) ] 2. 若有以下定义:char c =\'\\X41\'; 则变量C中包含的字符个数为 [(2) ] 3. 有定义 char str\[\]="\\nUSTC\\n2021";则表达式 sizeof(str) /sizeof(str\[0\]) 的值是: [ (3)] 4. 若有以下定义:char array\[2\]="0" , \*p=array ; 则表达式 (\*p++) == '\\0' 的值为: [(4)] 5. 程序中有下列程序语句: 6. 设有定义char x,y; 请写出描述"**x, y同时为小写字母或者同时为大写字母**"的表达式: [(7)] 。 7. 定义int i=100; 执行语句while(i- -\>0) { if (!i) break;}后,i的值为 [ (8)] 。 8. 函数调用语句fun(rec1,rec2+rec3,(rec4,rec5));含有的实参个数是[(9)] 。 9. 若有int i=1, a\[10\]\[5\]={1,2,3,4,5,6,7,8,9,10}, (\*p)\[5\]=a;则表达式 \*(\*(p+i)+5) 的值为 [(10)] 四、程序填空题 1\. 统计给定数组a中素数的个数并输出 \#include \ int prinum(int \*a) { int count=0,i,j,k; for(i=0;i\addr); } fclose(fp); } (5) 定义binarysearch 函数,以二分查找(亦称折半查找)方式实现按姓名查找该人员在人口普查信息表中的位置,若没有找到则返回-1, 表示查找失败。 int binarysearch(PERSON s\[\], int n, char \* key) { int low, mid, high; low = 0; high = n - 1; while (low \ 0) { low = mid + 1; } else if (udf\_empstr(key, s\[mid\].name) == 0) { return (mid); } else { high = mid - 1; } } return -1; } **A.2 综合测试(2)** **一、单选题** 1\. A 2. C 3. B 4. D 5. B 6\. A 7. B 8. C 9.C 10. D **二、填空题** 1\. 执行什么样的操作 或 执行的运算 2\. 保留字 3\. T = 4 \* t \* t / (t + 2) -- 20 或 T = 4 \* pow(t, 2) / (t + 2) -- 20 4\. 1 5\. 1 6\. n的值是 2,m的值是 8,p的值是 6 7\. x的值是 21,y的值是 1,z的值是 23 8\. 不是,表达式非法。递增运算符不能作用于 (n \* m) 这样的表达式。 **三、阅读程序题** 1\. 运行结果: 2\. 运行结果 3\. 运行结果 4\. 运行结果 5\. 运行结果 6\. 运行结果 **四、程序设计题** 1. \#include\ \#include\ \#define N 10 void udf\_vft(double a\[\], int n, double \*v, double \*f, double \*t) { double s1 = 0, s2 = 0; int i; for (i = 0; i \< N; i++) { s1 += a\[i\]; s2 += a\[i\] \* a\[i\]; } \*v = s1 / N; \*f = s2 / N; \*t = sqrt(\*f); } int main() { double v, f, t, s1 = 0, s2 = 0; double a\[10\] = {3.62, 2.93, 3.16, 3.73, 2.86, 3.40, 2.86, 3.07, 3.29, 3.24}; udf\_vft(a, N, &v, &f, &t); printf(\"平均值 = %5.2f\\n\", v); printf(\"方 差 = %5.2f\\n\", f); printf(\"均方差 = %5.2f\\n\", t); return 0; } 2. char \*udf\_gets(char s\[\], int lim) { int c, i; for(i = 0; i \< lim - 1 && (c = getchar()) != EOF && c!= \'\\n\'; ++i) { s\[i\] = c; } s\[i\] = \'\\0\'; if(i != 0) { return s; } else { return NULL; } } int udf\_strlen(char s\[\]) { int i = 0; while (s\[i\] != \'\\0\') { i++; } return i; } int udf\_strcmp(char s\[\], char t\[\]) { int i = 0; while (s\[i\] == t\[i\]) { if (s\[i++\] == \'\\0\') { return 0; } } return (s\[i\] - t\[i\]); } 3. **(1)算法描述** head \no != 0) { // 读入职工号不是结束标志(0)时做循环 if (head == NULL) { head = p; // 将 p 指向的新结点插入空表 } else { rear-\>next = p; // 新结点插入到表尾结点(rear指向的结点)之后 } rear = p; // 表尾指针指向新的表尾结点 p = (struct person\*)malloc(sizeof(struct person)); // 申请新结点 printf(\"\\n输入一个职工的工号和工资\"); scanf(\"%d%f\", &p-\>no, &p-\>salary); } rear-\>next = NULL; // 终端结点置空 free(p); return head; // 返回表头指针 } (2)函数定义 void writListR(struct person \*head) { FILE \*fp; struct person \*p; if ((fp = fopen(\"person\_list.txt\", \"w\")) == NULL) { printf(\"cannot open this file.\\n\"); exit(0); } p = head; while (p != NULL) { fprintf(fp, \"%d %f\\n\", p-\>no, p-\>salary); p = p-\>next; } } **\ ** **A.3 综合测试(3)** **一、单选题** 1. B 2. D 3. D 4. B 5. A 6. D 7. C 8. B 9. C 10. D 11. C 12. C 13. D 14. B 15. B 16. C 17. C 18. B 19. A 20. A 21. A 22. B 23. C 24. B **二、不定项选择题** 1.ACD 2.ABCD 3.BCD 4.ABD 5.ACD 6.AB **三、填空题** 1\. [**(1)** 2 ] 2\. [**(2)** 7 ] 3\. [**(3)** a=(int)(a\*100+0.5)/100.0] 4\. [**(4)** cdef ] 5\. [**(5)** 结构体(或结构) ] 6\. [**(6)** 200] [**(7)** 100] 7\. [**(8)** 5050 ] 8\. [**(9)** 4] [**(10)** 4 ] **四、程序填空题** 1. **(1)** j=n-1 **(2)** a\[m\]=x **(3)** flag=1或flag+=1或flag=flag+1 **(4)** a\[i\]\>x **(5)** insert(a,N,i,x) 2. **(6)**c=c-\'A\'+\'a\'或c=c+32 **(7)**c=c-\'a\'+\'A\'或c=c-32 3. **(8)**struct student t(或其它变量名) **(9)**j=0; j\score; p = p-\>next; num++; } return ave / num; } struct student \*excellent(struct student \*head, float ave) { //head为链表头,ave为学生平均成绩 //补充本函数代码,实现功能:从以上链表中找出所有超过平均成绩的优秀学生,按成绩从高到低的顺序创建一个新链表,链表头指向成绩最高的学生,并返回新链表头。 float swapscore; int count=0,i,j,swapnum; struct student \*p = head, \*q, \*newhead, \*q1, \*q2; newhead = NULL; while(p) { //头插法建立一个无序的链表 if ( ave \< p-\>score) { q = (struct student \*)malloc(sizeof(struct student)); q-\>score = p-\>score; q-\>Num = p-\>Num; q-\>next = newhead; newhead = q; count++; } p = p-\>next; } for(i=1;i\score \< q2-\>score) { swapnum=q1-\>Num; q1-\>Num=q2-\>Num; q2-\>Num=swapnum; swapscore=q1-\>score; q1-\>score=q2-\>score; q2-\>score=swapscore; } q1=q1-\>next; } } return newhead; } 另一种实现: struct student \*excellent(struct student \*head, float ave) { struct student \*p = head, \*q,\*pre, \*newnode,\*newhead; newhead = NULL; pre = NULL; while (p) { if ( ave \< p-\>score) { //筛选出高于均分的学生 newnode = (struct student \*)malloc(sizeof(struct student)); newnode-\>score = p-\>score; newnode-\>Num = p-\>Num; newnode-\>next = NULL; //这一句也可以放到尾插部分 //newnode节点继承该学生信息,有序插入新链表 q = newhead; while (q) { //用q遍历新链表,找插入点 if ( newnode-\>score \score) { pre = q; //pre为q前一节点 q = q-\>next; } else { break; } } if (q == newhead) { //新链表为空或插入在第一个结点前 newnode-\>next = newhead; newhead = newnode; } else if (!q){ //插入在最后一个结点后 pre-\>next = newnode; } else { //插入位置在中间 newnode-\>next = q; pre-\>next = newnode; } } p = p-\>next; } return newhead; } **\ ** **A.4 综合测试(4)** **一、单选题** 1. 2. D 3. A 4. B 5. D 6. D 7. B 8. B 9. D 10. B 11. D 12. B 13. B 14. D 15. D 16. B 17. D 18. C 19. B 20. D 21. A 22. C 23. A 24. C 25. D **二、不定项选择题** 1.ACD 2.BD 3.ABD 4.BC 5.BCD 6.ABCD **三、填空题** 1\. **(1)** 213.83 2\. **(2)** 1 3\. **(3)** 11 4\. **(4)** 0 5\. **(5)** 200 **(6)** 100 6\. **(7)** (x\>='A' && y\>='A' && x\='a' && x\