实验8函数参考答案.docx
《实验8函数参考答案.docx》由会员分享,可在线阅读,更多相关《实验8函数参考答案.docx(17页珍藏版)》请在冰豆网上搜索。
实验8函数参考答案
C语言程序设计实验教学(8)
【实验目的】函数是C程序的基本组成部分,学习函数的设计和调用是很重要的。
实验目的是掌握函数的定义、变量的作用域和函数的调用。
【实验要求】实际应用程序通常是由多个函数构成的,要求将常见的功能模块用函数形式实现,并学会在主函数或其他函数中调用定义的函数。
要学会函数声明。
【实验课时】6.0
【实验内容】
1.编写函数fun(n),n为三位自然数,判断n是否为水仙花数,是返回1,否返回0。
编写main函数,输入一个数num,调用fun(num)函数,并输出判断结果。
#include
#include
intfun(intn)
{inta,b,c;
a=n%10;b=n/10%10;c=n/100;
if(a*a*a+b*b*b+c*c*c==n)return
(1);
elsereturn(0);}
voidmain()
{intnum;clrscr();
scanf("%d",&num);
while(num<100||num>=1000)
{printf("pleaseenterthenumagain!
(num>=100&&num<1000)\n");
scanf("%d",&num);}
if(/**/fun(num)==1/**/)printf("%disasxhs.\n",num);
elseprintf("%disnotasxhs.\n",num);}
2.编写函数ss(n),判断n是否为素数,是返回1,否返回0。
编写main函数,输入一个数num,调用ss(num)函数,并输出判断结果。
#include
#include
intss(intn)
{inti;
for(i=2;iif(n%i==0)break;
if(i>=n)return
(1);
elsereturn(0);}
voidmain()
{intnum;clrscr();
scanf("%d",&num);
if(/**/ss(num)==1/**/)printf("%disasushu.\n",num);
elseprintf("%disnotasushu.\n",num);}
3.编写一个函数fun(n),计算n!
,并编写main函数测试,在main函数中输入num,调用fun(num),输出计算的结果。
#include
#include
longfun(intn)
{longs=1;inti;
for(i=1;i<=n;i++)s=s*i;
return(s);}
voidmain()
{intnum;clrscr();
scanf("%d",&num);
if(num>0)printf("%d!
=%ld\n",num,/**/fun(num)/**/);
elseprintf("inputdataerror!
\n");}
4.使用递归函数实现计算n!
,并在main函数中调用。
#include
#include
longfun(intn)
{longf;
if(n==1||n==0)f=1;
elsef=n*fun(n-1);
returnf;}
voidmain()
{intnum;clrscr();
scanf("%d",&num);
if(num>0)printf("%d!
=%ld\n",num,/**/fun(num)/**/);
elseprintf("inputdataerror!
\n");}
5.某数列为K(n)的定义为:
用递归的方法求该数列的第6项k(6)。
1n=1
k(n)=k(n-1)×2n为偶数
k(n-1)×3n为奇数
#include
#include
intk(intn)
{intc;
if(n==1)c=1;
elseif(n%2==0)c=k(n-1)*2;
elsec=k(n-1)*3;
returnc;}
voidmain()
{intm;clrscr();
scanf("%d",&m);
if(m>=1)printf("k(%d)=%d\n",m,/**/k(m)/**/);
elseprintf("inputdataerror!
\n");}
6.计算s=(1!
)+(1!
+2!
)+…+(1!
+…+n!
)。
n由用户输入,小于10。
(设计:
函数h1(n)计算n的阶乘;函数h2(m)计算1!
+2!
+…+m!
的累加运算。
在主函数中调用h2()函数,h2()函数中调用h1()函数来实现累加。
)
#include
#include
longh1(intn)
{longt=1;inti;
for(i=1;i<=n;i++)t=t*i;
returnt;}
longh2(intm)
{longs=0;inti;
for(i=1;i<=m;i++)
s=s+h1(i);
returns;}
voidmain()
{intk,num;longsum=0;clrscr();
scanf("%d",&num);
for(k=1;k<=num;k++)
/**/sum=sum+h2(k)/**/;
printf("(1!
)+(1!
+2!
)+...+(1!
+2!
+...+%d!
)=%ld\n",num,/**/sum/**/);}
7.设计一个函数gcd(),计算两个自然数的最大公约数。
在主函数中输入两个数,调用此函数,输出求得的结果。
#include
#include
intgcd(intm,intn)
{intr;r=m%n;
while(r!
=0)
{m=n;n=r;r=m%n;}
returnn;}
voidmain()
{intm,n;clrscr();
scanf("%d,%d",&m,&n);
printf("%d\n",/**/gcd(m,n)/**/);}/*调用gcd()求m,n的最大公约数*/
8.在一个一维数组a中存放10个正整数,输出其中所有的素数。
(用数组元素作为函数的实际参数)
#include
#include
intsushu(intx)
{inti,k=1;
if(x==1)k=0;
for(i=2;i<=x/2;i++)
if(x%i==0)k=0;
return(k);}
voidmain()
{inta[10],i;clrscr();
for(i=0;i<10;i++)scanf("%d",&a[i]);
printf("sushuofarrayaare:
\n");
for(i=0;i<10;i++)
if(/**/sushu(a[i])/**/)/*以数组元素作实参调用sushu()进行判断*/
printf("%5d",a[i]);
printf("\n");}
9.设计一个函数fc,其功能为统计数组中偶数的个数。
编写main函数,用数组名num做为函数传递的参数调用fc函数,实现对数组num的统计,并输出统计结果。
#include
#include
intfc(inta[],intn)
{inti,c=0;
for(i=0;iif(a[i]%2==0)c=c+1;
return(c);}
voidmain()
{inti,num[10];clrscr();
for(i=0;i<10;i++)scanf("%d",&num[i]);
printf("oushu:
%d\n",/**/fc(num,10)/**/);/*数组名和长度作实参调用fc()*/
printf("jishu:
%d\n",/**/10-fc(num,10)/**/);}
10.设计一个函数floatave(inta[10]),计算数组a所有元素的平均值。
(用数组名作为函数的实际参数)
#include
#include
floatave(inta[10])
{inti,sum=a[0];floataver;
for(i=1;i<10;i++)
sum=sum+a[i];
aver=1.0*sum/10;
return(aver);}
voidmain()
{inti,score[10];floataver;clrscr();
for(i=0;i<10;i++)scanf("%d",&score[i]);
printf("\n");
aver=/**/ave(score)/**/;/*以数组名作实参调用ave()*/
printf("averagescoreis%5.2f\n",aver);}
11.用选择法对数组中10个整数按升序排序。
(要求将排序功能设计成函数,数组名作为参数)
#include
#include
voidsort(intarray[],intn)
{inti,j,k,t;
for(i=0;i{k=i;
for(j=i+1;jif(array[j]t=array[k];array[k]=array[i];array[i]=t;}}
voidmain()
{inta[10],i;clrscr();
printf("inputthearray:
\n");
for(i=0;i<10;i++)scanf("%d",&a[i]);
/**/sort(a,10)/**/;/*以数组名和长度作实参调用sort()*/
printf("outputthearrayafterordered:
\n");
for(i=0;i<10;i++)printf("%5d",a[i]);
printf("\n");}
12.设有一个3×4的矩阵,求出其中的最大元素。
(要求:
将计算最大值的功能设计成函数max_value(intarray[12]),二维数组名作为参数)
#include
#include
max_value(intarray[12])
{inti,max;
max=array[0];
for(i=0;i<12;i++)
if(array[i]>max)max=array[i];
return(max);}
voidmain()
{inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};clrscr();
printf("max=%d\n",/**/max_value(a)/**/);}/*以二维数组名作实参*/
13.设计一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
(课后习题P248__题7.9)
#include
#include
#include
voidmain()
{intinverse(charstr[]);/*函数原型声明*/
charstr[100];clrscr();
printf("Inputstring:
\n");
gets(str);
/**/inverse(str)/**/;/*以数组名作实参调用*/
printf("Outputstringafterinverse:
\n");
puts(str);}
intinverse(charst[])/*函数定义*/
{chart;inti,j;
for(i=0,j=/**/strlen(st)/**/;i**/strlen(st)/2/**/;i++,j--)
{t=st[i];
st[i]=st[j-1];
st[j-1]=t;}
}
14.编写一个程序,在主函数中输入10个不等长的字符串。
用另一个函数
sort()对它们排序,函数sort()原型为:
voidsort(char(*s)[10]);,要求形参
是指向由10个元素组成的一维数组的行指针,然后在主函数输出这10个
已排好的字符串。
#include
#include
#include
voidmain()
{voidsort(char(*s)[10]);
inti;charstr[10][10];char(*p)[10];clrscr();
printf("Input10strings:
\n");
for(i=0;i<10;i++)
gets(str[i]);
p=/**/str/**/;/*让行指针变量指向二维字符数组第0行*/
/**/sort(p)/**/;/*以行指针变量名作实参调用sort()*/
printf("Now,thesequenceis:
\n");
for(i=0;i<10;i++)
puts(str[i]);
}
voidsort(char(*s)[10])/*冒泡法对10个字符串排序的函数*/
{inti,j;char*t,temp[10];
t=temp;
for(i=9;i>=1;i--)
for(j=0;j<=i-1;j++)
if(/**/strcmp(s[j],s[j+1])/**/>0)
{/**/strcpy(t,s[j]);strcpy(s[j],s[j+1]);strcpy(s[j+1],t);/**/}
}
运行结果:
Input10strings:
China↙
Japan↙
Korea↙
Egypt↙
Nepal↙
America↙
German↙
Sudan↙
Italy↙
Libya↙
Now,thesequenceis:
America
China
Egypt
German
Italy
Japan
Korea
Libya
Nepal
Sudan
15.编写一个程序,在主函数中输入10个不等长的字符串。
用另一个函数
sort()对它们排序,函数sort()原型为:
voidsort(char*p[10]);,要求用指针
数组处理,然后在主函数输出这10个已排好的字符串。
#include
#include
#include
voidmain()
{voidsort(char*p[]);
inti;char*s[10],str[10][20];clrscr();
for(i=0;i<10;i++)
s[i]=/**/str[i]/**/;
/*将第i个字符串的首地址赋予指针数组p的第i个元素*/
printf("Input10strings:
\n");
for(i=0;i<10;i++)
gets(/**/s[i]/**/);
/**/sort(s)/**/;/*以指针数组名作实参调用sort()*/
printf("Now,thesequenceis:
\n");
for(i=0;i<10;i++)
puts(s[i]);
}
voidsort(char*p[])/*冒泡法对10个字符串排序的函数*/
{inti,j;char*temp;
for(i=9;i>=1;i--)
for(j=0;j<=i-1;j++)
if(/**/strcmp(*(p+j),*(p+j+1))/**/>0)/*比较后交换字符串地址*/
{/**/temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;/**/}
}
运行情况如下:
Input10strings:
China↙
Japan↙
Yemen↙
Pakistan↙
Mexico↙
Korea↙
Brazil↙
Iceland↙
Canada↙
Mongolia↙
Now,thesequenceis:
Brazil
Canada
China
Iceland
Japan
Korea
Mexico
Mongolia
Pakistan
Yemen
16.编写一个程序,用指向指针的指针的方法对5个字符串排序并输出。
自定义函数sort()的原型为:
voidsort(char**p);。
#include
#include
#include
#defineLINEMAX20/*定义字符串的最大长度*/
voidmain()
{voidsort(char**p);
inti;char**p,*pstr[5],str[5][LINEMAX];clrscr();
for(i=0;i<5;i++)
pstr[i]=/**/str[i]/**/;
/*将第i个字符串首地址赋予指针数组pstr的第i个元素*/
printf("Input5strings:
\n");
for(i=0;i<5;i++)
gets(pstr[i]);
p=/**/pstr/**/;/*让二级指针变量p指向指针数组第0号元素*/
/**/sort(p)/**/;/*以二级指针变量名作实参调用sort()*/
printf("stringssorted:
\n");
for(i=0;i<5;i++)
puts(pstr[i]);
}
voidsort(char**p)/*比较交换法对5个字符串排序的函数*/
{inti,j;char*temp;
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(/**/strcmp(*(p+i),*(p+j))/**/>0)/*比较后交换字符串地址*/
{/**/temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;/**/}
}
运行情况如下:
Input5strings:
China↙
America↙
India↙
Philippines↙
Canada↙
stringssorted:
America
Canada
China
India
Philippines
17.编写一个程序,用指向指针的指针的方法对n个整数排序并输出。
要
求写一个自定义函数sort(),其原型为:
voidsort(int**p,intn);n和整数在
主函数中输入。
排序后结果最后在主函数中输出。
#include
#include
voidmain()
{voidsort(int**p,intn);/*被调函数的原型声明*/
inti,n,data[10],**p,*pstr[10];clrscr();
printf("Inputn:
");scanf("%d",&n);
for(i=0;ipstr[i]=/**/&data[i]/**/;
/*将第i个整数的地址赋予指针数组pstr的第i个元素*/
printf("Input%dintegernumbers:
\n",n);
for(i=0;iscanf("%d",/**/pstr[i]/**/);/*用指针数组元素引用data[i]地址*/
p=/**/pstr/**/;/*让二级指针变量p指向指针数组第0号元素*/
/**/sort(p,n)/**/;/*以二级指针变量名和整数数组长度作实参调用sort()*/
printf("Now,thesequenceis:
\n");
for(i=0;iprintf("%d",/**/*pstr[i]/**/);/*输出排序后的n个数*/
printf("\n");
}
voidsort(int**p,intn)/*比较交换法对n个整数排序的函数*/
{inti,j,*temp;
for(i=0;ifor(j=i+1;jif(/**/**(p+i)>**(p+j)/**/)/*比较后交换整数的地址*/
{/**/temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;/**/}
}
运行情况如下;
Inputn:
7↙
Input7integernumbers:
3498561222651↙
Now,thesequenceis:
1122234566598
说明:
data数组用来存放n个整数;pstr是指针数组,每一个元素指向data数组中的一个元素;p是指向指针的指针。
请参考图10.7。
图10.7(a)表示的是排序前的情况。
图10.7(b)表示的是排序后的情况。
在图中可以看到,data数组中数的次序没有变化,而pstr指针数组中的各元素的值(也就是它们的指向)改变了。
18.使用局部静态变量,求1到5的阶乘。
#include
#include
intfac(intn)
{staticintf=1;
f=f*n;
returnf;}
voidmain()
{inti;clrscr();
for(i=1;i<=5;i++)printf("%d!
=%d\n",/**/i/**/,/**/fac(i)/**/);}