实验8函数参考答案.docx

上传人:b****8 文档编号:9535881 上传时间:2023-02-05 格式:DOCX 页数:17 大小:31.14KB
下载 相关 举报
实验8函数参考答案.docx_第1页
第1页 / 共17页
实验8函数参考答案.docx_第2页
第2页 / 共17页
实验8函数参考答案.docx_第3页
第3页 / 共17页
实验8函数参考答案.docx_第4页
第4页 / 共17页
实验8函数参考答案.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验8函数参考答案.docx

《实验8函数参考答案.docx》由会员分享,可在线阅读,更多相关《实验8函数参考答案.docx(17页珍藏版)》请在冰豆网上搜索。

实验8函数参考答案.docx

实验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;i

if(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;i

if(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;j

if(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

{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;i

pstr[i]=/**/&data[i]/**/;

/*将第i个整数的地址赋予指针数组pstr的第i个元素*/

printf("Input%dintegernumbers:

\n",n);

for(i=0;i

scanf("%d",/**/pstr[i]/**/);/*用指针数组元素引用data[i]地址*/

p=/**/pstr/**/;/*让二级指针变量p指向指针数组第0号元素*/

/**/sort(p,n)/**/;/*以二级指针变量名和整数数组长度作实参调用sort()*/

printf("Now,thesequenceis:

\n");

for(i=0;i

printf("%d",/**/*pstr[i]/**/);/*输出排序后的n个数*/

printf("\n");

}

voidsort(int**p,intn)/*比较交换法对n个整数排序的函数*/

{inti,j,*temp;

for(i=0;i

for(j=i+1;j

if(/**/**(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)/**/);}

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

当前位置:首页 > 表格模板 > 调查报告

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

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