当前位置:首页 > c语言上机实验题
} getch(); }
10.请编辑调试下列程序,观察其运行结果,理解函数定义、函数调用的基本方法,并理解函数调用时形参和实参之间数据的传递方式。
(1)请将下列源程序进行调试,观察运行结果,尽量想明白为什么得到如此运行结果后再看题后的评注: 【源程序】
#include
int i=2,x=5,j=7; fun(j,6);
printf(“i=%d,j=%d,x=%d\\n”, i , j , x); }
int fun(int i ,int j)
{ int x=7;
printf(“i=%d,j=%d,x=%d\\n”, i , j ,x); }
(2)评注:
该题想要使大家明白,函数调用时是实参单向值传递给形参的,函数的形参是随着该函数被调用而分配空间,调用结束系统要回收空间;当执行main函数中的语句fun(j,6)时,其中的j是main函数中的量j,这次调用等价于fun(7,6),即将7和6分别传输给形参变量i和j;当执行fun函数时,fun有其自身的内部变量x,fun函数中的输出语句中,i,j,x的值分别为7,6,7;执行流程遇fun函数中的函数体闭封符“}”返回主函数,在主函数中输出时,i,j,x的值分别2,7,5。
2.(实验报告上的题2)请按如下步步骤设计程序: (1)编辑并运行下列程序: #include
char i; float x;
printf(\ scanf(\
printf(\ printf(\ printf(\
printf(\ printf(\
printf(\
scanf(\ /* 表示截取输入字符串中的1个字符,因为输入串中回车也算1个字符的*/
switch(i) /* i必须视作字符量,这由它的类型及输入的数据所决定*/ {
case '1': fexp(); break; case '2': flog10();break; case '3': flog();break; case '4': fsqrt();break;
default: printf(\ } getch(); }
fexp() { }
flog10() { } flog() { }
fsqrt() { }
评注:
这个程序既然能运行了,输入测试数据,试着走走所有的分支路径,看看能不能都走得通(当然有些是不可能有结果的,因为辅助功能函数都是空的),一定要走哟,并且弄清楚所走路径中分别执行什么语句,得到什么结果。
(2)试着将下面的功能函数的首部作修改(加上形参和返回值类型,一定要注意到哟): #include
char i; float x;
printf(\ scanf(\
printf(\ printf(\ printf(\
printf(\ printf(\
printf(\ scanf(\ switch(i) {
case '1': fexp(x); break; case '2': flog10(x);break; case '3': flog(x);break; case '4': fsqrt(x);break;
default: printf(\ } getch(); }
float fexp(float x) { }
float flog10(float x) { }
float flog(float x) { }
float fsqrt(float x) { }
评注:
注意到了吗?这个程序不能通过编译,错误的原因是“与'fexp'声明中的类型不匹配”等类的错误,还记得我课堂上讲了3个重要的概念,它们分别是函数的定义(目的是为了描述具体的功能,但不实现)、函数的调用(目的是实现函数所定义的功能)和函数的声明(目的是为了使一个存在的函数允许被调用,原则上是不能违背先定义后使用的原则,但当被定义的函数返回值为int类型时,被调用函数可以放在调用函数的后面而在调用之前缺省声明,这也就是第一步中程序能运行的原因)。
这个程序中,辅助函数的返回值类型均改为了float型,函数声明就不可以再缺省,有两种方法可以处理好这一问题,一是将后面的几个函数搬到main函数的前面,编译预处理命令的后面(自己试试吧);另一种办法是在编译预处理后面加函数的声明语句,如下列程序所示:
#include
float fexp(float); /*函数声明*/ float flog10(float); /*函数声明*/ float flog(float); /*函数声明*/ float fsqrt(float); /*函数声明*/ void main() {
char i;
float x;
printf(\ scanf(\
printf(\ printf(\ printf(\
printf(\ printf(\
printf(\ scanf(\ switch(i) {
case '1': fexp(x); break; case '2': flog10(x);break; case '3': flog(x);break; case '4': fsqrt(x);break;
default: printf(\ } getch(); }
float fexp(float x) { }
float flog10(float x) { }
float flog(float x) { }
float fsqrt(float x) { }
评注:
很神奇(这是编译系统的功劳,你要记住哟),程序又能执行了,跟(1)一样,可以走遍所有的路径了。
(3)下面我们试着将一些功能添加到函数中(当然,如果你有能力,可以添加足够复杂的功能,这也是我之希望:例如,求素数、黑洞数、反素数??可逐一添加到你的程序中,你想要某一模块干啥就去干啥):
#include
float fexp(float); /*函数声明*/ float flog10(float); /*函数声明*/ float flog(float); /*函数声明*/ float fsqrt(float); /*函数声明*/
共分享92篇相关文档