函数调用.docx
- 文档编号:10817791
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:48
- 大小:53.47KB
函数调用.docx
《函数调用.docx》由会员分享,可在线阅读,更多相关《函数调用.docx(48页珍藏版)》请在冰豆网上搜索。
函数调用
习题7
7.1编写函数说明doublefun(doublep,doubleq),计算的值,再设计主函数,调用fun函数对下列各表达式求值。
解答:
#include"math.h"
doublefun(doublep,doubleq)
{
doubley;
y=p/(q*q+sqrt(1+2*q+3*q*q));
return(y);
}
main()
{
floatx,a,b,c,d;
scanf("%f",&x);
a=fun(3.5,x);
b=fun(x-6.3,x*x);
c=fun(1.0,exp(x));
d=fun(sin(x),sin(x));
printf("a=%f\n",a);
printf("b=%f\n",b);
printf("c=%f\n",c);
printf("d=%f\n",d);
}
7.2编写函数factor(n),求n!
,再用它求下面表达式的值。
解答:
doublefactor(intn)
{
inti;
doubley;
y=1.0;
for(i=1;i<=n;i++)
y=y*i;
return(y);
}
main()
{
intn,m,p;
doublec;
scanf("%d%d",&n,&m);
p=m-n;
if(p<0)printf("m \n"); else if(p==0)printf("c=1\n"); else {c=factor(m)/(factor(n)*factor(p)); printf("c=%f\n",c);} } 7.3设计函数reverse(s),将字符串s的内容头尾颠倒。 例如,设charx[]=“abcde”,则调用reverse(x)以后,x的内容为“edcba”,本题约定转换以后的倒序字符串在main函数中输出。 解答: reverse(s) chars[]; { inti,j; chartemp; i=0; while(s[i]! ='\0') i++; i--; if(s[i]=='\n')i--; j=0; while(j {temp=s[j]; s[j]=s[i]; s[i]=temp; i--; j++; } } main() { chars1[80]; scanf("%s",s1); reverse(s1); printf("%s",s1); } reverse(s) chars[]; { inti,j; chartemp; i=0; while(s[i]! ='\0') i++; i--; if(s[i]=='\n')i--; j=0; while(j {temp=s[j]; s[j]=s[i]; s[i]=temp; i--; j++; } } main() { chars1[80]; scanf("%s",s1); reverse(s1); printf("%s",s1); } 7.4请分别写出下面两个C程序的运行结果和函数的功能。 (1)intdigit(longn,intk) {while(n&&k>1) {n/=10; k--; } returnn%10; } main() {longx=52761; printf(“digit(%ld,4)=%d\n”,x,digit(x,4)); } 程序输出值: 5 函数功能: 取整数n的第k位数字。 (2)intgys(inta,intb) {intr; r=a; if(r) {a=b; b=r; r=a%b; gys(a,b); } returnb; } main() {intx[]={18,24,14,45}; printf(“%d\t%d\t%d\n”,x[0],x[1],gys(x[0],x[1])); printf(“%d\t%d\t%d\n”,x[2],x[3],gys(x[2],x[3])); } 程序输出值: 此程序无法运行 函数功能: 7.5以下程序中,函数collect的功能是对n位学生的考试成绩统计总平均分和低于总平均分的人数,本题约定,人数的统计数由函数返回,总平均分则由形式参数aver带出,该程序有错误,请修改它直至达到程序的预期功能为止。 此题不能放在这里。 因为此时还没有学习指针。 #include #defineN10 intcollect(floats[],intn,float*aver); {inti,count=0; floatx=0.0; for(i=0;i x=x/N; for(i=0;i if(s[i] aver=x;改正: *aver=x; returncount; } main() {floats[N],aver; inti,num; for(i=0;i num=collect(s,N,aver);改正: num=collect(s,N,&aver); printf(“average=%.1f\n”,aver); printf(“<%.1fis: %d\n”,aver,num); } 7.6由初等数学知道,当n位奇数时,xn=x*xn-1,当x为偶数时,xn=(x2)n/2,请将下面求xn的函数power改写为递归函数。 doublepower(doublex,intn) {doublez=1.0,y; y=x; while(n>0) {while(n%2==0) {n/=2; y*=y; } n--; z*=y; } returnz; } 解答: doublepower(doublex,intn) { if(n==0)return1; if(n==1)returnx; if(n>1)return(x*power(x,n-1)); } main() {floatx,z; scanf("%f",&x); printf("x=%f\n",x); z=power(x,4); printf("z=%f\n",z); } 7.7编写函数voidlongstr(char*string),输出字符串string中最长的单词。 解答: voidlongstr(charstring[]) {intlen=0,length=0,flag=1,place=0,point,i; for(i=0;i<=strlen(string);i++) if((string[i]>='a'&&string[i]<='z')||(string[i]>='A'&&string[i]<='Z')) if(flay) { point=i; flag=0; } else len++; else { flay=1; if(len>=length) { length=len; place=point; len=0; } } printf("\nThelongestwordis: "); for(i=place; 7.8编写函数,求一元二次方程ax2+bx+c=0根。 本题约定: 求得的方程根必须通过实参带回到主函数中去输出,主函数通过循环对输入的一系列系数组求解。 此题不能放在这里。 解答: #include"math.h" #include"stdio.h" roots(inta,intb,intc,float*x1,float*x2) { floatdelt; intreal=1; delt=b*b-4*a*c; if(delt>=0) { *x1=(-b+sqrt(delt))/(2*a); *x2=(-b-sqrt(delt))/(2*a); } else { *x1=-b/(2*a); *x2=sqrt(-delt)/(2*a); real=0; } return(real); } main() { inta,b,c,real; floatx1,x2; charanswer; while (1) { printf("Inputa,b,c: \n"); scanf("%d%d%d",&a,&b,&c); if(a! =0) { real=roots(a,b,c,&x1,&x2); if(real) printf("hasrealroots: x1=%.2f,x2=%.2f\n",x1,x2); else { printf("hascomplexroots: \n"); printf("%8.2f+%8.2fi\n",x1,x2); printf("%8.2f-%8.2fi\n",x1,x2); } } else printf("isnotaquadratic\n"); printf("continue? (y/n)\n"); getchar(); answer=getchar(); if((answer=='N')||(answer=='n')) break; } } 7.9假设某年的1月1日为星期一,请编写函数writedate(intyear,intk),输出该year年的第k天是星期几。 例如,调用writedate(2001,95),则输出“Thursday,april12th”。 解答: writedate(intyear,intk) { inta[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; intleap,month,date,kk=k; leap=(year%4==0&&year%100! =0)||(year%400==0); month=0; while(k>=28) {k=k-a[leap][month];printf("k=%d\n",k); month++; } date=kk%7; switch(date) { case0: printf("Sunday");break; case1: printf("Monday");break; case2: printf("Tuesday");break; case3: printf("Wensday");break; case4: printf("Tursday");break; case5: printf("Friday");break; case6: printf("Satuday");break; } switch(month) { case1: printf("January");break; case2: printf("February");break; case3: printf("March");break; case4: printf("April");break; case5: printf("May");break; case6: printf("June");break; case7: printf("July");break; case8: printf("August");break; case9: printf("September");break; case10: printf("October");break; case11: printf("November");break; case12: printf("December");break; } switch(k) { case0: printf("1th");break; case1: printf("2th");break; case2: printf("3th");break; case3: printf("4th");break; case4: printf("4th");break; case5: printf("5th");break; case6: printf("6th");break; case7: printf("7th");break; case8: printf("8th");break; case9: printf("9th");break; case10: printf("10th");break; case11: printf("11th");break; case12: printf("12th");break; case13: printf("13th");break; case14: printf("14th");break; case15: printf("15th");break; case16: printf("16th");break; case17: printf("17th");break; case18: printf("18th");break; case19: printf("19th");break; case20: printf("20th");break; case21: printf("21th");break; case22: printf("22th");break; case23: printf("23th");break; case24: printf("24th");break; case25: printf("25th");break; case26: printf("26th");break; case27: printf("27th");break; case28: printf("28th");break; case29: printf("29th");break; case30: printf("30th");break; case31: printf("31th");break; } } main() { writedate(2001,95); } 7.10编写函数change(intx[N][N],intmode),按mode指定的方式对二维数组x进行转置,现约定: 当mode为1时,以主对角线为对称轴转置,否则以次对角线为对称轴转置。 若图(a)为数组的初始值,则图(b)、图(c)分别表示以主对角线为对称轴转置和以次对角线为对称轴转置后数组的内容。 123415913161284 5678261014151173 9101112371115141062 1314151648121613951 (a)(b)(c) 解答: #defineN4 convert(intx[N][N],intmode) { inti,j,t; if(mode==1) { for(i=0;i for(j=i+1;j {t=x[i][j]; x[i][j]=x[j][i]; x[j][i]=t; } } else { for(i=0;i for(j=N-i-2;j>=0;j--) {t=x[i][j]; x[i][j]=x[N-j-1][N-i-1]; x[N-j-1][N-i-1]=t; } } } main() {inti,j,mode,x[N][N]; printf("Inputarray: \n"); for(i=0;i for(j=0;j scanf("%d",&x[i][j]); printf("Inputmode: \n"); scanf("%d",&mode); printf("noriginalarray: \n"); for(i=0;i {for(j=0;j printf("%5d",x[i][j]); printf("\n"); } convert(x,mode); printf("convertarray: \n"); for(i=0;i {for(j=0;j printf("%5d",x[i][j]); printf("\n"); } } 7.11编写函数trans(intm,intd),将十进制整数m转换成d进制数(2≤d≤16)。 本题约定: 若转换出的数字位值大于9,必须用A、B、C、D、E、F来标记,再设计相应的主函数以构成完整程序。 解答: trans(intm,intd) { inta[100],shang,j,i; i=0; shang=m/d; a[0]=m%d; m=shang; while(m! =0) { i++; shang=m/d; a[i]=m%d; m=shang; } for(j=i;j>=0;j--) switch(a[j]) { case10: printf("a");break; case11: printf("b");break; case12: printf("c");break; case13: printf("d");break; case14: printf("e");break; case15: printf("f");break; default: printf("%d",a[j]); } printf("\n"); } main() { intm,d; printf("Inputmandd\n"); scanf("%d%d",&m,&d); trans(m,d); } 7.12编写函数intfind_no_k(intx[],intk,inty[2]),从整数序列x中找出第k大的哪个数以及该数在原序列中的序号,函数值通过形参数组y返回。 例如,设某整数序列为5,2,3,11,0,-6,22,-10,k为3,则调用find_no_k函数以后,通过y数组返回的函数值为5和1。 解答: #defineN8 intfind_no_k(intx[],intk,inty[2]) { inti,j,t,a[N];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 调用