1. 程式人生 > >第六章 實驗報告 (函數與宏定義)

第六章 實驗報告 (函數與宏定義)

錯誤 ror if條件語句 輸入 can main func 三角形 有一個

C程序設計實驗報告

實驗項目:

  • 6.4.1.1編寫由三角形三邊求面積的函數
  • 6.4.1.2編寫求N的階層
  • 6.4.1.3求兩個整數的最大公約數
  • 6.4.1.4打印輸出的指定圖形
  • 6.4.2.1模塊化程序設計

姓名:楊婷 實驗地點:教學樓514教室 實驗時間:2019年4月30日

一、實驗目的與要求
<1>6.4.1.1編寫由三角形三邊求面積的函數

  • 調用area()函數求三角形的面積
  • 在求面積函數中運用海倫公式

<2>6.4.1.2編寫求N的階層

  • 定義符號常量
  • 使用長整型變量存放累乘積
  • 在函數中,使用局部靜態變量存放累乘積
  • 使用全局變量存放累乘積

<3>6.4.1.3求兩個整數的最大公約數

  • 調用gcd()函數求兩個整數的最大公約數
  • 掌握輾轉相除法求兩個整數的最大公約數

<4>6.4.1.4打印輸出的指定圖形

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

<5>6.4.2.1模塊化程序設計

  • 掌握C語言中定義函數的方法
  • 掌握通過值傳遞調用函數的方法

二、實驗內容

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

  • 問題的簡單描述:
    編寫程序,從鍵盤輸入三角形的3條邊,調用三角形函數求出其面積,並輸出結果。
  • 流程圖:
    技術分享圖片
    技術分享圖片
  • 實驗代碼:
#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("請輸入三角形的三邊:\n");/*鍵盤輸入三角形的三邊*/ 
    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!");     
}
  • 問題分析:
    這道題求三角形的面積,要調用海倫公式,再判斷鍵盤輸入的三邊是否能構成三角形(用邏輯與與邏輯非均可)。我的代碼中寫的是"%f%f%f",我在運行時輸入了逗號,結果就顯示錯誤。後來,旁邊的同學提醒我應該輸入空格,而不是逗號。
  • 運行結果:
    技術分享圖片

實驗練習2:6.4.1.2編寫求N的階層

  • 問題的簡單描述:
    編寫函數,求出從主調函數傳來的數值i的階乘值,然後將其傳出主調函數並輸出。
  • 流程圖:
    技術分享圖片
    技術分享圖片
  • 實驗代碼:
#include "stdio.h"
#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);
    }
}
  • 問題分析:
    在這道題中,首先要用“#define N 5”定義符號常量N,並代表數字5;用“static long f=1”定義局部靜態變量f並賦初值1; 最後要調用函數function()求階乘值,並將其賦product。要輸出1,2,3等不同的數的階乘可以用“printf ("%的階乘是:%d\n",i,product);”表示。要註意的是不要把function什麽的打錯了,很難發現出現了拼寫錯誤。
    -運行結果:
    技術分享圖片

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

  • 問題的簡單描述:
    編寫程序,從鍵盤輸入兩個整數,調用gcd()函數求它們的最大公約數,並輸出結果。
  • 流程圖:
    技術分享圖片
    技術分享圖片
  • 實驗代碼:
#include<stdio.h>
int gcd(int a,int b)
{
    int remainder;
    int temp;
    if (a<b)
    {
        temp=b;
        b=a;
        a=temp;/*交換a和b的值*/
    }
        remainder=a%b;
    while (remainder!=0)
        {
            a=b;
            b=remainder;
            remainder=a%b;/*輾轉相除求最大公約數*/
        }
    return b;
}
main ()
{
    int x,y;
    int fac;
    printf ("please input two integers:");
    scanf ("%d,%d",&x,&y);
    fac=gcd(x,y);
    printf ("The great common divisor is:%d",fac);
}
  • 問題分析:
    當a<b時交換a和b的值,要用到中間值temp,代碼為“temp=b;b=a;a=temp”。在while循環中,用較大的數除以較小的數並取余數,並將余數賦值給較小的數。重復執行該循環直到較大的數除以較小的數後余數為0時,跳出循環,最後輸出的較小的數即為這兩個數的最大公約數。在代碼中,輾轉相除求最大公約數時,要括“a=b;b=remainder;remainder=a%b”.
    -運行結果:
    技術分享圖片

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

  • 問題的簡單描述:
    輸入整數n,輸出高度為n的等邊三角形。
  • 流程圖:
    技術分享圖片
    技術分享圖片
  • 實驗代碼:
