C语言试卷与答案
1999~2000学年“程序设计基础--C”试卷考试时间:2000年6月23日上午8:30-10:30注:请将答案写在答卷纸上试题一、单项选择题(每小题2分,共20分)1.C语言程序的三种基本结构是顺序结构、选择结构和______结构。A、循环B、递归C、转移D、嵌套2.若x是单精度实型变量,表达式(x=10/4)的值是_____。A、2.5B、2.0C、3D、23.表达式!x等价于_____。A、x==0B、x==1C、x!=0D、x!=14.若变量已正确定义且k的值是4,计算表达式(j=k--)后,_____。A、j=3,k=3B、j=3,k=4C、j=4,k=4D、j=4,k=35.算术运算符、赋值运算符和关系运算符的运算优先级按从高到低的顺序依次为_____。A、算术运算、赋值运算、关系运算B、关系运算、赋值运算、算术运算C、算术运算、关系运算、赋值运算D、关系运算、算术运算、赋值运算6.C语言中,形参的缺省的存储类说明是______。A、autoB、staticC、registerD、extern7.下列语句定义pf为指向float类型变量f的指针,_____是正确的。A、floatf,*pf=f;B、floatf,*pf=&f;C、float*pf=&f,f;D、floatf,pf=f;8.表达式sizeof(“key”)的值是______。A、1B、2C、3D、49.将程序prog.c编译后运行:prog–nlahelloworld则*(*(argv+2))是______。A、’p’B、‘-‘C、‘h’D、‘w’10.若a是整型变量,表达式~(a^~a)等价于______。A、~aB、1C、0D、2 试题二、填空题(每小题3分,共24分)1.写出语句printf("%d,%o,%x",0x12,12,012);的输出结果。 2.写出下列程序段的输出结果。#defineF(x)x-2#defineD(x)x*F(x)printf("%d,%d",D(3),D(D(3))); 3.写出下列程序段的输出结果。intk;char*s=“ABC”;for(k=10;k!=0;k--);printf("%d",k);while(*s++)putchar(*s);4.写出下列程序的输出结果。voidfun(intk){staticinta;printf(”%d,”,a);a+=k;}main()n{intk;for(k=1;k<=3;k++)fun(k);} 5.写出下列程序的输出结果。main(){structst{intx,y;}a[4]={{10,20},{30,40},{50,60},{70,80}};structst*p=a;printf("%d,",p++->x);printf("%d,",++p->y);printf("%dn",(a+3)->x);} 6.写出下列程序的输出结果。#include"stdio.h"voidmain(){intk,j,m,n,a[6][6],b[6];m=3,n=2;for(k=0;k
longfib(intg){switch(g){case0:return(0);case1:case2:return(2);}printf("g=%d,",g);return(fib(g-1)+fib(g-2));}main(){longk;k=fib(4);printf("k=%ldn",k);}n8.用typedef定义一个长度为10的整型数组NUM。 试题三、程序阅读题(每题5分,共20分)1.写出下列程序的输出结果。#includeintx,y,z;voidp(int*x,inty){--*x;y++;z=*x+y;printf("%d,%d,",*x,y);}voidmain(){x=5;y=2;z=0;p(&x,y);printf("%d,%d,%d--",x,y,z);p(&y,x);printf("%d,%d,%dn",x,y,z);}2.写出下列程序的输出结果,并指出该程序的功能。#includevoidmain(){intx,k;x=14;for(k=0;x!=0;x&=x-1)++k;printf("%dn",k);}3.写出下列程序的输出结果。#includevoidmain(){intv[]={6,3,4,1,2};intn=5;intgap,j,k,temp;for(gap=n/2;gap>1;gap/=2)for(j=gap;j=0&&v[k]>v[k+gap];k-=gap){temp=v[k];v[k]=v[k+gap];v[k+gap]=temp;}for(k=0;k<5;k++)printf("%d,",v[k]);}4.输入123450后,写出下列程序的输出结果。#defineLENsizeof(structline)#defineNULL0structline{intnum;structline*next;}main(){structline*p1,*p2,*head;intj,k=0;p1=p2=head=(structline*)malloc(LEN);scanf("%d",&p1->num);nwhile(p1->num!=0){p1=(structline*)malloc(LEN);scanf("%d",&p1->num);if(p1->num==0)p2->next=NULL;else{p2->next=p1;p2=p1;}k++;}p2->next=head;p1=head->next;p1=p1->next;for(j=1;j<=k;j++){printf("-->%d",p1->num);p1=p1->next;}} 试题四、程序填空题(每空2分,共20分) 1.输入10个点的坐标(设坐标为整数值),输出距原点最远的点(设唯一)的坐标及该点距原点的距离.#includevoidmain(){struct{intx,y;floatlength;}point[10];intk,sub=0;for(k=0;k<10;k++){scanf("%d%d",&point[k].x,&point[k].y);point[k].length=(1)}for(k=1;k<10;k++)if((2))(3)printf("(%d,%d)%fn",point[sub].x,point[sub].y,point[sub].length);}2.将输入的n个字符串连接成1个字符串,然后输出该字符串.#include#includevoidmain(){charstr[10][20],string[200];intk,n;scanf("%d",&n);for(k=0;k=’0’&&s[k]<=’9’||s[k]>=’a’&&s[k]<=’f’){if(s[k]>='0'&&s[k]<='9')(7)if(s[k]>='a'&&s[k]<='f')(8)k++;}returnd;} 4.函数month_day(year,yearday,&month,&day)的功能是将给定的某年第几天转换为相应的月和日。例如:调用month_day(1988,60,&m,&d)后,m的值是2,d的值是29(即1988年的第60天是1988年2月29日)。判别闰年的条件:能被4整除但不能被100整除或能被400整除。voidmonth_day(intyear,intyearday,int*pmonth,int*pday){staticintday_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};intk,leap;leap=year%4==0&&year%100!=0||year%400==0;for(k=1;yearday>day_tab[leap][k];k++)(9)*pmonth=(10)*pday=yearday;} 试题五、编程题(共16分)1.[程序说明](5分)请编写函数sum_fact(number),返回number的因子之和。(能整除number的数就是它的因子,number定义为int)例如sum_fact(6)=12(因为1,2,3,6是6的因子) 2.[程序说明](11分)文本文件input.txt中存放了一批整数,将其中每个数的因子之和顺序写入文件output.txt。(必须调用第1小题中定义的函数sum_fact(number)计算number的因子之和)例:若文件input.txt中存放了1,2,6,则每个数的因子之和分别是1312,它们被写入文件output.txt。 n1999~2000学年下《程序设计基础—C》答卷下框由教师填写:题号一二三四五总分得分 阅卷人 试题一、选择题(每小题2分,共20分)题号12345678910选择ABADCABDCC试题二、填空题(每小题3分,共24分)118,14,A27,-1330BC40,1,3,510,41,7063,7,11,7g=4,g=3,k=68typedefintNUM[10]试题三、程序阅读题(每小题5分,共20分)14,3,4,2,7—1,5,4,1,623统计二进制数中1的数目32,1,4,3,6,(4,1,2,3,6,j)4à3à4à5à1à2试题四、程序填空题(每空2分,共20分)(1)sqrt(point[k].x*point[k].x+point[k].y*point[k].y);(2)point[k].length>point[sub].length(3)sub=k;(4)strcpy(string,str[0]);(5)strcat(string,str[k]);(6)chars[]或char*s(7)d=d*16+s[k]-'0';(8)d=d*16+s[k]-'a'+10;(9)yearday-=day_tab[leap][k];(10)k试题五、编程题(第1题5分,第2题11分,共16分)n1、intsum_fact(intnumber)定义、变量说明、返回2分{intk,sum=0;if(number<0)number=-number;for(k=1;k<=number;k++)1分if(number%k==0)sum+=k;2分returnsum;}2、#include头文件、变量说明1分main(){FILE*fpin,*fpout;intx;if((fpin=fopen("input.txt","r"))==NULL){2分printf("Can'topenfileinput.txtn");exit(0);}if((fpout=fopen("output.txt","w"))==NULL){2分printf("Can'tcreatfileoutput.txt");exit(0);}while(!feof(fpin)){1分fscanf(fpin,"%d",&x);2分fprintf(fpout,"%d",sum_fact(x));2分}fclose(fpin);关闭文件1分fclose(fpout);}2000~2001学年《程序设计基础-C》试卷考试时间:2000年12月31日上午8:30-10:30注:请将答案写在答卷上 一、单项选择题(每小题2分,共30分)1.1. C语言程序中可以对程序进行注释,注释部分必须用符号_____括起来。A、‘{‘和’}’B、‘[‘和’]’C、“/*”和”*/”D、“*/”和”/*”2.2. 下列运算符中,优先级最低的是_____。A、*B、!=C、+D、=3.3. 若变量已正确定义,表达式(j=3,j++)的值是_____。A、3B、4C、5D、04.4. 已知字符‘a’的ASCII码为97,执行下列语句的输出是_____。printf("%d,%c",’b’,’b’+1);nA、98,bB、语句不合法C、98,99D、98,c1.5. 表达式strcmp(“box”,“boss”)的值是一个_______。A、正数B、负数C、0D、不确定的数2.6. 数组定义为inta[3][2]={1,2,3,4,5,6},数组元素_____的值为6。A、a[3][2]B、a[2][1]C、a[1][2]D、a[2][3]3.7. 要调用数学函数时,在#include命令行中应包含_____。A、”stdio.h”B、”string.h”C、”math.h”D、”ctype.h”4.8. 判断i和j至少有一个值为非0的表达式是_____。A、i!=0&&j!=0B、i*j!=0[yh1]C、!(i==0||j==0)D、i&&j5.9. 若a是基本整型变量,c是单精度实型变量,输入语句______是错误的。A、scanf(”%d,%f”,&a,&c);B、scanf(”d=%d,c=%f”,&a,&c);C、scanf(”%d%f”,&a,&c);D、scanf(”%d%f”,a,c);6.10. 若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于_____。A、p++B、x++C、*(p++)D、&x++7.11. 若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x,_____是正确的。A、p2=p1;B、p2=**p1;C、p2=&p1;D、p2=*p1;8.12. 下列程序段的输出是_____。intc[]={1,3,5};int*k=c+1;printf("%d",*++k);A、3B、5C、4D、69.13. 不正确的赋值或赋初值的方式是______。A、charstr[]="string";B、charstr[7]={'s','t','r','i','n','g'};C、charstr[10];str="string";D、charstr[7]={'s','t','r','i','n','g',’ ’};10.14. 对于以下结构定义,++p->str中的++加在_____。struct{intlen;char*str;}*p;A、指针str上B、指针p上C、str指的内容上D、以上均不是11.15. 对于如下说明,语法和语义都正确的赋值是_____。intc,*s,a[]={1,3,5};A、c=*s;B、s[0]=a[0];C、s=&a[1];D、c=a; 二、填空题(每小题2分,共20分)1.1. 写出下列程序段的输出结果。floatx1,x2;x1=3/2;x2=x1/2;printf("%d,%.1f",(int)x1,x2);2.2. 表达式(7<<1>>2^2)的值是_______。3.3. 写出下列程序段的输出结果。#defineA10n#defineB(A0)?2*f(n-1)+f(n-2):-1);}5.8. 写出下列程序段的输出结果。charstr[]="hellotworldn";printf("%d,%cn",sizeof(str),*(str+10));6.9. 输入12345#后,写出下列程序的输出结果。voidmain(){charc;for(c=getchar();getchar()!=’#’;c=getchar())putchar(c);}7.10. 执行程序find–nxouldtext.txt时,*++argv[1]的值是_______。三、程序阅读题(每题5分,共20分)1.1. 若输入3123<回车>,则以下程序的输出结果是_______。#include"stdio.h"voidmain(){inti,j,n,a[10];scanf("%d",&n);for(i=0;i,则以下程序的输出结果是_______。#include"stdio.h"#defineN10main(){intx[N],y1[N],y2[N];inti,j,n1,n2,t,p;n1=n2=0;for(i=0;iy1[j+1]){t=y1[j];y1[j]=y1[j+1];y1[j+1]=t;}for(i=0;iintz;voidp(int*x,inty){++*x;y--;z=*x+y+z;printf("%d,%d,%d#",*x,y,z);}voidmain(){intx=1,y=5,z=9;p(&x,y);printf("%d,%d,%d#",x,y,z);}2.4. 若输入-6+15*3/5=<回车>,则以下程序的输出结果是_______。#includevoidmain(){intm=0,sum=0;charc,oldc='+';do{c=getchar();if(c<='9'&&c>='0')m=10*m+c-'0';else{if(oldc=='+')sum+=m;elsesum-=m;m=0;oldc=c;printf("%d,",sum);n}}while(c!='=');} 四、程序填空题(每空2分,共20分)1.1. 下列程序的功能是创建单向链表。#include#includestructlink{charname[10];intmark;structlink*next;};voidinsert(char*,int);structlink*head=NULL;main(){charname[10];intmark;structlink*t;while(1){scanf("%s%d",name,&mark);if(strcmp(name,"#")==0)break;______(1)_______;}for(t=head;______(2)_______)printf("<%s>:%dn",t->name,t->mark);}voidinsert(char*name,intmark){structlink*p;p=______(3)_______;strcpy(p->name,name);p->mark=mark;______(4)_______;if(head!=NULL)______(5)_______;head=p;}2.2. prog.c是带命令行参数的程序。运行progfilename时,将文本文件filename中的内容原样输出;运行prog-ufilename时,将文本文件filename中的所有字母以大写方式输出(其余字符原样输出);运行prog-dfilename时,只将文本文件filename中的数字输出。#include#includevoidmain(intargc,char*argv[]){FILE*fp;char*filename,ch;inttag=0;if(argc<2||argc>3){printf(“Argumenterrorn”);return;}if(argc==3){if(strcmp(argv[1],“-u”)==0)tag=1;elseif(strcmp(argv[1],“-d”)==0)tag=2;nelse{printf(“Optionerrorn”);return;}______(6)_______;}elsefilename=argv[1];if(______(7)_______){printf(“Cannotopenfilen”);return;}while(______(8)_______){ch=fgetc(fp);if(tag==0)putchar(ch);elseif(tag==1)______(9)_______;elseif(______(10)_______)putchar(ch);}fclose(fp);} 五、编程题(共10分,混合班学生做第2题,其他学生做第1题)1.1. [程序说明](10分)输入m和n(m≥n≥0)后,计算下列表达式的值并输出。m!n!*(m-n)!要求将计算阶乘的运算写成函数fact(n),函数返回值的类型为float。 2.2. [程序说明](10分)编写函数strcmp(char*s1,char*s2)。若s1和s2均是数字串(包括+/-号),则按照十进制整数大小进行比较;否则按照Ascii序进行比较。s1大于/等于/小于s2时,分别输出1/0/-1。可以直接调用atoi函数。2000~2001学年《程序设计基础C》参考答案 一、单项选择题(每小题2分,共30分)题号123456789101112131415选择CDADABCBDBABCAC二、填空题(每小题2分,共20分) 11,0.5213-34c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’55,1060,-17-17813,d913510‘n’三、程序阅读题(每题5分,共20分) n11,2,3,2,3,1,3,1,2,24,8,16,24,76,89,35,25,11,9,32,4,6#2,5,9#40,-6,9,6,1,四、程序填空题(每空2分,共20分) (1)(1) insert(name,mark)(2)(2) t!=NULL;t=t->next(3)(3) (structlink*)malloc(sizeof(structlink))(4)(4) p->next=NULL(5)(5) p->next=head(6)(6) filename=argv[2](7)(7) (fp=fopen(filename,“r”))==NULL(8)(8) !feof(fp)(9)(9) putchar(toupper(ch))(10)(10) tag==2&&isdigit(ch)五、编程题(共10分,混合班学生做第2题,其他学生做第1题)1、#includefloatfact(int);main(){intm,n;floatval;scanf(“%d%d”,&m,&n);val=fact(m)/(fact(n)*fact(m-n));printf(“Value:%fn”,val);}floatfact(intn){if(n<=0)return1;return(fact(n-1)*n);}floatfact(intn){inti;floatf=1;for(i=1;i<=n;i++)f=f*i;returnf;} 2、#include#include#includeintstrcmp(char*s1,char*s2){inttoken=0,val1,val2,n,i; for(i=0;s1[i]!=’ ’;i++)if(s1[i]!=’+’&&s1[i]!=’-‘&&!isdigit(s1[i])){token=1;break;}for(i=0;!token&&s2[i]!=’ ’;i++)if(s2[i]!=’+’&&s2[i]!=’-‘&&!isdigit(s2[i])){token=1;break;}if(token==0)n{val1=atoi(s1);val2=atoi(s2);if(val1>val2)n=1;elseif(val1