實驗報告(2019年4月31日)
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日)