• 328.00 KB
  • 2022-04-22 11:33:55 发布

清华大学出版社刘志海版《C程序设计与案例分析》习题参考答案.doc

  • 61页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'习题11.1C语言的主要优点有哪些?它与其他程序设计语言的区别是什么?答:(略)1.2什么是程序?程序设计的目的是什么?程序设计的步骤有哪些?答:(略)1.3简要叙述C程序的上机调试过程。答:(略)1.4冯·诺依曼结构指的是什么?计算机有哪些组成部分?各部分的功能是什么?答:(略)5.改写例1.3的程序,求三个数的最大值。#include"stdio.h"intmax(inta,intb,intc);voidmain(){inta,b,c,d;printf("inputtwonumbers:");scanf("%d%d",&a,&b);d=max(a,b,c);printf("maxvalue=%dn",d);}intmax(inta,intb,intc){intd;if(a>b)d=a;elsed=b;if(d>c)printf(“maxvalue=%dn”,d);elseprintf(“maxvalue=%dn”,d);return(d);} 习题22.1简答题(1)C语言为什么要规定对所有用到的变量要“先定义,后使用”?这样做有什么好处?答:凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确;每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元;指定每一变量属于一个类型;这就便于在编译时;据此检查该变量所进行的运算是否合法。(2)下列符号中,你可以选用哪些做标识符?哪些不可以?为什么?Look3page35-bifnext_e_2OK?i*j$答:可用作标识符的是:Look3、page35、next_、e_2;其余的不可以,因为标识符是由字母或下划线开始的,由字母、下划线、数字组成的字符串,另外,关键字是不能够作为标识符的。(3)字符常量与字符串常量有什么区别?答:在C语言当中,通过“”这个特殊字符作为判断字符串结尾的标志,所以,即使一个空字符串,也要占用一个字符;另外,值得注意的是,在字符串中“”这个字符是不显示的。而字符常量在内存空间中,只占用一个字节的空间来存放字符说对应的ASCII码值。2.2填空题(1)下面程序的运行结果是。#includevoidmain(){chara=2,b="a";intc;c=a+b;a=c;printf("%d,%d,%dn",a,b,c);printf("%c,%c,%cn",a,b,c);}运行结果为:99,97,99c,a,c(2)求下面算术表达式的值。①设x=2.5,a=7,y=4.7,表达式x+a%3*(int)(x+y)%2/4的值是2.500000。②设a=2,b=3,x=3.5,y=2.5,表达式(float)(a+b)/2+(int)x%(int)y的值是3.500000。2.3编程题(1)要将“China” 译成密码,密码规律是,用原来的字母后第4个字母代替原来的字母。例如,字母‘a’后面第4个字母为‘e’。因此,“China”应译为“Glmre”。请编写程序,用赋初值的方法使c1、c2、c3、c4、c5这5个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使c1、c2、c3、c4、c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。答:#includevoidmain(){charc1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;printf(“%c%c%c%c%cn”,c1,c2,c3,c4,c5);}(2)从键盘输入一个小写英文字母,将其转换成大写字母输出结果。如小写字母c,转换成大写字母时用小写字母的ASCII-32即可。答:#includevoidmain(){charc;scanf(“%c”,&c);if(c>’a’&&c<’z’)c=c-32;printf(“%c”,c);}(3)改写例2.6程序,查看一个基本整型int数字在内存的存储。#includevoidmain(){intn=10;int*p=(int*)&n+3;for(inti=0;i<=3;i++){printf("%X");for(intj=0;j<=7;j++)printf("%d",(*p>>(7-j))&0x01);printf("n");p--;}} 习题33.1单项选择题(1)若有说明语句charc=‘72’;,则变量c(A)。A.包含1个字符  B.包含2个字符 C.包含3个字符 D.说明不合法,c值不确定(2)下列数据中属于“字符串常量”的是(B)。A.ABCB.“ABC”C.‘ABC’D.‘A’(3)C语言中,运算对象必须是整型的运算符是(B)。A./B.%C.+D.-(4)若有以下定义:chara;intb;floatc;doubled;则表达式a*b+d-c值的类型为(D)。A.floatB.intC.charD.double(5)执行语句“x=(a=3,b=a--)”后,x,a,b的值依次是(C)。A.3,3,2B.3,2,2C.3,2,3D.2,3,2(6)若有代数式3ae/bc,则不正确的C语言表达式是(C)。A.a/b/c*e*3B.3*a*e/b/cC.3*a*e/b*cD.a*e/b/c*3(7)设整型变量n的值为2,执行语句“n+=n-=n*n;”后,n的值是(C)。A.0B.4C.-4D.2(8)已知a=5,b=8,c=10,d=0;表达式的值为真的是(D)。A.a*2>8+2B.a&&dC.(a*2-c)||dD.a-bc4)后,s,t的值为(D)。A.1,2B.1,1C.0,1D.1,0 (11)设有定义:inta=2,b=3,c=4;,则以下选项中值为0的表达式是(A)。A.(!a==1)&&(!b==0);B.(a=Y>=ZC.(X>=Y)‖(Y>=Z)D.(X>=Y)&&(Y>=Z)(13)表达式(int)3.6*3的值为(A)。A.9B.10C.10.8D.18(14)以下语句的输出结果是(D)。inta=-1,b=4,k;k=(++a<0)&&!(b--<=0);printf("%d,%d,%dn",k,a,b);A.1,0,4B.1,0,3C.0,0,3D.0,0,4(15)已有定义intx=3,y=4,z=5;则表达式“!(x+y)+z-1&&y+z/2”的值是(D)。A.6B.0C.2D.13.2阅读程序写结果(1)若x和a均是int型变量,计算表达式x=(a=4,6*2)后的x值为12。(2)若a是int型变量,且a的初值为6,则计算a+=a-=a*a表达式后a的值为-60。(3)若有以下定义,intm=5,y=2;则计算表达式y+=y-=m*=y后的y值是-16。(4)若有定义intb=7;floata=2.5,c=4.7;,则下面表达式的值为5.500000。a+(int)(b/3*(int)(a+c)/2)%4(5)若x为int类型,请以最简单的形式写出与逻辑表达式!x等价的C语言关系表达式x==0。(6)以下程序运行后的输出结果是3。voidmain(){intp=30;printf("%dn",(p/3>0?p/10:p%3));}(7)设y是int型变量,请写出判断y为奇数的关系表达式(y%2)==1。 习题44.1单项选择题(1)若以下选项中的变量已正确定义,则正确的赋值语句是___C___。A.x1=26.8%3B.1+2=x2C.x3=0x12D.x4=1+2=3;(2)以下程序输出结果是___D___。voidmain(){inta=0,b=0,c=0,d=0;if(a=1)b=1;c=2;elsed=3;printf("%d,%d,%d,%dn",a,b,c,d);}A.0,1,2,0B.0,0,0,3C.1,1,2,0D.编译有错(3)与while(E)中的(E)不等价的表达式是(C)。A.(!E==0)B.(E>0‖E<0)C.(E==0)D.(E!=0)(4)以下程序段的输出结果是A。voidmain(){intx=3;do{printf("%3d",x-=2);}while(!(--x));}A.1B.30C.1-2D.死循环(5)执行下面程序后,a的值为B。#includevoidmain(){inta,b;for(a=1,b=1;a<=100;a++){if(b>=20)break;if(b%3==1){b+=3;continue;}b-=5;}printf("%d",a);} (6)下面程序输出的是B。#includevoidmain(){inty=9;for(;y>0;y--){if(y%3==0){printf("%d",--y);continue;}}}A.741B.852C.963D.875421(7)以下程序的输出结果是A。#includevoidmain(){inti;for(i=1;i<=5;i++){if(i%2)printf("*");elsecontinue;printf("#");}printf("$n");}A.*#*#*#$B.#*#*#*$C.*#*#$D.*#*#*$(8)以下程序的输出结果是D。#includevoidmain(){intk=4,n=4;for(;nvoidmain(){floatc,f;scanf(“%f”,&f);printf(“%f”,c=(f-32)*5/9);}(2)请为如下分段函数编写程序,当输入一个x值,计算输出y的数值:答:#includevoidmain(){intx,y;scanf(“%d”,&x);if(x<=1)y=x;elseif(x<10)y=2*x-1;elsey=3*x-11;printf(“y=%d”,y);}(3)输入一个字符,试编程判断是字母、数字还是特殊字符。答:#includevoidmain(){charc;scanf(“%c”,&c);if(c>=0&&c<=9)printf(“数字”);elseif(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’)printf(“字母”);elseprintf(“数字”);}(4)编写程序,从键盘输入一个字符,若为大写则转换为小写输出,若为小写则转换为大写输出,其他输入则输出"Error"。答:#include voidmain(){charc;scanf(“%c”,&c);if(c>=’a’&&c<=’z’)printf(“%c”,c-32);elseif(c>=’A’&&c<=’Z’)printf(“%c”,c+32);elseprintf(“Error”);}(5)输入一个不大于整型数最大值(2147483647)的整数,判断是几位数字,然后输出各位数字之和。#includeintmain(){intnum,sum=0,count=0; printf("输入一个整数:");scanf("%d",&num);while(num>0){sum+=num%10;count++;num=(num-num%10)/10;}printf("位数:%dn",count);printf("各位之和:%dn",sum);return0;}(6)输入整数x,y和z,若x2+y2+z2大于1000,则输出x2+y2+z2的值,否则输出x+y+z的值。#includevoidmain(){intx,y,z;scanf("%d,%d,%d",&x,&y,&z);{if(x*x+y*y+z*z>1000)printf("%dn",x*x+y*y+z*z);else printf("%dn",x+y+z);}}(7)百元百鸡问题:现有一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少只?#includevoidmain(){intx,y,z;for(x=1;x<=20;x++){for(y=1;y<=33;y++){z=100-x-y;if((z%3==0)&&(5*x+3*y+z/3==100))printf("%d,%d,%dn",x,y,z);}}}(8)输出1-100之内的所有勾股数,即两个数的平方和等于第三个数的平方。#includevoidmain(){intx,y,z;for(x=1;x<=100;x++){for(y=1;y<=100;y++){for(z=1;z<=100;z++){if(x*x+y*y-z*z==0)printf("%d,%d,%dn",x,y,z);}}}}(9)编程序按下列公式计算e的值(精度为1e-6)。e=1+1/1!+1/2!+1/3!+……1/n! 答:#include#includelongni(intx1){longx2=1;inti;for(i=1;i<=x1;i++)x2=i*x2;returnx2;}voidmain(){floatt=1,tt;ints=1,m=1;longn=1;do{tt=t;n=ni(m);t+=(float)s/n;m++;}while(fabs(t-tt)>=1e-6);printf("e=%fn",t);}(10)编程计算下列表达式:s=1!+2!+3!+4!+……+10!答:#includevoidmain(){longfac(intn);inti;longsum=0;for(i=1;i<=10;i++)sum=sum+fac(i);printf(“s=1!+2!+3!+4!+……+10!=%ld”,sum);}longfac(intn){staticlongf=1;f=f*n;return(f); }(11)利用公式求的近似值.答:#include#includeintmain(){intsign=1;doublepi=0.0,n=1.0,term=1.0;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}pi=pi*4;printf("pi=%10.8fn",pi);return0;}(12)编程输出满足以下条件的所有三位整数:该数的各位数字的阶乘之和等于该数本身。如:153=1!+5!+3!。#includevoidmain(){intjiech(intk);inta,b,c,i;for(i=100;i<=999;i++){a=i/100;b=i%100/10;c=i/10;if(i==jiech(a)+jiech(b)+jiech(c))printf("%4dn",i);}} jiech(intk){intn=1,m=1;while(n<=k){m=m*n;n++;}return(m);}(13)编程实现正弦函数,输入一个角度数值,输出对应的正弦数值,已知正弦函数的展开公式为:答:#includefloatfun(float,int);floatsin(int,float);floatterm(int);voidmain(){intn;floatx;printf(“请输入n,x值:n”);scanf(“%d”,&n);scanf(“%f”,&x);printf(“sin(%f)=%f”,x,sin(n,x));}floatsin(intn,floatx){inti;floats=0.0;for(i=1;i<=n;i++)s+=fun(-1.0,i-1)*fun(x,2*i-1)*term(2*i-1);return(s);} floatfun(floatx,intn){inti;floatp=1.0;for(i=0;i#includevoidmain(){inta;scanf("%d",&a);printf("%x",a);getch();}(15)将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。#includevoidmain(){intn,i;printf("pleaseinputanumber:");scanf("%d",&n);printf("%d=",n);for(i=2;i<=n;i++){while(n!=i) {if(n%i==0){printf("%d*",i);n=n/i;}elsebreak;}}printf("%dn",n);}(16)编程输出Fibonacci数列的前20项的数值,Fibonacci数列格式为:1123581321…,即从第三项开始,其值为前两项的和。#includevoidmain(){intf1=1,f2=1,f3;inti;printf("%d,%d,",f1,f2);for(i=1;i<=18;i++){f3=f1+f2;printf("%d,",f3);f1=f2;f2=f3;}}(17)输入一个小写金额数字,输出其大写数字格式,如输入:“1234.56”,输出“壹仟贰佰叁拾肆元五角六分”。#include"stdio.h"voidmain(){doublex;intm,k,n,i,j,f=0,t,a=0,b;scanf("%lf",&x);if(x>=10000){ printf("inputerror!");return;}m=(int)x;//整数部分k=(int)(x*100-m*100);//小数部分if(x<0.01){printf("零圆零角零分n");return;}//-----------处理整数部分------------n=10000,j=1000;for(i=1,b=0;i<=4;i++)//最多4位整数{a=(m%j==0)?1:0;//是否为j的整倍数t=m%n/j;n=n/10;j=j/10;if(t==0)b++;elseb=0;if(t>0&&f==0)//自首个不为零数字开始f=1;if(f==1){switch(t){case0:if(a==0){printf("零");if(b==2)//连续两个零则删除后一个零printf("bb");}break;case1: printf("壹");break;case2:printf("贰");break;case3:printf("叁");break;case4:printf("肆");break;case5:printf("伍");break;case6:printf("陆");break;case7:printf("柒");break;case8:printf("捌");break;case9:printf("玖");break;}switch(i){case1:if(t>0)printf("仟");break;case2:if(t>0)printf("佰");break;case3:if(t>0)printf("拾");break;case4:printf("圆");break;}} }//-----------处理小数部分------------if(k==0){printf("整n");return;}n=100,j=10;for(i=1,f=0;i<=2;i++)//最多4位整数{t=k%n/j;n=n/10;j=j/10;if(t>0&&f==0)//自首个不为零数字开始f=1;if(f==1){switch(t){case0:if(i==1)printf("零");break;case1:printf("壹");break;case2:printf("贰");break;case3:printf("叁");break;case4:printf("肆");break;case5:printf("伍");break;case6:printf("陆");break;case7:printf("柒");break; case8:printf("捌");break;case9:printf("玖");break;}if(i==1)printf("角");elseif(t>0)printf("分");}}}习题55.1单项选择题(1)以下对一维数组a的正确说明是(D)。  A.chara(10);   B.inta[];  C.intk=5,a[k];D.chara[]={"a","b","c"};(2)以下正确的数组定义语句是(D)。A.chara[5]={"1","2","3","4","5",""};B.intb[2][]={{1},{2}};C.floatc[][3]={1,2,3,4,5};D.chard[5]="CHINA";(3)不能把字符串Hello!赋给数组b的语句是(B)。A.charb[10]={"H","e","l","l","o","!"};B.charb[10]; b="Hello!";C.charb[10]; strcpy(b,"Hello!");D.charb[10]="Hello!";(4)若有如下定义和语句,能实现对数值为3数组元素的引用的是(A)。int a[]={1,2,3,4,5},*p=a;A.*(a+2)B.a[p-3]C.p+2D.a+3(5)若有定义inta[10],*p=a;,则p+5表示(C)。A.元素a[5]的地址B.元素a[5]的值  C.元素a[6]的地址D.元素a[6]的值(6)以下程序运行后的输出结果是(C)。voidmain(){chara[7]="a0a0";inti,j;i=sizeof(a);j=strlen(a);printf("%d%dn",i,j);}A.22B.76C.72D.62(7)若已定义:inta[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0≤i≤9,则对a数组元素不正确的引用是(D)。A.a[p-a]B.*(&a[i])C.p[i]D.a[10](8)定义如下变量和数组:intk;inta[3][3]={1,2,3,4,5,6,7,8,9};则下面语句的输出结果是(A)。for(k=0;k<3;k++)printf("%d",a[k][2-k]);A.357B.369C.159D.147(9)有以下程序#include"stdio.h"#include"string.h"voidmain(){chara[]={"a","b","c","d","e","f","g","h",""};inti,j;i=sizeof(a);j=strlen(a);printf("%d,%dn",i,j);}(10)下面程序的运行结果是(B)。#include"stdio.h"voidmain(){intx[5]={1,2,3,4,5},*p=x,**q;q=&p;printf("%d,",*(p++));printf("%dn",**q);}A.1,1  B.1,2  C.2,2  D.2,3 程序运行后的输出结果是(D)。A.9,9B.8,9C.1,8D.9,85.2编程题(1)从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。#includevoidmain(){charstr[10],hex[10];inti,n=0,x=0;gets(str);for(i=0;str[i]!="";i++)if((str[i]>="0"&&str[i]<="9")||(str[i]>="a"&&str[i]<="f")||(str[i]>="A"&&str[i]<="F")){hex[n]=str[i];n++;}hex[n]="";puts(hex);for(i=0;hex[i]!="";i++){if(hex[i]>="0"&&hex[i]<="9")x=x*16+hex[i]-"0";elseif(hex[i]>="a"&&hex[i]<="f")x=x*16+hex[i]-"a"+10;elseif(hex[i]>="A"&&hex[i]<="F")x=x*16+hex[i]-"A"+10;}printf("转换为十进制是:%dn",x);}(2)有n个人围成一个圆圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号?#includevoidmain(){ inti=0;intn=0;intout=0;intnum=0;inta[1024]={0};printf("Inputn:");scanf("%d",&n);for(i=0;ivoidmain(){intc,sum=0;while((c=getchar())!=EOF)if(c==’1’)sum=1+sum*2;elsesum=sum*2;printf(“%d”,sum);}(4)编程输入10个学生5门课程的成绩,实现:①计算每个学生的平均分;②计算每门课程的平均分;③计算平均方差:,其中xi为第i个学生的平均分。答:#include#defineN10#defineM5floatscore[N][M];floata_stu[N],a_cour[M];intr,c;voidmain(){inti,j;floats_var(void);voidinput_stu(void);voidaver_stu(void);voidaver_cour(void);input_stu();aver_stu();aver_cour();printf(“nNo.cour1cour2cour3cour4cour5avern”);for(i=0;ivoidmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti,t;for(i=0;i<5;i++){t=a[i];a[i]=a[9-i];a[9-i]=t;}for(i=0;i<10;i++)printf(“%dn”,a[i]);}(6)不用strcat函数,利用数组编写两个字符串连接的程序。答:#include#includevoidmain(){chara[40],b[20];inti,len1;gets(a);gets(b);for(i=0;a[i]!="";i++);len1=i;for(i=0;b[i]!="";i++)a[i+len1]=b[i];a[i+len1]="";for(i=0;a[i];i++)printf(“%c”,a[i]);}(7)从键盘上输入10个评委的分数,去掉一个最高分,去掉一个最低分,求出其余8个人的平均分并输出平均分、最大值和最小值。答:#include voidmain(){floata[10],max,min,aver,sum=0;inti;printf(“请输入十个评委的分数:”);for(i=0;i<10;i++)scanf(“%f”,&a[i]);max=min=a[0];for(i=0;i<10;i++){if(a[i]>max)max=a[i];if(a[i]voidmain(){intx[4]={3,11,8,22};int*p=x,i,t=1;for(i=0;i<4;i++)t=t*p[i];printf(“各元素之积为:%d”,t);}(9)编程实现两个矩阵的乘积,并输出结果。#include"stdio.h"voidmain(){inta[2][3]={1,2,3,4,5,6},b[3][2]={9,8,7,6,5,4},i,j,k,c[2][2]={0};for(i=0;i<2;i++){for(j=0;j<2;j++){for(k=0;k<3;k++)c[i][j]+=a[i][k]*b[k][j];printf("%5d",c[i][j]);}printf("n");}}(10) 从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复的字符。如输入”ad2f3adjfeainzzzv”,则输出”23adefijnvz”。#includevoidmain(){chara[80];inti,j,n,t;scanf("%c",&a[i]);while(a[i]!="n"){i++;scanf("%c",&a[i]);}n=i;for(i=0;ia[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}for(i=1;ivoidmain(){inta[80][80],b[80],c[80];intn,i,j,index,max,t,k;scanf("%d",&n);printf("请输入%d的矩阵:",n);for(i=0;imax)max=a[i][j];b[i]=max;c[i]=i+1;}for(i=0;ib[index]);Index=j;if(index==i)continue;t=b[index];b[index]=b[i];b[i]=t;k=c[index];c[index]=c[i];c[i]=k;}printf("每行最大数排序后:n");for(i=0;ivoidmain(){inta[50][50],i,j,k,n,m;scanf("%d",&n);m=2*n-1;for(k=0;kvoidmain(){chara[4][50];inti,j,d=0,x=0,k=0,q=0;for(i=0;i<=3;i++){printf("请输入第%d行:n",i+1);gets(a[i]);for(j=0;j<50;j++){if(a[i][j]>="A"&&a[i][j]<="Z")d++;elseif(a[i][j]>="a"&&a[i][j]<="z")x++;elseif(a[i][j]="n")k++;elseq++;}}printf("d=%d,x=%d,k=%d,q=%d",d,x,k,q);} 习题66.1单项选择题(1)以下程序的输出结果是___C___。A.699B.669C.61515D.6615intd=1;fun(intp){staticintd=5;d+=p;printf("%d",d);return(d);}voidmain(){inta=3;printf("%dn",fun(a+fun(d)));}(2)以下所列的各函数首部中,正确的是__C____。A.voidplay(var:Integer,varb:Integer)B.voidplay(inta,b)C.voidplay(inta,intb)D.Subplay(aasinteger,basinteger)(3)以下程序的输出结果是___A___。A.1B.2C.3D.4longfun(intn){longs;if(n==1||n==2)s=2;elses=n-fun(n-1);returns;}voidmain(){printf("%ldn",fun(3));}(4)以下程序运行后,输出结果是___B____。A.84B.83C.95D.99intd=11;fun(intp){intd=5;d+=p;printf("%d",d);}voidmain() {inta=3;fun(a);d=a;printf("%dn",d);}(5)若有以下调用语句,则不正确的fun函数的首部是(D)。A.voidfun(intm,intx[])B.voidfun(ints,inth[41])C.voidfun(intp,int*s)D.voidfun(intn,inta)voidmain(){…inta[50],n;…fun(n,&a[9]);…}(6)有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中,含有的实参个数是(A)。A.3B.4C.5D.有语法错(7)有如下程序intfunc(inta,intb){return(a+b);}voidmain(){intx=2,y=5,z=8,r;r=func(func(x,y),z);printf("%dn",r);}该程序的输出的结果是(D)。A.12B.13C.14D.15(8)有如下程序longfib(intn){if(n>2) return(fib(n-1)+fib(n-2));else return(2);}voidmain(){printf("%dn",fib(3));}该程序的输出结果是(B)。A.2B.4C.6D.8(9)以下程序的输出结果是(C)。A.0B.29C.31D.无定值fun(intx,inty,intz){z=x*x+y*y;} voidmain(){inta=31;fun(5,2,a);printf("%d",a);}(10)当调用函数时,实参是一个数组名,则向函数传送的是(B)。A.数组的长度B.数组的首地址C.数组每一个元素的地址D.数组每个元素中的值6.2编程题(1)计算s=5!+8!答:#includevoidmain(){floatfac(intn);floats;printf(“s=%f”,fac(5)+fac(8));}floatfac(intn){floatm;if(n==1)m=1;elsem=n*fac(n-1);return(m);}(2)编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调用函数中完成复制。答:#include#includevoidmain(){voidcopy_str(char*p,char*q,intn);chara[30],b[30];intm;printf(“Pleaseinputthestring:”);gets(a);printf(“nPleaseinputthenumber:”);scanf(“%d”,&m);copy_str(a,b,m-1);printf(“n%s”,b); }voidcopy_str(char*p,char*q,intn){inti=0;while(*(p+n+i)!=’’){*(q+i)=*(p+n+i);i++;}*(q+i)="";}(3)从键盘输入一个字符串,然后按照下面要求输出一个新字符串,新串是在原串中,每三个字符之间插入一个空格,如原串为abcd,则新串为abcd.要求在函数insert中完成新串的产生,并在函数中完成所有相应的输入和输出。答:#include#includevoidmain(){voidinsert(chars[]);chars[100];gets(s);insert(s);}voidinsert(chars[]){charc;char*p;intflag=0;p=s;while(*p!=""){putchar(*p);++p;++flag;if(flag==3){putchar("");flag=0; }}}(4)设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列,进行逆序处理时要求使用函数。试编程。答:#includevoidmain(){voidp(inta[],intm,intn);inta[]={0,1,2,3,4,5,6,7,8,9};intm,n,i;scanf(“%d,%d”,&m,&n);p(a,m,n);for(i=0;i<10;i++)printf(“n%d”,a[i]);}voidp(inta[],intm,intn){inti,t;for(i=0;ivoidmain(){chararr[20];inti,num=0;printf(“Pleaseinputcommand:n”);scanf(“%*s%s”,arr);for(i=0;arr[i]!=’’;i++)if(arr[i]>=65&&arr[i]<=90||arr[i]>=97&&arr[i]<=122)num++;printf(“ThenumberofEnglishcharactersis%d.n”,num);}或#includevoidmain(intargc,char*argv[]){ intn=0;char*s;for(s=argv[1];*s;s++){if((‘A’<=*s&&*s<=’Z’)||(‘a’<=*s&&*s<=’z’))n++;}printf(“Count=%d”,n);(6)编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔输出该串。答:#include"stdio.h"#include"string.h"#defineN100voidmain(){charx[N];inti,k;printf("inputastring:");gets(x);k=strlen(x);for(i=0;i<((k%2==0)?(k/2):(k/2+1));i++)puts(x+i*2);}(7)有十个字符串,在每个字符串中,找出最大字符按一一对应的顺序放入一维数组a中,即第i个字符串中的最大字符放入a[i]中,输出每个字符串中的最大字符,要求用函数实现。答:#includevoidmain(){voidp(chars[][20],chara[]);chars[10][20];chara[10];inti;for(i=0;i<10;i++)gets(s[i]);p(s,a);for(i=0;i<10;i++)printf(“%c”,a[i]);} voidp(chars[][20],chara[]){inti,j;for(i=0;i<10;i++){a[i]=s[i][0];for(j=1;s[i][j]!=’’;j++){if(a[i]voidmain(){voidp(inta[],intb[],intc[]);inta[]={1,3,5,7,9},b[]={2,4,6,8},c[10],i=0;p(a,b,c);}voidp(inta[],intb[],intc[]){inti=0,j=0,k=0;while(i<5&&j<4)if(b[j]voidmain(){ intn0=0,n1=0,n2=0,n3=0,n4=0,data;while(1==1){scanf(“%d”,&data);if(data==0)n0++;elseif(data==1)n1++;elseif(data==2)n2++;elseif(data==3)n3++;elseif(data==4)n4++;elseif(data==-1){printf(“n0=%d,n1=%d,n2=%d,n3=%d,n4=%d,”,n0,n1,n2,n3,n4);break;}}}(10)从键盘输入两个字符串a和b,要求不用strcat把b中的前五个字符连接到a中,如果b的长度小于5,则把b的所有元素都连接到a中,试编程。答:#include#includevoidmain(){chara[20],b[20];inti,len_a,len_b;printf(“请输入字符串a:n”);gets(a);printf(“请输入字符串b:n”);gets(b);len_a=strlen(a);len_b=strlen(b);if(len_b<5){for(i=len_a;ivoidprintData(intdata){if(data==0){return;}printf("%d",data%10);printData(data/10);}intmain(){intdata;printf("enteranumber:");scanf("%d",&data);printData(data);printf("n");return0;}(12)编写递归程序,实现字符串的倒序输出。如输入"abc"则输出"cba"。#include"stdio.h"voidinverse(char*p){if(*p=="")return;inverse(p+1);printf("%c",*p);//每次输出一个字符}intmain(intargc,char*argv[]){ inverse("abc");printf("n");return0;}(13)编写递归函数实现十进制整数向二进制数字的转换。#includevoidf(intn){if(n>1)f(n/2);printf("%d",n%2);}intmain(){intn;scanf("%d",&n);f(n);return0;}(14)已知x的n阶勒让德多项式值计算公式如下,编程输入x的值,输出n阶勒让德多项式的值。#includefloatp(intn,intx);voidmain(){inta,b;scanf("%d,%d",&a,&b);printf("p%d(%d)=%f",a,b,p(a,b));}floatp(intn,intx){if(n==0)return1; if(n==1)returnx;elsereturn((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n;}(15)编写一个函数,计算字符串的长度,要求用字符指针实现,在main函数中调用函数,并输出字符串的长度。#includevoidMyStrlen(char*pa);main(){chara[80];printf("pleaseinputa:");gets(a);MyStrlen(a);return0;}voidMyStrlen(char*pa){intcount=0;while(*pa!=""){pa++;count++;}printf("字符串的长度为:%dn",count);}(16)从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数对换,最大的数与最后一个数对换。要求将进行数据交换的处理过程编写成一个函数,函数中对数据的处理要用指针方法实现。#includevoidchange(int*a,intn);#defineN10voidmain(){inta[10],i=0; printf("Input10datas:");for(i=0;i*(a+i)){min=*(a+i);x=i;}}temp1=*(a+m);*(a+m)=*(a+9);*(a+9)=temp1;temp2=*(a+x);*(a+x)=*(a+0);*(a+0)=temp2;for(i=0;i<10;i++){printf("%d",a[i]); }}(15)利用指向行的指针变量求4×3数组各行元素之和。#includeintmain(){inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{11,22,33}};int(*p)[3];inti,j,s;for(i=0;i<4;i++){p=&a[i];//指向第i行s=0;for(j=0;j<3;j++)s+=*(*p+j);printf("sumofline%d=%dn",i+1,s);}return0;}(16)找出一个2×3的矩阵中的最大值及其行下标和列下标,要求调用子函数FindMax(intp[][3],intm,intn,int*pRow,int*pCol)实现,最大值以函数的返回值得到,行下标和列下标在形参中以指针的形式返回。#includeintFindMax(intp[][3],intm,intn,int*pRow,int*pCol);voidmain(){inta[2][3],i,j,row,col,max;printf("Input6datas:");for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);printf("n****array****n");for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%4d",a[i][j]); printf("n");}max=FindMax(a,2,3,&row,&col);printf("nMax=%d,Row=%d,Col=%dn",max,row,col);}intFindMax(intp[][3],intm,intn,int*pRow,int*pCol){int*max,i,j;max=p[0];*pRow=0;*pCol=0;for(i=0;i#includevoidcopystr(char*p1,char*p2,intm){intn=0;while(ny||(y2==y&&m2>m)||(y2==y&&m2==m&&d2>=d))//后日期大{s=days(y2,m2,d2)-days(y2,m,d);//先计算同年的不同两天差距for(i=y+1;i<=y2;i++)//间隔整年的天数s+=yeardays(i);}else//前日期大{s=days(y,m2,d2)-days(y,m,d);//先计算同年的不同两天差距for(i=y-1;i>=y2;i--)//间隔整年的天数s-=yeardays(i);}printf("daysbetween%d-%d-%dand%d-%d-%dis%lddaysn",y,m,d,y2,m2,d2,s);}//计算一年的天数intyeardays(inty){if(y%4==0&&y%100||y%400==0)return(366);elsereturn(365);}//计算该天在一年中是第多少天intdays(inty,intm,intd){intx[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},i,s=0;if(y%4==0&&y%100||y%400==0)x[2]+=1;for(i=0,s=d;i(y)?(x):(y)main(){inta=5,b=2,c=3,d=3,t;t=MAX(a+b,c+d)*10;printf(“%dn”,t);}A.70B.60C.7D.6(4)以下关于文件包含的说法中错误的是(C)。A.文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。B.文件包含处理命令的格式为#include“包含文件名”或#include<包含文件名>C.一条包含命令可以指定多个被包含文件D.文件包含可以嵌套,即被包含文件中又包含另一个文件。(5)下面程序的功能是通过带参的宏定义求圆的面积,填空。#include“stdio.h”#definePI3.1415926#defineAREA(r)____D_______main(){floatr=5;printf("%f",AREA(r));}A.PI*(r)*(r)B.PI*(r)C.r*rD.PI*r*r7.2简答题(1)带参数的宏与函数的区别。答:(略)(2)包含指令的作用是什么? 答:(略)(3)文件包含应该注意哪些问题?答:(略)(4)条件编译有那几种形式?答:(略)(5)分别用函数和带参的宏,从3个数中找出最大数。答:函数实现:#includevoidmain(){intmax(intx,inty,intz);inaa,b,c;printf(“input3integer:”);scanf(“%d,%d,%d”,&a,&b,&c);printf(“max=%dn”,max(a,b,c));}intmax(intx,inty,intz){return((x>y?x:y)>z?(x>y?x:y):z);}带参的宏实现:#include#defineMAX(a,b)((a)>(b)?(a):(b))voidmain(){inta,b,c;printf(“input3integer:”);scanf(“%d,%d,%d”,&a,&b,&c);printf(“max=%dn”,MAX(MAX(a,b),c));}习题88.1单项选择题(1)有以下程序段,则叙述中正确的是(B)。typedefstructNODE{intnum;structNODE*next;}OLD;A.以上的说明形式非法B.NODE是一个结构体类型C.OLD是一个结构体类型D.OLD是一个结构体变量(2)若有如下定义,则下面在scanf函数调用语句中对结构体成员的引用不正确的是()。 structpupil{charname[20];intage;intsex;}pup[5],*p;A.scanf("%d",p->age);B.scanf("%s",pup[0].name);C.scanf("%d",&pup[0].age);D.scanf("%d",&(pup[1].sex));(3)有下列结构体,对该结构体变量stu的成员项引用不正确的是(D)。struct  student{  intm; float n; }stu,*p;A.stu.nB.p->mC.(*p).mD.p.stu.n8.2编程题(1)定义一个结构体变量(包括年、月、日),计算该日在本年中是第几天。structdatetime{intyear;intmonth;intday;};#includeintdays(structdatetime);voidmain(){intcount_day;structdatetimedate;printf("请输入年月日:n");scanf("%d%d%d",&date.year,&date.month,&date.day);count_day=days(date);printf("日期%d/%2d/%2d是%d的第%d天n",date.year,date.month,date.day,date.year,count_day);}intdays(structdatetimedate){intresult=0;intyear=date.year,month=date.month,day=date.day;switch(month-1){case12:result+=31;case11: result+=30;case10:result+=31;case9:result+=30;case8:result+=31;case7:result+=31;case6:result+=30;case5:result+=31;case4:result+=30;case3:result+=31;case2:{if(year%400==0||year%100!=0&&year%4==0)result+=28;elseresult+=29;}case1:result+=31;}result+=day;returnresult;}(2)已知一个学生的信息由学号(intid)、姓名(charname[20])、年龄(intage)、语文(floatchinese)、数学(floatmath)、英语(floatenglish)三门功课成绩组成,请定义学生结构体并用循环方式输入10个同学的信息,输出每个学生三门功课的平均值。答:#include#defineN10structstudents{intid;charname[20];intage;floatchinese;floatmath;floatenglish; }stu[N];voidmain(){inti,j,k;for(i=0;itypedefstructperson{intcount;charname[10];}person;intmain(){inti,flag;personper[5]={{0,"zhang"},{0,"wang"},{0,"li"},{0,"zhao"},{0,"liu"}};printf("输入投票编号(0-zhang,1-wang,2-li,3-zhao,4-liu,5-结束投票:");flag=0;while(i!=5){scanf("%d",&i);switch(i){case0:per[0].count++;break;case1: per[1].count++;break;case2:per[2].count++;break;case3:per[3].count++;break;case4:per[4].count++;break;case5:flag=1;break;}if(flag==1){break;}}printf("姓名t得到票数n");for(i=0;i<5;i++){printf("%st%dn",per[i].name,per[i].count);}return0;}(3)用结构体编写程序,求3个长方柱的体积和表面积。#includestructbulk{floatlength;floatwidth;floatheigth;};voidvolume(structbulkb[]);//原函数的申明voidareas(structbulkb[]);voidmain(){inti;structbulkBULK[3];for(i=0;i<3;i++){printf("第%d个长方体的长宽高:n",i+1); scanf("%f%f%f",&BULK[i].length,&BULK[i].width,&BULK[i].heigth);}volume(BULK);//传递结构体areas(BULK);}voidvolume(structbulkb[])//计算体积{inti;for(i=0;i<3;i++){printf("第%d个长方体的体积%fn",i+1,b[i].length*b[i].width*b[i].heigth);}}voidareas(structbulkb[])//计算过表面积{inti;for(i=0;i<3;i++){printf("第%d个长方体的表面积%fn",i+1,2*(b[i].length*b[i].width+b[i].heigth*b[i].width+b[i].length*b[i].heigth));}}(5)建立一个单链表,把’A"–’Z’共26个大写字母插入到链表中,倒序输出。#include"stdio.h"#include"malloc.h"structchars{charch;structchars*next;}*h;/*定义创建链表头节点的函数*/structchars*create(){return(NULL);}/*定义插入节点的函数*/voidaddnode(charch){//空节点时直接插入新节点structchars*p=(structchars*)malloc(sizeof(structchars));p->ch=ch;if(h==NULL) {p->next=NULL;h=p;}//已存在的节点,查找待插入节点位置else{structchars*q=h;while(q!=NULL){if(q->ch<=ch)//前插法{p->next=q;if(h==q)//第一个节点h=p;elseq->next=p;break;}if(q->ch>=ch&&q->next==NULL)//最后一个节点{p->next=NULL;q->next=p;break;}if(q->ch>=ch&&q->next->ch<=ch)//中间节点{p->next=q->next;q->next=p;break;}q=q->next;}}}voidprintnode(){if(h==NULL){printf("NULLLIST!");return;}while(h!=NULL){ printf("%c",h->ch);h=h->next;}}voidmain(){charch;h=create();while(1){//输入任何非字母字符则退出循环scanf("%c%*c",&ch);if(!((ch>="A"&&ch<="Z")||(ch>="a"&&ch<="z")))break;addnode(ch);}printnode();}习题99.1简答题(1)C语言的文件系统分哪两种?有何特点?答:(略)(2)对文件的打开与关闭的含义是什么?为什么要打开和关闭文件?答:(略)9.2编程题(1)编程:从键盘输入一个字符串,把它输出到磁盘文件file1.txt中。答:#includevoidmain(){FILE*fp;charstr[81],ch;if((fp=fopen(“file1.txt”,”w”))==NULL){printf(“can’topenfile”);exit(0);}while((ch=getchar())!=’n’){fputc(ch,fp);} fclose(fp);fp=fopen(“file1.txt”,”r”);fgets(str,strlen(str)+1,fp);printf(“%sn”,str);fclose(fp);}(2)从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件string.txt中保存,输入的字符串以”#”结束。答:#include#include#includevoidmain(){FILE*fp;charstr[100];inti=0;if((fp=fopen(“string.txt”,”w”))==NULL){printf(“can’topenfile”);exit(0);}printf(“inputastring:n”);gets(str);while(str[i]!=’#’){if(str[i]>=’a’&&str[i]<=’z’)str[i]=str[i]-32;fputc(str[i],fp);i++;}fclose(fp);fp=fopen(“string.txt”,”r”);fgets(str,strlen(str)+1,fp);printf(“%sn”,str);fclose(fp);}(3)有两个磁盘文件a1.txt和a2.txt,各存放若干行字母,今要求把这两个文件中的信息按行交叉合并(即先是a1.txt的的第一行,接着是a2.txt中的第一行,然后是a1.txt的第二行,跟着是a2.txt的第二行,…),输出到一个新文件a3.txt中去。答:#include#include"stdio.h"main(){FILE*fp1,*fp2,*fp3;charstr[81]; if((fp1=fopen("a1.txt","r"))==NULL){printf("filea1cannotbeopenedn");exit(0);}if((fp2=fopen("a2.txt","r"))==NULL){printf("filea2cannotbeopenedn");exit(0);}if((fp3=fopen("a3.txt","w"))==NULL){printf("filea3cannotbeopenedn");exit(0);}while(!feof(fp1)&&!feof(fp2)){fgets(str,81,fp1);fputs(str,fp3);fgets(str,81,fp2);fputs(str,fp3);}while(!feof(fp1)){fgets(str,81,fp1);fputs(str,fp3);}while(!feof(fp2)){fgets(str,81,fp2);fputs(str,fp3);}fclose(fp1);fclose(fp2);fclose(fp3);}(4)将8名职工的数据(工号,姓名,年龄,工资)从键盘输入,然后保存到文件worker.dat中。答:#include#include#includestructworker{intnum;charname[20];intage;floatsalary;};voidmain(){inti=0;structworkerwork;charnumstr[20],ch;FILE*fp;if((fp=fopen("worker.dat","wb"))==NULL) {printf("can"topenfilestud.datn");exit(0);}while(i<8){printf("enternumber:");gets(numstr);work.num=atoi(numstr);printf("entername:");gets(work.name);printf("enterage:");gets(numstr);work.age=atoi(numstr);printf("entersalary:");gets(numstr);work.salary=atof(numstr);fwrite(&work,sizeof(structworker),1,fp);}fclose(fp);}(5)在worker.dat的末尾添加一位职工的记录数据。答:#include#include#includestructworker{intnum;charname[20];intage;floatsalary;};voidmain(){structworkerwork;charnumstr[20],ch;FILE*fp;if((fp=fopen("worker.dat","ab"))==NULL){printf("can"topenfilestud.datn");exit(0);}printf("enternumber:");gets(numstr);work.num=atoi(numstr);printf("entername:");gets(work.name);printf("enterage:");gets(numstr);work.age=atoi(numstr);printf("entersalary:");gets(numstr);work.salary=atof(numstr);fwrite(&work,sizeof(structworker),1,fp);}(6)统计出第(5)题worker.dat中保存的职工记录个数,并求出工资的最大值。答:#include#include#includestructworker{intnum;charname[20];intage; floatsalary;};voidmain(){structworkerwork[50];inti,count=0:floatmax;FILE*fp;if((fp=fopen("worker.dat","rb"))==NULL){printf("can"topenfilestud.datn");exit(0);}while(!feof(fp)){fread(&work[count],sizeof(structworker),1,fp);count++;}max=work[0].salary;for(i=1;imax)max=work[i].salary;}printf(“职工个数为:%d,工资最大值为:%f”,count,max);}(7)设worker.dat中的记录个数不超过100,试读出这些数据,对年龄超过50岁的职工每人增加100元工资,然后按工资高低排序,排序结果存入文件w_sort.dat中。答:#include#include#includestructworker{intnum;charname[20];intage;floatsalary;};voidmain(){structworkerwork[100];inti,j,count=0;structworkert;FILE*fp;if((fp=fopen("worker.dat","rb"))==NULL){printf("can"topenfilestud.datn");exit(0);}while(!feof(fp)) {fread(&work[count],sizeof(structworker),1,fp);count++;}fclose(fp);for(i=0;i50)work[i].salary+=100;}for(j=0;jnext;}while(p!=NULL);fclose(fp);}习题1010.1编程题(1)参照本章实例,编写一个简单的图书管理系统,能实现数据的添加、删除、查询和修改等操作。答:(略)可参考学籍管理系统进行系统分析,设计。(2)参照本章实例,编写一个简单的学籍管理系统,能实现数据的添加、删除、查询和修改等操作。答:见附件。(3)参照本章实例,编写一个简单的表达式分析函数,能对混合四则运算的字符串进行解析并得出结果。答:(略)(4)编写程序实现功能:输入一个字符串格式的大的十进制数字,转换成十六进制输出。答:(略)'