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改为用函数
实现。