一. 选择题(40分) 1..当c的值不为0时,在下列选项中能正确将c的值赋给变量a、b的是______ A c=b=a; B (a=c)‖(b=c); C (a=c)&.&.(b=c); D a=c=b; 2.在C语言中,不正 确的int类型的常数是________ A 32768 B 0 C 037 D 0xAF 3.以下程序的输出结果是________ main( ) { int a= -1,b=1,k; if(( a<0)&.&. ! (b-- <=0)) printf("%d %d\n",a,b); else printf("%d %d\n",b,a);} A -1 1 B 0 1 C 1 0 D 0 0 4.在C语言类型中,int ,char, short等类型的长度是_________ A.固定的 B.由用户自己定义 C.任意的 D.与机器字长有关 5.设a=1,b=2,c=3,d=4,则表达式:a A 4 B 3 C 2 D 1 6. 下列说法错误的是______________ A.结构体变量可以被整体赋值. B. 可以取结构体变量的地址 C. 可以取结构体变量成员的地址 D. 结构体类型的成员可以定义成该结构体类型的指针类型 7.设有如下定义:int x=l,y=-1;,则语句:printf("%d\n",(x--&. y));的输出结果是____ A 1 B 0 C -1 D 2 8. . 设有程序段: t=6.a=7.b=8. if(a=b)t=a.,这段程序执行后,t的结果是______ A. 6 B.7 C.8 D.0 9.下列描述中不正确的是________ A)字符型数组中可以存放字符串 B)可以对字符型数组进行整体输入、输出 C)可以对整型数组进行整体输入、输出 D)不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值 10.若a为二维数组,它有m列,则a[i][j]在数组中的位置是_________ A. i*m j B. j*m i C. i*m j-1 D. i*m j 1 11. 下列语句中符合C语言语法的赋值语句是__________ A a=7 b c=a 7. B a=7 b =a 7. C ) a=7 b,b ,a 7 D a=7 b,c=a 7. 12. 若a为二维数组,则a[1][3]等价于_________ A. *((a 1) 3) B. *(a[1] 3) C. (*(a 1) 3) D. &.a[1] 3 13.下面程序段不是死循环的是_____________ A. int j=100. while(1){j=j0 1.if(j>100)break.} B. for( . . ). C. int k=0. do{ k.}while(k>=0). D. int s=36. while(s).--s. 14.下列表达式中,错误的是______. A.2>1 ? a:b B.i j C.4.0%2.0 D.x*=y 8 15.a,b为整数且b!=0,则表达式(a/b)*b a%b的值为______的值. A.a B.b C.a被b除的余数部分 Da被b除商的整数部分 16.若以数组元素作为函数的实参,则实参向形参传送的是______. A.数组元素的地址 B.数组元素的值 C.数组的首地址 B.数组名 17.设有如下的共用体定义: union data {int i. long b. float f.}a. 则a所占的内存单元为______个字节. A.4 B.6 C.8 D.10 18.语句:printf("%d",(a=2)&.&.(b= -2);的输出结果是________ A 无输出 B 结果不确定 C -1 D 1 19.下列选项中不是C语言main函数正确表达形式的是________? A.main(int argc,char *argv[]). B.main(ac,av) int ac.char **av. B.main(c,v) int c.char *v[]. D.main(argc,argv) int argc.char argv[]. 20.执行for(j=1.j <4.).语句后变量j的值是_________ A. 3 B. 4 C. 5 D.不定 二.填充(20分) 1. C语言的数据类型中,构造类型包括:数组,__________和__________. 2.设x,y,z,t均为int型变量,则执行以下语句后,t的值为_________ x=y=z=1. t= x|| y&.&. z. 3.C语言的运算符要确定的两个方面分别是__________和__________. 4. 在函数内使用static是_________,在函数外使用static是________。 5.对于语句:scanf("==",&.a,&.b).,若输入123456,则a和b的值分别为_______和_______. 6.设有二维数组 inta[2][2],*p.,则a[I][j]三种其他表示是______________, ____________,___________。 7.字符串的长度是_________________,它的存储空间大小是_______。 8.静态变量赋初值是________赋值,动态变量赋初值是___________赋值。 9.链表中每个结点至少应包括二个部分,它们是__________和__________. 10.用数组名作函数参数时,形参和实参的结合是采用__________,因为数组名是 数组的__________. 三.程序分析题(20分) 1. 阅读下面程序,给出输出结果。 main( ) { int i, j, k. for(i=1. i<10. i ) { printf(“\n”). if(i<=5) {for(j=1. j<=i. j ) { for(k=1.k<=5-i.k ) printf(“ ”). printf(“* “). } else for (j=1. j<=10-i.j ) {for(k=1.k<=i-5.k ) printf(“ ”). printf(“* ”).}}} 2. 阅读下面程序,指出函数所实现的功能。 void ins(char s[ ], int start, char t[ ]) { int m, n,i,k. n=0.m=0. for(i=0.s[i]!=’\0’.i ) m . for(i=0.t[i]!=’\0’.i ) n . for(k=1 . k for(k=start.k s[k]=t[k-start]. s[m n]=’\0’. } 3. 阅读下面程序,指出下面程序所完成的功能 void st(char *a [ ],int n ) { int i,j,k. char *m. for(i=1. i { m=a[i]. k=i. for (j=i 1. j<=n. j ) if (strcmp(a[k],a[j])>0), k=j.) m=a[i]. a[i]=a[k]. a[k]=m. } for(i=1. i<=n. i ) printf(“%s”, a[i]).} 4.分析以下程序: #include “string.h”. main() {char c,string[81]. int i,a=0,b=0. gets(string). for(i=0.(c=string[i])!=’\0’.i ) if (c==’ ’)a=0. else if (a==0) {a=1.b .} printf("%d\n",b). } 该程序的作用是_________________.若输入:a b c,则程序运行后,输出结果为______, 且c的值为______,a的值为______. 5. 阅读下面程序,指出函数所实现的功能。 void lnsort(int L[ ],int n) {int i,j. for( i=2.i<=n.i ) {L[0]=L[i]. j=i-1. while(L[0] {L[j 1]=L[j]. j--. } L[j 1]=L[0]. } } 四.完成下列程序(20分) 1. 下面程序是查找学生的成绩,完成该程序。 main( ) { void search (float (*p) [3], int i ). float score [4][3]={{75,78,82},{66,72,77},{85,90,81},{74,89,68}}. while (1) { scanf (“%d” &.i ). if(___1____)break. search(_____2_______).}} void search (float (*p)[3],int i ) { int k. print (“The score of No %d are \n”,i ). for(_____3_______) printf( “%5.2f”,_____4_________).} 2. 已知两个线性表的元素按非递减排列,合并两表得到一新表,仍然是按 非递减排列,两个线性表以-1为结束标志。以函数来完成该操作,函数如下, 完成所缺语句。 void LL(int la[ ], int lb[ ], int lc[ ] ) // la,lb是已知二表// { int pa, pb, pc. pa=0 . pb=0.pc=0. if (la[pa] else {________6__________} while(_______7___________) { if (la[pa]<=lb[pb]) { lc[pc]=la[pa]. __8___. __9___.} else {____10_________}} while (_____11________) ____12___. while (____13________) ____14______. } 3.在一数组里装数取数,从数组中所装的数的最后一项的下一个空单元装数, 从数组中所装的数的最後一个取数,取数后该单元成空单元,如果取数已到数 组空,-1表示未取到,以下是对数组的一次取数操作,函数值是所取的值,完成该 函数。 define MAX 100 int pop ( int s[ ] ,int top ) { if (___15______) return (-1). top = ___16________. return (____17_______) .} 4.在 n 行 n 列的矩阵中,每行都有最大的数,本程序求这 n 个最大数中的最小一个 [程序1.2] #include〈stdio.h〉 #define N 100 int a[N][N]. void main() { int row ,col ,max ,min ,n. /*输入合法 n (〈100 〉,和输入 n×n 个整数到数组 a 的代码略*/ for ( row = 0.row < n.row ) { for ( max = a[row][0],col = l .col < n.col ) if (__18_) max = a[row][col]. if (__19__) min = max. else if(__20__) min = max. } printf ("The min of max numbers is %d\n",min). } 五. 编程题(50分) 1. 有函数f(x)=cos(x)可展开成:f(0) f’(0)x/1! f”(0)x /2! … 编写函数程序求cos(x),使误差小于0.0000001。 2. 有一个链表,输出所有结点的数值,确定该链表的长度,并将链表的头结点 与尾结点连接.编写完成这样操作的函数。这里的结点定义为 typedef struct node {int data . struct node * next . } Node . 3.将一个整数a左循环移位n次,求位移后的这个数.写出子函数 4.写函数,将一个十进制数转换成一个十六进制数,并输出. 5. 如果有n个棋子,甲、乙两方轮流取棋子,每方至少取一个棋子,最多取m个棋子 谁最后取剩下的一个棋子,谁就输,如果甲方先取,请给出甲方赢的算法.(写出函数)