C程序设计谭浩强第三版 函数参考答案.docx
《C程序设计谭浩强第三版 函数参考答案.docx》由会员分享,可在线阅读,更多相关《C程序设计谭浩强第三版 函数参考答案.docx(25页珍藏版)》请在冰豆网上搜索。
![C程序设计谭浩强第三版 函数参考答案.docx](https://file1.bdocx.com/fileroot1/2022-11/25/0894df27-4a4f-4bb3-9309-9e29cf79dceb/0894df27-4a4f-4bb3-9309-9e29cf79dceb1.gif)
C程序设计谭浩强第三版函数参考答案
C语言程序设计
(第三版)
谭浩强
第8章函数参考答案
【知识要点】
C语言的基本组成单位函数。
C是由一个且仅有一个主函数(main)和若干个子函数组成.子函数可有可无。
一个C语言源程序执行,从主函数开始,以主函数结束。
C语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。
采用了函数模块式的结构的特点:
程序的层次结构清晰,便于程序的编写、阅读和调试。
C语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。
如:
数学函数#include
字符函数#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;ifor(j=0;jb[j][i]=a[i][j];
}
voidmain()
{inti,j,a[N][M],b[M][N];
printf("Input%d*%darray:
\n",N,M);
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
printf("\Originalarray:
\n");
for(i=0;i{for(j=0;jprintf("%4d",a[i][j]);
printf("\n");
}
fun(a,b);
printf("Convertarray:
\n");
for(i=0;i{for(j=0;jprintf("%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;jfor(i=0;iif(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;iprintf("%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;jprintf("%8d",score[i][j]);
printf("%8.2f",a_stu[i]);/*输出某个学生的平均成绩*/
}
printf("\nAverage:
");
for(j=0;jprintf("%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;jscanf("%d",&score[i][j]);
}
}
voidaver_stu(intscore[N][M],floata_stu[N])/*计算各个学生平均成绩的函数*/
{
inti,j;
floats;
for(i=0;i{
s=0;
for(j=0;js+=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;is+=score[i][j];
a_cour[j]=s/N;
}
}
voidhighest(intscore[N][M])/*求最高分和它属于哪个学生,哪门课的函数*/
{
inthigh;
inti,j,row,column;
high=score[0][0];
for(i=0;ifor(j=0;jif(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