用switch語句製作菜單 (二)_引入數組

    在前面的文章《用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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章