#include<stdio.h>
trangle(int n)
{
    int i,j;
    for (i=0;i<n;i++)
    {
        for(j=0;j<n-i;j++)
        printf(" ");
        for(j=0;j<=2*i;j++)
        printf("*");
        putchar('\n');
    }
}
main()
{
   int n;
   printf("輸入一個整數:");
   scanf("%d",&n);
   printf("\n");
   trangle( n);
}
  • 問題分析:
    從流程圖中可以看出:n表示高度,i表示第幾行,而j表示星號。當n=5時,將等邊三角形分為兩個部分,第一行左半部分有4個空格,第二行有3個空格,第三行有2個空格······所以j=n-i,而且滿足j<=2*i。最後,調用trangle()函數打印出不同高度的等邊三角形。
    -運行結果:
    技術分享圖片

實驗練習5:6.4.2.1模塊化程序設計

  • 問題的簡單描述:
    若正整數A的所有因子(包括1但不包括自身,下同)之和為B,而B的因子之和為A,則稱A和B為一對親密數。例如,6的因子之和為1+2+3=6,因此6與6為一對親密數(即6自身構成一對親密數);又如,220的因子之和為1+2+4+5+10+11+20+22+44+55+110=284,而284的因子之和為1+2+4+71+142=220,因此,220與284為一對親密數。
    求500以內的所有的親密數對。
    具體要求如下:
    (1)編制一個函數facsum(m),返回給定正整數m的所有因子(包括1但不包括自身)之和。
    (2)編制一個主函數,調用(1)中的函數facsum(),尋找並輸出500以內的所有親密數對。
    (3)輸出要有文字說明。在輸出每對親密數時,要求從小到大排列並去掉重復的親密數對。
    (4)所有函數中的循環均為for循環。
  • 流程圖:
    技術分享圖片
    技術分享圖片
  • 實驗代碼:
#include<stdio.h>
int facsum (int m)
{
    int sum=1,f=2;
    while(f<=m/2)              /*while循環的循環體*/
    { 
        if(m%f==0)
        sum=sum+f;
        f=f+1;/*循環求m的因子之和並存放在sum變量中*/
    }
    return sum;
}
main()
{
    int m=3,n,k;
    while(m<=500)/*求500以內親密數對的while循環體*/
    {
       n=facsum(m);
       k=facsum(n);
       if(m==k&&m<=n)/*判斷是否是親密數對的if條件語句*/
       printf("%d,%d\n",m,n);
       m++;                 
     } 
    
}
  • 問題分析:
    從流程圖中可以看出:在facsum(m)模塊中,要先有一個while循環,再用if語句判斷是否滿足m%f==0,循環求m的因子之和並存放在sum變量中。求出m所有的因子後,將它們的和作為返回值。在主函數中,有一個while循環,從m=3開始調用facsum(m)函數,並判斷m是否有親密數對。條件“f<=m/2”中缺少等號的話輸出的是“24,24”。
    -運行結果:
    技術分享圖片

三、實驗小結

在這次實驗過程中,我存在著許多問題,少打了等號、打錯了函數名稱、輸入“%f%f%f”卻在運行時在數字間加入了逗號...有很多小問題其實是可以避免的,但是我在寫代碼的時候沒有註意到,檢查的時候也沒怎麽看出來,導致在運行的時候出現問題。這些都是我以後要格外註意的地方,我會盡量少犯這些錯誤。在寫代碼的時候,我都是看著書上的流程圖,還沒有自己去寫流程圖、想這些過程,這是還需要提高的部分。老師給我們講了算法中的方法,如輾轉相除法、更相減損法,還演示了如何添加斷點,這些在以後的學習過程中很可能會用到。

第六章 實驗報告 (函數與宏定義)