当前位置:文档之家› 实验八 函数含答案

实验八 函数含答案

实验八函数【目的与要求】1.掌握C语言函数的定义方法、函数的声明及函数的调用方法。

2.了解主调函数和被调函数之间的参数传递方式。

【上机内容】【一般示例】【例1】将打印18个"*"组成星形线定义为一个返回值和形参列表都为空的函数,通过主函数调用它。

#include<stdio.h>void Star(void) //画星形线。

函数没有返回值,形参列表也为空{ int i;for(i=1;i<=18;i++)printf("*"); //18个"*"组成星形线printf("\n");return ; //返回值类型为void,return后不带表达式,此句可省略}int main(){ Star( ); //单独的函数调用语句,实参表为空,但必须保留括号printf("I love C language!\n");Star( );return 0;}【例2】调用prime 函数以每行5个素数的格式输出100到200之间的所有素数。

#include<stdio.h>#include<math.h>int prime(int m) //判断素数函数定义{ int i,k,f=1 ; //函数内定义3个变量if (m==1) //形参若为1f=0 ; //形参若为1,非素数k=(int)sqrt(m);for (i=2; i<=k;i++)if (m%i==0) //m被某除数整除f=0 ; //则不是素数return f ; //用return语句返回} //函数体结束int main( ){int i,count=0;for (i=101;i<200;i=i+2) //用i作为循环控制变量,从101开始,步长为2 if (prime(i)) //对每一个i,调用prime函数判断它是否为素数{printf("%5d",i); //如果是素数,输出该素数icount++ ; //素数个数加1if (count%5==0 ) //每输出5个素数换一行printf("\n");}return 0;}判断素数的算法,我们在以前学习循环的时候已经学过了,在这里只是把这个算法用函数的形式表示出来。

这里我们要注意函数的定义、声明的方法和格式。

【例3】选择法排序函数的定义与调用。

(假设共10个元素)#include <stdio.h>void Selection(int *pa,int n);//选择排序函数声明int main(){ int a[10], i;for (i=0;i<10;i++)scanf("%d",&a[i]);printf("The original array is:\n");for (i=0;i<10;i++)printf("%5d",a[i]);printf("\n");Selection(a,10); //选择排序函数调用printf("The sorted array is:\n");for (i=0;i<10;i++)printf("%5d",a[i]);printf("\n");return 0;}void Selection(int *pa,int n) //选择排序函数定义{int i,k,index,temp;for (k=0;k<n-1;k++){index=k ;for(i=k+1;i<n;i++)if (pa[i]<pa[index])index=i;if (index!=k){temp=pa[index];pa[index]=pa[k];pa[k]=temp;}}}本例题用数组作为函数参数,大家要注意数组作为函数参数时的用法。

【上机练习】1.上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。

#include<stdio.h>void main(){int x,y;printf("%d\n",sum(x+y));int sum(a,b);{int a,b;return(a+b);}}#include<stdio.h>void main(){int x,y;printf("%d\n",sum(x+y));int sum(a,b);{int a,b;return(a+b);}}函数不能嵌套定义,不可以在函数体内定义另一个函数。

要给x、y赋初值。

调用函数的格式不对。

应将程序改为:#include<stdio.h>void main(){int x=9,y=7;printf("%d\n",sum(x+y));}int sum(int a,int b){return(a+b);}2.一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:1不是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。

例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。

试求[100,999]之内的所有逆向超级素数的个数。

39#include<stdio.h>#include<math.h>int primeInt(int m);void main(){int m,count=0;for(m=111;m<=999;m=m+2){if(primeInt(m)){if((m%100>10)&&primeInt(m%100)){if(primeInt(m%10)){printf("%d\t",m);count++;if(count%10==0)printf("\n");}}}}printf("\ncount=%d\n",count);}int primeInt(int m){int i,k,prime=1;if(m==1)prime=0;k=(int)sqrt(m);for(i=2;prime&&i<=k;i++)if(m%i==0)prime=0;return prime;}3. 写一函数,用“冒泡法”对输入的10个字符按由小到大顺序排序。

#include<stdio.h>void Bubble(char *pa,int n);int main(){char a[10],i=0;while(i<10){a[i]=getchar();i++;}Bubble(a,10);for(i=0;i<10;i++){printf("%c\t",a[i]);}printf("\n");return 0;}void Bubble(char *pa,int n){int i,j,temp,noswap;for(i=0;i<n-1;i++){noswap=1;for(j=n-1;j>i;j--)if(pa[j]<pa[j-1]){temp=pa[j];pa[j]=pa[j-1];pa[j-1]=temp;noswap=0;}if(noswap==1)return;}}4.德国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数的和。

但有些偶数可以分解成多种素数对的和,如: 10=3+7,10=5+5,即10可以分解成两种不同的素数对。

试求6744可以分解成多少种不同的素数对。

(注: A+B 与B+A认为是相同素数对)144#include<stdio.h>#include<math.h>void main(){int m,i,a1,a2,c,n=0;for(m=3;m<=3372;m+=2){if(abc(m)&&abc(6744-m)){printf("(%d,%d)\t",m,6744-m);n++;}}if(n/8==0)printf("\n");printf("\n");printf("%4d\n",n);}int abc(int a){int i;for(i=2;i<=a/2;i++) if(a%i==0)return(0);return(1);}。

相关主题