当前栏目:

高级语言程序设计-实验六 函数的使用

时间:2015-04-29浏览:1061设置

实验六函数的使用(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】写一个判断素数的函数,在主函数中输入一个整数,输出是否素数的信息。

文本框:/*此函数用于判别素数*/
int prime(           )
{









}
源程序如下:

#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()

文本框:void  convert(          )
{ 
	













}
{

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】写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。

源程序如下:

文本框:int hcf(         )
{
	













}
#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>

文本框:void sort(        )
{
	














}
#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】编写程序,从键盘分别输入年、月、日,计算出该天时这年中的第几天。

示例输出:

文本框:Input year_month_day:
2005 12 12
是这年的第346天。










}

  

  

  


请按下面程序中的提示完成整个程序。

#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));

}

【思考】

  1. 不使用二维数组存放每个月的天数,用两个一维数组分别存放闰年和非闰年的天数,重新编写程序。

  2. if语句对年、月、日的正确性进行验证,若不符合年、月、日的要求就退出程序。

  3. 将存放每个月天数的二维数组说明为局部数组,要如何修改程序?

编程作业

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’按降序排;(aascending升,d:descending 降)

4)在main() 函数中调用它们,实现完整的功能。



同栏目信息

其它相关信息