c语言课后习题第7章函数.docx

上传人:b****6 文档编号:6325940 上传时间:2023-01-05 格式:DOCX 页数:90 大小:56.71KB
下载 相关 举报
c语言课后习题第7章函数.docx_第1页
第1页 / 共90页
c语言课后习题第7章函数.docx_第2页
第2页 / 共90页
c语言课后习题第7章函数.docx_第3页
第3页 / 共90页
c语言课后习题第7章函数.docx_第4页
第4页 / 共90页
c语言课后习题第7章函数.docx_第5页
第5页 / 共90页
点击查看更多>>
下载资源
资源描述

c语言课后习题第7章函数.docx

《c语言课后习题第7章函数.docx》由会员分享,可在线阅读,更多相关《c语言课后习题第7章函数.docx(90页珍藏版)》请在冰豆网上搜索。

c语言课后习题第7章函数.docx

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

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

当前位置:首页 > 表格模板 > 合同协议

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

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