C语言程序设计实验报告五

C程序设计实验报告

姓名:钟子良 

实验地点:家 

实验时间:2020.04.26

一、实验目的与要求

1、熟练地掌握函数的定义方法和调用规则。

2、掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。

3、了解函数的返回值及其类型,并正确使用它。

4、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。

5、练习递归函数的使用。

二、实验内容

1、函数的定义与调用

(1)6.3.1实验练习1:已知三角形的三条边,求三角形的面积

(1)问题简单描述:编写程序,从键盘输入三角形的3条边,调用三角形函数求出其面积,并输出结果。

(2)实验代码:

#include 
#include 
float area(float a,float b,float c)
{
    float s,p,area;
    s=(a+b+c)/2;
    p=s*(s-a)*(s-b)*(s-c);
    area=sqrt(p);
    return(area);
}
main()
{
    float a,b,c,ts;
    printf("请输入三角形的三条边:");
    scanf("%f%f%f",&a,&b,&c);
    ts=area(a,b,c);
    if(a+b>c&&a+c>b&&b+c>a)
    printf("area=%.0f\n",ts);
    else 
    printf("此数据不能构成三角形"); 
} 

 

(3)问题分析:一开始没有考虑到数据不能构成三角形的情况,后面仔细分析了流程图才想出来。

(4)流程图:

 

 

(2)6.3.1实验练习2:求N的阶乘

(1)1.问题的简单描述:①局部静态变量的定义;②宏定义的运用

(2)实验代码:

#include
#define N 5
long function(int i)
{
    static long f=1;
    f=f*i;  //实现阶乘 
    return f;    
}
main()
{
    long product;
    int i;
    for(i=1;i<=N;i++)
    {
        product=function(i);  //调用函数 
        printf("%d的阶乘是%d\n",i,product);
    }
}

 

(3)问题分析:用宏定义定义符号常量N,其作用域是全局的

(4)流程图:

 

 

(3)6.3.1实验练习3:求两个整数的最大公约数

(1)问题简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。

(2)实验代码:

#include
int gcd(int a,int b)
{
    int temp;
    int remainder;
    if(a<b)
    {
        int t;
        t=a;a=b;b=t; 
    }
    remainder=a%b;
    while(remainder!=0)
    {
        a=b;
        b=remainder;
        remainder=a%b;  
    }
    return b;
}
main()
{
    int x,y;
    int fac;
    printf("请输入两个整数:"); 
    scanf("%d %d",&x,&y);
    fac=gcd(x,y); 
    printf("它们的最大公约数是 %d",fac); 
}

 

(3)问题分析:程序的关键是使用循环体,用辗转相除法求公约数。刚开始不明白辗转相除法的方式,后面查看实验书才明白。

(4)流程图:

 

 

(4)6.3.1实验练习4:打印输出指定的类型

(1)问题简单描述:输入整数n,输出高度为n的等边三角形。

(2)实验代码:

#include
trangle(int n)
{
    int i,j;
    for(i=0;i)
    {
        for(j=i;j)
        printf(" "); 
        for(j=0;j<=2*i;j++) 
        printf("*");
        putchar('\n');
    }
}
main()
{
    int n;
    printf("请输入三角形的高度n:");
    scanf("%d",&n);
    printf("\n");
    trangle(n);
}

 

(3)问题分析:先控制行数,再控制空格输出,最后控制*输出。

 

2、模块化程序设计

(5)6.3.2实验练习1:求500以内的所有亲密数对

 (1)问题的简单描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。

 (2)实验代码:

#include
int facsum(int m)
{
    int sum=1,f=2;
    while(f<=m/2)
    {
        if (m%f==0)
        {
            sum=sum+f;
        } 
        f++;
    }
    return sum;
}
main()
{
    int m=3,n,k;
    while(m<=500)
    {
        n=facsum(m);
        k=facsum(n);
        if(m==k&&m<=n)
        {
            printf("%d,%d\n",m,n);
        }
        m++;
    }
}

 

(3)问题分析:主要是对亲密对数的理解要清楚,才能确定算法。

3、函数的递归调用

(6)6.3.3练习1 编写x的y次幂的递归函数

(1)问题简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。

(2)实验代码:

#include"stdio.h" 
long getpower(int x,int y)
{
    if(y==1)
    return x;
    else
    y=x*getpower(x,y-1);
}
main()
{
    int num,power;
    long answer;
    printf("请输入一个数;");
    scanf("%d",&num);
    printf("请输入幂次方;"); 
    scanf("%d",&power);
    answer=getpower(num,power);
    printf("%d^%d=%ld\n",num,power,answer);
}

 

(3)问题分析:无。

(7)6.3.3练习2 编写计算学生年龄的递归函数

(1)问题简单描述:用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比另一个大2岁,求第五位学生的年龄。

(2)实验代码:

#include
int age(int n)
{
    int c;
    if(n==1) 
    c=10;
    else
    c=age(n-1)+2;
    return c;
}
void main()
{
    int n=5,sage;
    sage=age(n);
    printf("第%d位学生的年龄为%d\n",n,sage);
}

(3)问题分析:思路较简单,用if-else语句很快算出结果。

小结:

这次实验学习了如何定义和调用函数,函数必须先定义才可以调用,在主函数中调用定义过的函数可以使得程序更加简洁清晰。但是在调用的过程中必须明确调用函数里返回值的类型,否则会出现错误。

你可能感兴趣的:(C语言程序设计实验报告五)