C语言程序设计教程(第2版)课后习题答案_第1页
C语言程序设计教程(第2版)课后习题答案_第2页
C语言程序设计教程(第2版)课后习题答案_第3页
C语言程序设计教程(第2版)课后习题答案_第4页
C语言程序设计教程(第2版)课后习题答案_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计教程(第二版)课后习题答案第一章C语言程序设计概述-习题答案1算法的描述有哪些基本方法?答1、自然语言2、专用工具2C语言程序的基本结构是怎样的?举一个例子说明。答1、C语言程序由函数构成;2、“/*”与“*/”之间的内容构成C语言程序的注释部分;3、用预处理命令#include、#define可以包含有关文件或预定义信息;4、大小写字母在C语言中是有区别的;5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。3C语言有什么特点?答1、具有结构语言的特点,程序之间很容易实现段的共享;2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;3、运算符丰富,包含的范围很广;4、数据类型丰富;5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。4★指出合法与不合法的标识符命名。答AB12--√leed_3--a*b2--×8stu--×D.K.Jon--×EF3_3--√PAS--√if--×XYZ43K2--√AVE#XY--×_762--√#_DT5--×C.D--×5说明下列TurboC热键的功能。答F2:源文件存盘F10:调用主菜单F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件Alt+F5:将窗口切换到DOS下,查看程序运行结果。6说明下列TurboC方式下输入并运行下列程序,记录下运行结果。①main(){printf("********************\n");printf("welcomeyou\n");printf("verygood\n);printf("********************\n");}②main(){inta,b,c,t;printf("pleaseinputthreenumbers;");scanf("%d,%d,%d",&a,&b,&c);/*教材S是错误的*/t=max(max(a,b),c);printf("maxnumberis:%d\n",t);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}答运行结果:********************welcomeyouverygood********************运行结果:pleaseinputthreenumbers;3,1,4/*左侧下划线内容为键盘输入*/maxnumberis:47一个C程序是由若干个函数构成的,其中有且只能有一个___函数。答main()8在TurboC环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。答1、Userscreen2、Alt+F59★C语言对标识符与关键字有些什么规定?答1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。10C源程序输入后是如何进行保存的?答是以C为扩展名保存的纯文本文件。第二章C语言程序的基本数据类型与表达式-习题答案1★指出下列常数中哪些是符合C语法规定的。答'\'--×'101'--×"\"--×e3--×019--√0x1e--√"ab\n"--√1.e5--×(2+3)e(4-2)--×5.2e2.5--×2请找出下列程序中的错误,改正后写出程序运行结果。①voidmain(){intx,y=z=5,aver;x=7AVER=(x+y+z)/3printf("AVER=%d\n",aver);}②voidmain(){charc1='a';c2='b';c3='c';inta=3.5,b='A'printf("a=%db=\'\"end\n",a,b);printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);}答main(){intx,y=5,z=5,aver;x=7;aver=(x+y+z)/3;printf("AVER=%d\n",aver);}运行结果:AVER=5②main(){charc1='a',c2='b',c3='c';inta=3,b='A';printf("a=%d,b=\'%c\'\"end\"\n",a,b);printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);}运行结果:a=3,b='A'"end"aabccabc3写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。int99-1char'h'unsignedint66float55.78longint68答int99104665568-1char'c''h''B''7''D'unsignedint9910466556865535float99.00104.0066.0055.7868.00-1.00longint99104665568-14★写出程序运行结果。①voidmain(){inti,j;i=8,j=10;printf("%d,%d,%d,%d\n",i,j,++i,j++);}②main(){inta=1,b=2,c=30;;printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));}注意:a=b=c,a=b==c之间应为逗号,教材有误答运行结果:9,11,9,10运行结果:30,1,0,0③voidmain(){inta=10,b=20,c=30,d;d=++a<=10||b-->=20||c++;printf("%d,%d,%d,%d\n",a,b,c,d);}答运行结果:11,19,30,15★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。⑴a%=(b%=3)⑵n++,a+=a-=a*=a⑶(float)(a+c)/2+(int)x%(int)y⑷a*=b+c⑸++a-c+b++⑹++a-c+++b⑺a<b?x:'A'⑻b++==c⑼a+b,18+(b=4)*3,(a/b,a%b)⑽x+a%3*(int)(x+y)%2/4+sizeof(int)⑾a<b?a:c<d?c:d⑿b++==c⒀a*=b=c=2⒁a=b==c答⑴0⑵0⑶9.500000⑷90⑸10⑹10⑺'A'⑻2⑼4.5⑽1⑾0⑿20⒀06下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)?①m=(a=4,4*5)与m=a=4,4*5②(float)(a/b)与(float)a/b③(int)a+b与(int)(a+b)④m%=2+a*3与m=m%2+a*3⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b答①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。③因为a、b均为整数,其前后两个表达式的计算结果是一致的。④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。⑤前后表达式的计算结果应该是一致的:a=2,b=3,m=67条件表达式x>0?x:-x的功能是什么?答如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。8用一个条件表达式描述从a、b、c中找出最大都赋给max.答max=a>(b>c?b:c)?a:(b>c?b:c);9★若x为int型变量,则执行以下语句后x的值为()。x=6;x+=x-=x*x;A.36B.-60C.60D.-24答B.10★若有以下类型说明语句:charw;intx;floaty;doublez;则表达式w*x+z-y的结果为()类型。A.floatB.charC.intD.double答D.第三章顺序结构程序设计-习题答案1变量k为float类型,调用函数scanf("%d",&k),不能使变量k得到正确数值的原因是___。答格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。2★a=1234,b=12,c=34,则执行“printf("|%3d%3d%-3d|\n",a,b,c);”后的输出是___。答|12341234|分析如下:①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。3★设有“inta=255,b=8;”,则“printf("%x,%o\n",a,b);”输出是___。答ff,10①如果“printf("%X,%o\n",a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf("%#x,%o\n",a,b);”为或“printf("%#X,%o\n",a,b);”。本条解释不必须掌握。4★以下程序输出的结果是___。main(){inta1=1,a2=0,a3=2;printf("%d,%d,%d\n",a1,a1+a2+a3,a3-a1);}答1,3,15printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。答①实际②左端补空格6★已定义变量如下:inta1,a2;charc1,c2;若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。答scanf("%d,%d,%c,%c",&a1,&a2,&c1,&c2);7输入两个整型变量a、b的值,输出下列算式以及运算结果___。a+b、a-b、a*b、a/b、(float)a/b、a%b每个算式占一行。如a=10,b=5,a+b输出为:10+5=15答设inta=10,b=5;以下为输出语句及结果:①printf("%d+%d=%d\n",a,b,a+b);②printf("%d-%d=%d\n",a,b,a-b);③printf("%d*%d=%d\n",a,b,a*b);④printf("%d/%d=%d\n",a,b,a/b);10+5=1510-5=510*5=5010/5=2⑤printf("%(float)d/%d=%f\n",a,b,(float)a/b);(float)10/5=2.000000⑥printf("%d%%%d=%d\n",a,b,a%b);10%5=08★输入一个非负数,计算以这个数为半径的圆周长和面积。答#definePI3.1415926main(){floatr,l,area;printf("Inputapositive:");scanf("%f",&r);l=2*PI*r;area=PI*r*r;printf("l=%f\tarea=%f\n",l,area);}9输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。答main(){intx,y;printf("Inputanumber(100-999):");scanf("%d",&x);y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/printf("%d--->%d\n",x,y);}10★输入任意大小的3个整数,判断其中是否有两个奇数一个偶数。若是则输出YES,不是则输出NOT(要求用条件表达式进行判断,不使用if语句)。答main(){intx,y,z,oddcount=0;/*奇数数计数变量*/printf("Inputx,y,z:");scanf("%d,%d,%d",&x,&y,&z);x%2==1?oddcount++:0;y%2==1?oddcount++:0;z%2==1?oddcount++:0;oddcount==2?printf("YES"):printf("NOT");}11求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这3个字符及其对应的ASCII码值。答本题考查同学们对字符类型数据的认识,如果在ASCII范围内则即可以显示为字符,又可以显示为整数值;无论是否能够显示为字符,字符类型数据是可能参与数值运算的,切记。main(){charc;printf("Inputcharacter:");scanf("%c",&c);printf("%c----->%d\n",c-1,c-1);printf("%c----->%d\n",c,c);printf("%c----->%d\n",c+1,c+1);getch();/*为便于调试程序,运行至此程序停顿,此时可以看到运行结果,按任意键程序真难得结束并返回到编辑环境*/}12★输入三角形的边长,求三角形面积(面积=sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2)。答#include"math.h"/*由于程序中使用了开平方函数sqrt(),所以需要包含数学头文件*/main(){floata,b,c,s,area;intok=0;printf("Inputa,b,c:");scanf("%f,%f,%f",&a,&b,&c);a+b>c?ok++:0;/*以下3条语句为判断是否输入的数据是否构成封闭三角形*/a+c>b?ok++:0;b+c>a?ok++:0;ok==3?(s=(a+b+c)/2,area=sqrt(s*(s-a)*(s-b)*(s-c)),printf("area=%f",area)):printf("error");getch();}第四章选择结构程序设计-习题答案1★设x、t均为int型变量,则执行语句“x=10;t=x&&x>10;”后,t的值为___。答02★假定所有变量均已正确定义,则程序段:inta=0,y=10;if(a=0)y--;elseif(a>0)y++;elsey+=y;运行后y的值是___;答203★能表述20<x<30或x<-100的C语言表达式是___。答x>20&&x<30||+x<-1004★若有定义语句“inta=25,b=14,c=19;”,则以下语句执行结果是___。if(a<=25&&b<=2&&c)printf("***a+b=%d,a-b=%d***\n",a+b,a-b);elseprintf("***a=%d,b=%d,c=%d***\n",a,b,c);答***a=25,b=14,c=19***5★假定i和j为int型变量,则执行以下语句后i的值是___。inti=1;switch(i){case1:{for(j=0;j<9;j++)i+=j;break;}case2:{for(j=1;j<10;j++)i+=j;break;}case3:i++;}答37分析:执行了case1:和case3:中的代码。同时case1:语句中的{}是可以取消的。6★以下两条if语句可合并成一条if语句,即___。if(a<=b)x=1;elsey=2;if(a>b)printf("***y=%d\n",y);elseprintf("***x=%d\n",x);答if(a<=b)printf("***x=%d\n",x=1);elseprintf("***y=%d\n",y=2);7★输入两个字符,若这两个字符的序号(ASCII码)之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符。答main(){chara,b;printf("Inputtwochatactera,b:");scanf("%c,%c",&a,&b);if((a-b)/2==0)printf("%c,%c",a+1,b+1);elseprintf("%c,%c",a-1,b-1);}8★输入整数a和b,如果a能被b整除,就输出算式和商,否则输出算式、整数商和余数。答main(){inta,b;printf("Inputtwointegernumbersa,b:");scanf("%d,%d",&a,&b);if(b!=0&&a%b==0)printf("%d/%d=%d",a,b,a/b);elseprintf("%d/%d=%d......%d",a,b,a/b,a%b);}9输入某个点A的平面坐标(x,y),判断(输出)A点是在圆内、圆外还是在圆周上,其中圆心坐标为(2,2),半径为1。答include"math.h"main(){floatx,y,d;printf("Inputx,y:");scanf("%f,%f",&x,&y);d=sqrt((x-2)*(x-2)+(y-2)*(y-2));if(d>1)printf("outside");elseif(d<1)printf("inside");elseprintf("inside");}10★输入年号和月份,输出这一年该月的天数(一个年份,先判断是否闰年)。答main(){inty,m,d,f;printf("Inputyearandmonthy-m:");scanf("%d-%d",&y,&m);f=(y%4==0&&y/100!=0||y/400==0);if(m==2)d=28+f;/*依据是否闰年决定2月份的实际天数,若是闰年,则f=1,d即为29天*/elsed=31-(m==4)+(m==6)+(m==9)+(m==11);/*m==4时其值为1,则本月为30天,典型算法,重要啊*/printf("%d-%dis%ddays.\n",y,m,d);}11★请将以下语句改写成switch语句(a>0)。if(a<30)m=1;elseif(a<40)m=2;elseif(a<50)m=3;elseif(a<60)m=4;elsem=5答switch(a/10){case1:case2:case3:m=1;break;case4:m=2;break;case5:m=3;break;case6:m=4;break;default:m=5;}12有一函数x-1-5<x<0y=xx=0x+10<x<8编写一程序,要求输入x的值,输出y的值。分别用不嵌套的if语句,嵌套的if语句,switch语句编写。答使用不嵌套的if语句程序如下:main(){floatx,y;printf("Inputx:");scanf("%f",&x);if(x>-5&&x<0)y=x-1;if(x==0)y=0;if(x>0&&x<8)y=x+1;printf("y=%f\n",y);}使用嵌套的if语句程序如下:main(){floatx,y;scanf("%f",&x);if(x>-5&&x<8)if(x<0)y=x-1;elseif(x==0)y=0:elsey=x+1;printf("y=%f\n",y);}main()floatx,y;scanf("%f",&x);if(x<8)if(x>0)y=x+1;elseif(x==0)y=0;elseif(x>-5)y=x-1;printf("y=%f\n",y);}使用多分支语句程序如下:main(){floatx,y;intm;printf("Inputx:");scanf("%f",&x);if(x>-5&&x<8)if(x<0)m=-1;elseif(x==0)m=0:elsem=1;switch(m){}case-1:y=x-1;break;case0:y=0;break;case1:y=x+1;break;printf("y=%f\n",y);}以下为假设对int类型的变量进行处理,但毕竟不算完美main(){intx,y;printf("Inputx:");scanf("%d",&x);switch(x){case-4:case-3:case-2:case-1:y=x-1;break;case0:y=0;break;case1:case2:case3:case4:case5:case6:case7:y=x+1;break;}printf("y=%d\n",y);}第五章循环结构程序设计-习题答案1★输入n个整数,求这n个数之中的偶数平均值,并输出。答main(){intn,i,x,sum=0,count=0;printf("Inputn:");scanf("%d",&n);for(i=0;i<n;i++){printf("Input[%d]:",i+1);scanf("%d",&x);if(x%2==0){sum+=x;count++;}}printf("Averageis:%f\n",(float)sum/count);getch();}2★输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个数和数字字符个数。答#include"stdio.h"main(){charch;intcharcnt=0,numcnt=0;while((ch=getchar())!='*'){if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')charcnt++;if(ch>='0'&&ch<='9')numcnt++;}printf("Charactersnumber:%d\nDigitsnumber:%d\n",charcnt,numcnt);getch();}3★从键盘输入一个正整数n,计算该数的各位数字之和并输出。例如,输入数是5246,则计算5+2+4+6=17并输出。答#include"stdio.h"main(){intn,i,sum=0,count=0;printf("Inputn:");scanf("%d",&n);while((n/10)!=0){count++;sum+=n%10;printf("%d+",n%10);n/=10;}printf("=%d",sum+n);getch();}4★输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,然后输出。答#include"stdio.h"main(){charch;printf("Inputstring:");while((ch=getchar())!='\n'){if(ch>='a'&&ch<='z')printf("%c",ch-32);if(ch>='A'&&ch<='Z')printf("%c",ch+32);}getch();}5设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率为4.5%,那么多少年后该县年工业总产值将超500亿元。答main(){floatx=200;intn=0;do{x*=(1+0.045);n++;}while(x<500);printf("n=%d",n);getch();}6★输出1~999中能被3整除,而且至少有一位数字是5的所有数字。答main(){intx,y,flag;for(x=1;x<1000;x++){flag=0;y=x;if(y%3==0)/*余数为0说明该数能够被3整除*/{while(y%10!=0){if(y%10==5)flag=1;/*依个位、十位、百位顺序判断是否余数为5*/y/=10;}if(flag==1)printf("%d\t",x);}}getch();}7求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶每步跨6阶,则最后剩5阶每步跨7阶,最后正好1阶。答main(){intx=0,flag=0;while(1){x++;if(x%2==1)if(x%3==2)if(x%5==4)if(x%6==5)if(x%7==0){printf("%d",x);break;}}getch();}8输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3答main(){intx,a,b,c;printf("Inputnumber:");scanf("%d",&x);a=x/100;/*变量a中记录x的百位数字*/b=x/10%10;/*变量b中记录x的十位数字*/c=x%10;/*变量c中记录x的个位数字*/if(a*a*a+b*b*b+c*c*c==x){printf("%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n",x,a,a,a,b,b,b,c,c,c);printf("YES");}elseprintf("NOT");getch();}9★计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,3/2,5/3,8/5,...)。答main(){inti,n=10;floatf1=1,f2=2,f,sum=0;for(i=0;i<n;i++){sum+=f2/f1;f=f1+f2;f1=f2;f2=f;}printf("total=%d\nsum=%f",n,sum);getch();}10输入一个正整数,各输出n行的正(倒)三角形宝塔图案。答main(){intn,i,j;printf("Inputn:");scanf("%d",&n);for(i=0;i<n;i++){for(j=i+1;j<n;j++)printf("");for(j=0;j<2*i+1;j++)printf("*");printf("\n");}for(i=0;i<n-1;i++){for(j=0;j<i+1;j++)printf("");for(j=2*i-1;j<n+1;j++)printf("*");printf("\n");}getch();}11★输出九九乘法表。答main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf("%d*%d=%-3d",j,i,i*j);printf("\n");}getch();}12输入一串字符,直到输入一个星号为止,统计(输出)其中的正整数和负整数个数以及所有正整数的平均值和所有负整数的平均值。答#include"stdio.h"#include"math.h"main(){charch;intx=0,y=1,f=0,pcnt=0,ncnt=0;floatpsum=0,nsum=0;while((ch=getchar())!='*'){if(ch=='-'){if(x!=0){if(f==1){x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf("%d\n",x);}f=1;x=0;y=1;continue;}elseif(ch>='0'&&ch<='9'){x=10*x+ch-'0';y=10*y;if(x!=0&&10*x<y)f=0;continue;}else{if(x!=0){if(f==1){x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf("%d\n",x);}f=0;x=0;y=1;continue;}}if(x!=0){if(f==1){x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf("%d\n",x);}printf("\n---------\n");printf("Plus:\n");printf("Count=%d\n",pcnt);printf("Average=%f\n",psum/pcnt);printf("-------\n");printf("Negative:\n");printf("Count=%d\n",pcnt);printf("Average=%f\n",nsum/ncnt);getch();}13一个整数等于该数所有因子之和,则称该数是一个完数。例如,6和28都是完数。因为6=1+2+3,28=1+2+4+7+14。输出3位数中所有的完数。答main(){intk1,k2,k3,k4,k5,k6,k7,k8,k9,k10;inti,a,n,s;for(a=100;a<=999;a++){n=0;/*n累计因子的个数*/s=a;/*s存放未求出的因子之和,初值为被测数本身*/for(i=1;i<a;i++)if(a%i==0)/*由i到a循环检测i是否为a的因子*/{n++;/*找到一个因子*/s=s-i;/*减去已找到的因子*/switch(n)/*将找到的因子赋绐k1,k2,...*/{case1:k1=i;break;case2:k2=i;break;case3:k3=i;break;case4:k4=i;break;case5:k5=i;break;case6:k6=i;break;case7:k7=i;break;case8:k8=i;break;case9:k9=i;break;case10:k10=i;break;}}if(s==0)/*已经找到全部因子*/{printf("%dItsfactorsare",a);if(n>1)printf("%d,%d",k1,k2);/*n>1表示a至少有2个因子*/if(n>2)printf(",%d",k3);/*注意以下if的用法,追加的方法*/if(n>3)printf(",%d",k4);if(n>4)printf(",%d",k5);if(n>5)printf(",%d",k6);if(n>6)printf(",%d",k7);if(n>7)printf(",%d",k8);if(n>8)printf(",%d",k9);if(n>9)printf(",%d",k10);printf("\n");}}getch();}14★编写程序按下列公式计算e的值(精度为1e-6)。e=1+1/1!+1/2!+1/3!...+1/n!答main(){inti;doublee=0,t=1;for(i=1;t>0.000001;i++){for(j=1;j<=i;j++)t*=j;t=1/t;e+=t;}printf("e=%f\n",e);getch();}15用二分法求方程2x3-4x2+3x=0在(-10,10)附近的根(二分法:先找到a、b,使f(a)、f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b>0,a<b,如果f[(a+b)2]=0,该点就是零点,如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,按上述方法再求该区间中点的函数值,通过每次把f(x)的零点所有小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,该值即是方程的根)。答#include"math.h"main(){doublex,fx,fa,fb,a=-10,b=10,z=0.0001;fa=2*a*a*a-4*a*a+3*a;fb=2*b*b*b-4*b*b+3*b;if(fa*fb<0){do{x=(a+b)/2;fx=2*x*x*x-4*x*x+3*x;if(fx<0){a=x;fa=2*a*a*a-4*a*a+3*a;}else{b=x;fb=2*b*b*b-4*b*b+3*b;}}while(fabs(fa-fb)>z);printf("Therootis:%lf\n",x);}getch();}第六章函数与编译预处理-习题答案1★写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。答main(){unsignedintm,n,p,q;for(;;){printf("m,n=");scanf("%d,%d",&m,&n);if(m<0||n<0){printf("Theend.\n");break;}p=funp(m,n);q=funq(m,n);printf("p(%d,%d)=%d\nq(%d,%d)=%d\n",m,n,p,m,n,q);}}intfunp(intm,intn){inti;if(m>n){i=m;m=n;n=i;}for(i=m;i>0;i--)if(m%i==0&&n%i==0)return(i);}intfunq(intm,intn){inti;if(m<n){i=m;m=n;n=i;}for(i=m;i<=m*n;i+=m)if(i%n==0)return(i);}2★编写一个函数,由参数传入一个字符串,统计此字串中字母、数字和其他字符的个数,在主函数中输入字符串并显示统计结果。答未制作函数,主要利用了选择语句结构:#include"stdio.h"main(){inti,c,zm=0,sz=0,kg=0,qt=0;printf("Inputastring:");while((c=getchar())!='\n')if(c=='')kg++;elseif(c>47&&c<58)sz++;elseif(c>='A'&&c<='Z'||c>='a'&&c<='z')zm++;elseqt++;printf("am=%d,sz=%d,kg=%d,qt=%d\n",zm,sz,kg,qt);}制作函数,利用函数调用:#include"stdio.h"intanalys(charch);main(){inti,zm=0,sz=0,qt=0,c;printf("Inputastring:");while((c=getchar())!='\n'){i=analys(c);switch(i){case1:zm++;break;case2:sz++;break;case3:qt++;}}printf("zm=%d,sz=%d,qt=%d\n",zm,sz,qt);}intanalys(charch){if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')return1;if(ch>47&&ch<58)return2;return3;}3★按照第5章第8题的要求编写判断水仙花数的函数,从主函数输入正整数n,在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数。【输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3】答main(){intx,i,f;printf("Inputnumber:");scanf("%d",&x);for(i=0;i<=x;i++){f=0;f=fun(i);if(f==1)printf("%d\t",i);}getch();}intfun(intx){inta,b,c;a=x/100;b=x/10%10;c=x%10;if(a*a*a+b*b*b+c*c*c==x)return1;elsereturn0;}4★定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,并显示结果。答#definef(a,b)(a=a+b,b=a-b,a=a-b)main(){intx,y;printf("Inputx,y:");scanf("%d,%d",&x,&y);printf("%d,%d",x,y);f(x,y);printf("<-->%d,%d\n",x,y);getch();}5已知二阶Fibonacci数列:0若n=0若n=1Fib(n)=1Fib(n-1)+Fib(n-2)其它情况定义递归函数求Fib(n)。答main(){inti,n;printf("Inputn:");scanf("%d",&n);for(i=0;i<=n;i++)printf("%d\t",fib(i));getch();}intfib(intn){if(n==0)return0;elseif(n==1)return1;elsereturn(fib(n-1)+fib(n-2));}6定义函数求F=(n+m)!+n!,m、n均为任意正整数。要求使用递归调用。答longintf(intx);main(){inti,m,n;longintsum;printf("Inputm,n:");scanf("%d,%d",&m,&n);sum=f(n+m)+f(n);printf("%ld",sum);getch();}longintf(intx){inti,j;if(x==0||x==1)return1;elsereturn(x*f(x-1));}7★定义一个函数完成第5章第11题的功能。【输出九九乘法表。】答main(){fun();getch();}fun(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf("%d*%d=%-3d",j,i,i*j);printf("\n");}}8如果有两个数,每一个数的所有约数(除了它本身以外)的和正好等于对方,则称这两个数为互满数,求出30000以内所有的互满数,并显示输出,求一个数它的所有约数(除了它本身以处)的和,用函数实现。答main(){intx,y;for(x=1;x<30000;x++){for(y=1;y<x;y++){if(facsum(x)==y&&facsum(y)==x){printf("(%d,%d)\t",x,y);}}}getch();}facsum(intn){inti,sum=0;for(i=1;i<n;i++){if(n%i==0)sum+=i;}returnsum;}9编写以下函数:①输入职工的姓名和职工号;②按职工号由小到大排序,姓名顺序也随之调整;③输入一个职工号,找出该职工的姓名。在主函数中调用这些函数。答10★设计程序完成下列计算。已经:y=f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3))其中:f(x,n)=1-x2/2!+x4/4-...+(-1)n·x2n/(2n)!(n≥0)当:x=5.6,n=7时,求:y要求通过嵌套调用完成计算。答#include<stdio.h>floatf(floatx,intn);floatf1(floatx,intm);floatf2(intm);main(){floatx=5.6,y;intn=7,i;y=1+f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3));printf("y=%f\n\n",y);}floatf(floatx,intn){floatsum=0.0;inti;for(i=1;i<=n;i++){sum+=f1(-1,i)*f1(x,2*i)/f2(2*i);}returnsum;}floatf1(floatx,intm){inti;floaty=1.0;for(i=1;i<=m;i++){y*=x;}returny;}floatf2(intm){inti;floaty=1;for(i=1;i<=m;i++){y*=i;}returny;}第七章数组-习题答案1★以下各题中,选择一个正确的答案。1、能正确对一维数组a中所有元素进行初始化的是()。A.inta[5]={}C.inta[5]=0,0,0,0,02、有说明intk=3,a[10];则下列可以正确引用数组元素的表达式是()。A.a[k]B.a[10]C.a[1,3]D.a[3*5]3、有定义intd[][3]={1,2,3,4,5,6};执行语句printf("%c",d[1][0]+'A');结果是()。A.AB.BC.DD.E4、有定义charc='A',ch[20]={'a','b','c','\0','d','\0'};若执行printf("%s",ch);结果是()。A.'abc'B.abcC.abcd5、对数组进行初始化charcarr[]={'s','t','u','d','e','n','t'},barr[]="student";则正确的是()。B.inta[]={0}D.inta[5]={0}D.abc\0dA.carr与barr长度相同C.carr与barr相同B.carr比barr长D.carr比barr短答1、BD2、A3、D4、B5、D2★阅读下列程序,写出程序的执行结果。1、#include<stdio.h>#include<string.h>voidmain(){inti,j,temp,d[4][4]={{1,2,3,4},{5,6,7,8},{4,3,2,1},{1,2,3,4}};for(i=0;i<4;i++)for(j=0;j<i;j++)if(d[i][j]>d[j][i])d[j][i]=d[i][j];for(i=0;i<4;i++){printf("\n");for(j=0;j<4;j++)if(j>=i)printf("%6d",d[i][j]);elseprintf("%c",'');}}2、若输入十进制数3291时,下列程序输出为:#include<stdio.h>voidmain(){inti,d,m,n;chars[8];scanf("%d",&n);i=0;do{/*i是用来存放转换后的数组元素下标*/m=n/8;d=n%8;s[i]='0'+d;i++;n=m;}while(n!=0);for(i--;i>=0;i--)putchar(s[i]);/*反向输出字符*/}答163333★程序填空。在___处填写合适的语句,完善下列程序:1、从键盘输入一个数,将其插入到一个升序数组中,保持数组仍然按升序排列。#include<stdio.h>voidmain(){intdata,temp,k;staticinta[9]={-10,2,4,8,10,15,25,50};printf("\nEnteradata:");scanf("%d",&data);______①_____;for(k=8;____②____;k--)if(a[k]<a[k-1]){______③______;a[k]=a[k-1];a[k-1]=temp;}else______④______;for(k=0;__⑤__;k++)printf("%7d",a[k]);}2、从键盘输入一串英文字符(不含空格与其他字符),统计每个字符的个数,并输出字母及相应的个数。#include<string.h>#include<stdio.h>/*本行代码教材中应该加上,因为程序中有putchar()*/voidmain(){inti=0,c[52]={0},m=0;charstr[80];printf("Inputastring:");scanf(___①___,str);while(str[i]){if(str[i]>='A'&&____②___)c[str[i]-'A']++;if(str[i]>='a'&&str[i]<='z')_____③____;i++;}for(i=0;i<26;i++)if(c[i]{if(m%8==0)putchar('\n');m++;printf("%c:%-d",i+'A',c[i]);}for(i=0;i<26;i++)if(c[i+26]){if(m%8==0)putchar('\n');m++;printf("%c:%-d",____④___,c[i+26]);}}答1、①a[8]=data②k>=1③temp=a[k]④break⑤k<=82、①"%s"②str[i]<='Z'③c[str[i]-'a'+26]++④i+'A'4★求一组成绩的平均分数以及高于平均分的成绩,设给定的成绩为90,85,92,77,80,62。答main(){intscore[6]={90,85,92,77,80,62};inti,sum=0;floataver;for(i=0;i<6;i++)sum+=score[i];aver=sum/6.0;printf("\nAverage:%f\n",aver);printf("Highscore:");for(i=0;i<6;i++)if(score[i]>aver)printf("%d\t",score[i]);}5★编写程序,输入一组整数,将它们排序后由小到大输出。【提示】假设为具有10个元素的正整数数组;外层循环从数组的第一个元素开始选取;内层循环从外层循环选定的元素下一个元素开始选取,依次与外层循环选定的元素进行比较,将小者放入外层循环选定的元素中。答#defineN10main(){inta[N],i,j,t;for(i=0;i<N;i++)/*提示并为数组元素赋值*/{printf("\nInputa[%d]:",i);scanf("%d",&a[i]);}for(i=0;i<N;i++)/*外层选定待比较元素位置*/{for(j=i+1;j<N;j++)/*选定后续需要比较之元素位置*/{if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}}printf("%d\t",a[i]);/*输出已更新为较小值之外层选定元素*/}}6从键盘输入一个4×4整数矩阵,以主对角线(\)为对称轴,将左下角元素中较大元素代替右上角对应元素,将右上角(含对角线元素)输出。【提示】a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[3][0]a[3][1]a[3][2]a[3][3]答#defineM4main(){inta;inti,j,k,t;printf("Inputintegernumber:\n");for(i=0;i<M;i++)/*用两层循环为二维数组元素赋值*/for(j=0;j<M;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);}for(i=0;i<M;i++)/*用两层循环将数组以矩阵形式在屏幕输出*/{for(j=0;j<M;j++){printf("%d\t",a[i][j]);}printf("\n");}printf("-----------\n");/*分隔线*/for(i=0;i<M;i++)/*选定矩阵待处理的当前行*/{for(j=0;j<M;j++)/*将左下角元素中较大元素代替右上角对应元素*/{if(a[j][i]>a[i][j]){t=a[j][i];a[j][i]=a[i][j];a[i][j]=t;}}for(j=i;j<M;j++)/*将函对角线的右上角元素输出*//*本循环为将第i行第i列开始的右侧元素输出*/{printf("%d\t",a[i][j]);}printf("\n");for(k=0;k<i+1;k++)printf("\t");/*保证显示数据正确位置*/}getch();}【运行结果】a[0][0]=1a[0][1]=2a[0][2]=3a[0][3]=4a[1][0]=5a[1][1]=6a[1][2]=7a[1][3]=8a[2][0]=9a[2][1]=10a[2][2]=11a[2][3]=12a[3][0]=13a[3][1]=14a[3][2]=15a[3][3]=1612345678910111213141516-----------15913610141115167通过键盘给3×4的二维数组输入数据,然后分别按行和按列输出数组元素。答#defineM3#defineN4main(){inta[N],i,j;printf("Inputintegernumber:\n");for(i=0;i<M;i++)/*外层选定数组元素左维*/for(j=0;j<N;j++)/*内层选定数组元素右维*/{printf("a[%d][%d]=",i,j);/*提示输出元素位置*/scanf("%d",&a[i][j]);/*为指定元素赋值*/}printf("\nOutbyrow:\n");/*按行输出数组元素值*/for(i=0;i<M;i++)for(j=0;j<N;j++)printf("%d",a[i][j]);printf("\nOutbycollum:\n");/*按列输出数组元素值*/for(i=0;i<N;i++)for(j=0;j<M;j++)printf("%d",a[j][i]);getch();}【运行结果】Inputintegernumber:a[0][0]=1a[0][1]=2a[0][2]=3a[0][3]=4a[1][0]=5a[1][1]=6a[1][2]=7a[1][3]=8a[2][0]=9a[2][1]=10a[2][2]=11a[2][3]=12Outbyrow:123456789101112Outbycollum:1592610371148128编写程序,将两个字符串连接起来,不要使用strcat函数。答#include"string.h"main(){charstr1[80],str2[80];inti=0,l1;printf("Inputstr1:");gets(str1);/*若换成scanf("%s",str1);后面应该增加fflush(stdin);函数语句*/printf("Inputstr2:");gets(str2);l1=strlen(str1);/*计算字符串1的长度*/while(str2[i]){str1[l1+i]=str2[i];i++;}str1[l1+i]='\0';/*字符串连接后,不能忘记追加一个字符串结束符*/puts(str1);/*可换成语句:printf("%s",str1);*/getch();}9输入一行字符串,统计该字符串中字符对ab的个数。答#include"string.h"main(){charstr[80];inti=0,count=0;printf("Inputstring:");gets(str);while(str[i]){if(str[i]=='a'&&str[i+1]=='b'){count++;i+=2;/*如果在当前i的位置找到一对,则i越过b个字母*/}elsei++;/*如果在当前i的位置未找到,则i指向下一个字母*/}printf("%d",count);getch();}10从键盘输入10个字符串,找出一个最长的字符串。答#include"string.h"main(){charstr[10][80];/*设置二维字符数组,每一维可以记录最大79个字符的字符串*/inti,len,k[10],n=0,max=0;printf("Input10strings:\n");for(i=0;i<10;i++)/*向str数组输入10个字符串*/{printf("String%d=",i+1);gets(str[i]);len=strlen(str[i]);/*计算输入之字符串之长度*/if(len>max){max=len;n=0;k[n]=i;}/*记录最长字符串的长度、个数、在数组位置(行)*/elseif(len==max)k[++n]=i;/*与已记录最大长度相同时,记录其在数组中位置(行)*/}if(n==0)/*此时说明只有一个最大长度字符串,是str[k[0]*/{printf("ThelongeststringisString%d:",k[0]+1);/*输出其序号*/puts(str[k[0]]);}else/*此时说明有不止一个最大长度字符串时需要处理的复合语句*/{printf("Notonlyone!\n");for(i=0;i<=n;i++)/*分别输出各序号、字符串*/{printf("TheseareString%d:",k[i]+1);puts(str[k[i]]);}}getch();}11已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。【提示】将a中的元素最大值与b中元素最大值相比,将最大值存入c数组中,然后调整c、a或b元素指针(地址),依次重复前序工作,即可。答#defineM3#defineN7main(){inti=0,j=0,n=0,c[M+N],a[3]={10,27,543},b[7]={300,210,173,96,55,34,13};intmaxa,maxb;do{maxa=a[M-i-1];maxb=b[j];if(maxa>maxb){}c[n++]=maxa;/*将a中最大元素赋值给c数组当前元素,并调整c新元素位置*/i++;/*调整a中元素位置*/else{c[n++]=maxb;/*将a中最大元素赋值给c数组当前元素,并调整c新元素位置*/j++;/*调整b中元素位置*/}printf("%d",c[n-1]);/*打印输出c中新赋值元素数据*/}while(n<M+N);/*未为数组c赋值结束时继续以上步骤--执行循环体*/getch();}第八章指针-习题答案1★选择题。1、若函数f定义如下:voidf(char*d,char*s);{while(*d++=*s++);}函数f的功能是()。A.串比较B.串复制C.求串长D.串反向2、有定义intarr[10]={0,1,2,3,4,5,6,7,8,9},*p,i=2;若执行语句:p=arr;pritnf("%d",*(p+i));输出结果为()。A.0★3、有定义inttd[][3]={1,2,3,4,5,6};以下几种方法中,不能正确表示i行j列元素的是()。A.td[i][j]B.*(td[i]+j)C.*(*(td+i)+j)D.*(td+i-j)本题不要求掌握B.2C.3D.1答1、B2、B3、D2★写出下列程序的运行结果。1、voidmain(){inta,*p1,*p2;a=10;p1=&a;p2=p1;printf("TheValueis%d||%d||%d\n",a,*p1,*p2);*p1=11;printf("TheValueis%d||%d||%d\n",a,*p1,*p2);}2、若输入字符串program时,写出下列程序输出结果:#include<stdio.h>voidmain(){charstr[80];voidprochar(char*st,charch);scanf("%s",str);prochar(str,'r');puts(str);}voidprochar(char*str,charch){char*p;for(p=str;*p!='\0';p++)if(*p==ch){*str=*p;(*str)++;str++;}*str='\0';}答1、TheValueis10||10||10TheValueis11||11||112、ss3★填空题1、下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,填空完善该程序。#include<stdio.h>#include<string.h>voidmain(){intk=0;chara[80],b[80],c[80]={'\0'},*p,*q;p=a;q=b;gets(a);gets(b);while(_____①_____){if(____②____)c[k]=*p;elsec[k]=*q;p++;______③______;k++;}/*本题教材有误,少了此处的右大括号*/if(*p!=0)strcat(c,p);elsestrcat(c,q);puts(c);}2、以下程序从键盘输入10个不相同的数到数组a中,再输入一个数到x中,在a中查找与x值相同的元素所在的位置,填空完善该程序。。#include<stdio.h>voidmain(){inta[11],x,i;printf("Input10integers:\n");for(i=1;___①___;i++)scanf("%d",____②___);printf("Inputx:");scanf("%d",&x);*a=x;i=10;while(x!=*(a+i))_____③_____if(_____④_____)printf("%6d'spositionis:%3d\n",x,i);elseprintf("%6dNotbefound!\n",x);/*bee应为be,教材有误,小case*/}答1、①*p!='\0'&&*q!='\0'②*p>*q③q++2、①i<11②&a[i]③i--;④i>04编写函数fun,函数的功能是,从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如,程序执行时输入字符串为turbocandborlandc++,从键盘输入字符n,则输出后变为turbocadborladc++。如果输入的字符在字符串中不存在,则字符串照原样输出。【提示】答#include"string.h"main(){chars[80],*pstr=s,chdel;printf("Inputsourcestring:");gets(pstr);printf("Characteryouwantdelete:");scanf("%c",&chdel);fun(pstr,chdel);printf("Afterdeleted:");puts(pstr);getch();}intfun(char*s,charch){inti,j;for(i=0,j=0;s[i];i++)if(s[i]!=ch)s[j++]=s[i];s[j]=0;}5编程将从键盘输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论