c语言课后习题第7章函数.docx
《c语言课后习题第7章函数.docx》由会员分享,可在线阅读,更多相关《c语言课后习题第7章函数.docx(90页珍藏版)》请在冰豆网上搜索。
![c语言课后习题第7章函数.docx](https://file1.bdocx.com/fileroot1/2023-1/5/b323c792-9620-4909-9f73-6697f5ba8dfe/b323c792-9620-4909-9f73-6697f5ba8dfe1.gif)
c语言课后习题第7章函数
习题7
7.1已有变量定义和函数调用语句:
inta=1,b=–5,c;c=fun(a,b);fun函数的作用是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun函数。
Fun(intx,inty)
{ }
7.1求两数之差绝对值
#include
fun(intx,inty)
{returnabs(x-y);}
main()
{inta=1,b=-5,c;
c=fun(a,b);
printf("|%d-%d|=%d\n",a,b,c);
}
7.2已有变量定义和函数调用语句:
intx=57;isprime(x);函数isprime( );用来判断一个整型数a是否为素数,若是素数,函数返回1,否则返回0。
请编写isprime函数。
isprime(inta)
{ }
7.3已有变量定义和函数调用语句inta,b;b=sum(a);函数sum()用以求
和数作为函数值返回。
若a的值为10,经函数sum的计算后,b的值是55。
请编写sum函数。
Sum(intn)
{ }
7.3求∑k
#include
sum(intn)
{intk,s=0;
for(k=1;k<=n;k++)
s=s+k;
returns;
}
main()
{inta,b;
printf("Inputa:
");scanf("%d",&a);
b=sum(a);
printf("%c(1,%d)=%d\n",228,a,b);
}
一函数,输入一行字符,将此字符串中最长的单词输出。
7.4输出最长的单词,假设只包含字母和空格,单词间以空格分隔,空格个数不限
#include
voidfun(chara[])
{intn,i,j,k=0,len[80],p;
charc[80][80],max[80];
n=strlen(a);
for(i=0;iif(a[i]!
=32)/*a[i]不为空格,说明单词开始了*/
{j=0;
while(a[i]!
=32)/*没有遇到下一个空格,说明单词没有结束*/
{c[k][j]=a[i];j++;i++;}/*将单词放入字符串c[k]*/
c[k][j]='\0';/*人为加串尾标志*/
k++;/*k为下一个单词存入c的行号*/
}
for(i=0;ilen[i]=strlen(c[i]);/*求每行字符串的长度*/
p=0;
for(i=1;iif(len[p]/*找最长字符串的行号*/
printf("Thewordis:
%s\n",c[p]);
}
main()
{chara[80];
printf("Inputalinestring:
");gets(a);
fun(a);
}
7.5一函数,输入一个十六进制数,输出相应的十进制数。
7.5十六进制数转换成十进制数
#include
#include
intfun(chara[])
{inti,n=0,m;
for(i=0;a[i];i++)
{if(isalpha(a[i]))
/*如果a[i]是字母,求出相应的十进制数*/
switch(a[i])
{case'a':
case'A':
m=10;break;
case'b':
case'B':
m=11;break;
case'c':
case'C':
m=12;break;
case'd':
case'D':
m=13;break;
case'e':
case'E':
m=14;break;
case'f':
case'F':
m=15;break;
default:
printf("Inputerror!
\n");exit(0);
/*如果输入了不合法的字母,输出相应的信息*/
}
elseif(isdigit(a[i]))/*如果a[i]是数字*/
m=a[i]-'0';
else{printf("Inputerror!
\n");exit(0);}
/*如果输入了不合法的字符,输出相应的信息*/
n=n*16+m;/*将十六进制数转换成十进制数*/
}
returnn;
}
main()
{chara[80];intn;
printf("input:
");scanf("%s",a);
n=fun(a);
printf("output:
%d\n",n);
}
给出年、月、日,计算该日是该年的第几天。
#include
intfun(year,month,day)
{intn=0,i;
n=n+day;/*累加当月的天数*/
for(i=month-1;i>0;i--)/*累加前面月份的天数*/
switch(i)
{case12:
n=n+31;
case11:
n=n+30;
case10:
n=n+31;
case9:
n=n+30;
case8:
n=n+31;
case7:
n=n+31;
case6:
n=n+30;
case5:
n=n+31;
case4:
n=n+30;
case3:
n=n+31;
case2:
if(year%4==0&&year%100!
=0||year%400==0)
n=n+28;
elsen=n+29;/*根据year判断闰年或平年,进行累加*/
case1:
n=n+31;
}
returnn;/*返回天数*/
}
main()
{intyear,month,day;
printf("Inputyear,month,day:
");scanf("%d%d%d",&year,&month,&day);
printf("%d.%d.%disNo.%dofayear.\n",year,month,day,fun(year,month,day));
}
定义一个函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。
例如:
digit(15327,4)=5
digit(289,5)=0
7.7回送第k个数字
#include
intfun(longn,intk)
{inti,m;
for(i=1;i<=k;i++)
{m=n%10;/*从右边分离出第i个数字*/
n=n/10;/*为下一次分离作准备*/
}
returnm;/*返回第k次分离出的数字*/
}
main()
{longintn;intk;
printf("Inputn:
");scanf("%ld",&n);
printf("Inputk:
");scanf("%d",&k);
printf("TheNo.%dnumberis%d.\n",k,fun(n,k));
}
7.8计算s。
已知
s=10!
+7!
*8!
将n!
定义成函数。
#include
doublefun(intn)
{doublef=1.0;inti;
for(i=1;i<=n;i++)
f=f*i;/*求n!
*/
returnf;/*返回阶乘值*/
}
main()
{printf("10!
+7!
*8!
=%g\n",fun(10)+fun(7)*fun(8));}
7.9定义一个函数,使给定的二维数组(3×3)转置,即行列转换,并输出。
7.9矩阵转置
#include
voidconvert(inta[][3])
{inti,j,t;
for(i=0;i<3;i++)
for(j=0;j
{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}
}/*矩阵转置*/
main()
{inta[3][3],i,j;
printf("Input3*3array:
\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);/*读入数据*/
printf("beforeconverted,output:
\n");
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%4d",a[i][j]);
printf("\n");
}/*输出原始数据*/
convert(a);/*调用函数进行处理*/
printf("afterconverted,output:
\n");
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%4d",a[i][j]);
printf("\n");
}/*输出转置后的数据*/
}
7.10写几个函数:
①输入10个职工的性名和职工号;②按职工号由小到大的顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工的姓名。
7.10编写几个函数,分别实现输入、排序、查找
#include
#include
#defineN10
voidinput(charname[N][8],charno[N][8])
{inti;
printf("Input%dnameandNo.\n",N);
for(i=0;iscanf("%s%s",name[i],no[i]);
}/*输入每个人的姓名和学号*/
voidsort(charname[N][8],charno[N][8])
{chart[8];inti,j,p;
for(i=0;i{p=i;
for(j=p;jif(strcmp(name[p],name[j])>0)p=j;
if(p!
=i)
{strcpy(t,name[p]);strcpy(name[p],name[i]);strcpy(name[i],t);
strcpy(t,no[p]);strcpy(no[p],no[i]);strcpy(no[i],t);
}
}
}/*按姓名进行从小到大的排序,姓名进行交换的时候,
职工号也进行交换,以保证职工号跟着姓名走,以免打乱
对应的关系*/
voidfind(charname[N][8],charno[N][8],charNo[8],charmessge[8])
{intlow=0,high=N-1,mid;
while(low<=high)
{mid=(low+high)/2;
if(strcmp(No,no[mid])>0)low=mid+1;/*向下找*/
elseif(strcmp(No,no[mid])<0)high=mid-1;/*向上找*/
else{strcpy(message,name[mid]);return;}/*找到了,
就将对应的姓名存入find字符串*/
}
strcpy(message,"nofind");/*找不到,find字符串存入"nofind"*/
}
main()
{charname1[N][8],no1[N][8],No1[8],message1[8];inti;
clrscr();
input(name1,no1);/*调用输入函数*/
printf("%dalerksare:
\n",N);
printf("%10s%20s\n","name","No.");
for(i=0;iprintf("%10s%20s\n",name1[i],no1[i]);/*输出每个人的姓名和职工号*/
sort(name1,no1);/*调用排序函数*/
printf("aftersorted:
\n");
printf("%10s%20s\n","name","No.");
for(i=0;iprintf("%10s%20s\n",name1[i],no1[i]);/*输出排序后的姓名和职工号*/
printf("InputfindedNo.:
");scanf("%s",No1);/*输入要查找的职工号*/
find(name1,no1,No1,message1);/*调用查找函数,将找到的姓名放入find字符串*/
if(strcmp(message1,"nofind")==0)
printf("Nofind.\n");
else
printf("Thefindedalerkis:
%s\n",message1);
/*根据find的内容输出相应的信息*/
}
7.11定义一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
7.11反序存放字符串
#include
voidfun(chars[80])
{inti,j,n;charc;
n=strlen(s);/求字符串长度,n也对应串尾标志*/
for(i=0,j=n-1;i/*i表示前面的下标,j表示后面的下标*/
{c=s[i];s[i]=s[j];s[j]=c;}/*首尾交换*/
}
main()
{chars[80];
printf("Inputastring:
");gets(s);
fun(s);
printf("converted,output:
");puts(s);
}
7.11fun函数方法二
voidfun(chars[])
{inti,n=0;charc;
while(s[n])n++;/*n对应串尾标志,同时也代表长度*/
for(i=0;i<=n/2;i++)
{c=s[i];s[i]=s[n-1-i];s[n-1-i]=c;}
/*首尾交换,注意i的上界*/
}
7.11fun函数方法三
voidfun(chars[])
{inti,n=0;charc;
while(s[n++]);/*n是串尾后一个字符的下标*/
n--;/*n为串尾下标,同时也代表长度*/
7.12用递归法将一个整数N转换成字符串。
例如,输入483,应输出“483”。
N的位数不确定,可以是任意位数的整数。
7.12递归法将整数转换成字符串
main函数输入整数n。
fun(intn)函数完成:
如果n!
=0,
i=n/10;作为下一步递归调用的实参。
递归调用fun(i)。
以字符形式输出n%10
程序如下:
#include
voidconver(intn)
{inti;
if((i=n/10)!
=0)
conver(i);
putchar(n%10+’0’);
}
main()
{intnum;
printf("Inputnum:
");scanf(“%d”,&num);
printf(“Output:
”);
conver(num);
}
7.13已有变量定义语句;intn=5;和函数调用语句mypow(a,n);用以求a的n次方。
请编写doublemypow(doublex,inty)函数。
doublemypow(doublex,inty)
{ }
7.13求an
在被调函数中输出结果,调用函数作为独立的语句。
#include
voidmypow(doublex,inty)
{inti;doublez=1.0;
for(i=1;i<=y;i++)
z=z*x;
printf("Output:
%g\n",z);
}
main()
{doublea=5.0;intn=5;
mypow(a,n);
}运行结果:
Output:
3125
7.14以下程序的功能是用牛顿法求解方程f(x)=cosx-x=0。
已有初始值x0=3.1415/4,要求绝对误差不超过0.001,函数f用来计算迭代公式中xn的值,请编写子函数。
牛顿迭代公式是:
xn+1=xn-f(xn)
即:
xn+1=xn-(cosxn-xn)/(sinxn-1)
#include
#include
floatf(floatx0)
{ }
main()
{intt=0,k=100,n=0;floatx0=PI/4,x1;
while(n{x1=f(x0);
if(fabs(x0-x1)<0.001){t=1;break;}
else{x0=x1;n=n+1;}
}
if(t==1)printf(“\nfangchenggengis%”,x1);
elseprintf(“\nSorry,notfound!
”);
}
方法二:
在main函数输出结果,被调函数返回值
#include
doublemypow(doublex,inty)
{inti;doublez=1.0;
for(i=1;i<=y;i++)
z=z*x;
returnz;
}
main()
{doublea=5.0;intn=5;
printf("Output:
%g\n",mypow(a,n));
}运行结果:
Output:
3125
方法三:
递归调用
#include
doublemypow(doublex,inty)
{doublez;
if(y==0)z=1.0;
elsez=mypow(x,y-1)*x;
returnz;
}
main()
{doublea=5.0;intn=5;
printf("Output:
%g\n",mypow(a,n));
}运行结果:
Output:
3125
7.15已有函数调用语句c=add(a,b);请编写add函数,计算两个实数a和b的和,并返回和值。
Doubleadd(doublex,doubley)
{ }
7.15求和
#include
doubleadd(doublex,doubley)
{doublez;
z=x+y;
returnz;
}
main()
{doublea,b,c;
printf("Inputa,b:
");
scanf("%lf%lf",&a,&b);/*注意:
必须用%lf*/
c=add(a,b);
pirntf("%f+%f=%f\n",a,b,c);
}
7.16以下程序的功能是应用弦截法求方程x3-5x2+16x-80=0的根,其中f函数可根据指定x的值求出方程的值;函数xpoint可根据x1和x2求出f(x1)和f(x2)的连线与x轴的交点;函数root用来求区间(x1,x2)的实根,请编写root函数。
7.17以下函数p的功能是用递归方法计算x的阶勒让德多项式的值。
已有调用语句p(n,x);请编写p函数。
递归公式如下:
1(n=0)
Px(x)=x(n=1)
((2n-1)*x*Pn-1(x)-(n-1)*Pn-z(x))/n(n>1)
floatp(intn,intx)
{}
7.17递归法求勒让德多项式
#include
floatp(intn,intx)
{if(n==0)return1.0;
elseif(n==1)returnx;
elsereturn((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n;
}
main()
{intn,x;
printf("Inputn,x:
");scanf("%d%d",&n,&x);
printf("Output:
%g\n",p(n,x));
}
7.18程序的功能是应用下面的近似公式计算e的n次方。
函数f1用来计算每项分子的值,函数f2用来计算每项分母的值。
请编写f1和f2函数。
ex=1+x+
+
+……(前20项的和)
floatf2(intn)
{}
floatf1(intx,intn)
{}
main()
{floatexp=1.0;intn,x;
printf(“Inputanumber:
”);
scanf(“%d”,&x);printf(“%d\n”,x);
exp=exp+x;
for(n=2;n<=19;n++)exp=exp+f1(x,n)/f2(n);
printf(“\nTheisexp(%d)=%\n”,x,exp);
}
运行结果:
Inputanumber:
3
7.18求en
#include
floatf2(intn)
{inti;floatz=1.0;
for(i=1;i<=n;i++)
z=z*i;
returnz;
}
floatf1(intx,intn)
{inti;floatz=1.0;
for(i=1;i<=n;i++)
z=z*x;
returnz;
}
main()
{floatexp=1.0;intn,x;
printf("Inputanumber:
");scanf("%d",&x);
exp=exp+x;
for(n=2;n<=19;n++)
exp=exp+f1(x,n)/f2(n);
printf("\nTheresultisexp(%d)=%g\n",exp);
}/*修改%8.4f为%g,以免数值太小,输出0*/
7.19是一个2*4的整形数组,且各元素均已赋值。
函数max_value可求出其中的最大元素值max,并将此值返回主调函数。
今有函数调用语句max=max_value(a);请编写max_value函数。
max_value