华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
错误原因:未完整声明所有参数,导致部分参数不识别。 改正:int a,b,t;
(4)scanf(\
错误原因:scanf函数中类型声明中,两个%d符号中间不加符号。 改正:scanf(\(5)SWAP(a,b);
错误原因:与宏定义相对应的更改为三个参数。 改正:SWAP(a,b,t); 4.2.2 源程序修改替换
下面是用函数实现求三个数中最大数、计算两数之和的源程序。在这个源程序中存在若干语法和逻辑错误,要求:
(1)对这个例子源程序进行调试修改,使之能够正确完成指定任务。 (2)用带参数的宏替换函数max,实现求最大数的功能。
程序代码:
void main(void) {
int a, b, c; float d, e;
printf(\scanf(\
printf(\printf(\scanf(\
printf(\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; }
【分析】(1)修改如第一题,出现的问题有:scanf函数的参数变量类型间
的格式问题与函数声明问题。
(2)将函数max用带参数的宏定义表示,利用语句“?:”表示if选择语句。
【程序】(1) #include
31
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
int max(int x,int y,int z); float sum(float x,float y); int main() {
int a,b,c; float d,e;
printf(\ scanf(\
printf(\ printf(\ scanf(\
printf(\ return 0; }
int max(int x,int y,int z) {
int t;
if(x>y)t=x; else t=y; if(t float sum(float x,float y) { return x+y; } (2) #include #define max(x,y,z) (((x)>(y)?(x):(y))>(z))?((x)>(y)?(x):(y)):(z) float sum(float x,float y); int main() { int a,b,c; float d,e; printf(\ scanf(\ printf(\ printf(\ scanf(\ printf(\ return 0; } float sum(float x,float y) { return x+y; } 【测试】(1)程序运行结果如下,程序正确。 32 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 (2)程序运行结果如下,程序正确。 4.2.3跟踪调试 下面程序的功能是利用R计算圆的面积s,以及面积s的整数部分。现要求: (1)修改程序,使程序编译通过且能运行。修改过的源程序见下面部分。 (2)单步执行。进入函数integer_fraction时,watches窗口中为何值?在返回main时, watch窗口中i为何值?如图: x的值 i的值 (3)排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertion failed。 题目程序代码: #define R int main(void) { float r, s; int s_integer = 0; printf(\scanf(\#ifdef R s = 3.14159 * r * r; printf(\ 33 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 s_integer = integer_fraction(s); printf(\assert((s-s_integer) < 1.0); #endif return 0; } int integer_fraction(float x) { int i = x; return i; } 【修改后的源程序】 #include int integer_fraction(float x); int main() { float r,s; int s_integer=0; printf(\ scanf(\ #ifdef R s=3.14159*r*r; printf(\ s_integer=integer_fraction(s); printf(\ assert((s-s_integer)<1.0); #endif // R return 0; } int integer_fraction(float x) { int i=x; return i; } 4.2.4 程序设计 编写并上机调试运行能实现以下功能的程序: (1)已知三角形的面积是area=根号下[s(s–a)(s–b)(s–c)],其中s= (a+b+c)/2,a, b, c为三角形的三边。定义两个带参数的宏,一个用来求s,另一个用来求 area,试编写一程序,用带参数的宏来计算三角形的面积。 (2)使用条件编译方法编写一程序,其功能要求是,输入一行电报文字,可以任选两种输出:一为原文输出;二为变换字母的大小写,其他字符不变。用#define命令控制是否变换字母的大小写。 【分析】 (1)根据公式用宏定义表示s和area,并分别在函数中引用。 34 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 (2)宏定义变量CHANGE,通过改变CHANGE的值,利用if-else语句,控制大小写变换或者原文输出。 【程序】 (1) #include #define s(a,b,c) 1.0/2*((a)+(b)+(c)) #define area(s,a,b,c) sqrt((s)*((s)-(a))*((s)-(b))*((s)-(c))) int exam(int a,int b,int c); int main() { double a,b,c; printf(\ scanf(\ if(abs(a-b) (2) #include int main() { char c; printf(\ while((c=getchar())!=EOF) { if(CHANGE) { if(c>='A'&&c<='Z')putchar(c+32); else if(c>='a'&&c<='z')putchar(c-32); else putchar(c); } else putchar(c); } return 0; } 【测试】 (1)输入三边值为2,4,结果正确: 35