第六章 實驗報告 (函數與宏定義)
阿新 • • 發佈:2019-05-02
錯誤 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”卻在運行時在數字間加入了逗號...有很多小問題其實是可以避免的,但是我在寫代碼的時候沒有註意到,檢查的時候也沒怎麽看出來,導致在運行的時候出現問題。這些都是我以後要格外註意的地方,我會盡量少犯這些錯誤。在寫代碼的時候,我都是看著書上的流程圖,還沒有自己去寫流程圖、想這些過程,這是還需要提高的部分。老師給我們講了算法中的方法,如輾轉相除法、更相減損法,還演示了如何添加斷點,這些在以後的學習過程中很可能會用到。
第六章 實驗報告 (函數與宏定義)