c语言上机实验题 联系客服

发布时间 : 星期五 文章c语言上机实验题更新完毕开始阅读e60d91fe172ded630b1cb6da

} getch(); }

10.请编辑调试下列程序,观察其运行结果,理解函数定义、函数调用的基本方法,并理解函数调用时形参和实参之间数据的传递方式。

(1)请将下列源程序进行调试,观察运行结果,尽量想明白为什么得到如此运行结果后再看题后的评注: 【源程序】

#include void main() {

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 void main() {

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 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) { }

评注:

注意到了吗?这个程序不能通过编译,错误的原因是“与'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); /*函数声明*/