第四次实验报告

第六章  函数和宏定义实验

C程序设计实验报告

实验项目:

1、函数的定义和调用

2、模块化程序设计

姓名:徐溢璠     实验地点: 514实验室       实验时间:2019年4月30日

一、实验目的与要求

 1、函数的定义和调用

实验练习1    编写由三角形三边求面积的函数

  • 调用area()函数求三角形的面积

  • 在求面积函数中运用海伦公式

实验练习2   编写求N阶乘的函数

  • 定义符号常量

  • 使用长整型变量存放累乘积

  • 在函数中,使用局部静态变量存放累乘积

实验练习3   求两个整数的最大公约数

  • 调用gcd()函数求两个整数的最大公约数

  • 掌握辗转相除法求两个整数的最大公约数

实验练习4   打印输出指定图形

  • 调用trangle()函数输出三角形

  • 在trangle()函数中用for循环的嵌套输出指定的结果

2、模块化程序设计

实验练习1   求500以内的所有亲密数对

  • 掌握C语言中定义函数的方法

  • 掌握通过“值传递”调用函数的方法

二、实验内容

6.4.1   函数的定义和调用

实验练习1   编写由三角形三边求面积的函数

1、简单问题描述

编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。程序流程图如图6-1所示。流程图如下:

2、实验代码

#include<math.h>
#include<stdio.h>
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 x,y,z,ts;
    printf("请输入三条边长:");
    scanf("%f%f%f",&x,&y,&z);
    ts=area(x,y,z);
    if(x+y>z&&x+z>y&&y+z>x)
    {
        printf("area=%f
",ts);
    }
    else printf("data error!");
}

3、问题分析

问题:我将return(area)写成了return(p),得出结果如下:

解决办法:重新检查程序,改正过来。

实验练习2   编写求N阶乘的函数

1、简单问题描述

编写函数,求出从主调函数传来的数值 i 的阶乘值,然后将其传回主调函数并输出。流程图如下:

2、实验代码

#include<stdio.h>
long function(int i)
{
    static long f=1;
    f=f*i;
    return f;
}
main()
{
    long product;
    int i;
    for(i=1;i<=5;i++)
    {
        product=function(i);
        printf("%d的阶乘是:%d
",i,product);
    }
}

3、问题分析

解决办法:将printf中改成%d的阶乘是:%d。

实验练习3   求两个整数的最大公约数

1、简单问题描述

编写程序,从键盘输入两个整数,调用 gcd()函数求它们的最大公约数,并输出结果。流程图如下所示:

2、实验代码

#include<stdio.h>
int gcd(int a,int b)
{
    int temp;
    int remainder;
    if(a<b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    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("The great common divisor is:%d",fac);
 } 

 

3、问题分析

由于刚开始我代码是这样写的,然后发现我如果求较小的数就能得出正确结果,数字大了就无法输出。

解决办法:听老师的提示,我在while语句中加入了break;发现可以得到正确答案,但是这只是巧合,经过参考同学的代码,我知道应该在while语句中加上remainder=a%b,即可获得正确答案。

实验练习4   打印输出指定图形。

1、简单问题描述

输入整数n,输出高度为n的等边三角形。当n=5时的等边三角形如下:

                           *

                         ***

                        *****

                      *******

                     *********

2、实验代码

#include<stdio.h>
void trangle(int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=i;j<n;j++)
            printf(" ");
        for(j=0;j<=2*i;j++)
            printf("*");
        putchar('
');
    }
}
main()
{
    int n;
    printf("请输入一个整数n:
"); 
    scanf("%d",&n);
    printf("
");
    trangle(n);
}

 

3、问题分析

这个代码之前理论课已经遇见过,没有问题。

6.4.2   模块化程序设计

实验练习1   求500以内的亲密对数。

1、简单问题描述

若正整数A的所有因子(包括1但不包括自身,下同)之和为B ,而B的因子之和为A ,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数(即自身构成一对亲密数);又如,22的因子之和为1+2+4+5+10+11+20+22+44+55+110=248,而248的因子之和为1+2+4+71+142=220,因此220与248是一对亲密数。流程图如下:

2、实验代码

#include<stdio.h>
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
",m,n);
    }
        m++;
    }
    }

 

3、问题分析

问题:

发现无法输出结果,之后改正;

发现我没有换行,加上" ",得到正确答案。

三、实验小结

收获:

1、在上第六章的理论课时,发现对于函数的定义,调用和声明不太了解,但是通过这几个编程题题目我对于本章内容更加了解了,可以实际应用。果然,C语言是一门很需要实践的课程。

2、通过第一个实验和以前的一些实验,我发现自己使用if语句容易犯的几个错误,以及原因。

3、第二个实验联系了static的用法,同时我也知道如果字符太长,就用long。

4、第三个实验我知道了怎样交换两个数字的值,以及学会了辗转相除法和更相减损法。

5、又犯了一个新错误,&应该用在scanf中而不是printf中,以后要注意。

不足:

1、还不怎么会使用断点的方法找程序的错误,导致我调试的效率很低。

2、不习惯使用注释,总是自己都不懂自己的代码。

3、容易跟着书上的提示和流程图走,没有自己的思路。

原文地址:https://www.cnblogs.com/x-y-f/p/10803459.html