• 412.00 KB
  • 2022-04-29 14:14:21 发布

《浙工大C语言课本习题答案》.doc

  • 40页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'C程序设计习题参考答案习题一2习题二3习题三5习题四8习题五14习题六17习题七20习题八26习题九33习题十35习题十一3640 习题一1.填空题⑴计算机程序设计语言按其发展可分为三类,即机器语言、汇编语言和高级语言。⑵C程序是由函数构成的,一个C程序中至少包含1个main函数。因此,函数是C程序的基本单位。⑶C程序注释是由/*和*/所界定的文字信息组成的。⑷函数体一般包括函数首行和函数体。⑸在任何C程序中都必须且只能有一个主函数,主函数名必须为main。2.判断下列各个叙述的正确与否⑴C程序的执行总是从该程序的main函数开始,在main函数最后结束【√】⑵C程序的注释部分可以出现在程序中任何位置,它对程序的编译和运行不起任何作用,但可以增加程序的可读性【√】⑶由“/*”与“*/”界定的注释必须在同一行【╳】⑷通过了编译、连接的程序就是正确的程序【╳】⑸有计算结果输出的程序一定是正确的程序【╳】⑹编译错误是语法错误,运行结果错误是逻辑错误【√】⑺编译时在信息窗口出现包含“error”的信息,说明程序存在警告性错误【╳】⑻源程序每次修改后,都必须重新编译、连接【√】3.简答题⑴算法的含义、特点是什么?解答:算法是解题方法的精确描述。有穷性、确定性、有多或零个输入、有1或多个输出、有效性。⑵写出一个C程序的基本结构。由编译预处理命令、注释、1个main和若干个自定义函数构成,函数格式如下:函数类型函数名(类型标识符形参,类型标识符形参,...){类型声明语句;执行语句部分;}⑶写出在你使用的计算机系统上,进入C环境以及运行、调试程序的简要步骤。⑷输入x后计算其正弦值的源程序如下。编译信息是否表示有致命性错误?应如何修改?解答:致命性错误为第6行函数sin未声明,应加入编译预处理命令#include4.编程题40 ⑴请上机调试、运行本章课本上C语言程序例题4~6(注释部分可以不必输)⑵仿照例6编程,输入两个变量后,输出其中较大的值。#includevoidmain(){inta,b;printf("请输入A,B的值:n");scanf("%d%d",&a,&b);if(a>b)printf("%dn",a);elseprintf("%dn",b);}⑶仿照例题编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。#includevoidmain(){floatr,h,v;printf("请输入半径、高的值:n");scanf("%f%f",&r,&h);v=r*r*3.141593*h;printf("%fn",v);}习题二1.将下列程序上机运行,写出你所使用的C语言处理系统中short、int以及long类型数据的字长和数值范围。#includevoidmain(){printf("short类型数据的字长为:%dn",sizeof(short));printf("int类型数据的字长为:%dn",sizeof(int));printf("long类型数据的字长为:%dn",sizeof(long));}解答:VC++环境下,分别为2、4、42.仿照题1编程,测试float、double类型数据的字长。#includevoidmain(){printf("float类型数据的字长为:%dn",sizeof(float));printf("double类型数据的字长为:%dn",sizeof(double));}3.判断下列各个叙述的正确与否。⑴C的long类型数据可以表示任何整数【╳】⑵任何变量都必须要声明其类型【√】⑶C的任何类型数据在计算机内都是以二进制形式存储的【√】⑷scanf函数中的格式符“%d”不能用于输入实型数据【√】⑸格式符中指定宽度时,从缓冲区中读入的字符数完全取决于所指定的宽度【√】⑹按格式符“%d”输出float类型变量时,截断小数位取整后输出【╳】40 ⑺按格式符“%6.3f”输出i(i=123.45)时,输出结果为23.450【╳】⑻scanf函数中的格式符“%f”能用于输入double类型数据【╳】4.指出下列各项中那些是C的常量,对合法的C常量请同时指出其类型。10,150007-0x3dπ1e0e1o7o8"x""xo"1.52e0.5sin(3)0xf16"X""07"1.414E+22.54"\""a"解:007整型,-0x3d整型,1e0实型,"x"字符型,0xf16整型,"X"字符串"07"字符型,1.414E+2实型,2.54实型,"\"字符型,"a"字符型5.指出下列各项中那些是C的标识符(可作变量名)。x_1X_2Highprintfβ3DSi/je2-e2countIntnumber$23next_解:x_1、X_2、High、e2、count、Int、number、next_6.根据条件,写出下列各题的输出结果。⑴inti=234,j=567;函数printf("%d%dn",i,j)的输出结果是234567。⑵inti=234;floatx=-513.624;函数printf("i=%5dx=%7.4fn",i,x)的输出结果是i=234x=-513.6240。⑶floatalfa=60,pi=3.1415926535626;函数printf("sin(%3.0f*%f/180)n",alfa,pi)的输出结果是sin(60*3.141592/180)。⑷charch="$",floatx=153.45;函数printf("%c%-8.2f\n",ch,x)的输出结果是$153.45n。⑸intd=27;函数printf("%-5d,%-5o,%-5xn",d,d,d)的输出结果是27,34,1b。⑹floatx1=13.24,x2=-78.32;函数printf("x(%d)=%.2fx(%d)=%.2fn",1,x1,2,x2)的输出结果是x(1)=13.24x(2)=-78.327.根据下列条件写出变量i1(int类型)、c1(char类型)、f1(float类型)、d1(double类型)的当前值。⑴执行scanf("%d%c%f%lf",&i1,&c1,&f1,&d1)时输入52$9.173.1415926535后。i1为52,c1为"$",f1为9.17,d1为3.1415926535⑵执行scanf("%d$%c%f%lf",&i1,&c1,&f1,&d1)时输入52$9.173.1415926535后。i1为52,c1为"9",f1为0.17,d1为3.14159265358.下列源程序输入x、y后,输出x的y次方。运行时无编译、连接错误,但输入不同格式的两组数据输出结果却不同,哪一组是对的?请说明原因。解答:第1组输入数据错误,因为格式串中有“,”所以键盘输入数据x、y之间也一定以逗号为间隔符。40 9.写出下列程序运行时输入345的输出结果。#include#include输出结果:边长为3.00,4.00,5.00的三角形面积为6.00voidmain(){floata1,a2,a3,s,d;scanf("%f%f%f",&a1,&a2,&a3);s=(a1+a2+a3)/2;s=sqrt(s*(s-a1)*(s-a2)*(s-a3));printf("边长为%.2f,%.2f,%.2f的三角形面积为:%-10.3fn",a1,a2,a3,s);}10.编程题⑴编程,用getchar函数接收2个字符,用putchar函数输出这2个字符。解答:#includevoidmain(){charx;x=getchar();putchar(x);x=getchar();putchar(x);}⑵编程,用scanf函数输入1个10进制整数、1个单精度浮点数、1个双精度浮点数,并通过printf函数把输入的3个数分别输出。解答:#includevoidmain(){intk;floatx;doubled;scanf("%d%f%lf",&k,&x,&d);printf("%d,%f,%fn",k,x,d);}⑶编程,输入1个整数,然后分别以8进制、10进制、16进制形式输出该数。解答:#includevoidmain(){intx;scanf("%d",&x);printf("%d,%o,%xn",x,x,x);}习题三1.根据下列数学式,写出C的算术表达式。40 解答:-(a*a+pow(b,3))*pow(y,4)(sqrt(2)+100)/(atan(x)+3.141593)(5+b)/((a+6)/(b+5)-c*d)2.按照要求写出下列C的表达式。⑴数学式(x+1)e2X所对应的C算术表达式。⑵将double类型变量x的整数部分与y的小数部分相加的算术表达式。⑶将非零实型变量x四舍五入到小数点后2位的算术表达式。⑷为变量s赋值:取变量x的符号,取变量y的绝对值。⑸条件“-5≤x≤3”所对应的C逻辑表达式。⑹a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母的逻辑表达式⑺int类型变量a、b均为两位正整数,写出判断a的个位数等于b的十位数、且b的个位数等于a的十位数的逻辑表达式。⑻计算变量a、b中较小值的条件表达式。⑼判断变量ch是英文字母的表达式;⑽若字符变量ch的值为大写字母,则重新赋值为对应的小写字母。解答:⑴(x+1)*exp(2*x)⑵(int)x+y-(int)y⑶(int)(x*100+fabs(x)/x*0.5)/100.0⑷s=fabs(y)*x/fabs(x)⑸-5<=x&&x<=3⑹b-a=="a"-"A"⑺a%10==b/10&&b%10==a/10⑻ad⑸zf="B"⑹zf=="B"解答:⑴24.3,⑵1,⑶1,⑷0,⑸"B",⑹14.填空题⑴声明“floatx=2.5,y=4.7;inta=7;”,表达式x+a%3*(int)(x+y)%2/4值为2.5。⑵设整型变量a、b值分别为10与20,计算c=(a%2==0)?a:b后,c的值为10。⑶设整型变量d的值为7,表达式“3="A"&&ch<="z")ch=ch-32;⑸下列程序的输出结果是(0.00,0.5)。#includevoidmain(){inty;doubled=3.4,x;x=(y=d/2.0)/2;printf("(%0.2f,%d)",x,y);}⑹判断a、b是否绝对值相等而符号相反的逻辑表达式为a==-b。⑺判断变量a、b中必有且只有一个为0的逻辑表达式为a*b==0&&a+b!=0。⑻c初值为3,计算赋值表达式“a=5+(c+=6)”后表达式值、a、c的值依次为40 14、14、9。⑼求解赋值表达式“a=(b=10)%(c=6)”后,表达式值、a、b、c的值依次为4、4、10、6。⑽求解逗号表达式“x=a=3,6*a”后,表达式值、x、a的值依次为18、18、3。⑾若a=13、b=25、c=-17,表达式“((y=(a="a"&&s<="z")?s-32:s;”后字符变量s的值为"D"。5.写出下列程序的输出结果。程序⑴#includevoidmain(){unsignedk,n;scanf("%u",&n);k=n%10*10+n/10;printf("n=%dk=%dn",n,k);}运行时输入数据为:6972输出结果为:n=69k=96程序⑵#includevoidmain(){intx=40,y=4,z=4;x=y==z;printf("%d%d%dn",x,y,z);x=x==(y=z);printf("%d%d%dn",x,y,z);}输出结果为:144044程序⑶#includevoidmain(){intx,y,z;x=y=2;z=3;y=x++-1;printf("%dt%dt%dt",x,y,z);y=--z+1;printf("%dt%dt%dn",x,y,z);x=y=z=0;++x&&++y||++z;printf("%dt%dt%dt",x,y,z);--x&&++y&&++z;printf("%dt%dt%dn",x,y,z);}输出结果为:3133321100106.编程,输入长方形的长和宽,求长方形的面积和周长并输出。解答:#includevoidmain(){floata,b,x,y;scanf("%f%f",&a,&b);x=a*b;y=2*(a+b);printf("面积=%.4f周长=%.4fn",x,y);}7.编程,输入3个字符后,按各字符ASCII码从小到大的顺序输出这些字符。解答:#include40 voidmain(){chara,b,c,x,y,z;scanf("%c%c%c",&a,&b,&c);x=(x=ab?a:b)>c?z:c;y=a+b+c-x-z;printf("%c%c%cn",x,y,z);}8.编程,输入3个整数,要求按绝对值从小到大输出它们的值。解答:#include#include//也可以用题7的做法voidmain(){intx,y,z,a;scanf("%d%d%d",&x,&y,&z);if(fabs(x)>fabs(y)){a=x;x=y;y=a;}if(fabs(x)>fabs(z)){a=x;x=z;z=a;}if(fabs(y)>fabs(z)){a=y;y=z;z=a;}printf("%dt%dt%dn",x,y,z);}9.编程,输入3个数,计算这三个数的平均值,并求出与平均值最接近的值。解答:#include#includevoidmain(){floata,b,c,v,x;scanf("%f%f%f",&a,&b,&c);v=(a+b+c)/3;x=a;if(fabs(b-v)voidmain(){intn,m;scanf("%d",&n);m=n%10*100+n%100/10*10+n/100;printf("%dt%dn",n,m);}习题四1.填空题⑴求1至100的和,写作for(s=0,i=1;i<=100;++i)s+=i;⑵执行程序段“y=1;x=5;while(x--);y++;”后,y的值为2。⑶顺序输出26个大写英文字母的循环结构,写作for(ch="A";ch<="Z";ch++)putchar(ch);⑷输入若干个以问号结束的字符,同时输出这串字符(不包括问号),写作while((ch=getchar())!="?")putchar(ch);40 ⑸循环程序段“k=5;for(;k<0;k--);”执行后,k的值为5。2.改写下列程序段,去掉continue语句,使结构更为合理。⑴while(A){解答:while(A)if(!B)C;if(B)continue;C;}⑵do{解答:while(A){B;C;}if(!A)continue;elseB;C;}while(A);3.写出下列程序的输出结果程序⑴#includevoidmain(){charx;intn=0,k=0;while((x=getchar())!="."){switch(x){case"t":k++;break;case"h":if(k==1)k++;break;case"e":if(k==2)k++;break;default:k=0;}if(k==3)n++;}printf("%dn",n);}运行时输入:atheasdfthethethere.输出结果:3程序⑵#include输出结果:A#includeBBBvoidmain()CCCCC{chara,b,x;inti;DDDDDDDwhile(!isupper(x=getchar()));EEEEEEEEEfor(a="A";a<=x;a++){for(b="A";b<"A"+x-a;b++)putchar("");for(i=1;i<=2*(a-"A")+1;i++)putchar(a);putchar("n")}}运行时输入:35dffE4.程序填空题,根据下列各题题意,将程序补充完整。⑴下列程序在输入m后求n使n!≤m≤(n+1)!(例如输入726,应输出n=6)#includevoidmain(){intm,n,jc=1;40 scanf("%d",&m);for(n=2;jc<=m;n++)jc=jc*n;printf("n=%dn",n-2);}⑵下列程序输出6至10000之间的亲密数对。【说明】若a、b是亲密数对,则a的因子和等于b、b的因子和等于a且a不等于b。#includevoidmain(){inta,b,c,i;for(a=6;a<=10000;a++){b=1;for(i=2;i<=a/2;i++)if(a%i==0)b+=i;c=1;for(i=2;i<=b/2;i++)if(b%i==0)c+=i;if(c==a&&a!=b)printf("%d%dn",a,b);}}5.根据下列各小题题意编程。⑴编程,输入x后按下式计算y值并输出。解答:#include#includevoidmain(){floatx,y;scanf("%f",&x);if(x>=0&&x<=1)y=x+sin(x);elsey=x+sin(x);printf("%fn",y);}⑵输入一个百分制的成绩t后,按下式输出它的等级,要求分别写作if结构和switch结构。等级为:90~100为A,80~89为B,70~79为C,60~69为D,0~59为E。解答:#includevoidmain(){intt;charx;scanf("%d",&t);if(t>=90)x="A";switch((int)t/10){elseif(t>=80)x="B";case9:case10:x="A";break;elseif(t>=70)x="C";case8:x="B";break;elseif(t>=60)x="D";case7:x="C";break;elsex="E";case6:x="D";break;printf("%cn",x);default:x="E";break;}}⑶输入10个学生的成绩,输出最低分数和最高分数。解答:#includevoidmain(){intx,max=0,min=101,i;40 for(i=1;i<=10;i++){scanf("%f",&x);if(x>max)max=x;if(xvoidmain(){floats=2,eps,t=1;inti=2;scanf("%f",&eps);while(t>=eps){t/=i++;s+=t;}printf("%fn",s);}⑸统计输入的若干个数中负数、零及正数的个数(输入^z控制循环结束)。解答:#includevoidmain(){floatx;intzs=0,lin=0,fs=0;while(scanf("%f",&x)!=EOF)if(x>0)zs++;elseif(x<0)fs++;elselin++;printf("正数%d个,零%d个,负数%d个n",zs,lin,fs);}⑹输入k,利用下列迭代公式计算k1/3的近似值,要求计算结果具14位有效位数。解答:#include#includevoidmain(){intk;doublex,x0;scanf("%d",&k);x=1;while(1){x0=x;x=x0+(k/(x0*x0)-x0)/3;if(fabs(x-x0)<1e-14){printf("k=%d,x=%.14fn",k,x);break;}}}⑺编程,输入n后,计算下列表达式的值。解答:#include#includevoidmain(){inti,n;floaty=0;scanf("%d",&n);for(i=n;i>=1;i--)y=sqrt(i+y);printf("%fn",y);40 }⑻编程,输入x、n后,计算下列表达式的值。解答:#includevoidmain(){floatx,y,a;inti,n;scanf("%f%d",&x,&n);y=0;for(i=0;i<=n;i++){scanf("%f",&a);y=y*x+a;}printf("y=%.6fn",y);}⑼当x为-2、-1.5、...、1.5、2时,求f(x)=x2-3.14·x-6所取最大值、最小值。解答:#includevoidmain(){floatx,y,max,min;x=-2;max=min=x*x-3.14159*x-6;for(x=-1.5;x<=2;x=x+0.5){y=x*x-3.14159*x-6;if(y>max)max=y;elseif(yvoidmain(){intx,y,a;scanf("%d%d",&x,&y);a=x;while(a%y!=0)a+=x;printf("最小公倍数%d,最大公约数%dn",a,x*y/a);}⑾编程,输出1~5000之间的同构数(就是出现在其平方数右边的那些数,如5、6、25均为同构数)。解答:#include#includevoidmain(){intk,kk,n;for(k=1;k<=5000;k++){n=log10(k)+1;if((k*k-k)%(int)pow(10,n)==0)printf("%d,%dn",k,k*k);}}⑿参照例25编程,输出下列形式的九九乘法表。40 解答:#includevoidmain(){inti,j;printf("");for(i=1;i<10;i++)printf("(%d)",i);putchar("n");for(i=1;i<10;i++){printf("(%d)",i);for(j=1;j<10;j++)printf("%4d",i*j);putchar("n");}}⒀当n取值在-39~40范围内时,判断表达式n2+n+41的值是否都是素数。解答:#include#includevoidmain(){inti,j,y;for(i=-39;i<=40;i++){y=i*i+i+41;for(j=3;j<=sqrt(y);j+=2)if(y%j==0)break;if(j<=sqrt(y))printf("结论不成立!n");elseprintf("%dt%dn",i,y);}}⒁参照例24题编程,用梯形公式求下列定积分。解答:#include#includevoidmain(){floata,b,h,s;inti,n;scanf("%f%f%f",&a,&b,&n);h=(b-a)/n;x=a;s=0.5*(sqrt(1+a*a*a)+sqrt(1+b*b*b));for(i=1;i#includevoidmain(){floata,b,c;a=0;b=5;do{c=(a+b)/2;if((a*a+a*sin(a)-5)*(c*c+c*sin(c)-5)<0)b=c;elsea=c;}while(fabs(c*c+c*sin(c)-5)>=1e-5&&fabs(b-a)>=1e-5);printf("%fn",c);}习题五1.判断下列各个叙述的正确与否。⑴函数的类型标识符缺省类型为void【√】⑵函数中不可以没有return语句【╳】⑶传值调用的形参只有在被调用时才被创建(分配存储单元)【√】⑷传值调用时,实参不限于变量名,而可以是表达式【√】⑸被定义为前向调用的函数,不必再声明其函数原型【√】⑹函数f可以用f(f(x))形式调用,f是递归函数【╳】2.写出下列程序的输出结果。程序⑴#includevoidprn(inta,intb,intc,intmax,intmin){max=(max=a>b?a:b)>c?max:c;min=(min=aintf(intm,intn)40 {if(m%n==0)returnn;elsereturnf(n,m%n);}voidmain(){printf("%dn",f(840,48));}输出结果为24程序⑶#includeintf1(int,int),f11(int);voidf2(int);voidmain(){inti,j;for(i=0;i<5;i++){f2((5-i)*3);for(j=0;j<=i;j++)printf("%3d",f1(i,j));putchar("n");}}intf1(intm,intn){returnf11(m)/f11(n)/f11(m-n);}intf11(intk){if(k<=1)return1;returnk*f11(k-1);}voidf2(intn){for(inti=1;i<=n;i++)putchar("");}输出结果为1111211331146413.根据下列各题题意填空,将程序补充完整。⑴输入若干个正整数,判断每个数从高位到低位各位数字是否按值从小到大排列。#includeintfun1(int);voidmain(){intn;while(scanf("%d",&n),n>0)if(fun1(n))printf("%d中各位数字按从小到大排列n",n);}intfun1(intm){intk;k=m%10;while(m)if(m/10%10>k)return0;else{m=m/10;k=m%10;}return1;}40 ⑵函数f10_2可以显示形参变量所对应的二进制形式。下列程序的两行显示结果分别为“1011”、“100011”。#includevoidf10_2(intn){if(n==0)return;else{f10_2(n/2);printf("%d",n%2);}}voidmain(){f10_2(11);putchar("n");f10_2(35);putchar("n");}4.根据下列各小题题意编程。⑴编制函数,返回三个变量中的最大值。解答:floatf(floata,floatb,floatc){floatmax;max=(max=a>b?a:b)>c?max:c;returnmax;}⑵编制函数,判断一个整数a是否是区间[1,b]之间的素数。解答:intf(inta,intb){inti;if(a>b||a<2)return0;for(i=2;i<=sqrt(a);i++)if(a%i==0)return0;return1;}⑶编写函数,其返回值为整数n从右边开始的第k位数字的值。如digit(231456,3)返回4,digit(1456,5)返回0。解答:intf(intn,intk){inti;for(i=1;iintf(intn){inti,y=1;for(i=2;i<=n/2;i++)if(n%i==0)y=y+i;if(y==n)return1;elsereturn0;}40 voidmain(}{inti;for(i=1;i<=1000;i++)if(f(i))printf("%dn",i);}⑸定义函数,形参为两个int类型变量,功能是显示这两个数的最大公约数和最小公倍数。解答:voidf(intx,inty){inta=x;while(a%y!=0)a+=x;printf("最小公倍数%d,最大公约数%dn",a,x*y/a);}⑹多项式p(n,x)定义如下,编写递归函数求该多项式的值。解答:doublep(intn,doublex){if(n==0)return1;elseif(n==1)returnx;elsereturn((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n;}习题六1.单项选择题⑴程序中调用了库函数exit,必须包含头文件【D】A、math.hB、string.hC、ctype.hD、stdlib.h⑵程序中调用了库函数strcmp,必须包含头文件【B】A、math.hB、string.hC、ctype.hD、stdlib.h⑶下列宏定义命令中,哪一个格式是正确的【C】A、#definepi=3.14159;B、definepi=3.14159C、#definepi3.14159D、#definepi(3.14159);⑷定义带参数的宏计算两个表达式的乘积,下列定义中正确的是【C】A、#definemuit(u,v)u*vB、#definemuit(u,v)u*v;C、#definemuit(u,v)(u)*(v)D、#definemuit(u,v)=(u)*(v)⑸宏定义为“#definediv(a,b)a/b”,对语句“printf("div(a,b)=%dn",div(x+5,y-5));”作宏替换后为【A】A、printf("div(a,b)=%dn",x+5/y-5);B、printf("a/b=%dn",x+5/y-5);C、printf("a/b=%dn",(x+5)/(y-5));D、printf("div(a,b)=%dn",(x+5)/(y-5));2.填空题⑴定义一个带参数的宏,若变量中的字符为大写字母则转换成小写字母#defineutol(ch)ch=ch>="A"&&ch<="Z"?ch+"a"-"A":ch⑵定义一个带参数的宏,将两个参数的值交换40 #defineswap(a,b){doublet;t=a;a=b;b=t;}⑶函数f定义如下,执行语句“m=f(5);”后,m的值应为8。intf(intk){if(k==0||k==1)return1;elsereturnf(k-1)+f(k-2);}⑷函数f定义如下,执行语句“sum=f(3)+f(3);”后,sum的值应为6。intf(intm){staticinti=0;ints=0;for(;i<=m;i++)s+=i;returns;}⑸对下列函数f,f(f(4))的值是5。intf(intx){staticintk=0;x+=k++;returnx;}3.写出下列程序的输出结果程序⑴#include#defineSx=y=z#defineP3(x,y,z)printf("x=%dty=%dtz=%dn",x,y,z)voidmain(){intx,y,z;S=1;++x||++y||++z;P3(x,y,z);S=1;++x&&++y||++z;P3(x,y,z);S=-1;++x||++y&&++z;P3(x,y,z);S=-1;++x&&++y&&++z;P3(x,y,z);}输出结果为x=2y=1z=1x=2y=2z=1x=0y=0z=-1x=0y=-1z=-1程序⑵#includeintfunc1(){staticints=1;s+=2;returns;}intfunc2(){ints=1;s+=2;returns;}voidmain(){inti;for(i=0;i<2;i++)printf("func1=%d",func1());printf("n");for(i=0;i<2;i++)printf("func2=%d",func2());}40 输出结果为func1=3func1=5func2=3func2=3程序⑶#includeinti=1,reset(),next(int),last(int),New(int);voidmain(){inti,j;i=reset();for(j=1;j<=3;j++){printf("i=%d,j=%dn",i,j);printf("next(%d)=%dn",i,next(i));printf("last(%d)=%dn",i,last(i));printf("new(%d+%d)=%dn",i,j,New(i+j));}}intreset()输出结果为i=1,j=1{returni;}next(1)=1intnext(intj)last(1)=10{returnj=i++;}new(1+1)=12intlast(intj)i=1,j=3{staticinti=10;next(1)=2returnj=i--;last(1)=9}new(1+2)=13intNew(inti)i=1,j=3{intj=10;next(1)=3returni=j+=i;last(1)=8}new(1+3)=144.根据下列各小题题意编程。⑴编程,输入3个数后输出其中绝对值最小的数。要求定义带参数的宏,计算两个数中绝对值最小的数。解答:#include#include#definemin(a,b)fabs(a)#include#definef(x)(x)*(x)-asin(x)voidmain(){doublex=0,y=0;40 for(inti=1;i<=10;i++){y=y+(f(x)+f(x+0.1))/20;x=x+0.1;}printf("%fn",y);}习题七1.单项选择题⑴下列数组声明语句中,正确的是【C】A、inta[]={1,2,,4,5};B、chara[5]={A,B,C,D,E};C、inta[5]={1,2};D、chara[5]="Hello";⑵数组声明语句为“inta[6];”,输入数组所有元素的语句应为【B】A、scanf("%d%d%d%d%d%d",a[6]);B、for(inti=0;i<6;i++)scanf("%d",a+i);C、for(inti=0;i<6;i++)scanf("%d",*a+i);D、for(inti=0;i<6;i++)scanf("%d",a[i]);⑶数组声明语句为“floata[3][4];”,引用第3行第1列的元素写作【A】A、**(a+2)B、*(*a+2)C、a[3][1]D、*(a[3]+1)⑷初始化多维数组的语句中,可以缺省的是【B】A、最后1个下标界B、第1个下标界C、第2个下标界D、以上都不对⑸数组声明为“inty[4][3];”,表达式“*(y+2)+2-*y”的值为【D】A、10B、20C、16D、8⑹数组声明为“charstr1[20]="Borland",str2[]="C++5.0";”,调用函数“strcpy(str1,str2);”后,字符串str1的串长是【C】A、13B、15C、6D、7⑺数组声明为“charstr1[20]="Borland",str2[]="C++5.0";”,调用函数“strcat(str1,str2);”后,字符串str1的串长是【A】A、13B、15C、6D、7⑻表达式“strcmp("Windows98","Windows95")”的值为【C】A、0B、3C、1D、-32.填空题。⑴未初始化的int类型数组,其各元素的值是0。⑵初始化时没有被赋值的字符类型数组元素,它们的值为""。⑶数组声明为“inta[6];”,数组元素a[1]是否又可以写作“*(a++)”?原因是不可以,数组名(地址常量)不可改变。⑷引用二维数组a第i行、j列的元素(i、j为0表示第1行、第1列),可以写作*(*(a+i-1)+j-1)或a[i-1][j-1]。⑸数组声明为“inta[6][6];”,表达式“*a+i”是指第1行第i+1个元素的地址、“*(a+i)”是指第i+1行第1个元素的地址、“**a”又是指a[0][0]。⑹数组声明为“floatx[7][5];”,若x[6][4]是内存中从x[0][0]数起的第35个元素,则x[4][4]是第25个元素。⑺声明“charstr1[20]="Borlandc++5.0"后,使字符串str1为"Borland"的赋值表达式,应为str1[7]=""。40 ⑻将包括空格在内的6个字符串输入到字符数组a[6][20]中,输入语句可以写作for(i=0;i<6;i++)gets(a[i]);。3.按照下列各题题意编程。⑴输入平面上凸10边形各点x、y坐标,计算并输出各点之间距离之和。解答:#include#includevoidmain(){floatx[10],y[10],s=0;inti;for(i=0;i<10;i++)scanf("%f%f",&x[i],&y[i]);for(i=0;i<9;i++)for(j=i+1;j<10;j++)s+=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));printf("s=%fn",s);}⑵编程,计算多项式a0+a1x+a2x2+a3x3+...+an-1xn-1的和(n≤30)。解答:#includevoidmain(){floata[30],x,y;inti,n,t;scanf("%d%f",&n,&x);for(i=0;i#includevoidmain(){floata[20],temp;inti,j,k;for(i=0;i<20;i++)scanf("%f",&a[i]);for(i=0;i<19;i++){k=i;for(j=i+1;j<20;j++)if(fabs(a[j])voidmain(){floata[5][6],min;inti,j,k,l;for(i=0;i<5;i++)for(j=0;j<6;j++)scanf("%f",&a[i][j]);for(i=0;i<5;i++){40 for(j=0;j<6;j++)printf("%8.2f",a[i][j]);printf("n");}min=a[0][0];k=0;l=0;for(i=0;i<5;i++)for(j=0;j<6;j++)if(a[i][j]#includevoidmain(){floata[5][6],max;inti,j;for(i=0;i<5;i++)for(j=0;j<6;j++)scanf("%f",&a[i][j]);for(i=0;i<5;i++){max=a[i][0];for(j=1;j<6;j++)if(fabs(a[i][j])>fabs(max))max=a[i][j];for(j=0;j<6;j++)a[i][j]/=max;}for(i=0;i<5;i++){for(j=0;j<6;j++)printf("%8.2f",a[i][j]);printf("n");}}⑹输入一个字符串(串长不超过60),删除字符串中所有的空格符。如输入字符串为"i=x1+y;",处理后的字符串为"i=x1+y;"。解答:#include#includevoidmain(){chars[61];inti,n,k;gets(s);while(1){k=0;n=strlen(s);while(s[k++]!=""&&k#includevoidmain(){charstr[20][30];inti,j,k=0,k1;for(i=0;i<20;i++)gets(str[i]);for(i=0;i<20;i++){k1=0;for(j=i+1;j<20;j++)if(strcmp(str[i],str[j])==0)k1++;40 if(k1>k)k=k1;}printf("%dn",k);}4.写出下列程序的输出结果程序⑴#includevoidmain(){intm[]={1,2,3,4,5,6,7,8,9},i,j,k;for(i=0;i<4;i++){k=m[i];m[i]=m[8-i];m[8-i]=k;for(j=0;j<9;j++)printf("%d",m[j]);putchar("n");}}输出结果为923456781983456721987456321987654321程序⑵#includevoidmain(){intx[4][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}},i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)*(*(x+i)+j)/=*(*(x+i)+i);for(i=0;i<4;i++){for(j=0;j<4;j++)printf("%3d",*(*(x+i)+j));putchar("n");}}输出结果为1234015609180001程序⑶#include#includevoidmain(){charline[]="123456789";inti,k=strlen(line);for(i=0;i<4;i++){line[k-i]="";puts(line+i);}}输出结果为1234567892345678345674640 5.根据下列各题题意填空,将程序补充完整。⑴输入10个数,输出其中与平均值之差的绝对值为最小的数。#include#includevoidmain(){floata[10],s,d,x;inti;for(i=0;i<10;i++)scanf("%f",a+i);s=0;for(i=0;i<10;i++)s+=a[i];s/=10;d=fabs(a[0]-s);x=a[0];for(i=1;i<10;i++)if(fabs(a[i]-s)voidmain(){inta[10][10]={{0}},i,j,n;while(scanf("%d",&n),n<1||n>10);for(i=0;i#includevoidmain(){charb[61];inti;gets(b);40 for(i=1;b[i]!="";i++)if(b[i-1]==""&&b[i]==""){strcpy(b+i-1,b+i);i--;/*提示:此处填入正确的函数名*/}puts(b);}6.输入2个数组,每个数组不超过10个元素,将只在其中一个数组出现的数输出。解答:#includevoidmain(){floata[10],b[10];intm,n,i,j;scanf("%d%d",&m,&n);for(i=0;ivoidmain(){floata[10],x;inti,j,k,n;for(i=0;i<10;i++){scanf("%f",&x);if(i==0){a[0]=x;n=0;}else{for(j=0;j<=n;j++)if(x>a[j]){for(k=n;k>=j;k--)a[k+1]=a[k];break;}a[j]=x;n++;}}for(i=0;i<10;i++)printf("%.1f",a[i]);putchar("n");}8.输入4行字符,每行不超过60个字符。将其中所有的字符"$"改作"S"。解答:#include#include40 voidmain(){chars[4][61];inti,j,k;for(i=0;i<4;i++)gets(s[i]);for(i=0;i<4;i++)for(j=0;j#includevoidmain(){chars[4][61];inti,j,k;for(i=0;i<4;i++)gets(s[i]);for(i=0;i<4;i++)for(j=0;j<=strlen(s[i]);j++)if(s[i][j]=="$")strcpy(s[i]+j,s[i]+j+1);for(i=0;i<4;i++)puts(s[i]);}10.输入4行字符,每行不超过60个字符。将空格符后的第1个英文字母改为大写(原为大写字母则不变)。解答:#include#include#includevoidmain(){chars[4][61];inti,j,flag;for(i=0;i<4;i++)gets(s[i]);for(i=0;i<4;i++){flag=1;for(j=0;j<=strlen(s[i]);j++){if(flag==1&&slower(s[i][j])){flag=0;s[i][j]-=32;}elseif(s[i][j]=="")flag=1;elseflag=0;}}for(i=0;i<4;i++)puts(s[i]);}习题八⒈单项选择题⑴下列语句定义px为指向int类型变量x的指针,正确的是【D】A、int*px=x,x;B、int*px=&x,x;C、intx,*px=x;D、int*px,x;p=&x;⑵指针变量p1、p2类型相同,要使p2、p2指向同一变量,正确的是【A】A、p2=*&p1;B、p2=**p1;C、p2=&p1;D、p2=*p1;⑶声明语句为“chara="%",*b=&a,**c=&b”,下列表达式中错误的是【】40 A、a==**cB、b==*cC、**c=="%"D、&a=*&b⑷数组定义为“inta[4][5];”,下列哪一个引用是错误的【D】A、*aB、*(*(a+2)+3)C、&a[2][3]D、++a⑸表达式“c=*p++”的执行过程是【A】A、复制*p的值给c后再执行p++B、复制*p的值给c后再执行*p++C、复制p的值给c后再执行p++D、执行p++后将*p的值复制给c⑹声明语句为“chars[4][15],*p1,**p2;intx,*y;”,下列语句中正确的是【D】A、p2=s;B、y=*s;C、*p2=s;D、y=&x;2.填空题⑴声明flaot类型变量x和指向x的指针变量px的语句是floatx,*px=&x。⑵声明语句为“chara[5][9],*pa[5];”。为指针数组pa各元素顺序赋值a数组各行首地址值的循环结构可以写作for(i=0;i<5;i++)pa[i]=a[i];。⑶声明fg为指向返回值为float类型、形参依次为float**、int、int类型变量的函数的指针,声明语句为float(*fg)(float**,int,int);。⑷编制函数find_ch,在一个字符串中查找字符ch第一次出现的位置,返回值为所找到字符的地址,函数find_ch的原型应为char*find_ch(char*s,charch)。⑸动态分配n个int类型数据的存储空间,并将该存储空间的首地址返回给指向int类型数据的指针变量p,写作语句p=(int*)malloc(n*sizeof(int))。3.阅读下列程序,指出程序中的错误并说明错误的原因。程序⑴程序⑵#include#includevoidmain()voidmain(){char*p;chars[80];{floatx,y;int*p;p=s[0];scanf("%s",s);x=3.45;p=&x;y=*p;printf("%sn",p);printf("%fn",y);}}程序⑶程序⑷#include#includevoidmain()voidmain(){intx,*p;{int*p=&a;*p=x;inta;printf("%dn",*p);printf("%dn",*p);}}解答:⑴语句p=s[0]错误,应赋地址常量⑵语句y=*p错误,p为悬挂指针⑶语句*p=x错误,p为悬挂指针⑷语句int*p=&a;错误,a此时未分配存储空间4.声明语句为“inta[3][5]={{1,3,5,7,9},{11,13,15,17,19},{21,23,25,27,29}}”,数组a在内存中一维、连续存放且首地址为63fdf8,已知表达式sizeof(int)值为4,写出下列表达式的值并说明它们的含义(指针常量的级、指向或数组元素)。a(第1行行地址)*a(第1行第1个元素地址)a+2(第3行行地址)&a[0](第1行行地址)a[0]+3(第1行第4个元素地址)*(a+1)(第2行第1个元素地址)*(a+2)+1(第3行第2个元素地址)*(a[1]+2)(等价于a[1][2])&a[0][2](第1行第3个元素地址)*(*(a+2)+3)(等价于a[2][3])a[2][3]&**a(第1行第1个元素地址)40 5.按照下列各题题意编程⑴编程,输入10个数,按绝对值从小到大排序后输出。解答:#includevoidmain(){float*p,temp;inti,j,k;p=(float*)malloc(10);for(i=0;i<10;i++)scanf("%f",p+i);for(i=0;i<9;i++){k=i;for(j=i+1;j<10;j++)if(fabs(p[j])voidmain(){float*p,temp,inti,j,k,n;scanf("%d",&n);p=newfloat[n];for(i=0;i#includevoidsort(float*p,intn){floattemp;inti,j,k;for(i=0;i*max){*max=a[i];*k1=i;}elseif(a[i]<*min){*min=a[i];*k2=i;}}8.编制函数,将一个字符串中的所有大写字母转换为相应的小写字母。解答:char*utol(char*str){inti;for(i=0;i#includevoiddel_bk(char*p){char*p1;p1=p;while(*p1!="")if(*p1==""&&*(p1+1)=="")strcpy(p1,p1+1);elsep1++;}voidmain(){charaa[]="aabbccccdddefgh";printf("%sn",aa);del_bk(aa);printf("%sn",aa);}输出结果:aabbccccdddefghaabbccccdddefgh10.编制函数,将字符串中连续的相同字符仅保留1个(字符串"abbcccddddef40 "处理后为"abcddef")。解答:#include#includevoidsub(char*p){inti,j;for(i=1;i#includefloatfind_max(float**x,intm,intn){inti,j;floatmax=x[0][0];for(i=0;imax)max=*(*(x+i)+j);或x[i][j];returnmax;}voidmain(){floata[5][5],b[6][4],*pa[5],*pb[6];inti,j;for(i=0;i<5;i++)pa[i]=a[i];for(i=0;i<6;i++)pb[i]=b[i];for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%f",&a[i][j]);for(i=0;i<6;i++)for(j=0;j<4;j++)scanf("%f",&b[i][j]);printf("%fn",find_max(pa,5,5)-find_max(pb,6,4));}12.编制函数,将float类型二维数组的每一行同除以该行上绝对值最大的元素。要求分别以8.4.2节介绍的两种方法编写,并上机调试。解答:方法一:#include#includevoidf(float**x,intm,intn){inti,j;floatmax;for(i=0;ifabs(max))max=x[i][j];for(j=0;j#includevoidf(float*p,intm,intn){inti,j;floatmax;for(i=0;ifabs(max))max=p[i*n+j];for(j=0;j#includechar*str(char*str[],intn,char*s){inti;for(i=0;ifloat*find_data(float*a,intn,floatdata){intlow,mid,high;low=0;high=n-1;while(low<=high){mid=(low+high)/2;if(a[mid]>data)40 high=mid-1;elseif(a[mid]#includefloatf1(float),f2(float);floatfs(floata,floatb,intn,float(*f)(float)){floats=0,x=a,h=(b-a)/n;inti;for(i=1;i<=n;i++){s+=((*f)(x)+(*f)(x+h))*h/2;x+=h;}returns;}voidmain(){floaty;y=fs(2,6,50,f1)+fs(3,7,50,f2);printf("%fn",y);}floatf1(floatx){returnx*x+x*sin(x);}floatf2(floatx){returnlog10(x*x)-x+3;}习题九1.构造一个表示通讯录中每个“记录”的数据类型,声明该类型的标识符。解答:structperson{charname[9];intpho;};⒉编程,先输入n,再40 输入通讯录中若干个人的记录到结构体数组中,按电话号码的升序对结构体数组排序后输出。解答:#include#includestructperson{charname[9];intpho;};voidmain(){structperson*p,temp;intn,i,j,k;scanf("%d",&n);p=(structperson*)malloc(n*sizeof(structperson));for(i=0;i#includestructperson{charname[9];intpho;};voidsort(structperson*p,intn){structpersontemp;inti,j,k;for(i=0;i#include#includestructnode{charx;structnode*t;};voidmain(){structnode*h=NULL,*p1,*p2;charch;while((ch=getchar())!="."){p2=(structnode*)malloc(sizeof(structnode));p2->x=ch;if(h==NULL)h=p1=p2;else{p1->t=p2;p1=p2;}}p2->t=NULL;p1=h;while(p1!=NULL){if(isalpha(p1->x))putchar(p1->x);p1=p1->t;}putchar("n");40 }5.阅读下列程序,写出输出结果。程序⑴#includevoidmain(){structT1{charc[4],*s;}s1={"abc","def"};structT2{char*cp;T1ss1;}s2={"ghi",{"jkl","mno"}};printf("%c,%cn",s1.c[0],*s1.s);printf("%s,%sn",s1.c,s1.s);printf("%s,%sn",s2.cp,s2.ss1.s);printf("%s,%sn",++s2.cp,++s2.ss1.s);}输出结果为a,dabc,defghi,mnohi,no程序⑵#include#includevoidmain(){structinfo{intdata;info*pn;}info*base,*p;base=NULL;for(inti=0;i<10;i++){p=(inf*)malloc(sizeof(structinfo));p->data=i+1;p->pn=base;base=p;}p=base;while(p!=NULL){printf("%2d",p->data);p=p->pn;}printf("n");}输出结果为109876543216.下列函数用于将节点类型为ntab的链表中某个结点(数据成员data与形参num匹配)删除,填空将函数补充完整。解答:structntab*del_node(structntab*h,intnum){structntab*p1,*p2;if(h==NULL){printf("nlistnull!n");returnh;}p1=h;while(num!=p1->data&&p1->next!=NULL){p2=p1;p1=p1->next;}if(num==p1->data)if(p1==h){h=p1->next;free(p1);}else{p2->next=p1->next;deletep1;}elseprintf("%dnotbeenfound!n",num);returnh;}40 7.下列函数用于在节点类型为ltab的非空链表中插入一个节点(由形参指针变量p0指向),链表按照节点数据成员no的升序排列,填空将函数补充完整。解答:structltab*insert(structltab*head,structltab*stud){structltab*p0,*p1,*p2;p1=head;p0=stud;while((p0->no>p1->no)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p0->no<=p1->no)if(head==p1){p0->next=head;head=p0;}else{p2->next=p0;po->next=p1;}else{p1->next=p0;p0->next=NULL;}return(head);}习题十1.计算下列表达式的值。⑴5&7⑵-12&6⑶7|8⑷-12||32⑸(x=13)^9⑹15/2^1⑺~-15⑻~15/3⑼7<<2⑽-9<<2⑾(x=13)>>3⑿-9>>3解答:⑴5⑵-5⑶15⑷1⑸4⑹6⑺14⑻-5⑼28⑽-36⑾1⑿-22.变量a、b均被声明为short类型,分别写出执行下列语句后a、b的值。⑴a=4;b=5;a&b;⑵a=-4;b=a|6;⑶a=3;b=a<<2;⑷a=-15;b=~a>>2解答:⑴a=4,b=5⑵a=-4,b==2⑶a=3,b=12⑷a=-15,b=33.阅读下列程序,写出运行时输入688412-523-12^z的输出结果。#includevoidsub1(short*x,short*y){*x=*x^*y;*y=*x^*y;*x=*x^*y;}voidmain(){shorta,b;while(scanf("%hd%hd",&a,&b)!=EOF){sub1(&a,&b);printf("%hd,%hdn",a,b);}}解答:交换a、b的值。4.编程,输入一个int类型数据后,输出该数的机内码。解答:#includevoidmain(){inta,i;charb[33]={""};scanf("%d",&a);for(i=31;i>=0;i--){b[i]=(char)((a&1)+"0");a=a>>1;}puts(b);}5.输入1个short类型数据,显示它二进制数奇数位(即从左边起的第1、3、5、……、40 15位)。解答:#includevoidmain(){shorta,i;charb[9]={""};scanf("%hd",&a);a=a>>1;for(i=7;i>=0;i--){b[i]=(char)((a&1)+"0");a=a>>2;}puts(b);}6.输入一个整数,将其低8位全置1,高8位保留,并以十六进制输出该数。解答:#includevoidmain(){inta;scanf("%d",&a);a=a|0xff;printf("%xn",a);}习题十一⒈写出下列fopen函数调用所打开文件的读写方式与文件存储格式。⑴fpt=fopen("d:\user\dat\ex1.dat","w")⑵fpt=fopen("d:\user\dat\ex1.dat","wb")⑶fpt=fopen("d:\user\dat\ex1.dat","r+")⑷fpt=fopen("d:\user\dat\ex1.dat","ab")⑸fpt=fopen("d:\user\dat\ex1.dat","w+")解答:⑴新建文本文件⑵新建二进制文件⑶可读写文本文件⑷追加记录二进制文件⑸新建可读写文本文件⒉填空题⑴fopen函数的返回值是文件读写的首地址或NULL。⑵文件打开方式为"r+",文件打开后,文件读写位置在文件的首纪录前。⑶文件打开方式为"a",文件打开后,文件读写位置在文件的末纪录后。⑷表达式“fgetc(fpn)”的值为所读入字符的ASCII值或EOF。⑸表达式“fgets(a,10,fpn)”的值为字符串a的地址或NULL。⑹函数fscanf的返回值为所读入数据个数或EOF。⑺函数fread的返回值为所读入数据的个数或0。⑻表达式“fscanf(fpn,"%f",&x)”的值为-1时,函数feof()的值为1。3.编程,输入若干同学的姓名、学号、3门功课成绩,写到文本文件e:aaa.txt。解答:#includestructstu{charname[9];charnumb[9];intscore[3];}voidmain(){FILE*fp1;structstua;inti,n;fp1=fopen("e:\aaa.txt","w");scanf("%d",&n);for(i=1;i<=n;i++){40 scanf("%s%s%d%d%d",a.name,a.numb,&a.score[0],&a.score[1],&a.score[2]);fprintf(fp1,"%s%s%d%d%dn",a.name,a.numb,a.score[0],a.score[1],a.score[2]);/*格式串中各格式符间有空格,在从文件读入数据时可作为间隔符*/}fclose(fp1);}4.编程,顺序读入题3所建立文本文件中各个同学的姓名、学号、成绩,显示输出。解答:#includestructstu{charname[9];charnumb[9];intscore[3];};voidmain(){FILE*fp1;structstua;fp1=fopen("e:\aaa.txt","r");while(fscanf(fp1,"%s%s%d%d%d",a.name,a.numb,&a.score[0],&a.score[1],&a.score[2])!=EOF)printf("%s,%s,%d,%d,%dn",a.name,a.numb,a.score[0],a.score[1],a.score[2]);fclose(fp1);}/*应参照(题3)文件中数据存储格式,确定读文件时的格式符*/5.编程,输入1个同学的学号,从题3所建立的文本文件中删除该同学的信息。解答:#include#includestructstu{charname[9];charnumb[9];intscore[3];};voidmain(){FILE*fp1,*fp2;structstua;charx[9];gets(x);fp1=fopen("e:\aaa.txt","r");fp2=fopen("e:\bbb.txt","w");while(fscanf(fp1,"%s%s%d%d%d",a.name,a.numb,&a.score[0],&a.score[1],&a.score[2])!=EOF)if(strcmp(a.numb,x))fprintf(fp2,"%s%s%d%d%dn",a.name,a.numb,a.score[0],a.score[1],a.score[2]);fclose(fp1);fclose(fp2);remove("e:\aaa.txt");rename("e:\bbb.txt","e:\aaa.txt");}6.编程,读入若干行字符(每行不超过80个),写入文本文件e:bbb.txt。解答:#includevoidmain(){FILE*fp;chara[81];fp=fopen("e:\bbb.txt","w");while(gets(a)!=NULL){fputs(a,fp);fputc("n",fp);}fclose(fp);/*加入换行符,作为间隔符*/}7.文件a.txt、b.txt中各自存放了若干个整数,编程,显示在a.txt中存在而b.txt中不存在的那些数。40 解答:#includevoidmain(){FILE*fa,*fb;inta,b;fa=fopen("e:\a.txt","r");fb=fopen("e:\b.txt","r");while(!feof(fa)){fscanf(fa,"%d",&a);while(!feof(fb)){fscanf(fb,"%d",&b);if(a==b)break;}if(feof(fb))printf("%dn",a);rewind(fb);}fclose(fa);fclose(fb);}8.编程,输入若干同学的姓名、学号、3门功课成绩,写到二进制文件中(文件名自定)。解答:#includevoidmain(){FILE*fp;charname[9],numb[9];inti,n,score[3];fp=fopen("e:\aaa.dat","wb+");scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s%s%d%d%d",name,numb,&score[0],&score[1],&score[2]);fwrite(name,sizeof(name),1,fp);fwrite(numb,sizeof(numb),1,fp);fwrite(score,sizeof(int),3,fp);}rewind(fp);/*下面的读文件程序段不是必须的,只是为验证输入是否正确*/while(fread(name,sizeof(name),1,fp)!=NULL){fread(numb,sizeof(numb),1,fp);fread(score,sizeof(int),3,fp);printf("%8s%8s%4d%4d%4dn",name,numb,score[0],score[1],score[2]);}}9.编程,输入1个同学的姓名、学号、3门功课成绩,修改题8所建立的二进制文件中具有相同学号同学的信息。解答:#include#includevoidmain(){FILE*f1,*f2;charname[2][9],numb[2][9];ints[2][3];f1=fopen("e:\aaa.dat","rb");f2=fopen("e:\bbb.dat","wb");scanf("%s%s%d%d%d",name[0],numb[0],&s[0][0],&s[0][1],&s[0][2]);while(fread(name[1],sizeof(name[1]),1,f1)!=NULL){fread(numb[1],sizeof(numb[1]),1,f1);fread(s[1],sizeof(int),3,f1);if(strcmp(numb[0],numb[1])){fwrite(name[1],sizeof(name[1]),1,f2);40 fwrite(numb[1],sizeof(numb[1]),1,f2);fwrite(s[1],sizeof(int),3,f2);}else{fwrite(name[0],sizeof(name[0]),1,f2);fwrite(numb[0],sizeof(numb[0]),1,f2);fwrite(s[0],sizeof(int),3,f2);}}fclose(f1);fclose(f2);remove("e:\aaa.dat");rename("e:\bbb.dat","e:\aaa.dat");/*下面的读文件程序段不是必须的,只是为验证输入是否正确*/f2=fopen("e:\aaa.dat","rb");while(fread(name[0],sizeof(name[0]),1,f2)!=NULL){fread(numb[0],sizeof(numb[0]),1,f2);fread(s[0],sizeof(int),3,f2);printf("%8s%8s%4d%4d%4dn",name[0],numb[0],s[0][0],s[0][1],s[0][2]);}fclose(f2);}10.编程,模仿第10章例8,利用按位异或对某一文件加密与解密。解答:#includevoidmain(){chara;intm1,m2,i;FILE*p1,*p2;printf("输入一个整数密值(1~255):n");scanf("%d",&m1);p1=fopen("e:\a.txt","r");p2=fopen("e:\b.txt","w");while((a=fgetc(p1))!=EOF)fputc(a^m1,p2);fclose(p1);fclose(p2);p2=fopen("e:\b.txt","r");while((a=fgetc(p2))!=EOF)putchar(a^m1);fclose(p2);}11.文本文件a.txt、b.txt每行存放一个数且均按从小到大存放。下列程序将这两文件中数据合并到c.txt,文件c.txt中数据也要从小到大存放,填空将程序补充完整、正确。说明:若文件a.txt数据为1↙6↙9↙18↙27↙35↙,b.txt数据为10↙23↙25↙39↙61↙,则文件c.txt中数据应为1↙6↙9↙10↙18↙23↙25↙27↙35↙39↙61。解答:#includevoidmain(){FILE*f1,*f2,*f3;intx,y;f1=fopen("e:\a.txt","r");f2=fopen("e:\b.txt","r");⑴f3=fopen("e:\c.txt","w");fscanf(f1,"%d",&x);fscanf(f2,"%d",&y);while(1)if(⑵x