第四次實驗報告

第六章  函數和宏定義實驗

C程序設計實驗報告

實驗項目:

一、函數的定義和調用編程

二、模塊化程序設計模塊化

姓名:徐溢璠     實驗地點: 514實驗室       實驗時間:2019年4月30日

1、實驗目的與要求

 一、函數的定義和調用

實驗練習1    編寫由三角形三邊求面積的函數

  • 調用area()函數求三角形的面積函數

  • 在求面積函數中運用海倫公式spa

實驗練習2   編寫求N階乘的函數

  • 定義符號常量設計

  • 使用長整型變量存放累乘積3d

  • 在函數中,使用局部靜態變量存放累乘積調試

實驗練習3   求兩個整數的最大公約數

  • 調用gcd()函數求兩個整數的最大公約數code

  • 掌握展轉相除法求兩個整數的最大公約數blog

實驗練習4   打印輸出指定圖形

  • 調用trangle()函數輸出三角形rem

  • 在trangle()函數中用for循環的嵌套輸出指定的結果

二、模塊化程序設計

實驗練習1   求500之內的全部親密數對

  • 掌握C語言中定義函數的方法

  • 掌握經過「值傳遞」調用函數的方法

2、實驗內容

6.4.1   函數的定義和調用

實驗練習1   編寫由三角形三邊求面積的函數

一、簡單問題描述

編寫程序,從鍵盤輸入三角形的3條邊,調用三角形面積函數求出其面積,並輸出結果。程序流程圖如圖6-1所示。流程圖以下:

二、實驗代碼

#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\n",ts);
    }
    else printf("data error!");
}

三、問題分析

問題:我將return(area)寫成了return(p),得出結果以下:

解決辦法:從新檢查程序,改正過來。

實驗練習2   編寫求N階乘的函數

一、簡單問題描述

編寫函數,求出從主調函數傳來的數值 i 的階乘值,而後將其傳回主調函數並輸出。流程圖以下:

二、實驗代碼

#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\n",i,product);
    }
}

三、問題分析

解決辦法:將printf中改爲%d的階乘是:%d。

實驗練習3   求兩個整數的最大公約數

一、簡單問題描述

編寫程序,從鍵盤輸入兩個整數,調用 gcd()函數求它們的最大公約數,並輸出結果。流程圖以下所示:

二、實驗代碼

#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("請輸入兩個數字:\n");
    scanf("%d%d",&x,&y);
    fac=gcd(x,y);
    printf("The great common divisor is:%d",fac);
 } 

 

三、問題分析

因爲剛開始我代碼是這樣寫的,而後發現我若是求較小的數就能得出正確結果,數字大了就沒法輸出。

解決辦法:聽老師的提示,我在while語句中加入了break;發現能夠獲得正確答案,可是這只是巧合,通過參考同窗的代碼,我知道應該在while語句中加上remainder=a%b,便可得到正確答案。

實驗練習4   打印輸出指定圖形。

一、簡單問題描述

輸入整數n,輸出高度爲n的等邊三角形。當n=5時的等邊三角形以下:

                           *

                         ***

                        *****

                      *******

                     *********

 

二、實驗代碼

#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('\n');
    }
}
main()
{
    int n;
    printf("請輸入一個整數n:\n"); 
    scanf("%d",&n);
    printf("\n");
    trangle(n);
}

 

三、問題分析

這個代碼以前理論課已經碰見過,沒有問題。

6.4.2   模塊化程序設計

實驗練習1   求500之內的親密對數。

一、簡單問題描述

若正整數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是一對親密數。流程圖以下:

二、實驗代碼

#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\n",m,n);
    }
        m++;
    }
    }

 

三、問題分析

問題:

發現沒法輸出結果,以後改正;

發現我沒有換行,加上"\n",獲得正確答案。

3、實驗小結

收穫:

一、在上第六章的理論課時,發現對於函數的定義,調用和聲明不太瞭解,可是經過這幾個編程題題目我對於本章內容更加了解了,能夠實際應用。果真,C語言是一門很須要實踐的課程。

二、經過第一個實驗和之前的一些實驗,我發現本身使用if語句容易犯的幾個錯誤,以及緣由。

三、第二個實驗聯繫了static的用法,同時我也知道若是字符太長,就用long。

四、第三個實驗我知道了怎樣交換兩個數字的值,以及學會了展轉相除法和更相減損法。

五、又犯了一個新錯誤,&應該用在scanf中而不是printf中,之後要注意。

不足:

一、還不怎麼會使用斷點的方法找程序的錯誤,致使我調試的效率很低。

二、不習慣使用註釋,老是本身都不懂本身的代碼。

三、容易跟着書上的提示和流程圖走,沒有本身的思路。

相關文章
相關標籤/搜索