实验模块化程序设计
一、实验目的和要求
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小时内删除。