1、 数学与软件科学学院 实验报告学期:2013 至_2014 第_ 1 学期 时间:2013 年 12 月 07 日课程名称:程序设计基础教程-C 语言 专业:数学与应用数学 2012 级 1 班实验编号:06 实验项目:基于函数的模块化程序设计 指导教师_姓名: 学号:实验成绩:良+ 一、实验目的及要求(1) 了解和掌握 C语言环境下模块化程序设计的基础-基于函数模块的程序设计技术;(2) 复习C语言程序的基本结构特点,了解基于函数模块的程序模块及其调用关系、过程;(3) 函数的声明、定义、使用方法;(4) 对各种变量属性的使用方法;(5) 对C语言中常用的预编译语句的基本掌握。二、实验内容(
2、第 1 题任选其两个小题,第 2 题和第 3 题必做)1.函数的声明、定义和使用方法。具体实例如下:(1) 编写一个在屏幕上画一条正弦曲线的函数;(2) 编写一个函数,它可以求出给定数的所有因子,如下形式显示其结果:72=2*2*2*3*3;(3) 分别写出一个求 N个数的最大公约数和最小公倍数的递归函数;(4) 试编制n碟片hanoi塔的问题求解函数,并利用它求解4个盘片的结果;(5) 试编写求 n!的函数,并求n=7的结果。具体要求如下:(1) 编写程序通过调试获得正确结果;(2) 分析函数的声明、定义和使用方法;(3) 分别分析函数调用时的参数传值调用方法。2.有关变量的属性实验(静态、
3、动态、全局、局部等方面)。具体实例如下:(1) 仔细分析以下程序的执行结果,然后上机运行如下程序段,并对各个变量的属性及其使用结果进行比较分析:int main(void) /*(a)*/int nX=1;/*(b)*/void prt(void);int nX=3;prt();printf(“The second nX is %dn“,nX);/*(c)*/printf(“The first nX is %dn“,nX);return 0;void prt(void) /*(d)*/int nX=5;printf(“The third nX is %dn“,nX); /*(e)*/(2) 仔
4、细分析下列程序,是否有错误之处?然后分析其执行结果,上机验证并对各个变量的存储属性及其结果进行比较分析:#define LOW 11#define HIGH 23#define CHANGE 12int i=LOW;int main(void)int workover(int i);int reset(int i);int i=HIGH;reset(i/2.5);printf(“i=%dn“,i);reset(i=i/3);printf(“i=%dn“,i);reset(i/2);printf(“i=%dn“,i);workover(i);printf(“i=%dn“,i);return 0;
5、workover(int i);i=(i%i+)*(i*i)/(2*i)+4);printf(“i=%dn“,i);return (i);reset(int i);i=i )。三、实验预备(1) 编写所选实验题目的程序代码和流程图;(2) 检查源程序并给出其可能的运行结果说明。四、实验步骤(1) 上机验证所选题目,并做相应测试和分析;(2) 进行实验分析;(3) 总结基于函数、宏等技术的模块化程序设计和实现方法及其经验;(4) 编写实验报告。五、实验结果分析与评价 (1) 根据测试目标写出测试报告;(2) 测试结果分析说明;(3) 测试程序代码清单。1.函数的声明、定义和使用方法。具体实例如下
6、:(1)分别写出一个求N个数的最大公约数和最小公倍数的递归函数;程序如下:int main(void)int a,b,p,r,nTemp;clrscr();printf(“Please input (a,b):n“);scanf(“%d,%d“,if (ab */nTemp=a;a=b;b=nTemp;p=a*b; /*将a*b的值放到p里面,以便接下来求a,b的最小公倍数*/while (b!=0) /*采用辗转相除法求最大公约数*/r=a%b;a=b;b=r;printf(“the zui da gong yue shu is %dn“,a); /*输出最大公约数*/printf(“the
7、 zui xiao gong bei shu is %dn“,p/a); /*输出最小公倍数*/return 0;运行结果:(2) 试编写求 n!的函数,并求n=7的结果。程序如下:int main(main)long int n,i,nSum=0,nX=1; /*声明变量*/clrscr();printf(“Please input (n):n“);scanf(“%d“,for (i=1;i#define LOW 11#define HIGH 23#define CHANGE 12int i=LOW;int main(void)int i=HIGH;int reset(int i);clrs
8、cr();reset(i/2.5);printf(“i=%dn“,i);reset(i=i/3);printf(“i=%dn“,i);reset(i/2);printf(“i=%dn“,i);workover(i);printf(“i=%dn“,i);return 0;int workover(int i)i=(i%i+)*(i*i)/(2*i)+4);printf(“i=%dn“,i);return (i);reset(int i)i=i#define P printf /*采用宏定义*/#define D “%d“#define F “%fn“int main(void)int m=5,n
9、=8,k=11;float b=3.8,d=9.7,f=21.08; /*遇到D,F就换成“%d“,printf*/P(D F,m,b); /*printf(“%d %fn“,m,b)*/P(D F,n,d); /* printf(“%d %fn“,n,d)*/P(D F,k,f); /* printf(“%d %fn“,k,f)*/return 0;运行结果如下:(2) 带参数的宏替换 (教材例7-7例7-12,习题7-8和习题7-9);例7-7:程序如下:#include#define MAX(num1,num2) (num1num2)?num1:num2 /*宏定义*/int main(
10、void)int m,n,max;printf(“Input two number:“);scanf(“%d%d“, max=MAX(m,n); /*宏展开:(mn)?m:n*/ /*宏调用*/printf(“max = %dn“,max);return 0;运行结果如下:例7-8 :在带参宏定义中,形参是标识符。宏调用中,实参可以是任何合法表达式。程序如下:#include#define SQ(n) (n)*(n)int square(int number);int main(void)int m,nSquare;clrscr();printf(“Input a number:“);scan
11、f(“%d“,nSquare=SQ(m+1);printf(“nSquare=%d square=%dn“,nSquare,square(m+1);return 0;int square(int number)return (number*number);运行结果如下:(3) 习题 7-11 和习题 7-12;习题 7-11:程序如下:#define exchange(ch1,ch2) ch1-32int main(void)char ch1,ch2;printf(“Please input two chars:n“);scanf(“%c,%c“,printf(“Lower char is %
12、cn“,ch1);ch2=exchange(ch1,ch2);printf(“Upper char is %cn“,ch2);return 0;运行结果如下:习题 7-12:程序如下:#include#define change(i,j) if(ij) temp=i;i=j;j=temp; else temp=i;i=j;j=temp;int main(void)int i,j,temp;clrscr();printf(“Please input 2 numbers:n“);scanf(“%d,%d“,change(i,j);printf(“%d,%d“,i,j);getch();return
13、 0;运行结果如下:(4) 文件包含 (#include “和#include 表示标准的include目录之头文件,“表示与当前应用程序相关的用户定义文件。一个#include只能指定一个被包含文件。文件的包含允许嵌套。实验心得:(1) 逐渐了解和掌握了 C语言环境下模块化程序设计的基础-基于函数模块的程序设计技术;(2) 相信通过 复习C 语言程序的基本结构特点,更能了解基于函数模块的程序模块及其调用关系、过程; 函数的声明、定义、使用方法;对各种变量属性的使用方法; 对C语言中常用的预编译语句的基本掌握。注: 实验成绩等级分为(90-100 分)优,(80-89 分)良,(70-79 分) 中,(60-69 分) 及格,(59 分)不及格