1、C程序设计谭浩强第三版 函数参考答案C语言程序设计(第三版)谭浩强第8章 函数参考答案【知识要点】 C语言的基本组成单位函数。 C是由一个且仅有一个主函数( main)和若干个子函数组成.子函数可有可无。 一个C语言源程序执行,从主函数开始,以主函数结束。语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。采用了函数模块式的结构的特点:程序的层次结构清晰,便于程序的编写、阅读和调试。语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。如:数学函数 #include 字符函数 #include 字符串函数 #inclu
2、de 输入输出函数 #include 动态存储分配函数 #include #include 清屏函数 #include 日期和时间函数 #include 函数可以嵌套调用,而不可嵌套定义。函数的值: 函数的值的数据类型由函数定义时所决定的。调用函数时可有返回值和无返回值两种。有返回值的函数在函数体内必有一条或多条 return 语句,无返回值的函数定义为void类型,且在函数体无return 语句。函数调用时参数的传递:主调函数和被调函数之间数据传递有两种,数值传递和地址传递。【习题参考答案】8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数
3、由键盘输入。【解析】用碾转相除法求最大公约数。最小公倍数两个整数之积/最大公约数。#include int gcf(int x,int y) /*求两整数的最大公约数*/int t,r; if (xy) t=x;x=y;y=t; while (r=x%y)!=0) x=y; y=r; return y;int lcm(int x,int y,int h) /*求两整数的最小公倍数*/ return(x*y/h);void main ( ) int a,b,df,sc; /* df:所求的最大公约数,sc:所求的最小公倍数*/ printf(Input a,bn); scanf(“%d%d”,&
4、a,&b); df=gcf(a,b); printf(“G.C.F=%dn”,df); sc=lcm(a,b,df); printf(“L.C.M=%dn”,sc);8.2 求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。从主函数输入a,b,c的值。# include void real_root(float a,float b,float disc) /*求方程的两个不相同的实根*/float x1,x2; x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(x1=%5.2f
5、tx2=%5.2fn,x1,x2);void equal_root(float a,float b) /*求方程的两个相同的实根*/ float x1,x2; x1=x2=(-b)/(2*a); printf(x1=%5.2ftx2=%5.2fn,x1,x2);void imaginary_root(float a,float b,float disc) /*求方程的两个不相同的虚根*/ float p,q; p=-b/(2*a); q=sqrt(disc)/(2*a); printf(x1=%5.2f+%5.2fitx2=%5.2f-%5.2fin,p,q,p,q);void main (
6、) float a,b,c,disc; printf(nInput a,b,c:n); scanf(%f%f%f,&a,&b,&c); disc=b*b-4*a*c; if (disc0) real_root(a,b,disc); else if (disc=0) equal_root(a,b); else imaginary_root(a,b,disc);8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。【解析】:素数(质数):只能被1和该整数本身整除的数为素数。换句话说,只有两个正因数(1和自己)的自然数即为素数。#include int prime(int n) int
7、 flag=1,i; /*flag:标识变量*/ for (i=2;i=n/2 & flag=1;i+) if (n%i=0) flag=0; return flag ;void main ( ) int n; printf(nInput an integer:); scanf(%d,&n); if (prime(n) printf(n %d is a prime.,n); else printf(n %d is not a prime.,n); 【扩展】求100以内的所有的素数。#include int prime(int n) int flag=1,i; /*flag:标识变量*/ for
8、 (i=2;i=n/2 & flag=1;i+) if (n%i=0) flag=0; return flag ;void main ( ) int a100,i,j=0; for(i=2;i=100;i+) ai=i; for(i=2;i=100;i+) if (prime(ai) if(j+%5=0) printf(n); /*控制每行输出的个数,每行按5个输出*/ printf(%5d,ai); 8.4写一函数,使给定的一个二维数组(33)转置,即行列互换。# define N 3#define M 3#include void fun (int aNM,int bMN) int i,j
9、,t; for (i=0;iN;i+) for (j=0;jM;j+) bji=aij;void main ( ) int i,j,aNM,bMN; printf(Input %d * %d array:n,N,M); for (i=0;iN;i+) for (j=0;jN;j+) scanf(%d,&aij); printf(Original array : n); for (i=0;iN;i+) for (j=0;jN;j+) printf(%4d,aij); printf(n); fun(a,b);printf(Convert array:n); for (i=0;iN;i+) for
10、(j=0;jN;j+) printf(%4d,bij); printf(n);8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。【解析】字符串处理方法,一是字符数组,二是指针,编写函数时,采用地址传递。#include #include void inverse (char str ) char t; int i,j; for (i=0,j=strlen(str)-1;istrlen(str)/2;i+,j-) t=stri; stri=strj; strj=t; void main ( ) char str80; void inverse (char str ); p
11、rintf(“Input string:”); gets(str); inverse(str); puts(str);8.6写一函数,将两个字符串连接。【解析】:将串2连接在串1 的后面,形成一新串。新串末尾须加字符串结束标志。#include #include char connect(char str1 ,char str2 )int i,j; for (j=strlen(str1),i=0;str2i!=0;i+) str1i+j=str2i; str1i+j=0; /*新串末尾须加字符串结束标志0*/void main ( ) char s180,s280; printf(nInput
12、 string1:); gets(s1); printf(nInput string2:); gets(s2); connect(s1,s2); puts(s1);_ng is %sn”,s);8.7 写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。#include #include void string_copy(char str) int i,j=0; for(i=0;stri!=0;i+) if(stri=a|stri=e|stri=i|stri=o|stri=u) strj+=stri; strj=0; puts(str);void main ( ) char st
13、r80; int n; gets(str); string_copy(str);8.8写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字之间有一个空格。如输入1990,应输出”1 9 9 0”。#include #include void change(int n,char str) /* 该函数的功能将数值转换为数字字符*/ int i; for(i=3;i=0;i-) stri=n%10+0; n/=10; str4=0;void insert(char str) /* 该函数的功能插入空格并输出该数字字符*/ int i; for (i=strlen(str);i0;i-)
14、 str2*i=stri; str2*i-1= ; puts(str);void main ( ) char str80; int n; printf(nInput number :); do /* 该循环控制输入的数为四位整数*/ scanf(%d,&n); while(n10000); change(n,str); insert(str);8.9编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。#include #include #include int letter,digit,space,others; /* 说明
15、定义为全局变量,全局变量不赋值时自动赋0值 */int count(char str )int i; for (i=0;stri!=0;i+) if (isalpha(stri) letter+; else if (isdigit(stri) digit+; else if (stri= ) space+; else others+;void main ( ) char str80; printf(nInput string:n); gets(str); printf(string:); puts(str); count(str); printf(letter:%d,digit:%d,spac
16、e:%d,others:%dn,letter,digit,space,others);8.10写一函数,输入一行字符,将此字符串中最长的单词输出。【解析】先确定单词是如何组成的。假若以空格、数字或其它字符作为单词的分隔。#include #include #include char string_long(char str) int i,j,k=1,flag=1,max=0,si=0,sj; for(i=0;stri!=0;i+) if(isalpha(stri) if(flag) j=i; flag=0; else k+; else if(maxk) max=k; si=j; /* si:记
17、长串的起始位置*/ sj=si+k; /* sj:记长串的结束位置*/ flag=1; k=1; strsj=0; puts(&strsi);void main ( ) int i; char string80; printf(Input one line character:n); gets (string); printf(nThe longest word is :); string_long(string); 8.11写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。#define N 10#include #include void sort(char str) int
18、i,j; char t; for (j=0;jN-1;j+) for (i=0;istri+1) t=stri; stri=stri+1; stri+1=t; void main ( )char chN; int i,flag; for(i=0;i10;i+) scanf(%c,&chi); sort(ch); printf(string sorted:n); for (i=0;iN;i+) printf(%c,chi);8.12用牛顿迭代法求根。方程为,系数的值依次为1,2,3,4。求x在1附近的一个实根。求出根后由主函数输出。【解析】牛顿迭代公式: #include #include do
19、uble f(float a,float b,float c,float d,double x) return a*x*x*x+b*x*x+c*x+d; double f1(float a,float b,float c,double x) return 3*a*x*x+2*b*x+c; double root(float a,float b,float c,float d,double x) double x0; do x0=x; x=x0-f(a,b,c,d,x0)/f1(a,b,c,x0); while(fabs(x-x0)1e-5); return x;void main() floa
20、t a, b, c, d; double x; a=1;b=2;c=3;d=4; x=1; x=root(a,b,c,d,x); printf ( root:%lfn,x);8.13用递归方法求n阶勒让德多项式的值,递归公式为:#include stdio.hdouble P(double x, int n) if(n=0) return 1; if(n=1) return x; if(n1) return (2*n-1)*x-P(x,n-1)-(n-1)*P(x,n-2)/n;void main() double x; int n; double P(double x, int n); sc
21、anf(%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的返回值是最
22、高分,r,c是两个全局变量,分别代表最高分所在的行,列号。函数s_var的返回值是平均分的方差。程序如下:【程序一】#include #include # define N 10# define M 5float s_var(float a_stuN);void highest(int scoreNM); /* 函数原型声明 */void input_stu(int scoreNM); /* 函数原型声明 */void aver_stu(int scoreNM,float a_stuN); /* 函数原型声明 */void aver_cour(int scoreNM,float a_courM
23、); /* 函数原型声明 */void main() int score NM; float a_stu N,a_courM; /*各个学生平均分,各门课程平均分*/ int i,j; input_stu(score ); /* 函数调用,输入10个学生成绩 */ aver_stu(score,a_stu); /* 函数调用,计算10个学生平均成绩 */ aver_cour(score,a_cour); /* 函数调用,计算5门课平均成绩 */ printf(n NO. cour1 cour2 cour3 cour4 cour5 aver); for (i=0;iN;i+) printf(n
24、NO.%2d ,i+1); /* 输出学生序号 */ for (j=0;jM;j+) /* 输出某个学生各门课的成绩 */ printf(%8d,scoreij); printf(%8.2f,a_stui); /* 输出某个学生的平均成绩 */ printf(nAverage:); for (j=0;jM;j+) /* 输出每门课平均成绩 */ printf(%8.2f,a_courj); highest(score); /* 调用函数,求最高分和它属于哪个学生,哪门课 */ printf(nVariance:%8.2fn,s_var(a_stu); /* 调用函数,计算和输出方差 */ vo
25、id input_stu(int scoreNM) /* 输入10个学生成绩的函数 */ int i,j; for (i=0;iN;i+) printf(nInput score of student%2d:n,i+1); /* 学生号从1开始 */ for (j=0;jM;j+) scanf(%d,&scoreij); void aver_stu(int scoreNM,float a_stuN) /* 计算各个学生平均成绩的函数 */ int i,j; float s; for (i=0;iN;i+) s=0; for (j=0;jM;j+) s+=scoreij; a_stui=s/M;
26、 void aver_cour(int scoreNM,float a_courM) /* 计算各门课的平均成绩的函数 */ int i,j; float s; for (j=0;jM;j+) s=0; for (i=0;iN;i+) s+=scoreij; a_courj=s/N; void highest(int scoreNM) /* 求最高分和它属于哪个学生,哪门课的函数 */ int high; int i,j,row,column; high=score00; for (i=0;iN;i+) for (j=0;jhigh) high=scoreij; row=i+1; /* 数组行号i从0开始,学生号r从1开始,故row=i+1 */ column=j+1; /*数组列号j从0开始,学生号c从1开始,故column=j+1 */ printf(nHighest score is:%3d,NO.%2d student,course %2dn,high,row,column);float s_var(float a_stuN) /* 求方差的函数 */ int i,j; float sumx,sumxn; sumx=0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1