实验六函数的使用(4学时)
目的要求
(1)掌握定义函数的方法;
(2)掌握函数实参与形参的对应关系以及“值传递”的方式;
(3)掌握函数的嵌套调用方法;
(4)掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
(5)学习对多文件程序的编译和运行。
上机内容
一般示例
【例1】上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。
![]() |
#include <stdio.h>
void main()
{
int,y;
printf(“%d\n”,sum(x+y));
int sum(a,b)
{
int a,b;
return(a+b);
}
}
【例2】写一个判断素数的函数,在主函数中输入一个整数,输出是否素数的信息。
源程序如下:
#include <stdio.h>
#include <math.h>
int prime(int);
void main()
{
int number;
printf(请输入一个正整数:\n);
scanf(%d,&number);
if (prime(number))
printf(\n%d是素数.\n,number);
else
printf(\n%d不是素数.\n,number);
}
【提示】判断素数的算法,我们在以前学习循环的时候已经学过了,在这里只是把这个算法用函数的形式表示出来。这里我们要注意函数的定义、声明的方法和格式。
【例3】写一函数,是给定的一个二维数组(N×N)转置,即行列互换。请你总结数组作为函数参数时的用法。
源程序如下:
#include <stdio.h>
#define N 4
void convert(int arr[N][N]);
void main()
{
int i,j;
int array[N][N];
printf(输入数组元素:\n);
for (i=0;i<N;i++)
for (j=0;j<N;j++)
scanf(%d,&array[i][j]);
printf(\n数组是:\n);
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf(%5d,array[i][j]);
printf(\n);
}
convert(array);
printf(转置数组是:\n);
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf(%5d,array[i][j]);
printf(\n);
}
}
数组作为函数参数用法总结:
【例4】写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。
源程序如下:
#include <stdio.h>
Int hcf(int ,int );
int lcd(int u,int v,int h);
{
return(u*v/h);
}
void main()
{
int u,v,h,l;
scanf(%d %d,&u,&v);
h=hcf(u,v);
printf(H.C.F=%d\n,h);
l=lcd(u,v,h);
printf(L.C.D=%d\n,l);
}
int lcd(int u,int v,int h)
{
return(u*v/h);
}
你能不能用全局变量的方法,分别用两个函数求最大公约数和最小公倍数?请将程序写在下面。
【例5】写一函数,用“冒泡法”对输入的10个字符按由小到大顺序排序。
源程序如下:
/*冒泡法排序*/
#include <stdio.h>
#include <string.h>
#define N 10
void sort(char str[]);
void main()
{
int i,flag=1;
char str[N];
while(flag)
{
printf(\n输入字符串,长度为10:\n);
gets(str);
if (strlen(str)>N)
printf(超过长度,请重输!);
else
flag = 0;
}
printf(%s\n,str);
sort(str);
printf(\n排序结果:);
for (i=0;i<N;i++)
printf(%c,str[i]);
printf(\n);
}
【例6】编写程序,从键盘分别输入年、月、日,计算出该天时这年中的第几天。
示例输出:
请按下面程序中的提示完成整个程序。
#include “stdio.h”
Int day_tab[2][13]={
{0,31,28,31,30,31,30,31,31,30,30,31},
{0,31,29,31,30,31,30,31,31,30,30,31}};
/*统计天数函数的头部*/
{
int i,j;
/*判断该年是否是闰年,并将其逻辑值赋给变量i*/
for(j=1;j<month;j++)
/*对天数进行累加*/
/*返回总的天数*/
}
void main( )
{
int y,m,d;
/*提示输入年月日*/
/*分别输入年月日*/
printf(“是这年的第%d天\n”,day_year(y,m,d));
}
【思考】
不使用二维数组存放每个月的天数,用两个一维数组分别存放闰年和非闰年的天数,重新编写程序。
用if语句对年、月、日的正确性进行验证,若不符合年、月、日的要求就退出程序。
将存放每个月天数的二维数组说明为局部数组,要如何修改程序?
编程作业
1.定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计50个学生成绩中,高于平均成绩的有多少人?
2.编写一个对n个数据从大到小的排序C函数,再编写一个计算最后得分的C函数,计算方法是:去除一个最高分,去除一个最低分,其余的平均分为参赛选手的最后得分。并在主函数中调用它们对有n个评委评分,m个选手参赛的最后得分,从大到小排序输出。
3.用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数.(习题8.10)
【注意】此题要求实现两个版本,第一个版本要求把两个函数放在同一个程序文件中,作为一个文件进行编译和运行。第二个版本把两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。
选做题
1.编写一个程序,包括主函数和如下子函数。
(1) 输入10个无序的整数;
(2) 用冒泡法从大到小排序;
(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。
【提示】用input函数完成10个整数的录入,sort函数完成冒泡法排序,search函数完成输入数的查找。
2.根据条件进行学生成绩排名
(1)在函数中进行10个学生成绩从高到低排名 sort(int a[10]);
(2)改进第一步的函数为sort(int a[],int n),进行n个学生成绩从高到低排名;
(3)改进第二步的函数为sort(int a[],int n, char style), 将n个学生成绩从高到低排名,排名方式根据sort()函数的style参数进行,如style为‘a’按升序排,style为’d’按降序排;(a:ascending升,d:descending 降)
(4)在main() 函数中调用它们,实现完整的功能。