第4页C语言第二部分C语言程序设计一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)21.以下声明中有语法错误的是21。A.char*x=thank;B.charx[];C.char*x(void);D.char(*x)[2];22.假定a为一个一维字符数组名,则引用数组元素a[k]的正确形式为22。A.a+kB.&a+kC.*(a+k)D.*a+k23.已有声明“intx;”,实现“若x的值是奇数,则输出x”这一功能的语句是23。A.if(x/2)printf(%d,x);B.if(x%2)printf(%d,x);C.if(x/2==1)printf(%d,x);D.if(x%2==0)printf(%d,x);24.假定一个函数的头部为“char*func(intn)”,则该函数返回值的类型是24。A.intB.int*C.charD.char*25.已知fun函数的头部为“voidfun(intx[],intn)”,main函数中有声明“inta[10]={1},b=10;”,欲在main函数中调用fun函数,则以下调用语句中正确的是25。A.fun(a,fun(a,b));B.fun(a[10],b);C.fun(a,a[0]);D.fun(b,a);26.已有声明“inta[3][4]={{3,4},{2,8,6}};”,则数组元素a[1][0]的值为26。A.2B.4C.6D.827.已有声明“intx=0,*p;”,则以下赋值表达式中正确的是27。A.p=xB.*p=*xC.&p=&xD.p=&x28.已有声明“charc='\72';”,则变量c包含28个字符。A.1B.2C.3D.429.已有声明“int*p;”,若用语句“p=(int*)malloc(20*sizeof(int));”动态申请一个int型数组存储区,则p所指向的数组中可存储29个int型数据。A.10B.20C.40D.8030.判断char型变量c1的值是否为小写字母的正确表达式为30。A.'a'=c1='z'B.c1=a&&c1=zC.'a'=c1||'z'=c1D.c1='a'&&c1='z'二、填空题(将答案填写在答题纸的相应答题号内,每个答案只占一行,共30分)基本概念(5分)1.已有声明“inta=-3;”,则表达式“a=0?a:-a”的值是(1)。2.&&、+、=是C语言中的三个运算符,其中优先级最高的是(2)。3.假定指针变量p指向对象的值为16,p+1指向对象的值为35,则*p++的值为(3)。4.在系统头文件中定义的符号常量NULL代表的数值(整数)是(4)。5.若需要打开一个已存在的非空文件F.txt并修改其中的部分数据,则打开文件F.txt的语句应是“fp=fopen(F.txt,(5));”。阅读程序(13分)6.以下程序运行时,输出到屏幕的结果是(6)。#includestdio.h第5页C语言intmain(){intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0;for(i=0;i3;i++)for(j=2;j=i;j--)t+=b[i][j];printf(%d\n,t);return0;}7.以下程序运行时,输出到屏幕的结果是(7)。#includestdio.hintmain(){char*str[]={one,two,three,four};puts(str[3]+1);return0;}8.以下程序运行时,输出到屏幕的结果是(8)。#includestdio.hintfun(intx,inty,intz){returnx*y*z;}intmain(){printf(%d,fun(1.5,2.5,3.5));return0;}9.以下程序运行时,输出到屏幕的结果是(9)。#includestdio.hintfun(char*s){if(*s=='\0')return0;elsereturn1+fun(s+1);}intmain(){charstr[]=China;printf(%d\n,fun(str));return0;}10.以下程序运行时,输出到屏幕的结果中第一行是(10),第二行是(11)。#includestdio.hintmain(){intx;chara;第6页C语言a=x=266;printf(%d\n%d,x,a);return0;}11.以下程序运行时,输出到屏幕的结果中第一行是(12),第二行是(13)。#includestdio.hintf(intn){ints=1;returns*=n;}intg(intn){staticints=1;returns*=n;}intmain(){inta=0,b=0,i;for(i=1;i4;i++){a=a+f(i);b=b+g(i);}printf(%d\n%d,a,b);return0;}12.以下程序运行时,输出到屏幕的结果中第一行是(14),第二行是(15)。#includestdio.hvoidfun(inta[],intb[],intn){intk,i,j;for(i=0;in;i++){k=n;for(j=0;jn;j++)if(a[i]=a[j])k--;b[k]=a[i];}}intmain(){inti,b[6],a[6]={1,3,4,2,5,0};fun(a,b,6);for(i=0;i6;i++)printf((i+1)%3==0?%4d\n:%4d,b[i]);return0;}13.以下程序运行时,若输入1到变量k1、输入85到变量k2,则输出到屏幕的结果中第一行是(16),第二行是(17),最后一行是(18)。第7页C语言#includestdio.hintsieve(intx[][4],intn,inty[][4],intkey1,intkey2,int*p1,int*p2){inti=0,k,m=0;while(in){if(x[i][1]==key1&&x[i][2]=key2&&x[i][3]=key2){for(k=0;k4;k++)y[m][k]=x[i][k];m++;}i++;}*p1=*p2=0;for(i=0;im;i++){*p1+=y[i][2];*p2+=y[i][3];}*p1/=m;*p2/=m;returnm;}intmain(){inta[6][4]={{101,1,97,90},{102,0,92,89},{103,0,88,78},{104,1,90,90},{105,1,60,70},{106,1,93,87}},b[6][4]={0};intcount=6,k1,k2,av1,av2,i,j;printf(key1=);scanf(%d,&k1);printf(key2=);scanf(%d,&k2);count=sieve(a,count,b,k1,k2,&av1,&av2);for(i=0;icount;i++){for(j=0;j4;j++)printf(%4d,b[i][j]);printf(\n);}printf(ave1=%d,ave2=%d\n,av1,av2);return0;}完善程序(12分)14.以下程序在20000~21000范围内验证数学命题:如果一个整数的奇数位上各位数字之和与该整数的偶数位上各位数字之和的差是11的倍数(若奇数位的各位数字之和小于或等于偶数位的各位数字之和,则对奇数位各位数字之和不断加11,直到其值大于偶数位各位数字之和为止),则这个数能被11整除。#includestdio.hintfun(longm){intodd,even;odd=even=(19);while(m0)第8页C语言{odd=odd+m%10;even=even+(20);m=m/100;}while((21)){odd=odd+11;}if((odd-even)%11==0)return1;elsereturn0;}intmain(){longk,n=20000,m=21000,j=0;for(k=n;k=m;k++){if((22))if(k%11==0){if(j++%10==0)putchar('\n');printf(%ld,k);}elseprintf(error);}return0;}15.以下程序的功能是反转一个字符串中单词的顺序。例如,将字符串“thereisnotry”中单词顺序反转后变为“trynoisthere”。假定以空格作为单词分隔符。#includestdio.h#includestring.h#includestdlib.hvoidreverseWords(charstr1[],charstr2[]){inttokenPos,wReadPos,wEnd,writePos;writePos=0;/*tokenPos记录向前扫描(从串尾到串首扫描)str1字符串时当前被判断字符的下标*/tokenPos=(23);while(tokenPos=0){if(str1[tokenPos]==''){str2[writePos++]=str1[tokenPos--];/*复制单词之间的空格*/}else{wEnd=tokenPos;/*wEnd记录str1字符串中被处理单词的尾字符下标*/while(tokenPos=0&&str1[tokenPos]!='')/*向前扫描到空格为止*/tokenPos--;wReadPos=(24);/*wReadPos记录str1字符串中被处理单词的首字符下标*/while(wReadPos=wEnd)str2[writePos++]=str1[wReadPos++];}第9页C语言}str2[writePos]=(25);/*在str2数组中置字符串的终止符*/}intmain(){char*sentence=thereisnotry,*reverse;reverse=(char*)malloc(strlen((26))+1);printf(%s\n,sentence);reverseWords(sentence,reverse);printf(%s\n,reverse);free(reverse);return0;}16.已知一个单向链表结点的数据结构定义如下:typedefstructpoint{intx;structpoint*next;}POT;函数creat的功能是:找出p指向的单向链表中数据值只出现一次的结点,将这些结点依次复制链接到q链表,函数返回q链表首结点的地址。POT*creat(POT*p){POT*q=NULL,*qr,*p0,*p1,*p2;intc;p0=(27);/*p0指向p链表首结点*/while(p0!=NULL){c=0;p1=p;/*p1指向p链表首结点*/while(p1!=NULL)/*依次将p1指向的每个结点中的数据与p0指向的结点中的数据做比较*/{if(p1-x==p0-x)c++;p1=(28);}if(c==1){/*将p0指向的结点中数据复制到p2指向的结点,将p2指向的结点链入q链表*/p2=(POT*)malloc(sizeof(POT));p2-x=p0-x;if(q==NULL)q=qr=(29);else{qr-next=p2;qr=p2;}}p0=p0-next;}qr-next=(30);returnq;}