函数调用.docx
《函数调用.docx》由会员分享,可在线阅读,更多相关《函数调用.docx(48页珍藏版)》请在冰豆网上搜索。
![函数调用.docx](https://file1.bdocx.com/fileroot1/2023-2/22/f55da300-5cd0-4224-80b8-8eae3b69ed6d/f55da300-5cd0-4224-80b8-8eae3b69ed6d1.gif)
函数调用
习题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;ix=x/N;
for(i=0;iif(s[i]aver=x;改正:
*aver=x;
returncount;
}
main()
{floats[N],aver;
inti,num;
for(i=0;inum=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;ifor(j=i+1;j{t=x[i][j];
x[i][j]=x[j][i];
x[j][i]=t;
}
}
else
{
for(i=0;ifor(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;ifor(j=0;jscanf("%d",&x[i][j]);
printf("Inputmode:
\n");
scanf("%d",&mode);
printf("noriginalarray:
\n");
for(i=0;i{for(j=0;jprintf("%5d",x[i][j]);
printf("\n");
}
convert(x,mode);
printf("convertarray:
\n");
for(i=0;i{for(j=0;jprintf("%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];
for(i=0;ia[i]=x[i];
for(j=0;j<=N-1;j++)
for(i=0;iif(a[i]{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
i=0;
while(a[k-1]!
=x[i])
i++;
y[0]=a[k-1];
y[1]=i+1;
}
main()
{
intx[N],k,y[2],i;
printf("Inputxplease\n");
for(i=0;iscanf("%d",&x[i]);
printf("Inputkplease\n");
scanf("%d",&k);
find_no_k(x,k,y);
printf("%d,%d\n",y[0],y[1]);
}
7.13编写递归函数findmax(intx[],intm),从整数序列x的前m个元素中找最大数。
问题的递归定义为:
findmax(x,1)=x[0]n=1
findmax(x,n)=x[n-1]>findmax(x,n-1)?
x[n-1]:
findmax(x,n-1)n>1
解答:
findmax(intx[],intm)
{
if(m==1)return(x[0]);
else
if(m>1)return(x[m-1]>findmax(x,m-1)?
x[m-1]:
findmax(x,m-1));
}
main()
{
intx[10],i,max;
for(i=0;i<10;i++)
scanf("%d",&x[i]);
max=findmax(x,10);
printf("max=%d\n",max);
}
习题9
9.1设有说明语句staticdoublea[2][3]={1.0,2.0,3.0,4.0,5.0,6.0};现已知a数组的存储首地址为0x86,请分别写出下列各表达式的值。
(1)*a
(2)&a[1](3)*a[1]
(4)a[1]+2(5)*(a+1)+1(6)*(*(a+1)+1)
解答:
(1)0x86
(2)0xaa(3)0xaa(4)0xce(5)0xc6(6)5.0
9.2编写函数doubleround(double*a,double*b),对指针a、b所指向的存储单元中的数从第四位开始四舍五入,并向main函数返回处理以后的值。
例如,设主函数中有说明语句doublex=6.0576,y=-1.8923,当调用上述函数后,x、y的值分别为6.058-和1.892,现规定main函数中不允许使用指针变量。
题中函数的类型有误。
解答:
voidround(float*a,float*b)
{intm,n;
m=(*a+0.0005)*1000;
n=(*b+0.0005)*1000;
*a=(float)m/1000;
*b=(float)n/1000;
}
main()
{
floatx=6.0576,y=-1.89