C程序设计谭浩强第三版 函数参考答案.docx

上传人:b****4 文档编号:3800894 上传时间:2022-11-25 格式:DOCX 页数:25 大小:34.76KB
下载 相关 举报
C程序设计谭浩强第三版 函数参考答案.docx_第1页
第1页 / 共25页
C程序设计谭浩强第三版 函数参考答案.docx_第2页
第2页 / 共25页
C程序设计谭浩强第三版 函数参考答案.docx_第3页
第3页 / 共25页
C程序设计谭浩强第三版 函数参考答案.docx_第4页
第4页 / 共25页
C程序设计谭浩强第三版 函数参考答案.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C程序设计谭浩强第三版 函数参考答案.docx

《C程序设计谭浩强第三版 函数参考答案.docx》由会员分享,可在线阅读,更多相关《C程序设计谭浩强第三版 函数参考答案.docx(25页珍藏版)》请在冰豆网上搜索。

C程序设计谭浩强第三版 函数参考答案.docx

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;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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1