使用函式進行模組化設計
阿新 • • 發佈:2019-01-09
題目:
輸入全班某門課成績,統計其最高分和平均分。(要求函式1負責輸入成績;函式2負責統計最高分和平均分;函式3負責輸出結果)
根據題意,我現在完成程式碼。
看到題目時首先要分析題目的要求,將其一步一步分解,這樣有助於我們對題意的理解和理清自己的思路,其次再去寫大概的輪廓程式碼,最後完善自己的程式碼。
思路:
1.某門成績,所以要想到以陣列的形式呈現出來,分數可能為小數麼?顯然可以,所以定義陣列時,需要注意:float score[20];
2.最高分和平均分,都可能是小數形式,因此需要以float的形式出現。
3.要寫三個子函式,要注意其每個函式所要完成的功能。
4.完成程式碼開發。
程式碼如下:
#include <stdio.h>
float a[5]={0}; // 宣告全域性變數
float max=0; // 宣告全域性變數
float avg=0; // 宣告全域性變數
void main()
{
void input();
void output();
void fun();
input();
fun();
output();
}
/* 輸入成績 */
void input()
{
int i;
printf("請輸入學生成績:" );
for(i=0; i<5; i++) // 陣列的引用
{
scanf("%f",&a[i]);
}
}
/* 結果輸出 */
void output()
{
printf("最高分為:%.2f\n",max);
printf("平均分為:%.2f\n",avg);
}
/* 最大值和平均值 */
void fun()
{
int i;
float sum=0;
max=a[0];
for(i=0; i<5; i++)
{
sum = sum + a[i];
if (max<a[i])
{
max = a[i];
}
}
avg = sum/5;
}
這樣我們就簡單的把程式碼寫完了,結果也大體上正確,結果如下:
那麼,我們就對這個程式碼進行思考一下,這樣的程式碼合理麼?
有沒有漏洞呢?
很顯然是由問題的:
- 假如我輸入的成績有負數呢?是不是需要加判斷?
- 假如我輸入的成績很大呢?是不是需要增加一個上限值?
- 假如我的學生不是5個人呢?我是不是設計一個可輸入學生人數的方案?
。。。
等等這樣的問題都是程式碼中隱藏的bug,需要初學開發的人儘量把所有可能的情況都考慮全,免得出現問題反覆定位,耗費時間。
那我們現在講程式碼修改一下,能不能達到一個相對比較合理的情況。程式碼如下:
#include <stdio.h>
#define N 100
float score[N] = {0}; // 宣告全域性變數
float max = 0; // 宣告全域性變數
float avg = 0; // 宣告全域性變數
int n = 0; // 宣告全域性變數
void main()
{
void input();
void output();
void fun();
input();
fun();
output();
}
/* 輸入成績 */
void input()
{
int i;
int flag=0;
printf("請輸入學生個數:");
scanf("%d",&n);
while(1)
{
flag = 0;
printf("請輸入%d個學生成績:",n);
for(i=0; i<n; i++) // 陣列的引用
{
scanf("%f",&score[i]);
}
/* 檢測是否有非法成績 */
for(i=0; i<n; i++)
{
if(score[i]<0 || score[i]>100)
{
flag = 1;
printf("輸入有非法值,請重新輸入!\n");
break;
}
}
if(flag == 0)
{
break;
}
}
}
/* 結果輸出 */
void output()
{
printf("最高分為:%.2f\n",max);
printf("平均分為:%.2f\n",avg);
}
/* 最大值和平均值 */
void fun()
{
int i;
float sum=0;
max=score[0];
for(i=0; i<n; i++)
{
sum = sum + score[i];
if(max<score[i])
{
max = score[i];
}
}
avg = sum/n;
}
這樣就較好的完成了本題程式碼開發,大家可以借鑑參考。
執行效果為: