C语言 四川师范大学 信息与计算科学 冯山 实验六
姓名:杨帆 学号:2014060634 实验得分
一、实验目的
(1) 了解和掌握C语言环境下模块化程序设计的基础----基于函数模块的程序设计技术;
(2) 复习C语言程序的基本结构特点,了解基于函数模块的程序模块及其调用关系、过程;
(3) 函数的声明、定义、使用方法; (4) 对各种变量属性的使用方法;
(5) 对C语言中常用的预编译命令的基本掌握。
二、实验内容
函数的声明、定义和使用方法。具体实例如下: (1) 编写一个在屏幕上画一条正弦曲线的函数;
(2) 编写一个函数,它可以求出给定数的所有因子,如下形式显示其结果:72=2*2*2*3*3;
(3) 分别写出一个求N个数的最大公约数和最小公倍数的递归函数; (4) 试编制n碟片hanoi塔的问题求解函数,并利用它求解4个盘片的结果; (5) 试编写求n!的函数,并求n=7的结果。
2.有关变量的属性实验(静态、动态、全局、局部等方面)。
(1) 仔细分析以下程序的执行结果,然后上机运行如下程序段,并对各个变量的属性及其使用结果进行比较分析:
main()
{ /******(a)******/ int x=1;
{/******(b)******/ void prt(void); int x=3; prt();
printf(\"The second x is %d\\n\ }/******(c)******/
printf(\"The first x is %d\\n\}
void prt(void)
{ /******(d)******/ int x=5;
printf(\"The third x is %d\\n\ }/******(e)******/
(2) 仔细分析下列程序,是否有错误之处?然后分析其执行结果,上机验证并对各个变量的存储属性及其结果进行比较分析:
#define LOW 11 #define HIGH 23 #define CHANGE 12 int i=LOW; main() {
int workover(int i); int reset(int i); int i=HIGH; reset(i/2.5);
printf(\"i=%d\\n\ reset(i=i/3);
printf(\"i=%d\\n\ reset(i/2);
printf(\"i=%d\\n\ workover(i);
printf(\"i=%d\\n\}
workover(int i); {
i=(i%i++)*((i*i)/(2*i)+4); printf(\"i=%d\\n\ return (i); }
reset(int i); {
i=i<=CHANGE?LOW:HIGH++; return (i); } (3) 以下程序希望打印5行\"*****\",能否做到?为什么?
int i; main() {
void prt();
for (i=0;i<5;i++) prt(); }
void prt() {
for (i=0;i<5;i++) printf(\"%c\ printf(\"\\n\"); }
(4) 分析、编辑并执行以下程序,如果有错,请指出其错误原因,同时需要指出各个变量的存储属性。
/*****file1.c*****/ int last(void); int new(int); int reset(void); exter int i; main(void) {
int i,j; i=reset();
for (j=1;j<=3;j++) {
printf(“i=%d\j=%d\\n”,i,j); printf(“next(i)=%d\”,next(i)); printf(“last(i)=%d\\n”,last());
printf(“new(i+j)=%d\\n”,new(i+j)); }
int next(void) {
return (i++); } }
/*****file2.c*****/ static int i=10; fast(void) {
rturn (i-=1_); }
new(int i) {
static int j=-5; return (i=j+=++i); }
/*****file3.c*****/ extern int i; reset() {
return (i); }
3.预编译命令实验。具体实例如下: (1) 一般宏替换实验; (2) 带参数的宏替换;
三、实验准备
(1) 编写所选实验题目的程序代码和流程图; (2) 检查源程序并给出其可能的运行结果说明。
四、实验步骤及结果
1、(1) 编写一个函数,它可以求出给定数的所有因子,如下形式显示其结果:72=2*2*2*3*3; 程序代码如下:
运行结果:
分析:此程序根据最小公倍数和辗转相除法写。
(2)分别写出一个求N个数的最大公约数和最小公倍数的递归函数;
运行结果:
分析: 此程序采用的是辗转相除法,根据数学上面的只是求的最大公约数以及最小公倍数。
(3)试编制n碟片hanoi塔的问题求解函数,并利用它求解4个盘片的结果;
程序如下:
结果如下:
分析:(1)以C为辅助将A杆上面的n-1张盘移到B杆hanoi(n-1,A,B,C); (2)将n张盘从杆A移到C move(n,A,C)(3)以A杆为辅助将B杆上n-1移到C上 hanoi(n-1,B,C,A)
(4)试编写求n!的函数,并求n=7的结果。 程序如下:
分析:fact(num-1)运用另一个函数进行嵌套。 2、(1)上机调试结果
修改后的程序如下:
分析:分程序也要用花括符括起来。 (2)上机调试结果
该程序有误,修改为: #include int i=HIGH; int reset(int i); clrscr(); reset(i/2.5); printf(\"i=%d\\n\ reset(i=i/3); printf(\"i=%d\\n\ reset(i/2); printf(\"i=%d\\n\ workover(i); printf(\"i=%d\\n\ return 0; } int workover(int i) { i=(i%i++)*((i*i)/(2*i)+4); printf(\"i=%d\\n\ return (i); } reset(int i) { i=i<=CHANGE?LOW:HIGH; return (i); } 分析;宏定义只是字符串的替换,从define开始后面所有的非字符串内的宏都可以用宏定义的宏体替换。 (3)能 (4)上机调试结果 修改后程序如下: 分析错误原因:fast 写成了last ,程序的冗杂太多,删除一些没用的。 3.预编译命令实验。 (1) 一般宏替换实验(教材例7-5); 程序如下: 注意;宏替换只是字符串的替换。 (2) 带参数的宏替换(教材例7-7) 注意:带参宏中的参数是形式参数,调用的时候是实际参数。 五:收获 (1)宏体本质是字符串,它可以是常量,变量或表达式。(2)宏可以带参,在调用时,实参是字符串。(3)函数按照先声明,后定义,再使用的顺序避免了很多不应该的错误,(4)参数传值调用,空间使用了立即回收。 因篇幅问题不能全部显示,请点此查看更多更全内容