(实验六)模块化(函数)程序设计
- 格式:doc
- 大小:45.00 KB
- 文档页数:3
实验六模块化(函数)程序设计
一、实验目的
●了解并掌握函数的定义方法
●了解并掌握函数的调用方法
●了解并掌握函数参数的单向传递
●了解并掌握函数的递归调用
二、实验环境
●个人计算机一台,PIII500(或同等性能)以上CPU,128MB以上内存,500MB以
上硬盘剩余空间。
●Windows2000、Windows XP或Win 7操作系统
●Code::Blocks(版本12.11或近似版本,英文版)
三、实验内容
1. 课本习题
完成课本P197第3题。
/*example-22.c*/
2. 年龄谜题
有5个人坐在一起,问第5个人多少岁?他说比第4个大2岁。问第4个人多少岁?他说比第3个大2岁。问第3个人多少岁?他说比第2个大2岁。问第2个人多少岁?他说比第1个大2岁。最后问第一个人,他说是10岁。请问第5个人有多大?
编写一函数fun来用递归调用来计算第5个人的岁数,并在main函数中调用它。
/*example-23.c*/
3. 课本习题
完成课本P197第1题。
例如:输入两个整数319和377,两者的最大公约数为29,两者的最小公倍数为4147。
/*example-24.c*/
【解题提示】
两个整数a与b(a>b)的最大公约数gcd(a, b)可用辗转相除法来求得:
若a%b=0,则gcd(a, b)=b;若a%b=r≠0,则gcd(a, b)=gcd(b, r),即a与b的最大公约数等于b与r的最大公约数。把b赋给a,把r赋给b,获得新的a和b,继续这个过程。一定有一个时刻,b的值会为0,此时a即为原来的a和b的最大公约数。
用公式表示如下:gcd(a, b)=gcd(b, r1)=gcd(r1, r2)=gcd(r2, r3)...=gcd(r n-1, r n),当r n=0,r n-1即为a和b的最大公约数。(a%b=r1,b%r1=r2,r1%r2=r3…r i%r i+1=r i+2)
两个整数a与b的最小公倍数lcm=a*b/gcd(a, b),即为a和b的乘积除以两者的最大公约数。
4. 结构体数据在函数之间的传递
将下列程序补充完整,练习结构体变量作为函数参数和函数返回值的方法。
在主函数中定义结构体变量s,并将其成员的初值赋为1、1.0和"example_1";在子函数fun()中,将三个成员的值分别改为20、2.0和"example_2",再传回到主函数中赋给s。程序的输出为:20, 2.000000, example_2。
/*example-25.c*/
#include "stdio.h"
#include "string.h"
typedef struct st
{
int a;
float b;
char c[20];
} ST;
fun( )
{
}
int main()
{
s = {10, 1.0, "example1"};
printf("%d, %f, %s\n", s.a, s.b, s.c);
return 0;
}
四、总结与思考
一般而言,程序都是有多个函数组成的,因为一个函数中实现的功能会造成逻辑混乱以及阅读上的困难。模块化的思想要求每个函数都只实现单一的功能,这也是实际的程序设计中,程序员所共同遵守的。因此,了解和掌握函数调用方法及函数之间的数据传递方法是非常重要的。只有掌握好了这些,才能让多个函数完美融合成一个整体。
函数调用的难点是递归调用,关键在于在某个时刻,递归要能够结束,否则程序就会陷入无穷的递归。
在完成以上实验的基础上,有兴趣的同学可以在课后思考以下问题,该题难度较大:思考题:汉诺塔问题
课本习题P198 12
/*think-4.c*/