在前面的文章《用switch語句製作菜單》中,我們定義了四個函數分別求平均成績、找最高成績、統計不及格人數和統計80分以上人數。在四個函數中,都有打開文件、讀文件、關閉文件的操作。當操作次數多,文件中數據量大時,這是一種非常低效率的做法,因爲磁盤操作是一種耗時的過程。因此,我們有必要更新程序,找到新的方法來減少文件操作的次數。
在原來程序的每個函數中,只是定義了一個變量score來存儲成績,每讀一個成績,就處理一個,後面讀進來的成績會覆蓋前面的成績。也就是說每個函數都沒有保存成績,因此每個函數中都必須重新讀文件。現在學完數組了,我們可以考慮用數組來保存成績,具體過程是:在主函數中定義一個數組score,然後打開文件,將文件中的數據全部讀入到score數組中,最後將score數組以參數的形式傳遞給四個處理成績的函數。這樣,四個函數就共享score數組進行數據處理,沒有必要再分別讀文件。給四個函數增加數組形參,並對代碼進行相應的修改即可。具體代碼如下:
//這個版本引入了數組,將文件數據讀出來放到數組中。這樣只需讀一次文件即可(原來每個函數都讀一次)。
#include "stdio.h"
#include "stdlib.h"
#define NUMOFSTU 38
//print函數用於在顯示菜單時,打印星號和空格。
void print(char c, int n)
{
int i;
for(i=1;i<=n;i++)
putchar(c);
}
//ave()函數用於求平均成績
void ave(float score[])
{
int i;
float average,sum=0;
for(i=0;i<=NUMOFSTU-1;i++)
{
sum += score[i];
}
average = sum/NUMOFSTU;
printf("\nThe average score is %.2f\n",average);
}
//max()函數用於找最高成績
void max(float score[])
{
int i;
float max = -1;
for(i=0;i<=NUMOFSTU-1;i++)
{
if(score[i]>max)
max = score[i];
}
printf("\nThe maximum score is %.2f\n",max);
}
//numOfFailing()函數用於統計不及格人數
void numOfFailing(float score[])
{
int i,count=0;
for(i=0;i<=NUMOFSTU-1;i++)
{
if(score[i]<=60)
count++;
}
printf("\nThe number of failing grade is %d\n",count);
}
//numOf80()函數用於統計80分以上人數
void numOf80(float score[])
{
int i,count=0;
for(i=0;i<=NUMOFSTU-1;i++)
{
if(score[i]>=80)
count++;
}
printf("\nThe number of grades greater than 80 is %d\n",count);
}
int main()
{
int i,choice;
char ifcontinue;
float score[NUMOFSTU]; //存放學生成績的數組
system("color 30");
//顯示菜單
putchar('\n');
print(' ',10);
print('*',60);
putchar('\n');
print(' ',20);
printf("1--Calculate the average score\n");
print(' ',20);
printf("2--Find the maximum score\n");
print(' ',20);
printf("3--Count the number of failing grades\n");
print(' ',20);
printf("4--Count the number of grades greater than 80\n");
print(' ',20);
printf("5--Exit\n");
print(' ',10);
print('*',60);
putchar('\n');
//從文件讀成績到數組中
FILE *fp;
fp = fopen("grade.txt","r");
for(i=0;i<=NUMOFSTU-1;i++)
{
fscanf(fp,"%f",&score[i]);
}
fclose(fp);
//等待用戶選擇菜單項
while(1)
{
printf("\nPlease select menu item (key in 1-5): ");
scanf("%d",&choice);
//根據用戶不同的選擇,調用相應的函數
switch(choice)
{
case 1: ave(score); break;
case 2: max(score); break;
case 3: numOfFailing(score); break;
case 4: numOf80(score); break;
case 5: exit(0);break;
default: printf("\nInvalid input!\n");
}
printf("\nIf you want to continue, press y, otherwise, press any other key!");
getchar();
ifcontinue = getchar();
if(ifcontinue!='y')
break;
}
return 0;
}