c语言课后习题第7章函数.doc
《c语言课后习题第7章函数.doc》由会员分享,可在线阅读,更多相关《c语言课后习题第7章函数.doc(14页珍藏版)》请在咨信网上搜索。
习 题 7 7.1 已有变量定义和函数调用语句:int a=1,b=–5,c;c=fun(a,b);fun函数的作用是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun函数。 Fun(int x,int y) { } 7.1 求两数之差绝对值 #include <math.h> fun(int x,int y) { return abs(x-y); } main() { int a=1,b=-5,c; c=fun(a,b); printf("|%d-%d|=%d\n",a,b,c); } 7.2 已有变量定义和函数调用语句:int x=57;isprime(x);函数isprime( );用来判断一个整型数a是否为素数,若是素数,函数返回1,否则返回0。请编写isprime函数。 isprime(int a) { } 7.3 已有变量定义和函数调用语句int a ,b;b=sum(a);函数sum()用以求,和数作为函数值返回。若a的值为10,经函数sum的计算后,b的值是55。请编写sum函数。 Sum(int n) { } 7.3 求∑k #include <stdio.h> sum(int n) { int k,s=0; for(k=1;k<=n;k++) s=s+k; return s; } main() { int a,b; printf("Input a: "); scanf("%d",&a); b=sum(a); printf("%c(1,%d)=%d\n",228,a,b); } 7.4 一函数,输入一行字符,将此字符串中最长的单词输出。 7.4 输出最长的单词,假设只包含字母和空格,单词间以空格分隔,空格个数不限 #include <string.h> void fun(char a[]) { int n,i,j,k=0,len[80],p; char c[80][80],max[80]; n=strlen(a); for(i=0;i<n;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<k;i++) len[i]=strlen(c[i]); /*求每行字符串的长度*/ 输入一行字符,以空格分隔,单词只包含字母 将每个单词存入字符串数组c 求c中最长字符串的行号 输出 p=0; for(i=1;i<k;i++) if(len[p]<len[i]) p=i; /*找最长字符串的行号*/ printf("The word is : %s\n",c[p]); } main() { char a[80]; printf("Input a line string: "); gets(a); fun(a); } 7.5 一函数,输入一个十六进制数,输出相应的十进制数。 7.5 十六进制数转换成十进制数 #include <stdio.h> #include <ctype.h> int fun(char a[]) { int i,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("Input error!\n"); exit(0); /*如果输入了不合法的字母,输出相应的信息*/ } else if(isdigit(a[i])) /*如果a[i]是数字*/ m=a[i]-'0'; else { printf("Input error!\n"); exit(0); } /*如果输入了不合法的字符,输出相应的信息*/ n=n*16+m; /*将十六进制数转换成十进制数*/ } return n; } main() { char a[80]; int n; printf("input: "); scanf("%s",a); n=fun(a); printf("output: %d\n",n); } 7.6 给出年、月、日,计算该日是该年的第几天。 #include <stdio.h> int fun(year,month,day) { int n=0,i; n=n+day; /*累加当月的天数*/ for(i=month-1;i>0;i--) /*累加前面月份的天数*/ switch(i) { case 12: n=n+31; case 11: n=n+30; case 10: n=n+31; case 9: n=n+30; case 8: n=n+31; case 7: n=n+31; case 6: n=n+30; case 5: n=n+31; case 4: n=n+30; case 3: n=n+31; case 2: if(year%4==0&&year%100!=0||year%400==0) n=n+28; else n=n+29; /*根据year判断闰年或平年,进行累加*/ case 1: n=n+31; } return n; /*返回天数*/ } main() { int year,month,day; printf("Input year,month,day: "); scanf("%d%d%d",&year,&month,&day); printf("%d.%d.%d is No.%d of a year.\n",year,month,day,fun(year,month,day)); } 7.7 定义一个函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如: digit(15327,4)=5 digit(289,5)=0 7.7 回送第k个数字 #include <stdio.h> int fun(long n,int k) { int i,m ; for(i=1;i<=k;i++) { m=n%10; /*从右边分离出第i个数字*/ n=n/10; /*为下一次分离作准备*/ } return m; /*返回第k次分离出的数字*/ } main() { long int n; int k; printf("Input n: "); scanf("%ld",&n); printf("Input k: "); scanf("%d",&k); printf("The No.%d number is %d.\n",k,fun(n,k)); } 7.8 计算s。已知 s=10!+7!*8! 将n!定义成函数。 #include <stdio.h> double fun(int n) { double f=1.0; int i; for(i=1;i<=n;i++) f=f*i; /*求n!*/ return f; /*返回阶乘值*/ } main() { printf("10!+7!*8!=%g\n",fun(10)+fun(7)*fun(8)); } 7.9 定义一个函数,使给定的二维数组(3×3)转置,即行列转换,并输出。 7.9 矩阵转置 #include <stdio.h> void convert(int a[][3]) { int i,j,t; for(i=0;i<3;i++) for(j=0;j<i;j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; } } /*矩阵转置*/ main() { int a[3][3],i,j; printf("Input 3*3 array: \n"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*读入数据*/ printf("before converted, output: \n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%4d",a[i][j]); printf("\n"); } /*输出原始数据*/ convert(a); /*调用函数进行处理*/ printf("after converted, 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 <stdio.h> #include <string.h> #define N 10 void input(char name[N][8],char no[N][8]) { int i; printf("Input %d name and No.\n",N); for(i=0;i<N;i++) scanf("%s%s",name[i],no[i]); } /*输入每个人的姓名和学号*/ void sort(char name[N][8],char no[N][8]) { char t[8]; int i,j,p; for(i=0;i<N-1;i++) { p=i; for(j=p;j<N;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); } } } /*按姓名进行从小到大的排序,姓名进行交换的时候, 职工号也进行交换,以保证职工号跟着姓名走,以免打乱 对应的关系*/ void find(char name[N][8],char no[N][8],char No[8],char messge[8]) { int low=0,high=N-1,mid; while(low<=high) { mid=(low+high)/2; if(strcmp(No,no[mid])>0) low=mid+1; /*向下找*/ else if(strcmp(No,no[mid])<0) high=mid-1; /*向上找*/ else { strcpy(message,name[mid]); return; } /*找到了, 就将对应的姓名存入find字符串*/ } strcpy(message,"no find"); /*找不到,find字符串存入"no find"*/ } main() { char name1[N][8],no1[N][8],No1[8],message1[8]; int i; clrscr(); input(name1,no1); /*调用输入函数*/ printf("%d alerks are: \n",N); printf("%10s%20s\n","name","No."); for(i=0;i<N;i++) printf("%10s%20s\n",name1[i],no1[i]); /*输出每个人的姓名和职工号*/ sort(name1,no1); /*调用排序函数*/ printf("after sorted: \n"); printf("%10s%20s\n","name","No."); for(i=0;i<N;i++) printf("%10s%20s\n",name1[i],no1[i]); /*输出排序后的姓名和职工号*/ printf("Input finded No. : "); scanf("%s",No1); /*输入要查找的职工号*/ find(name1,no1,No1,message1); /*调用查找函数,将找到的姓名放入find字符串*/ if(strcmp(message1,"no find")==0) printf("No find.\n"); else printf("The finded alerk is: %s\n",message1); /*根据find的内容输出相应的信息*/ } 7.11 定义一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 7.11 反序存放字符串 #include <string.h> void fun(char s[80]) { int i,j,n; char c; n=strlen(s); /求字符串长度,n也对应串尾标志*/ for(i=0,j=n-1;i<j;i++,j--) /*i表示前面的下标,j表示后面的下标*/ { c=s[i]; s[i]=s[j]; s[j]=c; } /*首尾交换*/ } main() { char s[80]; printf("Input a string: "); gets(s); fun(s); printf("converted, output: "); puts(s); } 7.11 fun函数方法二 void fun(char s[]) { int i,n=0; char c; 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.11 fun函数方法三 void fun(char s[]) { int i,n=0; char c; while(s[n++]) ; /*n是串尾后一个字符的下标*/ n--; /*n为串尾下标,同时也代表长度*/ 7.12 用递归法将一个整数N转换成字符串。例如,输入483,应输出“483”。N的位数不确定,可以是任意位数的整数。 7.12 递归法将整数转换成字符串 main函数输入整数n。 fun(int n)函数完成: 如果n!=0, i=n/10; 作为下一步递归调用的实参。 递归调用fun(i)。 以字符形式输出n%10 程序如下: # include <stdio.h> void conver(int n) { int i; if (( i=n/10 )!=0) conver(i); putchar( n%10+’0’); } main() { int num; printf("Input num: "); scanf(“%d”,&num); printf(“ Output: ” ); conver(num); } 7.13 已有变量定义语句double a=5.0;int n=5;和函数调用语句mypow(a,n);用以求a 的n 次方。请编写double mypow(double x,int y)函数。 double mypow(double x,int y) { } 7.13 求an 在被调函数中输出结果,调用函数作为独立的语句。 #include <stdio.h> void mypow(double x,int y) { int i; double z=1.0; for(i=1;i<=y;i++) z=z*x; printf("Output : %g\n",z); } main() { double a=5.0; int n=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<stdio.h> #include<math.h> #define PI 3.1415 float f(float x0) { } main() {int t=0,k=100,n=0;float x0=PI/4,x1; while(n<k) {x1=f(x0); if(fabs(x0-x1)<0.001){t=1;break;} else{x0=x1;n=n+1;} } if(t==1)printf(“\nfangcheng geng is %10.5f”,x1); else printf(“\nSorry,not found!”); } 方法二:在main函数输出结果,被调函数返回值 #include <stdio.h> double mypow(double x,int y) { int i; double z=1.0; for(i=1;i<=y;i++) z=z*x; return z; } main() { double a=5.0; int n=5; printf("Output: %g\n",mypow(a,n)); } 运行结果:Output: 3125 方法三:递归调用 #include <stdio.h> double mypow(double x,int y) { double z; if(y==0) z=1.0; else z=mypow(x,y-1)*x; return z; } main() { double a=5.0; int n=5; printf("Output : %g\n",mypow(a,n)); } 运行结果:Output: 3125 7.15 已有函数调用语句c=add(a,b);请编写add函数,计算两个实数a和b的和,并返回和值。 Double add(double x,double y) { } 7.15 求和 #include <stdio.h> double add(double x,double y) { double z; z=x+y; return z; } main() { double a,b,c; printf("Input a,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) float p(int n,int x) { } 7.17 递归法求勒让德多项式 #include <stdio.h> float p(int n,int x) { if(n==0) return 1.0; else if(n==1) return x; else return ((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n; } main() { int n,x; printf("Input n,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项的和) float f2(int n) { } float f1(int x,int n) { } main() {float exp=1.0;int n,x; printf(“Input a number:”); scanf(“% d”,&x);printf(“%d\n”,x); exp=exp+x; for(n=2;n<=19;n++) exp=exp+f1(x,n)/f2(n); printf(“\nThe is exp(%d)=%8.4f\n”,x,exp); } 运行结果:Input a number:3 The is exp(3)=20.0855 7.18 求en #include <stdio.h> float f2(int n) { int i; float z=1.0; for(i=1;i<=n;i++) z=z*i; return z; } float f1(int x,int n) { int i; float z=1.0; for(i=1;i<=n;i++) z=z*x; return z; } main() { float exp=1.0; int n,x; printf("Input a number: "); scanf("%d",&x); exp=exp+x; for(n=2;n<=19;n++) exp=exp+f1(x,n)/f2(n); printf("\n The result is exp(%d)=%g\n",exp); } /*修改%8.4f为%g,以免数值太小,输出0*/ 7.19 是一个2*4的整形数组,且各元素均已赋值。函数max_value可求出其中的最大元素值max,并将此值返回主调函数。今有函数调用语句max=max_value(a);请编写max_value函数。 max_value(int arr[][4]) { } 7.19 求二维数组的最大值 #include <stdio.h> max_value(int arr[][4]) { int i,j,max; max=arr[0][0]; for(i=0;i<2;i++) for(j=0;j<4;j++) if(max<a[i][j]) max=a[i][j]; return max; } main() { int a[2][4],i,j,max; printf("Input 2*4 array: \n"); for(i=0;i<2;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); max=max_value(a); printf("Output max=%d\n",max); } 7.20 输入若干整数,其值均在1至4的范围内,用-1作为输入结束标志,请编写函数f用于统计每个整数的个数。 例如:若输入的整数为 1 2 3 4 1 2,则统计的结果为: 1: 2 2: 2 3: 1 4: 1 #define M 50 main() int a[M],c[5]={0},i,n,x; n=0; printf(“Enter 1 or 2 or 3 or 4,to end with-1\n”); scanf(“%d”,&x); while(x!=-1) {if(x>=1&&x<=4){a[n]=x;n++};??? Scanf(“%d”,&x); }??? f(a,c,n); printf(“Output the result:\n”); for(i=1;i<=4;i++) printf(“%d:%d\n”,I,c[i]); printf(“\n”); } f(int a[],int c[],int n) { } 7.20 统计1~4的个数 #define M 50 main() { int a[M],c[5]={0},i,n,x; n=0; printf("Enter 1 or 2 or 3 or 4, to end with -1\n"); scanf("%d",&x); while(x!=-1) { if(x>=1&&x<=4) { a[n]=x; n++; } scanf("%d",&x); } /*读入n个数*/ f(a,c,n); printf("Output the result: \n"); for(i=1;i<=4;i++) printf("%d: %d\n",i,c[i]); printf("\n"); } f(int a[],int c[],int n) { int i; for(i=1;i<=n;i++) c[a[i]]++; /*a[i]作为计数数组的下标*/ } 7.21 用递归方法计算下列函数的值: fx (x,n)=x-x2+x3-x4+…(-)n-1xn n>0 8.22 下面是5×5的螺旋方阵,编程生成n×n的螺旋方阵。 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 8.23 回文是从前向后和从后向前读起来都一样的句子。写一个函数,判断一个字符串是否为回文,注意处理字符串中有中文也有西文的情况。 8.24 编写程序,将字符串str中的所有字符’k’删除。- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课后 习题 函数
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文