C语言程序设计试卷及答案
C 语言程序设计 笔试试题
题号 一 二 三 四 五 六
笔试(70%)
综
合 (30%)
总分
分数
试卷说明:
1. 笔试卷面总分100分,取卷面成绩的70%计入总分;
2. 综合成绩为平时成绩(10%)和实验成绩(20%)之和,占总分的30%;
3. 答题时禁止拆开试卷钉,试卷背面即为草稿纸;
4. 答题时间120分钟。
一、单项选择题。将正确答案填入下面框中。
(本题16分,每小题1分)
题号 1 2 3 4 5 6 7 8 答案 题号 9 10 11 12 13 14 15 16 答案
1. 有以下程序 main() {int a=1,b=0; if(!a) b++;
else if(a==0) if(a) b+=2; else b+=3;
printf(“%d\n ”,b); }则程序输出( A )。 A) 0
B) 1
C) 2
D) 3
2. 有以下定义:int a; long b; double x,y;则下列正确的是( A )。
A) a%(int)(x-y) B) a=x!=y
C) (a*y)%b D) y=x+y=x
3. 若有定义 int (*p)[3];则下列说法正确的是( C )。
A) 定义了基类型为int 的三个指针变量
B) 定义了一个名为 *pt 、具有三个元素的整型数值
号
学
名
姓
注意行为规范 遵守考试纪律
C) 定义了一个名为pt的指针变量,它可以指向每行有三个整数元素的二维数组D) 定义了基类型为int的具
有三个元素的整型数组
4. 有以下程序段
main()
{ int x=10;
while(x--);
printf("x=%d\n",x);}
则最后的输出结果是:( B)。
A) x=0 B) x= -1 C) x=1 D)while构成无限循环
5. 有以下程序:
int fun()
{static int x=1;
x *= 2;
return x;}
main( )
{ int i,s=1 ;
for(i=1 ;i<=2 ;i++) s=fun() ;
printf(“%d\n ”,s) ;}
执行后的输出结果为( D)。
A) 0 B) 1 C) 8 D) 4
6. void main( ){
int k=011;
printf("%d\n",k++); }
}程序输出结果是( D )
A)12 B) 11 C) 10 D) 9
7. 以下C语言标识符中,不合法的是( C)。
A) _2 B) a_b C) a--b D) AaBc
8. C语言允许函数类型默认定义,此时该函数值隐含的类型是( B)。
A) float B) int C) long D) double
9. 以下程序段运行结果是( B)。
enum weekday{aa,bb=2,cc,dd,ee}week=ee;
printf(“%d\n“,week);
A) 4 B) 5 C) ee D) 0
10. 以下对C语言函数的描述中,不正确的是( B )。
A) 不同函数中可以使用相同名字变量B) 函数可以嵌套定义
C) 函数可以没有返回值D) 程序由函数组成
11. 若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数组元素的是( D )。
A) *p B) *x C) *(p+1) D) x[5]
12. 以下程序段运行结果是( B )。
int a=6;
printf(“%d\n“,a>>1);
A) 12 B) 3 C) 6 D) 1
13. 若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是( B )。
A) scanf(“%lf%lf”,x,y); B) scanf(“%lf,%lf”,px,py);
C) scanf(“%f%f”,&x,&y); D) scanf(“%f%f”,x,y);
14. 以下程序运行结果是( D )。
char str[ ]=“abc“;
printf(“%d, %d \n“,strlen(str),sizeof(str));
A)6,3 B) 3,3 C) 10,10 D) 3,10
15. 以下程序段运行结果是( A )。
#define f(x) x*x*x
main( )
{ int a=1,b,c;
b=f(a+1);c=f((a+1));
printf(“%d,%d\n“,b,c);}
A) 4,8 B) 8,4 C) 8,8 D) 4,4
16. 有以下程序:
main()
{FILE *f;
f=fopen(“fa.txt“,“w“);
fprintf(f,“day“);
fclose(f);}
若文本文件fa.txt中原有内容为:hello,则运行以上程序后,文件fa.txt中的内容为( A )。
A)day B) helloday C) daylo D)dayhello
二、填空题。请按序号把答案填入下面框中,
不允许出框线。(本题20分,每空2分)
题号答案题号答案
1 a[row][col] 6 k<=n
2 x%10或x%100%10 7 k++
3 23hE45a8 m%i==0&&n%i==0
4 fun() 9 p=p->next
5 m++ 10 s[i]或’\0’
1. 以下fun函数功能是在N行M列的整型二维数组中,选出一个最大值作为函数值返回。
int fun(int a[N][M])
{ int i,j,row=0,col=0;
for(i=0;i for(j=0;j if(a[i][j]>a[row][col]){row=i;col=j;} return( 【1】);} 2. 以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位,百位的顺序拆分输出。main() { int x=123; printf(“%d-%d-%d\n”, 【2】,x/10%10,x/100);} 3. 下列程序运行时,若输入23he45a<回车>,输出结果是【3】 #include main() { char a=0;ch; while((ch=getchar())!=’\n’) {if(a%2!=0&&(ch>=’a’&&ch<=’z’)) ch=ch-‘a’+’A’; a++;putchar(ch);} printf(“\n”);} 4. 以下程序的功能是,通过函数fun输入字符并统计输入字符个数。用字符$作为输入结束标志。 #include long 【4】;/*函数声明语句*/ main() { long n; n=fun(); printf(“n=%ld\n”,n);} long fun() {long m; for(m=0;getchar()!='$'; 【5】); return m;} 5. 有以下程序段,且变量已正确定义和赋值 for(s=1.0,k=1;k<=n;k++)s=s+1.0/(k*(k+1)); printf("s=%f\n\n",s); 请填空,是下面程序段的功能与之完全相同 s=1.0;k=1; while( 【6】){s=s+1.0/(k*(k+1)); 【7】;} printf("s=%f\n\n",s); 6. 以下函数的功能是求两个整数的最大公约数。 fun(int m,int n) { int i=1,t; for(;i<=m&&i<=n;i++) if( 【8】 )t=i; return(t);} 7. 以下程序将三个struct node 型变量链接成一个链表,并在while 循环中输出链表节点数据域中的数据。 struct node {int data;struct node *next;} main() { struct node a,b,c,*p,*q; a.data=10; b.data=20; c.data=30;p=&a; a.next=&b;b.next=&c;c.next=NULL;q=p; while(p){printf(“%d,”,p->data); 【9】 ;} printf(“\n ”);} 8. 以下程序的功能是:删除字符串中所有的空格。 main() { char s[20]=”how are you!”; int i,j; for(i=j=0;s[i]!=’\0’;i++) if(s[i]!=’ ’){ s[j]=s[i]; j++; } s[j]= 【10】 ;} 三、请把下列程序运行结果填入答案框中,不允 许出框线,用“↙”表示回车。(本题24分,每小题3分) 1. main() { int i,j,a[ ][2]={1,2,3,4}; for(i=0;i<2;i++) for(j=i;j<2;j++) printf(“%d ”,a[i][j]); printf(“\n ”);} 题号 1 2 3 4 5 6 7 8 答案 124 43 6 4 121 55555 30 4 2.main() {char ch[ ]=”453cd34”; int i,s=0; for(i=0;ch[i]>’0’&& ch[i]<’9’;i+=2) s=10*s+ ch[i]-’0’; printf(“%d\n”,s);} 3. long fib(int n) {if(n>2) return(fib(n-1)+fib(n-2)); else return(2);} void main() {printf(“%d\n”,fib(4));} 4. main( ) { union example{ struct { int x; int y; }in; int a; int b; }e; e.a=2;e.b=1; e.in.x=e.a+e.b e.in.y=e.a*e.b; printf(“%d\n”,e.in.y);} 5. struct NODE {int k; struct NODE *link;}; void main() { struct NODE m[3],*p=m,*q=m+2; int i=0; while(p!=q){ p->k=++i;p++; q->k=i++;q--; } b6 q->k=i; for(i=0;i<3;i++)printf(“%d”,m[i].k); printf(“\n”);} 6. main() { int j,a[]={1,3,5,7,9},*p=a+3; for(j=3;j;j--) { switch(j) {case 1: case 2:printf("%d",*(p++)); case 3:printf("%d",*(--p)); }}} 7.main() {int x; for(x=1;x<=50;x++) if(x%2==0) if(x%3==0) if(x%5==0) printf("%d",x);} 8.main(){ int a,b; for(a=1,b=1;a<=50;a++) { if(b>8)break; if(b%3==1){b+=3;continue;} b-=5; } printf("%d\n",a);} 四、根据功能描述改正程序中的错误。 不得增行或删行,不得更改程序结构。(本题10分) 1.下列给定程序中,函数fun的功能是:实现两个整数的交换。例如给a和b分 别输入60和65,输出为:a=65b=60。(本小题6分) #include #include void fun(int a,b) { int t; b7 t=b;b=a;a=t; } main() { int a,b; printf("Enter a,b:"); scanf("%d%d",a, b); fun(&a,&b); printf("a=%d b=%dn",a,b); } 答案: scanf("%d%d",a, b); 改为:scanf("%d%d",&a,&b);------2分 fun(int a,b) 改为:fun(int*a,int *b) ------2分 t=b; b=a; a=t; 改为:t=*b;*b=*a;*a=t; ------2分 2.下述代码定义了一个结构体STRU,用其声明指针变量*s,并完成对这个指针变量的赋值、输出的任务。请指出下列程序的错误,并予以更正(本小题4分)struct STRU { int num; char name[20]; float score; struct STRU *p1; }; main() { STRU *s=(struct STRU *)malloc(sizeof(struct STRU)); s.num=123; s->name=”zhang”; s->score=61.5; printf(“num=%d,name=%s,score=%f”,s->num,s->name, s->score); } 答案: s.num=123; 改为:s->num或(*s).sum------2分 s->name=”zhang”;改为:strcpy(s->name,”zhang”)------2分 b8 b 9 五、请用标准程序流程图描述下列问题的算法 (本题10分) 依次从键盘输入30个学生的《计算机实用基础》成绩,请分别统计不及格的人数和优秀(成绩不小于90)的人数,并打印输出统计结果。 答案: 六、编程题(本题20分) (考查课做前两道,考试课做后两道) 1. 某个公司采用公用电话传递数据,数据是四位的整数,在 传递过程中是加密的,加密规则如下:每位数字都加上 5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 (本小题10分) 开始 定义循环变量i 、成绩fScore 、不及格nuPass 和优秀计数器nGood 并初始化i>30i<60输入成绩 nuPass++ nGood++ i>=90 输出统计结果 结束 是 否 是否是 否 1分 1分 1分 1分 1分 i++ 1分 1分 1分1分 答案: main() { int a,i,aa[4],t; scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++) { aa[i]+=5; aa[i]%=10; } for(i=0;i<=3/2;i++) { t=aa[i]; aa[i]=aa[3-i]; aa[3-i]=t; } for(i=3;i>=0;i--) printf("%d",aa[i]); } 2. 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字 符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。(本小题10分) 例如:若字符串中的内容为****A*BC*DEF*G******* 删除后,字符串内容应该是:ABCDEFG void fun( char *a) { } main() { int s[81]; gets(s); fun(s); b10 puts(s); } 参考答案: fun( char *a) { int i=0; char *p=a; while(*p!='\0') { if(*p!='*') { a[i]=*p; i++; } p++; } a[i]='\0'; } 3. 60名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun(),它的功能是:找出学生的最低分,由函数值返回。(本小题10分) #include #include #define N 60 struct slist { double s; struct slist *next; }; typedef struct slist STREC; double fun(STREC *h) { } STREC * creat (double *s) b11 { STREC *h,*p,*q; int i=0; h=p=(STREC*)malloc(sizeof(STREC)); p->s=0; while(i { q=(STREC*) malloc(sizeof(STREC)); p->s=s[i]; i++; p->next=q; p=q; } p->next=NULL; return h; } outlist(STREC *h) { STREC *p; p=h->next; printf("head"); do { printf("->%2.0f ",p->s); p=p->next; }while(p!=0); printf("->NULL\n\n "); } main() {double s[N]={56,89,76,95,91,68,75,85}, max; b12 STREC *h; h=creat(s); outlist(h); max=fun(h); printf("min=%6.1f\n ",max); } 参考答案: double fun(STREC *h) { double max=h->s; while(h!=NULL) { if (max max=h->s; h=h->next; } return max; } 饱食终日,无所用心,难矣哉。——《论语?阳货》 b13