C程序设计谭浩强第三版 函数参考答案.docx
- 文档编号:3800894
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:25
- 大小:34.76KB
C程序设计谭浩强第三版 函数参考答案.docx
《C程序设计谭浩强第三版 函数参考答案.docx》由会员分享,可在线阅读,更多相关《C程序设计谭浩强第三版 函数参考答案.docx(25页珍藏版)》请在冰豆网上搜索。
C程序设计谭浩强第三版函数参考答案
C语言程序设计
(第三版)
谭浩强
第8章函数参考答案
【知识要点】
C语言的基本组成单位函数。
C是由一个且仅有一个主函数(main)和若干个子函数组成.子函数可有可无。
一个C语言源程序执行,从主函数开始,以主函数结束。
C语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。
采用了函数模块式的结构的特点:
程序的层次结构清晰,便于程序的编写、阅读和调试。
C语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。
如:
数学函数#include
字符函数#include
字符串函数#include
输入输出函数#include
动态存储分配函数#include
清屏函数#include
日期和时间函数#include
函数可以嵌套调用,而不可嵌套定义。
函数的值:
函数的值的数据类型由函数定义时所决定的。
调用函数时可有返回值和无返回值两种。
有返回值的函数在函数体内必有一条或多条return语句,无返回值的函数定义为void类型,且在函数体无return语句。
函数调用时参数的传递:
主调函数和被调函数之间数据传递有两种,数值传递和地址传递。
【习题参考答案】
8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。
【解析】用碾转相除法求最大公约数。
最小公倍数=两个整数之积/最大公约数。
#include
intgcf(intx,inty)/*求两整数的最大公约数*/
{intt,r;
if(x {t=x;x=y;y=t;} while((r=x%y)! =0) {x=y; y=r; } returny; } intlcm(intx,inty,inth)/*求两整数的最小公倍数*/ { return(x*y/h); } voidmain() {inta,b,df,sc;/*df: 所求的最大公约数,sc: 所求的最小公倍数*/ printf("Inputa,b\n"); scanf(“%d%d”,&a,&b); df=gcf(a,b); printf(“G.C.F=%d\n”,df); sc=lcm(a,b,df); printf(“L.C.M=%d\n”,sc); } 8.2求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。 从主函数输入a,b,c的值。 #include voidreal_root(floata,floatb,floatdisc)/*求方程的两个不相同的实根*/ {floatx1,x2; x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("x1=%5.2f\tx2=%5.2f\n",x1,x2); } voidequal_root(floata,floatb)/*求方程的两个相同的实根*/ {floatx1,x2; x1=x2=(-b)/(2*a); printf("x1=%5.2f\tx2=%5.2f\n",x1,x2); } voidimaginary_root(floata,floatb,floatdisc)/*求方程的两个不相同的虚根*/ {floatp,q; p=-b/(2*a); q=sqrt(disc)/(2*a); printf("x1=%5.2f+%5.2fi\tx2=%5.2f-%5.2fi\n",p,q,p,q); } voidmain() { floata,b,c,disc; printf("\nInputa,b,c: \n"); scanf("%f%f%f",&a,&b,&c); disc=b*b-4*a*c; if(disc>0) real_root(a,b,disc); elseif(disc==0) equal_root(a,b); else imaginary_root(a,b,disc); } 8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。 【解析】: 素数(质数): 只能被1和该整数本身整除的数为素数。 换句话说,只有两个正因数(1和自己)的自然数即为素数。 #include intprime(intn) { intflag=1,i;/*flag: 标识变量*/ for(i=2;i<=n/2&&flag==1;i++) if(n%i==0) flag=0; returnflag; } voidmain() { intn; printf("\nInputaninteger: "); scanf("%d",&n); if(prime(n)) printf("\n%disaprime.",n); else printf("\n%disnotaprime.",n); } 【扩展】求100以内的所有的素数。 #include intprime(intn) { intflag=1,i;/*flag: 标识变量*/ for(i=2;i<=n/2&&flag==1;i++) if(n%i==0) flag=0; returnflag; } voidmain() { inta[100],i,j=0; for(i=2;i<=100;i++) a[i]=i; for(i=2;i<=100;i++) if(prime(a[i])) {if(j++%5==0)printf("\n");/*控制每行输出的个数,每行按5个输出*/ printf("%5d",a[i]); } } 8.4写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 #defineN3 #defineM3 #include voidfun(inta[N][M],intb[M][N]) {inti,j,t; for(i=0;i for(j=0;j b[j][i]=a[i][j]; } voidmain() {inti,j,a[N][M],b[M][N]; printf("Input%d*%darray: \n",N,M); for(i=0;i for(j=0;j scanf("%d",&a[i][j]); printf("\Originalarray: \n"); for(i=0;i {for(j=0;j printf("%4d",a[i][j]); printf("\n"); } fun(a,b); printf("Convertarray: \n"); for(i=0;i {for(j=0;j printf("%4d",b[i][j]); printf("\n"); } } 8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 【解析】字符串处理方法,一是字符数组,二是指针,编写函数时,采用地址传递。 #include #include voidinverse(charstr[]) {chart; inti,j; for(i=0,j=strlen(str)-1;i {t=str[i]; str[i]=str[j]; str[j]=t; } } voidmain() { charstr[80]; voidinverse(charstr[]); printf(“Inputstring: ”); gets(str); inverse(str); puts(str); } 8.6写一函数,将两个字符串连接。 【解析】: 将串2连接在串1的后面,形成一新串。 新串末尾须加字符串结束标志。 #include #include charconnect(charstr1[],charstr2[]) {inti,j; for(j=strlen(str1),i=0;str2[i]! ='\0';i++) str1[i+j]=str2[i]; str1[i+j]='\0';/*新串末尾须加字符串结束标志\0*/ } voidmain() {chars1[80],s2[80]; printf("\nInputstring1: "); gets(s1); printf("\nInputstring2: "); gets(s2); connect(s1,s2); puts(s1); }_ngis%s\n”,s); } 8.7写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。 #include #include voidstring_copy(charstr[]) {inti,j=0; for(i=0;str[i]! ='\0';i++) if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u') str[j++]=str[i]; str[j]='\0'; puts(str); } voidmain() {charstr[80]; intn; gets(str); string_copy(str); } 8.8写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字之间有一个空格。 如输入1990,应输出”1990”。 #include #include voidchange(intn,charstr[])/*该函数的功能将数值转换为数字字符*/ {inti; for(i=3;i>=0;i--) {str[i]=n%10+'0'; n/=10; } str[4]='\0'; } voidinsert(charstr[])/*该函数的功能插入空格并输出该数字字符*/ {inti; for(i=strlen(str);i>0;i--) {str[2*i]=str[i]; str[2*i-1]=''; } puts(str); } voidmain() {charstr[80]; intn; printf("\nInputnumber: "); do/*该循环控制输入的数为四位整数*/ scanf("%d",&n); while(n<999||n>10000); change(n,str); insert(str); } 8.9编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。 #include #include #include intletter,digit,space,others;/*说明定义为全局变量,全局变量不赋值时自动赋0值*/ intcount(charstr[]) {inti; for(i=0;str[i]! ='\0';i++) if(isalpha(str[i])) letter++; elseif(isdigit(str[i])) digit++; elseif(str[i]=='') space++; else others++; } voidmain() { charstr[80]; printf("\nInputstring: \n"); gets(str); printf("string: "); puts(str); count(str); printf("letter: %d,digit: %d,space: %d,others: %d\n",letter,digit,space,others); } 8.10写一函数,输入一行字符,将此字符串中最长的单词输出。 【解析】先确定单词是如何组成的。 假若以空格、数字或其它字符作为单词的分隔。 #include #include #include charstring_long(charstr[]) { inti,j,k=1,flag=1,max=0,si=0,sj; for(i=0;str[i]! ='\0';i++) {if(isalpha(str[i])) if(flag) {j=i; flag=0;} else k++; else { if(max {max=k; si=j;/*si : 记长串的起始位置*/ sj=si+k;/*sj : 记长串的结束位置*/ } flag=1; k=1; } } str[sj]='\0'; puts(&str[si]); } voidmain() {inti; charstring[80]; printf("Inputonelinecharacter: \n"); gets(string); printf("\nThelongestwordis: "); string_long(string); } 8.11写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。 #defineN10 #include #include voidsort(charstr[]) {inti,j; chart; for(j=0;j for(i=0;i if(str[i]>str[i+1]) {t=str[i]; str[i]=str[i+1]; str[i+1]=t; } } voidmain() {charch[N]; inti,flag; for(i=0;i<10;i++) scanf("%c",&ch[i]); sort(ch); printf("stringsorted: \n"); for(i=0;i printf("%c",ch[i]); } 8.12用牛顿迭代法求根。 方程为 ,系数 的值依次为1,2,3,4。 求x在1附近的一个实根。 求出根后由主函数输出。 【解析】牛顿迭代公式: #include #include doublef(floata,floatb,floatc,floatd,doublex) { returna*x*x*x+b*x*x+c*x+d; } doublef1(floata,floatb,floatc,doublex) { return3*a*x*x+2*b*x+c; } doubleroot(floata,floatb,floatc,floatd,doublex) { doublex0; do {x0=x; x=x0-f(a,b,c,d,x0)/f1(a,b,c,x0); } while(fabs(x-x0)>1e-5); returnx; } voidmain() { floata,b,c,d; doublex; a=1;b=2;c=3;d=4; x=1; x=root(a,b,c,d,x); printf("root: %lf\n",x); } 8.13用递归方法求n阶勒让德多项式的值,递归公式为: #include"stdio.h" doubleP(doublex,intn) {if(n==0)return1; if(n==1)returnx; if(n>1)return((2*n-1)*x-P(x,n-1)-(n-1)*P(x,n-2))/n; } voidmain() {doublex;intn; doubleP(doublex,intn); scanf("%lf%d",&x,&n); printf("%lf",P(x,n));} 8.14输入10个学生5门课的成绩,分别用函数实现下列功能: (1)计算每个学生的平均分; (2)计算每门课的平均分; (3)找出所有50个分数中的最高的分数所对应的学生和课程; (4)求出平均分方差; 其中, 为某一学生的平均分。 解: 函数input_stu的执行结果是给全程变量学生成绩数组score各元素输入初值。 函数aver_stu的作用是计算每个学生的平均分,并将结果赋给全程变量数组a_stu中各元素。 函数aver_cour的作用是计算每门课的平均成绩,计算结果存入全程变量数组a_cour。 函数highest的返回值是最高分,r,c是两个全局变量,分别代表最高分所在的行,列号。 函数s_var的返回值是平均分的方差。 程序如下: 【程序一】 #include #include #defineN10 #defineM5 floats_var(floata_stu[N]); voidhighest(intscore[N][M]);/*函数原型声明*/ voidinput_stu(intscore[N][M]);/*函数原型声明*/ voidaver_stu(intscore[N][M],floata_stu[N]);/*函数原型声明*/ voidaver_cour(intscore[N][M],floata_cour[M]);/*函数原型声明*/ voidmain() { intscore[N][M]; floata_stu[N],a_cour[M];/*各个学生平均分,各门课程平均分*/ inti,j; input_stu(score);/*函数调用,输入10个学生成绩*/ aver_stu(score,a_stu);/*函数调用,计算10个学生平均成绩*/ aver_cour(score,a_cour);/*函数调用,计算5门课平均成绩*/ printf("\nNO.cour1cour2cour3cour4cour5aver"); for(i=0;i { printf("\nNO.%2d",i+1);/*输出学生序号*/ for(j=0;j printf("%8d",score[i][j]); printf("%8.2f",a_stu[i]);/*输出某个学生的平均成绩*/ } printf("\nAverage: "); for(j=0;j printf("%8.2f",a_cour[j]); highest(score);/*调用函数,求最高分和它属于哪个学生,哪门课*/ printf("\nVariance: %8.2f\n",s_var(a_stu));/*调用函数,计算和输出方差*/ } voidinput_stu(intscore[N][M])/*输入10个学生成绩的函数*/ { inti,j; for(i=0;i { printf("\nInputscoreofstudent%2d: \n",i+1);/*学生号从1开始*/ for(j=0;j scanf("%d",&score[i][j]); } } voidaver_stu(intscore[N][M],floata_stu[N])/*计算各个学生平均成绩的函数*/ { inti,j; floats; for(i=0;i { s=0; for(j=0;j s+=score[i][j]; a_stu[i]=s/M; } } voidaver_cour(intscore[N][M],floata_cour[M])/*计算各门课的平均成绩的函数*/ { inti,j; floats; for(j=0;j { s=0; for(i=0;i s+=score[i][j]; a_cour[j]=s/N; } } voidhighest(intscore[N][M])/*求最高分和它属于哪个学生,哪门课的函数*/ { inthigh; inti,j,row,column; high=score[0][0]; for(i=0;i for(j=0;j if(score[i][j]>high) { high=score[i][j]; row=i+1;/*数组行号i从0开始,学生号r从1开始,故row=i+1*/ column=j+1;/*数组列号j从0开始,学生号c从1开始,故column=j+1*/ } printf("\nHighestscoreis: %3d,NO.%2dstudent,course%2d\n",high,row,column); } floats_var(floata_stu[N])/*求方差的函数*/ { inti,j; floatsumx,sumxn; sumx=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C程序设计谭浩强第三版 函数参考答案 程序设计 谭浩强 第三 函数 参考答案