1 实验六 函 数 一、实验目的 掌握C程序函数的定义和调用方法,学会编写通用程序模块,掌握程序设计 的基本方法并编写出具有清晰模块结构的C程序。 二、实验要求 1. 掌握C程序中函数的定义和调用方法。 2. 掌握函数间数据传递的4种方式:传值、传地址、利用返回值和利用外 部变量。 3. 掌握函数的递归调用。 4. 掌握局部变量和全局变量的作用域及其存储类别,以及它们在程序中使 用的方法。 5. 掌握动态内存分配函数malloc()和free()函数的使用。 6. 学会使用带形参的main()函数,指向函数的指针的编程。 7. 编写实验报告(六)。 三、实验内容 6-1 编写程序S6-1.C,用函数fun实现计算分段函数 ? ? ? ? ? +? ?+ = 2 2 3 2 xx xx y 输入x = -5.6时,输出结果是 ; 输入x = 7.8时,输出结果是 。 6-2 从键盘输入两个正整数,然后求这两个数的最大公约数,试完善S6-2.C中 的函数gcd()。 源程序S6-2.C # include <stdio.h> main() { int a,b,x; int gcd( ); scanf("%d%d",&a,&b); x=gcd(a,b); printf("%d",x); } int gcd(u,v) int u,v; { } 6-3 用递归调用编写S6-2.C中的函数gcd(),输入x=25,y=15,写出输出结果。 gcd(int a,int b) { (x < 0) (x≥0) 2 } 6-4 将S6-2.C中的键盘输入,改为命令行输入,试改写main()函数,并写出执 行过程。 6-5 S6-5.C是一个求解方程ax 2 +bx+c=0的根的程序,要求用3个函数分别处理 b 2 -4ac>0,b 2 -4ac=0和b 2 -4ac<0的3种情况。从键盘输入a,b,c的值,写出 执行情况。试完善以下3个函数。 源程序S6-5.C #include <math.h> #include <stdio.h> float x1, x2; double p,q,disc; greater_than_zero(float a, float b) { } equal_to_zero(float a, float b) { } smaller_than_zero(float a,float b) { } main() { float a,b,c; printf("请输入方程的系数a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); printf("方程%6.3fx*x+(%6.3fx)+(%6.3f)=0的解为:\n",a,b,c); disc=b*b-4*a*c; if(disc>0) { greater_than_zero(a,b); printf("x1=%6.3f,x2=%6.3f\n",x1,x2); } if(disc= =0) { equal_to_zero(a,b); printf("x1=x2=%6.3f\n",x1); } if(disc<0) { smaller_than_zero(a,b); printf("x1=%6.3lf+%6.3lfi,x2=%6.3lf-%6.3lfi\n",p,q,p,q); 3 } } 6-6 输入5个学生5门课程的成绩,分别用函数求:①每个学生的平均分;② 每门课程的平均分;③找出最高分数所对应的学生及其课程;④求平均分 方差: 2 2 1 ? ? ? ? ? ?Σ ?Σ= n x x n i i σ ,式中,x i 为某一学生的平均分。试完成 input_stu(),avr_stu(),avr_cor(),highest()和s_diff()函数的内容,并写出运行结 果。 源程序S6-6.C #define N 5 #define M 5 float score[N][M]; float a_stu[N],a_cor[M]; main() /* 主函数 */ { int i,j,r,c; float h; float s_diff(); float highest(); r=0; c=0; input_stu(); avr_stu(); avr_cor(); printf("\n 序号 课程 1 2 3 4 5 平均分"); for(i=0;i<N;i++) { printf("\n NO%2d",i+1); for(j=0;j<M;j++) printf("%8.2f",score[i][j]); printf("%8.2f",a_stu[i]); } printf("\n课平均"); for(j=0;j<M;j++) printf("%8.2f",a_cor[j]); h=highest(&r,&c); printf("\n最高分%8.2f是%d号学生的第%d门课\n",h+1,r,c+1); printf("\n 方差 %8.2f", s_diff()); } input_stu() /* input_stu函数,输入学生成绩*/ { } avr_stu() /* avr_stu函数,计算学生平均分 */ { 4 } avr_cor() /* avr_cor函数,计算课程平均分 */ { } float highest(r,c) /* highest函数,找最高分 */ int *r,*c; { } float s_diff() /* s_diff函数,求方差 */ { } 6-7 调试程序S6-7.C,用函数arer()求出10个数的平均值,并找出其中的最大 值和最小值,返回主函数输出其结果。允许增添和改动语法成分,但不得 删除整条语句。 源程序S6-7.C main() { float ave , a [10] ; int i ; for (i=0 ; i<10 ; i++ ) scanf ("%f ", a++ ) ; ave =aver (a , 10 ) ; printf ("max=%6.2f\n min=%6.2f\n" , max , min ) ; printf ("average =%6.2f\n", ave); } float aver (b , n ) float b [ ] ; int n ; { int i ; float max , min , sum ; max=min=sum=b[0] ; for (i=1 ; i<n ; i++ ) { if (b[i]>max ) max=b[i] ; else if ( b[i]<min ) min=b[i] ; sum=sum+b[i] ; } return (sum/n ) ; } 6-8 在程序S6-8.C中,函数invert()是对数组a[n]中的元素按逆序重新放置,主 5 函数通过动态存储分配申请n个单元。调试程序S6-8.C,允许增添和改动 语句,但不得删除整行。 源程序S6-8.C #include <stdio.h> void invert(int a[],int n) { int i,w,nn=n/2; for(i=1;i<nn;i++) { w=a[i];a[i]=a[n-i];a[n-i]=w;} } main() { int i,n,*a; while(1) { printf("Enter n:"); scanf("%d",&n); printf("\n"); if(n>0)break; } a=(int *)malloc(n*sizeof(int)); if(a) { printf("allocation error_aborting"); exit(1); } printf("Enter a[0]...a[%d]:",n); for(i=1; i<n; i++) scanf("%d",a++); invert(a,n); printf ("the array has been invert:\n"); for(i=0;i<n;i++) { if(i%5==0)printf("\n"); printf("%5d",*(a-n+i)); } } *6-9 编写程序S6-9.C,模拟用户注册和登录的过程。将S5-9.C改为用函数 实现。