当前位置:文档之家› 实验六 函数

实验六 函数

实验六 函数
一、实验目的
1.掌握自定义函数的一般结构及定义函数的方法。

2.掌握形参、实参、函数原型等重要概念。

3.掌握函数声明、函数调用的一般方法。

4. 了解函数的嵌套调用以及函数的递归调用的格式。

二、实验预习
1 .理解为什么要在程序中引入函数?函数的引入对程序的整体结构有什么样的影响?
2. 函数的定义格式,理解函数的类型说明符根据什么来确定?
3. 充分理解函数实参和形参的联系和区别,掌握单向值传递的意义。

4. 了解针对不同返回类型的函数返回值的应用,尤其是有无return 语句的区别。

5. 掌握函数调用与函数声明的格式,了解什么情况下需要进行函数声明?什么情况下不需要?
6. 了解函数嵌套调用和递归调用的原理及使用原则。

三、实验内容
(一)阅读并调试下列程序,根据要求给出程序结果。

1.求三角形面积函数。

⑴ 编程分析
① 设三角形边长为a 、b 、c ,面积area 的算法是s=(a+b+c)/2, area=))()((c s b s a s s --- ,其中 显然,要计算三角形面积,需要用到三个参数,面积函数的返回值的数据类型应为实型。

② 尽管main()函数可以出现在程序的任何位置,但为了方便程序阅读,通常将主函数放在程序的开始位置,并在它之前集中进行自定义函数的原型声明。

⑵ 参考程序
/* 定义和使用求三角形面积函数的程序 */
#include "math.h"
#include "stdio.h"
float area(float,float,float); /*函数的声明*/
void main()
{
float a,b,c;
printf("请输入三角形的三个边长值:\n")
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a&&a>0.0&&b>0.0&&c>0.0)
printf("Area=%-7.2f\n",area(a,b,c));
/* 以下是计算任意三角形面积的函数 */
float area(float a,float b,float c)
{
float s,area_s;
s=(a+b+c)/2.0;
area_s=sqrt(s*(s-a)*(s-b)*(s-c));
return(area_s);
}
⑶ 程序调试
① 三角形面积函数area()不能单独调试,需要通过主函数调用来进行调试。

② 输入多个边长数据进行测试,在输入时,应考虑多种情况,如:负数值、零值、构不成三角形的数值等。

2.菜单程序。

编写一个菜单程序,运行后首先在屏幕显示如下菜单,当输入数值1后,调用显示“&”图案的函数程序;输入数值2后,调用显示“$”图案的函数程序;输入数值3后结束程序。

**********************************
* Menu section *
* 1. Design(&) *
* 2. Design($) *
* 3. Exit *
**********************************
⑴ 编程分析
① 在主程序中生成菜单,并提供数值输入和函数调用功能。

② 分别设计显示“&”图案的design1()函数和显示“$”图案的
design2()函数,以供主函数调用。

design1()和design2()都为void型
函数,无返回值,函数参数也可以缺省。

⑵ 参考程序
/* 菜单程序 */
#include "stdio.h"
void design1(),design2();
void main()
{
int op; /* 以下代码生成菜单 */
printf("\n*************************************");
printf("\n* Menu section *");
printf("\n* 1. Design(&) *");
printf("\n* 2. Design($) *");
printf("\n* 3. Exit *");
printf("\n*************************************");
printf("\nPlease enter selection:");
scanf("%d",&op);
if(op==1)
design1();
else if(op==2)
design2();
else
exit(0);
}
/* 以下是显示&图案的函数 */
void design1()
{
int i;
char str[31]="&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&";
for(i=1;i<10;i++)
puts(str);
return;
}
/* 以下是显示$图案的函数 */
void design2()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=1;j<i;j++)
putchar(' ');
for(j=1;j<30;j++)
putchar('$');
printf("\n");
}
return;
}
⑶ 程序调试
① 为提高程序的调试效率,在设计使用菜单程序之前,首先调试两个图案显示函数。

② 在调试菜单程序时,可以使用简单的空函数,即函数体只包含一个“return;”语句的函数。

③将主函数中的if-else结构尝试采用switch结构来实现,给出最后结果,并分析两种实现方法的异同。

3. 分析下面的程序,根据所学内容对上述程序进行调试,调试通过后写出运行结果。

(1)程序分析
①下面这个程序运行有些错误,学生应该从以下几点来考虑如何修改,使程序正常运行。

在函数被调用前是否需要函数声明?函数返回值是否需要return语句?函数定义时的类型标识符应该根据什么来确定?
②根据以上的提示对程序进行调试,并总结出这一类程序的关于函数声明,函数调用以及函数的返回值等相关的语法点。

(2)参考程序
#include <stdio.h>
main()
{
float n;
float x=1.0,y=2.0;
n=s(x,y);
printf("x=%5.2f,y=%5.2f,n=%5.2f",x,y,n);
}
s(float x,float y)
{
float z;
float x=3.0,y=4.0;
z=x+y;
}
(3)程序的执行结果为____________________________________________。

(二)程序编制题
1. 写一个函数,使给定的一个二维整型数组(3×3)转置,即行列互换。

2. 写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

3. 用递归法将一个整数n转换成字符串。

例如,输入483,应输出字符串“483”。

n的位数不确定,可以是任意位数的整数。

四、思考题
1.理解局部变量和全局变量的概念区别。

以及如何在程序中使用静态变量。

2.在本实验的菜单程序中再增加一些菜单项,需要调用的用户函数名及其功能自己确定。

3. 比较地址传递和值传递的异同点。

相关主题