
一、单选题(每小题2分,共30分)
1.下列表示中,不是C语言合法字符常量的是 (1) 。
A. ‘\0xff’ B. ‘\65’ C. ‘$’ D. ‘\x2a’
2.设有如下定义:
float y=3.45678;
int x;
则下列表达式中能实现将y中数值保留至小数点后2位,小数点后第3位四舍五入的表达式是 (2) 。
A. y=(y*100+0.5)/100.0 B. x=y*100+0.5, y=x/100.0
C. y=y*100+0.5/100.0 D. y=(y/100+0.5)*100.0
3.下列表示中,能在C语言中正确定义三个整型变量a、b、c,且能给它们均赋值5的是 (3) 。
A. int a=b=c=5; B. int a,b,c=5;
C. int a=5,b=5,c=5; D. a=b=c=5;
4.设有数学命题“当整数a的值为奇数时,表达式的值为真,否则为假”,则下列C语言表达式中,不能满足该数学命题要求的是 (4) 。
A.a%2==1 B. !(a%2) C. !(a%2==0) D. a%2
5.执行下列程序段后,变量i的值是 (5) 。
int i=1;
switch(i){ case 0: i+=1;
case 1: i+=1;
case 2: i+=1;
default: i+=1;
}
A. 1 B. 2 C. 3 D. 4
6.在C语言中,break语句 (6) 。
A. 能用在C源程序中的任何位置 B. 只能用在循环体内
C. 只能用在循环体内或switch语句中 D. 可用作函数内的任一语句
7.设有程序段:
int x=10;
while (x=0) x=x-1;
则下列叙述中正确的是 (7) 。
A. while循环执行10次 B. 循环是无限循环
C. 循环体语句一次也不执行 D. 循环体语句只执行一次
8.在C语言中,数组名可作为实在参数传递给函数的形式参数,此时,作为实在参数的数组名被处理为 (8) 。
A. 该数组的长度 B. 该数组的元素个数
C. 该数组中元素的值 D. 该数组的首地址
9.以下关于函数定义的叙述中,正确的是 (9) 。
A. 构成C语言源程序的基本单位之一是函数定义
B. 所有被调用的函数必须在调用之前定义
C. main函数的定义必须放在其他函数定义之前
D. 定义main函数时,main函数的函数体内必须至少包含一条语句或声明
10.设有下列程序段:
struct person{char name[9]; int age; };
struct person class[10]={“John”,17, “Paul”,19, “Mary”,18, “adam”,16};
则下列选项中,能打印出字母“M”的语句是 (10) 。
A. printf(“%c\\n”,class[3].name);
B. printf(“%c\\n”,class[3].name[1]);
C. printf(“%c\\n”,class[2].name[1])
D. printf(“%c\\n”,class[2].name[0])
11.以下能将字符串“good!”正确地存放在字符数组s中,或使指针变量s能正确地指向这个字符串的是(11) 。
A. char s[5]={‘g’, ‘o’, ‘o’, ‘d’, ‘!’};
B. char s[5];s=“good!”;
C. int s[5]=“good!”;
D. char *s;s=“good!”;
12.若有语句:
char s1[10],s2[10]=“books”;
则下列表示中,能正确地将字符串“books”赋给数组s1的是 (12) 。
A. s1={“books”} B. strcpy(s1,s2)
C. s1=s2 D. strcpy(s2,s1)
13.以下正确的函数说明语句是 (13) 。
A. int fun(int a, b) B. float fun(int a; int b)
C. double fun() D. int fun(char a[][])
14.设有说明语句
char *s=“abcd”;
则执行s+=2后,*s的内容是 (14) 。
A. a B. b C. c D. cd
15.下列对typedef的叙述中,错误的是 (15) 。
A. 用typedef可以增加新类型
B. 用typedef可以定义各种类型名,但不能用来定义变量
C. 用typedef只是将已存在的类型用一个新的标识符来代表
D. 使用typedef有利于程序的通用和移植
二、填空题(每空1分,共20分)
1.一个C语言源程序是由若干个(1) 组成的;C语句的分隔符是(2) 。
2.程序的三种基本控制结构分别是(3) 、选择和(4) 。
3.数学表达式“”所对应的C语言表达式为(5) 。在C程序中要计算这样的表达式,通常必须包含头文件(6) 。
4.在C语言中,声明变量的格式为:
存储类别 类型名 变量名表;
其中,变量有四种存储类别,它们分别是(7) 、register、extern和(8) 。
5.若有定义:“int a[3][4]={{1,2,3},{4,5},{6,7,8}}; ”,则执行该说明语句后,a[1][2]=(9) ,a[2][1]=(10) 。
6.在C程序中,若有函数定义如下:
void f()
{ static int i;
… }
其中,void表明函数f(11) ;而i是一个(12) 整型变量。
7.在C语言程序设计中,预处理命令行必须以(13) 开头,该命令是在 (14) 被处理的。
8.若一结构的成员项是指向本结构类型的结构指针,则称该结构为(15) 。定义这种结构类型的一般形式如下:
struct node { int data;
(16) next;
};
9.在C语言源程序中,函数内部说明局部变量时若缺省了存储类型,则该变量的存储类型为(17) ;定义一个函数时,若缺省该函数返回值的类型,则默认返回值为 (18) 型。
10.设有以下说明语句:
struct student { int x;
int *y;
};
int dt[4]={1,2,3,4};
struct student a[4]={10, &dt[3], 20, &dt[2], 30, &dt[1], 40, &dt[0]}, *p=a;
则表达式++p->x的值为(19) ,表达式*(++p)->y的值为(20) 。
三、阅读程序写出结果(每小题4分,共20分)
1.下列程序的运行结果是 。
#include main() { int s=0,n=135; do{ s+=n%10; n/=10; }while(n); printf(“%d\\n”,s); getch(); } 2.下列程序的运行结果是 。 #include void f(int x,int y) { int t; t=x;x=y; y=t; } main( ) { int a=1,b=100; f(a,b); printf (“%d,%d\n”,a,b); getch(); } 3.以下程序运行的结果是 。 #include #include main() { int i; for(i=0;i<3;i++) printf("%3d ",f(i)); getch(); } f(int x) { int y=0; static int z=1; y++,z++; return(x+y+z); } 4. 下面程序段运行的结果是__________________。 #include #include main() { int i=1,j=0,m=1,n=1; switch(i) { case 1:m++;n++; case 2:switch(++j) { case 1:m++;break; case 2:n++; } case 3:m++;break; case 4:n++; } printf("%d,%d\\n",m,n); getch(); } 5. 下面程序段运行的结果是__________________。 #include #include main() { char ch[7]=“1234”; int i,s=0; for(i=strlen(ch)-1; i>=0; i--) s=s*10+ch[i]-‘0’; printf(“%d\\n”,s); getch(); } 四、完善程序题(每空1分,共30分) 1.以下程序的功能是统计正整数的各位数字中零的个数,并求出各位数字中的最大者。请填空。 #include main ( ) { long int n,t; int count=0, max=0; scanf ("%ld", &n); while(n) { t= (1) ; if (t==0) count++; else if(max } printf("count=%d,max=%d\\n",count,max); getch(); } 2.以下程序的功能是把从键盘上输入的十进制数n以八进制数的形式输出,请填空。 #include main() { int c[],i=0,base=8; long n; printf("Enter a number:\\n"); scanf("%ld",&n); do{ c[i++]= (3) ; (4) ; }while(n); printf("Transmite new base:\\n"); for(--i;i>=0;--i) printf("%d (5) ); printf("\\n"); getch(); } 3.程序中函数double mycos(double x)的功能是:根据下列公式计算cos(x)的近似值,直到某一项的绝对值小于10-6为止。在主函数中输入x值,输出cos(x)的值。请填空。 #include #include #include double mycos(double x) { int n=1; double sum=0,term=1.0; while((6) ) { sum+=term; term*=(7) ; n=n+2; } return sum; } main() { double x; scanf("%lf",&x); printf("cos(%lf)=%lf\\n",x,(8) ); getch(); } 4.设有函数pow定义如下: pow(int x,int y) { int i,j=1; for(i=1;i<=y;++i)j=j*x; return (j); } 下列改变后的函数欲取消上述函数中的局部变量i而使pow的功能不变。请填空。 pow(int x,int y) { int j; for((9) ;(10) ; (11) )j=j*x; return (j); } 5.设有一表头结构如下: struct date { int day; char month[4]; int year; }; struct stu { (12) ; (13) ; (14) ; }; 6.有如下说明和变量的定义: struct node { char data; struct node *link; }*p,*q; 设p、q已分别申请到一个结点空间,现要求把结点q连接到结点p之后。写出建立如下图所示的存储结构和赋值所需的语句。 data link data link ↑p ↑q scanf(“%c%c”,&p->data,&q->data); /*输入数据为:59<回车> */ (15) ; /*结点q连接到结点p之后*/ (16) = NULL; 6.一个简易的明码密码对照表如下: #include #include char cs[2][10]={"aceghjlnp void encode(char *s1,char *s2) { int n,i,j; for(n=0;s1[n]!='\\0';n++) { for(i=0;i<10 && (17) ; i++); if( (18) ) s2[n]=s1[n]; else s2[n]= (19) ; } s2[n]='\\0'; } main() { char ts[80]="jntwrnwt",td[80]; encode( (20) ); puts(ts); puts(td); getch(); } 8.以下程序在b数组中查找与y值相同元素的所在位置。 main() { int b[20] ,y, i; printf(“Enter 10 Integers:\\n”); for(i=0; i<20; i++) scanf(“%d”,b+i); printf(“Enter y:”); scanf(“%d”,&y); (21) ; while(i<20) { if( (22) ) break; ++i; } if( (23) ) printf(“%5d ’s position is %4d\\n”,y,i); else printf(“%d is not found!\\n”,y); } 9.函数char *conj( char *p1 , char *p2)的功能是实现将两个字符串p1和p2连接起来(要求该函数返回字符串p1的首地址),请填空。 #include char *conj( char *p1 , char *p2) { char *p=p1; while(*p1) (24) ; while(*p2) { (25) ____________; p1++; p2++; } *p1=’\0’; return (26) ; } main() { char s1[30],s2[10],*p; gets(s1); gets(s2); p=conj(s1,s2); printf(“%s\\n”,p); } 10.以下程序对一组点坐标(x,y)按升序进行排序。要求:先按x的值排序,若x的值相同,则按y的值排序(排序算法为直接选择排序)。请填空。 #include #define N 5 typedef struct { int x; int y ; }POINT; void point_sort(POINT *x,int n) { POINT t; int i,j,k; for(i=0;i for(j=(28) ;j else if((29) &&x[k].y>x[j].y)k=j; if((30) ) {t=x[i],x[i]=x[k],x[k]=t;} } } main() { POINT a[N]; int i=0; while(i i++; } point_sort(a,N); for(i=0;i } 200706 一、单选题(每小题2分,共30分) 16.用于结构化程序设计的3种基本结构是 (1) 。 A. 顺序结构、选择结构、循环结构 B. if, switch, break C. for, while, do-while D. if , for, continue 17.下列各组中不全是合法变量名的是 (2) 。 A. day , lotus_1_2_3 , x1 B. Abc , _above , basic C. M.John , year , sum D. YEAR , MONTH , DAY 18.C语言中,下列运算符中运算对象必须是整型的是 (3) 。 A.%= B. / C. = D. <= 19.能在C语言中定义三个整型变量a、b、c,并能给它们均赋值5的正确表示是 (4) 。 A. int a=b=c=5; B. int a,b,c=5; C. int a=5,b=5,c=5; D. a=b=c=5; 20.设有数学命题“当整数a的值为偶数时,表达式的值为真,否则为假”,则下列C语言表达式中,不能满足该数学命题要求的是 (5) 。 A.a%2==0 B. !(a%2==1) C. !(a%2) D. a%2 21.若有说明语句: char c=’\72’; 则变量c (6) 。 A. 包含1个字符 B. 包含2个字符 C. 包含3个字符 D. 说明不合法 22.在C语言中,break语句 (7) 。 A. 能用在C源程序中的任何位置 B. 只能用在循环体内 C. 只能用在循环体内或switch语句中 D. 可用作函数内的任一语句 23.设有程序段: int x=-1; do { x=x*x; } while (!x); 则下列叙述中正确的是 (8) 。 A. 循环是无限循环 B. 循环体语句执行1次 C. 循环体语句执行2次 D. 有语法错误 24.在C语言中,数组名可作为实在参数传递给函数的形式参数,此时,作为实在参数的数组名被处理为 (9) 。 A. 该数组的长度 B. 该数组的首地址 C. 该数组中元素的值 D. 该数组的元素个数 25.以下叙述中,正确的是 (10) 。 A. C语言源程序总是从第一个函数开始执行 B. 在C语言程序中,调用函数必须在main()函数中定义 C. C语言源程序总是从main()函数开始执行 D. C语言程序中的main()函数必须放在程序的开始地方 26.若已定义的函数有返回值,则以下关于该函数调用的叙述中,错误的是(11) 。 A. 函数调用可以作为的语句存在 B. 函数调用可以作为一个函数的实参 C. 函数调用可以出现在表达式中 D. 函数调用可以作为一个函数的形参 27.设有下列程序段: struct p{char name[9]; int age; }; struct p class[10]={“John”,17, “Paul”,19,“Mary”,18,“Adam”,16 }; 则下列选项中,能打印出字母“P”的语句是 (12) 。 A. printf(“%c\\n”,class[1].name[0]) B. printf(“%c\\n”,class[2].name[0]); C. printf(“%c\\n”,class[1].name[1]); D. printf(“%c\\n”,class[2].name); 28.若有以下调用语句,则错误的fun函数的首部是 (13) 。 main() { int a[50],n; …… fun(n,&a[9]); …… } A. void fun(int m,int x[]) B. void fun(int s,int h[50]) C. void fun(int p,int *s D. void fun(int m,int a) 29.设有说明语句 char *s=“abcd”; s+=2; 则 *s的内容是 (14) 。 A. a B. b C. c D. cd 30.下列对typedef的叙述中,错误的是 (15) 。 A. 用typedef可以增加新类型 B. 用typedef可以定义各种类型名,但不能用来定义变量 C. 用typedef只是将已存在的类型用一个新的标识符来代表 D. 使用typedef有利于程序的通用和移植 二、填空题(每空1分,共20分) 11.C语言源程序是由函数构成的,一个C源程序至少包含一个 (1) 函数。对C程序中的任何部分可用 (2) 作注释。 12.调用C语言标准库函数时要求用(3) 预处理命令,strcat函数的作用是(4) 。 13.数学表达式“”所对应的C语言表达式为(5) 。在C程序中要计算这样的表达式,通常必须包含头文件(6) 。 14.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是_(7)_____;数组名作为实参时,传递给对应形参的是数组的_(8)_ _________。 15.若有定义:“ int a[3][4]={{1},{2,3},{4,5,6}}; ”,则执行该说明语句后,a[0][1]=(9) ,a[2][1]=(10) 。 16.在C程序中,若有函数定义如下: void f() { static int i; … } 其中,void表明函数f(11) ;而i是一个(12) 整型变量。 17.关系表达式x 19.设有说明语句: char *s="\a\\017bc"; 则指针变量s指向的字符串所占的字节数是 (17) 。若有如下程序段: char *s="\a\\018bc"; for( ; * s!=’\0’; s++)printf("*"); 则for循环体语句的执行次数是(18) 次。 20.若一结构的成员项是指向本结构类型的结构指针,则称该结构为(19) 。定义这种结构类型的一般形式如下: struct node { int data; (20) next; };。 四、阅读程序写出结果(每小题4分,共20分) 4.下列程序的运行结果是 。 #include main() { int s=1,n=235; do{ s*=n%10; n/=10; }while(n); printf(“%d\\n”,s); } 5.下列程序的运行结果是 。 #include void f(int x,int y) { int t; t=x;x=y; y=t; } main( ) { int a=1,b=10; f(a,b); printf (“a=%d,b=%d\n”,a,b); } 6.以下程序运行的结果是 。 #include #include main() { int i,k; for(i=1;i<5;i++) { k=sub(&i); printf("%4d",k); } printf("\\n"); } int sub(int *s) { static int t=0; t=*s+t ; return t; } 4. 下面程序段运行的结果是__________________。 #include #include main() { int i,j=3; for(i=j;i<=2*j;i++) switch(i/j) { case 0: case 1: printf ("*");break; case 2: printf ("#"); } } 5. 下面程序段运行的结果是__________________。 #include #include main() { char *p="987"; int i,s=0; while(*p) { s=s*10+*p-'0'; p++; } printf("%d\\n",s); } 四、完善程序题(每空1分,共30分) 1.下列程序的功能是按5个一行输出100至1000之间各位数字之和是5的数,并统计这些数的个数。请填空。 #include #include main( ) { int s,i,k,count=0; for(i=100;i<=1000;i++) { s=0; k=i; while(k) { s=s+k%10; k= (1) ; } if ((2) ) { count++; if(count%5==0) printf("%5d\\n",i); else printf("%5d",i); } } printf("\\n%5d",count); } 2.以下程序在a数组中查找与x值相同的元素的所在位置。请填空。 #include #include main() { int a[11],x,i; printf("Enter 10 Integers;\\n"); for(i=1;i<=10;i++) scanf("%d",a+i); printf("Enter x;"); scanf("%d",&x); a[0]= (3) ; i=10; while(x!=a[i]) (4) ; if((5) ) printf("%5d's position is:%4d\\n",x,i); else printf("%d Not been found !\\n",x); } 3.以下程序的功能是用二分法求方程2x3-4x2+3x-6=0的根,并要求绝对值误差不超过0.001。请填空。 #include #include #include float f(float x) { float y; y= (6) ; return y; } main() { float m=-100,n=90,r; r=(m+n)/2; while((7) ) { if(f(r)*f(n)<0) m=r; else n=r; (8) ; } printf("This fangcheng jie is%6.3f\\n",r); } 4.两个等长的二进制数之间的海明距离是指对应位数字不同的位数。如100101和001110之间的海明距离为4。设计算机系统使用16个二进制位表示一个十进制整数,试按下列要求编写程序: (1) 编写函数void DecToBin(char str[], int n),其功能是将非负整数n转换成16位二进制数字字符串,按由低位向高位存入数组str中; (2) 编写函数int Hymin(char *x , char *y),其功能是统计x、y指向的两个16位二进制数字字符串对应位数字不同的位数,并返回统计结果; (3) 在主函数中输入两个十进制正整数39和15,分别调用函数DecToBin将它们转换为二进制数字字符串,再调用函数Hymin计算它们之间的海明距离。将这两个十进制数转换后的二进制字符串及其海明距离输出。 测试数据及结果: distance of 39 and 15 = 2 [源程序] #include #include void DecToBin(char str[] , int n) { int i=0,j; while(n!=0) { str[i++]= (9) ; (10) ; } for(j=i;j<16;j++) str[j]='0'; } int Hymin(char x[],char y[]) { int count=0, i ; for(i=0; i<16 ; i++) if((11) ) count++; return count; } main() { int m,n; char a[17],b[17]; scanf("%d%d",&m,&n); (12) ; (13) ; printf("distance of %d and %d=%d\\n",m,n, (14) ); } 5.以下程序的功能是从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入,请填空。 #include #include main ( ) { float x,max,min; scanf ("%f (15) ); max=x; min=x; while ((16) ) { if ((17) ) max=x; if ((18) ) min=x; scanf("%f",&x); } printf("\\nmax=%f\\nmin=%f\\n", max,min); } 6. 设有一表头结构如下: struct date { int day; char month[4]; int year; }; struct stu { (19) ; (20) ; (21) ; }; 7.有如下说明和变量的定义: struct node { int data; struct node *link; }*p,*q; 设p、q已分别申请到一个结点空间,现要求把结点q连接到结点p之后。写出建立如下图所示的存储结构和赋值所需的语句。 data link data link ↑p ↑q scanf(“%d%d”,&p->data,&q->data); /*输入数据为:59<回车> */ (22) ; /*结点q连接到结点p之后*/ (23) = NULL; 8. 函数char *conj( char *p1 , char *p2)的功能是实现将两个字符串p1和p2连接起来(要求该函数返回字符串p1的首地址),请填空。 #include char *conj( char *p1 , char *p2) { char *p=p1; while(*p1) (24) ; while(*p2) { *p1= (25) ______; p1++; p2++; } *p1=’\0’; return (26) ; } main() { char s1[30],s2[10],*p; gets(s1); gets(s2); p=conj(s1,s2); printf(“%s\\n”,p); } 9. 程序功能:将一字符串做压缩处理。编程要求: (1) 编写一个函数int compress(char s[]),将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数,返回被删除的字符个数。 (2) 编写主函数main,从键盘读入一行字符数据放入一个字符型数组中,调用compress函数对该字符数组中字符做压缩处理,输出压缩后的字符串。 (3) 测试数据及结果如下: 测试数据:@@@@@ I wwillll successful 测试结果:@ I wil successful 11 #include #include #include main ( ) { char s[]="@@@@@ I wwillll successful"; int n; n= (27) ; puts(s); printf("\\n%d\\n",n); } int compress(char s[]) { char *p=s,*q; int n=0; while(*p) { q=p+1; while((28) ) { q++; n++; } strcpy((29) ); p++; } (30) ; } 程序设计题(附加题!每小题10分,共20分) 注,程序设计题最终没考 1.求满足下列条件的三位数n,它除以11(整数相除)所得到的商等于n的各位数字的平方和,且其中至少有二位数字相同的数。如:131,它除以11的商为11,各位数字的平方和为11,又如550,也是满足条件的三位数。 2.设n0是一个给定的正整数。对于i=0,1,2,…,定义:若ni是偶数,则ni+1=ni/2;若ni是奇数,则ni+1=3ni+1;若ni是1,则序列结束。用这种方法产生的数称为冰雹数(hailstone)。请编写一个函数void hailstones(int n),其功能是显示由n产生的序列,并按如下形式输出。 Hailstones generated by 77: 77 232 116 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 Number of hailstones generated:23
其中,num为长整型;name为长度不超过10的字符串型;day和year为整型;month为长度不超过3的字符串型。下列程序段用于设计一结构类型描述上述结构。请填空。num name birthday day month year
以下程序中函数void encode(char *s1, char *s2)的功能是完成一个字符串的加密,将s1字符串中的字符经过变换后保存到s2指向的字符数组中。二维数组cs用于保存了上述明码密码对照表,第一行是明码字符,第二行是对应的密码字符。加密方法:从s1字符串中每取一个字符,均在cs表第一行中查找有无该明码字符,若找到则将对应的密码字符放入s2中,否则将s1中原来的字符放入s2中。a c e g h j l n P \\0 f o n p t i u d e \\0
其中,name为长度不超过10的字符串型;sex是字符型;day和year为整型;month为长度不超过3的字符串型。下列程序段用于设计一结构类型描述上述结构。请填空。name sex birthdate day month year
