实验5 模块化程序设计
一、实验目的和要求
1.掌握C语言函数定义及调用的规则。
2.理解参数传递的过程。
3.理解函数的递归调用。
4.掌握库函数的调用方法。
5.理解变量的作用域和生存期。
6.了解编译预处理命令的使用。
二、实验内容和步骤
1.阅读并分析下面的程序,并按要求改写程序。
#include <stdio.h>
main()
{
int max,a,b;
printf("Please enter 2 numbers:(a,b)");
scanf("%d,%d",&a,&b);
if(a>b)
max=a;
else
max=b;
printf("max=%d\n",max);
}
(1)该程序的主要功能是什么?
(2)自定义函数fun1()实现该程序的功能,要求在主函数内实现数据的输入和输出,部分代码已经给出,请补充完整。
#include <stdio.h>
main()
{
int max,a,b;
/*函数的声明语句*/
printf("Please enter 2 numbers:(a,b)");
scanf("%d,%d",&a,&b);
/*函数的调用语句*/
printf("max=%d\n",max);
}
int fun1( )/*函数头*/
{
int max;
if(x>y)
max=x;
else
max=y;
/*函数的返回语句*/
}
(3)调试运行该程序,并记录输出结果。
2.上机调试下面的程序。
#include <stdio.h>
main()
{
float x,y;
scanf("%d,%d",&x,&y);
f(x,y);
}
void fun2(float a,float b)
{
float c;
if(b>0)
c=a+b;
else
c=a-b;
printf("%f",c);
}
(1)记录系统给出的出错信息,并指出出错原因。
(2)如果将该函数定义为float fun2(float a,float b),该程序应该如何改变?
(3)调试运行该程序,并记录输出结果。
3.上机调试下面程序,改正其不合理之处。
main()
{
int x,n,s;
s=power(x,n);
}
power(y)
{
int i,p=1;
for(i=1;i<=n;i++)
p=p*y;
}
4.编写一个函数,计算xy,用主函数进行调用。
(1)在主函数里,实现数据的输入和输出;
(2)函数的头部的定义,注意函数的形参个数和类型,函数的返回类型;
(3)函数体的定义,注意返回语句的用法。
5.编写程序,用递归的方法求1+2+3+…+n,可设递归函数为fun5()。
(1)递归结束条件为n=0;
(2)递推公式为n+fun5(n-1)。
6.编写并调试一个求n!(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。
(1)注意递归结束条件和递推公式;
(2)动态的显示递归函数被调用的轨迹,即每次要打印出变量的变化情况。
7.分析下面的程序,并记录输出结果。
#include <stdio.h>
main()
{
int x=2,y=3;
void fun7();
printf("x=%d,y=%d\n",x,y);
fun7();
printf("x=%d,y=%d\n",x,y);
fun7();
}
void fun7()
{
static int x=1;
int y=10;
x=x+2;
y=y+x;
printf("x0=%d,y0=%d\n",x,y);
}
(1)分析自动变量的作用域和生存期。
(2)分析静态变量的作用域和生存期。
8.分析下面的程序,并记录其执行结果。
#include <stdio.h>
main()
{
void fun8x(),fun8y();
extern int x,y;
printf("1:x=%d\ty=%d\n",x,y);
y=100;
fun8x();
fun8y();
}
void fun8x()
{
extern int x,y;
x=110;
递归函数c语言规则 printf("2:x=%d\ty=%d\n",x,y);
}
int x,y;
void fun8y()
{
printf("3:x=%d\ty=%d\n",x,y);
}
(1)分析外部变量的作用域和生存期。
(2)注意extern关键字的用法。
9.写出下面程序的输出结果。
#include <stdio.h>
#define PI 3.1415
#define FU(K) K+PI
#define PRINT(s) printf("%d\t",(int)(s))
void main()
{
int x=3;
PRINT(x*FU(1));
}
(1)分析#include命令的用法。
(2)分析#define命令的用法。
10.调用库函数,随机生成100~200之间的整数。
11.编写一个函数fun11(),输入3个顶点坐标,求ΔABC的面积。
对应答案:实验5 模块化程序设计
1.参考答案
(1)该程序的主要功能是:从键盘上输入两个整数,并求出其中的最大值。
(2)自定义函数fun1()实现该程序的功能,要求在主函数内实现数据的输入和输出,部分代码已经给出,请补充完整。
#include <stdio.h>
main()
{
int max,a,b;
int fun1(int,int); /*函数的声明语句*/
printf("Please enter 2 numbers:(a,b)");
scanf("%d,%d",&a,&b);
max=funl(a,b); /*函数的调用语句*/
printf("max=%d\n",max);
}
int fun1(int x,int y) /*函数头*/
{
int max;
if(x>y)
max=x;
else
max=y;
return max; /*函数的返回语句*/
}
(3)运行结果
Please enter 2 numbers:(a,b)
4,5
max=5
2.参考答案
(1)出错信息:Linker error:Undefined symbol '_f' in model。
错误原因是:函数调用错误,调用函数fun2()却调用了没有定义的函数f()。
(2)程序应该改为
#include <stdio.h>
main()
{
float x,y;
float fun2(float a,float b);
scanf("%f,%f",&x,&y);
printf("x+|y|=%f",fun2(x,y));
}
float fun2(float a,float b)
{
float c;
if(b>0)
c=a+b;
else
c=a-b;
return c;
}
(3)运行结果
3,-4
x+|y|=7
3.改正后的程序如下。
main()
{
int x,n,s;
int power(int x,int n);
printf("Please enter x,n");
scanf("%d,%d",&x,&n);
s=power(x,n);
printf("value =%d",s);
}
int power(int x,int n)
{
int i,p=1;
for(i=1;i<=n;i++)
p=p*x;
return p;
}
4.参考程序
long fun(int x,int y)
{
int i,p=1;
for(i=1;i<=y;i++)
p=p*x;
return p;
}
5.参考程序
main()
{
int fun5(int);
printf("1+2+3+…+10=%d",fun5(10));
}
int fun5(int n)
{
if(n==0)
return 0;
else
return n+fun5(n-1);
}
6.参考程序
main()
{
long fun6(int);
clrscr();
printf("5!=%ld",fun6(5));
}
long fun6(int n)
{
long data=1;
if(n==0)
{
data=1;
printf("%d!=%ld\n",n,data);
}
else
{
printf("%d-->",n);
data=n*fun6(n-1);
printf("%d!=%ld\n",n,data);
}
return data;
}
7.运行结果
x=2,y=3
x0=3,y0=13
x=2,y=3
x0=5,y0=15
(1)分析自动变量的作用域和生存期。
在主函数里定义的自动变量x、y,其作用域仅限于所在的函数(main)内。故两次的输出语句均为x=2,y=3。其生存期与所在函数共存,即从函数调用开始到调用结束为止。
在子函数fun7里定义的y也为自动变量,其作用域仅限于所在的函数(fun7)内,生存期与所在函数共存。即函数调用开始到调用结束为止,故每次调用的初值均为10。
(2)分析静态变量的作用域和生存期。
在子函数fun7里定义的x为静态局部变量,其作用域仅限于所在的函数(fun7)内, 其生存期与所在程序共存,即程序开始运行时到程序运行结束为止,所以每次调用fun7(),其值有继承性,第1次调用初值为1,第2次调用初值为3。
8.参考答案
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论