(实验六)模块化(函数)程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六模块化(函数)程序设计

一、实验目的

●了解并掌握函数的定义方法

●了解并掌握函数的调用方法

●了解并掌握函数参数的单向传递

●了解并掌握函数的递归调用

二、实验环境

●个人计算机一台,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*/

相关文档
最新文档