c语言课后习题第7章函数.docx
- 文档编号:6325940
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:90
- 大小:56.71KB
c语言课后习题第7章函数.docx
《c语言课后习题第7章函数.docx》由会员分享,可在线阅读,更多相关《c语言课后习题第7章函数.docx(90页珍藏版)》请在冰豆网上搜索。
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;i if(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;i len[i]=strlen(c[i]);/*求每行字符串的长度*/ p=0; for(i=1;i if(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;i scanf("%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;j if(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;i printf("%10s%20s\n",name1[i],no1[i]);/*输出每个人的姓名和职工号*/ sort(name1,no1);/*调用排序函数*/ printf("aftersorted: \n"); printf("%10s%20s\n","name","No."); for(i=0;i printf("%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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课后 习题 函数