实验六函数 、实验目的 掌握¢程序函数的定义和调用方法,学会编写通用程序模块,掌握程序设计 的基本方法并编写出具有清晰模块结构的C程序 、实验要求 1.掌握C程序中函数的定义和调用方法。 2.掌握函数间数据传递的4种方式:传值、传地址、利用返回值和利用外 部变量 3.掌握函数的递归调用 4.掌握局部变量和全局变量的作用域及其存储类别,以及它们在程序中使 用的方法。 5.掌握动态内存分配函数 mallock和feeO函数的使用 6.学会使用带形参的 main(函数,指向函数的指针的编程 7.编写实验报告(六) 三、实验内容 61编写程序S61C,用函数fm实现计算分段函数y=xe4 输入x=-56时,输出结果是 输入x=78时,输出结果是 6-2从键盘输入两个正整数,然后求这两个数的最大公约数,试完善S6-2C中 的函数god 源程序S6-2C include <stdio h maino i int a, b, x; int gcd( scanf("%d%d", &a, &b) xcd(a, b); printf("%d"X) int gcd(u, v) Int uv 6-3用递归调用编写S6-2C中的函数gcdO,输入x=25,y=15,写出输出结果 gcd(int a, int b)
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 x x x x y 输入 x = -5.6 时,输出结果是 ; 输入 x = 7.8 时,输出结果是 。 6-2 从键盘输入两个正整数,然后求这两个数的最大公约数,试完善 S6-2.C 中 的函数 gcd()。 源程序 S6-2.C # include 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)
6-4将S6-2C中的键盘输入,改为命令行输入,试改写main(函数,并写出执 行过程 6-5S6-5C是一个求解方程ax2+bx+c=0的根的程序,要求用3个函数分别处理 24ac>0,b2-4ac=0和b2-4ac 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) maino float a.b.c printi("请输入方程的系数ab,c:") scanf("%f, %f, %f", &a, &b, &c); printf(("方程%63fx*x+(%6.3fx)+(%6.3f)=0的解为:hn"ab,c) disc=b*b-4*a*c greater than zero(a, b) printf("x1=%6.3f, x2=%6.3f\n x1, X2); equal to zero(a, b) printf("x1=x2=%6.3f\" 1); smaller than zero(a, b) printf("x1=%6.31f+%6.31fi, x2=%6.3lf-%6.3Ifiin"p, a, p, q);
2 } 6-4 将 S6-2.C 中的键盘输入,改为命令行输入,试改写 main()函数,并写出执 行过程。 6-5 S6-5.C 是一个求解方程 ax 2 +bx+c=0 的根的程序,要求用 3 个函数分别处理 b2 -4ac>0,b2 -4ac=0 和 b2 -4ac #include 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);
6-6输入5个学生5门课程的成绩,分别用函数求:①每个学生的平均分;② 每门课程的平均分;③找出最高分数所对应的学生及其课程;④求平均分 方差:G=1x2-x,式中,x为某一学生的平均分。试完成 n nput stuO, avr stuO), avr corO, highest和sdf函数的内容,并写出运行结 果 源程序S6-6C #define 5 #define m 5 float scoreINJIM float a stuN), a corM] maino /*主函数* i int i,j float s diff; float highest( Input stu( avr corO printf(("hn序号课程12345平均分") for(i=0 K<N; i++) i printf("n NO%2d, 1+1); for(=0; <M; j++) printf(%8.2f", scoreD printf("%8.2f, a stui); t("hn课平均"); for(=0; <M: j++) printf("%8.2f, a cor[]: h=highest(&r, &c) printf("n最高分%82f是%d号学生的第%d门课",h+1,r,+1), print("n方差%82r",sdif0) input stuo /* Input stu函数,输入学生成绩* },{} avr stuO /* avr stu函数,计算学生平均分*
3 } } 6-6 输入 5 个学生 5 门课程的成绩,分别用函数求:①每个学生的平均分;② 每门课程的平均分;③找出最高分数所对应的学生及其课程;④求平均分 方差: 2 1 2 ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ Σ = Σ − n x x n i σ i ,式中, xi 为某一学生的平均分。试完成 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 函数,计算学生平均分 */ {
avr coro /* avr cor函数,计算课程平均分*/ float highest(r, c) /* highest函数,找最高分* float s diffe /*sdi函数,求方差* 6-7调试程序S6-7C,用函数 arerO求出10个数的平均值,并找出其中的最大 值和最小值,返回主函数输岀其结果。允许增添和改动语法成分,但不得 删除整条语句。 源程序S6-7C maino i float ave, a[10]: 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 b[ Int I float max, min, sum maxmin=sum=bo for(i=l; i<n; i++) if (b[i]max max=bi else if( b[ik<min min=bl sum=sum+bl] return(sum/n) 6-8在程序S6-8C中,函数 Invert0是对数组a[n]中的元素按逆序重新放置,主
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 ; imax ) 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]中的元素按逆序重新放置,主
函数通过动态存储分配申请n个单元。调试程序S6-8C,允许增添和改动 语句,但不得删除整行。 源程序S6-8C #include break a=(int*malloc(n*sizeof(int)); i printf("allocation error aborting") t(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++) i if(i%5-0)printf("n") printf("%5d" *(a-n+)) *6-9编写程序S6-9C,模拟用户注册和登录的过程。将S5-9C改为用函数 实现
5 函数通过动态存储分配申请 n 个单元。调试程序 S6-8.C,允许增添和改动 语句,但不得删除整行。 源程序 S6-8.C #include void invert(int a[],int n) { int i,w,nn=n/2; for(i=1;i0)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 改为用函数 实现