1. 程式人生 > >實驗報告(2019年4月31日)

實驗報告(2019年4月31日)

putchar == cti c中 包括 編制 嵌套 scanf data

c程序實驗報告

姓名:黃誌乾????實驗地點:教學樓514教室????實驗時間:4月30日
實驗項目:
???1、編寫由三角形三邊求面積的函數
???2、編寫求N階乘的函數
???3、求兩個整數的最大公約數
???4、打印輸出指定圖形
???5、求500以內所有親密數對
???6、利用復化梯形公式計算定積分
???7、計算Ackerman函數
???8、編寫計算x的y次冪的遞歸函數getpower(int x,int y)。並在主程序中實現輸入輸出。
???9、編寫計算學生年齡的遞歸函數
???10、編寫遞歸函數下hi先Ackerma函數

一、實驗目的與要求

1.編寫由三角形三邊求面積的函數

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

● 在求面積函數運用海倫公式

2.編寫求N階乘的函數

● 定義符號常量
● 使用長整型變量存放累乘積
●使用全局變量存放累乘積

3.求兩個整數的最大公約數

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

4.打印輸出指定圖形

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

5.模塊化程序設計


目的:
●掌握c語言中定義函數的方法
●掌握通過“值傳遞”調用函數的方法
要求:
● 編制一個函數facsum(m),返回給定正整數m的所有因子(包括1但不包括自身)之和
● 編制一個主函數,調用(1)中的函數facsum(),尋找並輸出500以內的所有親密數對

● 輸出要有文字說明。在輸出每對親密數時,要求從小到大排列並去掉重復的親密數對
● 所有函數中的循環均為for循環

6.利用復化梯形公式計算定積分

●掌握c語言中定義函數的方法
●掌握通過“值傳遞”調用函數的方法

7.計算Ackerman函數

●掌握遞歸函數的設計方法
●進一步聯系閱讀檢查與測試修改c程序的方法

8.編寫計算x的 y次冪的遞歸函數getpower(int x,int y),並在主程序中實現輸入輸出。

●寫出解決該問題的遞歸算法
●在遞歸函數中,使用數字1作為回歸條件
●在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推還是回歸

9.編寫計算學生年齡的遞歸函數

●寫出解決該問題的遞歸算法
遞歸公式如下,根據公式容易寫出遞歸程序
●在遞歸函數中,使用數字1作為回歸條件
●在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推還是回歸

10.編寫遞歸函數實現Ackerman函數

●根據遞歸公式編寫遞歸函數
●在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推還是回歸

二、實驗內容

1.實驗練習:6.4.1.1

問題描述:

編寫程序,從鍵盤輸入三角形的3條邊,調用三角形面積函數求出其面積,並輸出結果。

流程圖

技術分享圖片

實驗代碼

#include<stdio.h>
#include<math.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("請輸入三角形三邊x,y,z的值\n") ;
    scanf("%f,%f,%f",&x,&y,&z);
    ts=area(x,y,z);
    if (x+y>z|y+z>x|z+x>y)
    printf("area=%f\n",ts);
    else printf("data error!");
}

運行結果

技術分享圖片

問題:

2.實驗練習:6.4.1.2

問題描述:

編寫函數,求出從主函數傳來的數值i階乘值,然後將其傳回主調函數並輸出。

流程圖

技術分享圖片

實驗代碼:

#include<stdio.h>
int 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);
    }
}

運行結果

技術分享圖片

問題:

在這個實驗中,主要問題是static中的f值的值傳遞,f值傳值再通過for語句實現循環

3.實驗練習:6.4.1.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("請輸入兩個整數:");
    scanf("%d,%d",&x,&y);
    fac=gcd(x,y);
    printf("The great common divisor is:%d",fac);
}

運行結果

技術分享圖片

問題:這裏主要要理解最大公約數的算法,其余步驟較基本

4.實驗練習:6.4.1.4

問題描述:

輸入整數n,輸出高度為n的等邊三角形,當n的值為5,等邊三角形為:

流程圖

技術分享圖片

實驗代碼

#include<stdio.h>
void 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);
}

運行結果

技術分享圖片

問題:

這個實驗與前幾章做的三角形實驗有相同之處,通過將相關語句定義為函數,再進行賦值實現

6.實驗練習: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以內的所有的親密數對。

流程圖

技術分享圖片

實驗代碼

#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++;
      } 
 }

運行結果

技術分享圖片

問題:

三、實驗小結

本次實驗課需要完成的實驗數目較多,並且有一定難度,主要在於實驗的算法方面,在做實驗時並不能很好的理解其中的算法。是通過流程圖及書上給出的算法完成的實驗,對於獨立完成實驗有一定難度,希望能在課後加深對於算法的理解

實驗報告(2019年4月31日)