课程名称 | 程序设计基础(C语言) |
实验项目名称 | 函数程序设计 |
实验目的及要求 | 实验目的:通过函数程序设计实验,要求学生理解掌握函数的定义,掌握函数的基本技能,获得使用函数的能力,达到使用目的,能够应用从函数的方面,解决编程问题, 实验要求: (1)熟练掌握函数的定义与调用 (2) 熟练掌握使用函数编写程序 (3) 掌握函数的实参、形参和返回值的概念及使用 掌握局部变量与全局变量在函数中的运用,进一步掌握单步调试进入函数和跳出函数的方法 |
实验主要仪器、设备和材料 | 计算机,教材,编译器Code::Blocks实验报告源代码error05_1.cpp及error05_2.cpp |
实验内容 | 一、实验原理: 二、操作步骤: 一、计算两个复数之积:分别输入两个复数的实部和虚部,用函数实现计算两个复数之积。 若两个复数分别为:c1=x1+(y1)i,c2=x2+(y2)i,则: c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i 源程序(有错误的程序)(error05_1.c) 1 #include<stdio.h> 2 double result_real, result_imag; /* 全局变量,用于存放函数结果 */ 3 void complex_prod(double x1, double y1, double x2, double y2) /*函数声明*/ 4 5 int main() 6 { 7 double imag1, imag2, real1, real2; /* 两个复数的实、虚部变量 */ 8 9 printf("Enter 1st complex number(real and imaginary): "); 10 scanf("%lf%lf", &real1, &imag1); /* 输入第1个复数 */ 11 printf("Enter 2nd complex number(real and imaginary): "); 12 scanf("%lf%lf", &real2, &imag2); /* 输入第2个复数 */ 13 complex_prod(real1, imag1, real2, imag2); /* 求复数之积 */ 14 printf("product of complex is %f+%fi ", result_real, result_imag) 15 16 return 0; 17 } 18 19 /* 定义求复数之积函数 */ 20 void complex_prod(double x1, y1, x2, y2); 21 { 22 double result_real, result_imag; 23 24 result_real = x1*x2 - y1*y2; 25 result_imag = x1*y2 + x2*y1; 26 27 return result_real, result_imag; 28 } (1) 编译后共有 个[error(s)], 个[warning(s)] 编译错误改正如下。 (先截图1,再说明) ① 第1个错误信息:(先截图1,再说明) 错误原因是 ② 行去掉分号,改为: (先截图2,再说明) ③ 函数头中的形参y1前加一个 错误原因: ④ 函数头中形参x2,y2前加上 错误原因: ⑤ 修正后的程序还有错误, 1. 应 2. 应 (2) ① 经过上述编译错误改正步骤,再重新编译成功。运行,输入测试数据。 Enter 1st complex number(real and imaginary):1 1 Enter 2nd complex number(real and imaginary):-2 3 运行结果为: Product of complex is 不正确,开始进入程序调试。 ② 调试步骤1:执行到断点。 在第12行上设置断点,该行有红点。单击调试按钮 ,开始调试运行程序,输入一个复数后,程序执行到断点(第12行)处暂停,此时该行变为。打开watches窗口,观察量result_real, result_imag, imag1, imag2, real1, real2,其中result_real, result_imag是全局变量需要自行输入,在右边的调试观察窗口中显示了这些变量的值(截图3,自己的截图). ③ 调试步骤2:单步进入函数。 单击“单步进入”按钮,再输入一个复数后,单步进入complex_prod( ),单击“下一步”按扭,中间变量名result_real发现它的值为-5,截图4,而回到主程序中全局变量result_real的值却为0,截图5。 ④ 调试步骤3:主函数。 返回主函数,调试观察窗口显示result_real=0;result_imag=0,函数的计算结果丢失。 原因分析:函数complex_prod( )中因为第 行 ,使得在函数中result_real和 result_imag变成了局部变量定义,其使用范围仅局限在函数complex_prod( )内,离开函数变量值就不复存在,而在主函数,变量result_real和 result_imag为全局变量,其值为原来的0。 ★全局变量的作用范围从定义处到程序结束,但当函数的局部变量与全局变量同名时,函数内以局部变量为准,全局变量不起作用。 单击“停止执行”按钮,修改程序。将第 行删除,使得全局变量的作用范围覆盖函数complex_prod( )。 ⑤ 调试步骤4:使用断点重现观察全局变量值。 单击按钮 ,执行到断点处,调试观察窗口显示全局变量result_real和 result_imag的值为-5,1,单击“跳过函数”按钮,返回主函数,调试观察窗口显示全局变量result_real=-5,result_imag=1,全局变量值得到保持,最终程序运行结果正确。 ⑥ 调试步骤5:结束调试。 单击“停止执行”按钮,程序调试结束。 (3) 运行结束(改正后程序的运行结果) 直接单击按钮(运行)运行程序,得到正确结果: Enter 1st complex number(real and imaginary):1 1 Enter 2nd complex number(real and imaginary):-2 3 Product of complex is -5.000000+1.000000i 截图6 |
实验数据(现象)记录及结果处理可附页 | ,, 编译后共有 5个[error(s)], 0个[warning(s)] 编译错误改正如下。 1、D:cyyspacebbmain.c|16|error: expected ';' before 'return'|这个错误说明少了一个分号,在14行后面加一个分号 2、D:cyyspacebbmain.c|20|error: 'y1' has not been declared| D:cyyspacebbmain.c|20|error: 'x2' has not been declared| D:cyyspacebbmain.c|20|error: 'y2' has not been declared| y1,x2,y2没有被定义,在20行y1,x2,y2前分别加上double,改正后继续编译,编译后发现新的错误 D:cyyspacebbmain.c|21|error: expected unqualified-id before '{' token|这个错误说明希望有一个标识符, 根据具体情况可以看出20行,多了一个分号,故将;删去, 然后再次编译, 0个[error(s)], 0个[warning(s)] 编译错误改正如下。 显然有错误,在22行打断点,然后进入调试,运行到26行,子函数运行完了,实数和虚数都有值 进入主函数时实数虚数都为0 仔细检查发现result_real, result_imag;被重复定义了,把22行删除,再次运行,结果正确 (1) 初次编译后共有__3__个[error(s)],__2__个[warning(s)]请填写出错信息并分析原因。 出错信息:D:cyyspacebbmain.c|3|error: expected initializer before 'int'| 出错原因:第二行少了一个分号 (2) 改正编译错误后,程序有出现其他编译错误,请填写出错信息并分析原因。 出错信息:D:cyyspacebbmain.c|15|error: expected unqualified-id before '{' token| 出错原因:多了个;,删掉即可 (3) 改正编译错误后,程序还有其他编译错误,请填写出错信息并填写原因。 出错信息:D:cyyspacebbmain.c|20|error: lvalue required as left operand of assignment|
出错原因:等号左边不能是表达式,只能是一个变量
错误行号: 20 正确代码:result=fact(i-1)*i;
(4) 改正上述错误后,再次编译无错误出现,运行程序。运行结果为1!+2!+…+10!= 45.000000,是否正确?: 不正确 (5) 请仔细分析错误产生的原因,模仿调试示例中的方法进行调试改错简要说明你的方法并给出正确语句: 方法:在第8行上设置断点,在watches窗口查看变量 i、sum 、result,在右边调试窗口中观察这些变量的值是否和自己的预期的一样,若不一样,进行改正。 改错汇总:i未等于10 ,少了个10的阶层;result未赋值;fact函数未返回值。 错误行号: 8 正确语句: for (int i = 1 ; i <= 10; i++) 错误行号: 17 正确语句: result = 1; 错误行号: 21 正确语句: return result; |
实验结果分析及讨论,可附页 | 1、实验中出现过的问题或错误分析:1、在改错题时,对于递归函数的理解不是很透彻,最后三个错误找了好久 2、void函数不返回值 3、void后可以有return但是后面不跟变量 2、保证实验成功(或程序运行正确)的关键问题:1、熟练 应用C语言的基础知识 2、了解出题人的意图,主要考的是什么 3、细心 4、灵活运用调试找出问题 |
收获及体会 | 1、对于递归函数有了进一步的了解 2、void不返回值 3、void后可以有return但是后面不跟变量 4、调试的重要性 完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。通过这次为数不多的几天计算机实践学习,我们了解了一些关于c语言的知识,理解巩固了我们c语言的理论知识,着对我们将来到社会工作将会有莫大的帮助。同时它让我知道,只要你努力,任何东西都不会太难。 |
C语言实验一
最新推荐文章于 2023-12-17 19:15:00 发布