C语言程序设计实验报告(五)
专业 计算机科学与技术 班级 卓越工程师班 日期 2011年12月09日 实验组别 第一组 成绩 第五次实验 编译预处理实验 指导教师 李开 学生姓名 邱金源 学号 U201114493
实验名称 编译预处理实验
(一)实验目的
(1)掌握文件包含、宏定义、条件编译、assert宏的使用。
(2)练习带参数的宏定义、条件编译的使用。
(3)练习assert宏的使用。
(4)使用集成开发环境中的调试功能:单步执行,设置断点,观察变量值。
(二)实验内容及要求
1.源程序改错
下面是用宏来计算平方差和交换两数的源程序。在这个源程序中,存在若干语法和逻辑错误,要求在计算机上对这个源程序进行调试修改,使之能够正确完成计算平方差和交换两数的任务。
源程序1
#include #define SUM a + b
#define DIF a - b
#define SWAP(a,b) a = b, b = a
int main(void)
{
int b, t;
printf("Input two integers a,b:");
scanf("%d, %d", &a, &b);
printf("\nSUM = %d\n the difference between square of a and square of b is:%d", SUM, SUM * DIF);
SWAP (a, b);
Printf("\nNow a = %d, b = %d\n", a,b);
return 0;
}
2.源程序修改替换
下面是用函数实现求三个数中最大数、计算两数之和的源程序。在这个源程序中存在若干语法和逻辑错误,要求:
(1) 对这个例子源程序进行调试修改,使之能够正确完成指定任务。
(2) 用带参数的宏替换函数max,实现求最大数的功能。
源程序2
void main(void)
{
int a, b, c;
float d, e;
printf("Enter three integers:");
scanf("%d, %d, %d", &a, &b, &c);
printf("\nthe maximum of them is %d\n", max(a,b,c));
printf("Enter two floating point numbers:");
scanf("%f, %f", &d, &e);
printf("\nthe sum of them is%f\n",sum(d,e));
return 0;
}
int max(int x, int y, int z)
{
int t;
if (x > y)
t = x;
else
t = y;
if (t < z)
t = z;
return t;
}
float sum(float x, float y)
{
return x + y;
}
3.跟踪调试程序
下面程序的功能是利用R计算圆的面积s,以及面积s的整数部分。现要求:
(1) 修改程序,使程序编译通过且能运行。
(2) 单步执行。进入函数integer_fraction时,watches窗口中x为何值?在返回main时,watch窗口中i为何值?
(3) 排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertion failed。
源程序3
#define R
int main(void)
{
float r, s;
int s_integer = 0;
printf("input a number:");
scanf("%f", &r);
#ifdef R
s = 3.14159 * r * r;
printf("area of round is:%f\n", s);
s_integer = integer_fraction(s);
printf("the integer fraction of area is %d\n", s_integer);
assert((s-s_integer) < 1.0);
#endif
return 0;
}
int integer_fraction(float x)
{
int i = x;
return i;
}
4.程序设计
编写并上机调试运行能实现一下功能的程序:
(1) 已知三角形的面积是area = 根号下[s(s – a)(s – b)(s – c)],其中s = (a + b + c)/2,a, b, c为三角形的三边。定义两个带参数的宏,一个用来求s,另一个用来求 area,试编写一程序,用带参数的宏来计算三角形的面积。
(2) 使用条件编译方法编写一程序,其功能要求是,输入一行电报文字,可以任选两种输出:一为原文输出;二为变换字母的大小写,其他字符不变。用#define命令控制是否变换字母的大小写。
(三)实验步骤及结果
1. 源程序改错的实验步骤及结果
(1)创建一个工程
建立名为prj2的工程。
(2)编辑源文件和保存
用源程序1替换prj2工程中的main.c的源代码,编辑完毕后保存。
(3)编译和运行程序
编译结果如图
改错后程序及运行结果如图
结果有误!
经分析,第二个printf语句中SUM * DIF应该为(SUM) * (DIF)。修改后程序及运行结果如图。
结果正确!
2. 源程序修改替换的实验步骤及结果
(1)修改后程序如图
输入a = 3, b = 6, c = 9, d = 2.5, e = 3.5,观察程序运行结果如图
结果正确!
(2)替换源程序
替换后的程序如图所示
输入a = 1, b = 2, c = 3, d = 2.5, e = 3.5,观察程序运行结果如图
结果正确!
3.跟踪调试程序的实验步骤及结果
(1)创建一个工程
建立名为prj3的工程。
(2)编辑源文件和保存
用源程序3替换prj3工程中的main.c的源代码,编辑完毕后保存。
(3)修改程序使之能编译通过且能运行
修改后的程序如图所示
输入r = 2,观察程序运行结果如图所示
结果正确!
(4)单步执行
(A) 进入函数integer_fraction时,watches窗口中x为何值?
(B)在返回main时,watch窗口中i为何值?
12
(5)排除错误
要对函数做初始化。不做初始化,则参数在传递过程中回默认为double或int,导致结果出现错误。
4.程序设计
(1)
1)创建一个工程
建立名为prj4的工程。
2)编辑源文件和保存
程序如图
3)编译和运行程序
输入a = 3, b = 4, c = 5,观察程序运行结果如图
结果正确!
(2)
1)创建一个工程
建立名为prj5的工程。
2)编辑源文件和保存
程序如图
3)编译和运行程序
输入一行字符,观察程序运行结果如图。
结果正确!
将“#define CHANGE 1”换成“#define CHANGE 0”再输入一行字符,观察程序运行结果如图。
结果正确!
(四)实验体会
编写C语言程序时,要掌握文件包含、宏定义还有条件编译的使用。要掌握带参数的宏定义和函数的使用,达到灵活运用。一般来说,宏比较适合于经常使用的简短表达式,以及小的可重复的代码段,这样可以使程序运行速度更快;当任务比较复杂,需要多行代码才能实现时,或者要求程序越小越好时,就应该使用函数而不用宏。
头文件assert.h中的宏assert用来测试表达式的值,有助于表达式的值满足要求,保证程序的正确性。
条件编译能够控制预处理指令的执行和程序代码的编译。
熟练掌握编译预处理,可以使程序的编辑更为得心应手。
8