基於檔案的學生資訊管理系統

iamzxf發表於2014-12-24

    前面基於連結串列、陣列完成了基於檔案的學生資訊管理系統,這裡基於檔案給出相應的版本,供大家參考。

    學生成績管理系統主要是對檔案進行操作,同時需要對學生的資訊進行詳細定義。為了操作上的方便,假設學生的資訊包括以下幾部分:學號、姓名、語文成績、數學成績、平均成績。其中平均成績是根據輸入的語文成績和數學成績計算出來的。

    根據要求設計7個函式:Menu()、inputScore()、Search()、Insert()、Delete()、Count()和Show()函式。

① Menu()模組

該模組執行後,給出5個選單項的內容和輸入提示。

*1.成績錄入

*2.成績查詢

*3.成績插入

*4.成績刪除

*5.成績統計

*0.退出

請輸入0~5:

使用數字0~5來選擇選單項,其它輸入不起作用。在選擇時,通過switch語句進行選擇,使用迴圈控制選單項的顯示,迴圈條件恆為真,選擇正確的項,轉向相應的操作;選擇退出,結束操作;選擇其它項,螢幕總是顯示選單項,直至滿足相應的條件為止。

② inputScore ()模組

本模組實現的功能是對學生的資訊進行錄入,每輸入一條學生記錄,將其寫入檔案,並詢問是否繼續錄入,根據需求輸入若干條記錄。

③ Search()模組

本模組實現的功能是查詢學生的相關資訊,首先輸入學生學號,在檔案中查詢與輸入的學號相同的記錄,並在螢幕上顯示出來。當檔案中不存在該學生的資訊時,系統將做出相關提示。

④ Insert()模組

本模組實現的功能是要求使用者輸入某一學生的相關資訊,並將該學生插入到檔案末尾。

⑤ Delete()模組

本模組實現的功能是要求使用者輸入某一學生的學號,從檔案中查詢該學生的資訊,如果存在,刪除該學生的資訊;反之提供相關提示。

⑥ Count()模組

本模組實現的功能是對學生的資訊進行統計,主要實現三方面的功能:按照數學成績對學生進行分段統計,按照語文成績對學生進行分段統計,按照平均成績對學生進行分段統計。

⑦ Show()模組

本模組實現的功能是將檔案中的所有資訊在螢幕上顯示出來。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxNum 100			//定義學生的最大數量
typedef struct stud{
	int number;				//學號
	char name[20];			//姓名
	float math;				//數學成績
	float chinese;				//語文成績
	float average;			//平均成績
}StudentInfor;
//函式宣告
void Menu();					//主選單模組
void inputScore();				//輸入模組
void Search();				//查詢模組
void Insert();					//插入模組
void Delete();				//刪除模組
void Count();					//統計模組
void Show();					//檢視模組
int main()
{	
	int choice;
	while(1){
		Menu();
		scanf("%d",&choice);
		switch(choice){
			case 1: inputScore(); Show();break;
			case 2: Search(); break;
			case 3: Insert();Show();break;
			case 4: Delete();Show();break;
			case 5: Count(); break;
			case 0: return 0; 
			default: printf("\n\t輸入錯誤,請重新選擇!\n");
		}		
	return 0;	
}
//*******************************************************************
//功能:顯示系統選單,選擇要執行的操作
//引數:無
//返回值:無
//主要思路:用printf輸出選擇項
//*******************************************************************
void Menu()
{
		printf("\t學生成績管理系統\n");
		printf("\t*1. 學生成績輸入\n");
		printf("\t*2. 學生成績查詢\n");
		printf("\t*3. 學生成績修改\n");
		printf("\t*4. 學生成績插入\n");
		printf("\t*5. 學生成績刪除\n");
		printf("\t*6. 學生成績統計\n");
		printf("\t*0. 退出\n");
		printf("請選擇您要進行的操作:");
}
//*******************************************************************
//功能:建立二進位制檔案,並輸入學生的相關資訊
//引數:無
//返回值:無
//主要思路:通過鍵盤輸入學生的相關資訊,每輸入一個學生的資訊,使用fread函式將該資訊寫
//          入指定檔案中。
//*******************************************************************
void inputScore()
{
	char ch='y';		//用來控制是否繼續輸入
	FILE *fp;
	StudentInfor varStu;
	if((fp=fopen("studentScore.dat","wb"))==NULL)
	{
		printf("檔案無法開啟!\n");
		return;
	}
	printf("請輸入學生的學號,姓名,數學成績,語文成績\n");
	while(ch=='y')
	{
		scanf("%d", &varStu.number);
		getchar();
		scanf("%s",varStu.name);
		scanf("%f%f", &varStu.math,&varStu.chinese);
		varStu.average=(varStu.math+varStu.chinese)/2;
		fwrite(&varStu,sizeof(StudentInfor),1,fp);
		printf("是否需要繼續輸入?(y/n)");
		scanf("%c",&ch);
		ch=(ch=='Y')?ch+32:ch;
	}
	fclose(fp);
}
//*******************************************************************
//功能:在存放學生資訊的檔案中查詢符合條件的記錄
//引數:無
//返回值:無
//主要思路:通過鍵盤輸入學生的學號,讀取學生資訊檔案中的記錄,查詢檔案中是否存在與輸入學
//          號相同的記錄,並在螢幕上顯示相應的資訊。
//*******************************************************************
void Search()
{
	int number,flag;	//flag判斷查詢是否成功;
	FILE *fp;
	StudentInfor varStu;
	char ch='y';			//用於控制是否繼續查詢
	if((fp=fopen("studentScore.dat","rb"))==NULL)
	{
		printf("檔案無法開啟!\n");
		return;
	}
	while(ch=='y')
	{
		flag=0;
		printf("請輸入您要查詢的學生學號:");
		scanf("%d", &number);
		getchar();
		rewind(fp);	
		while(!feof(fp))
		{
			fread(&varStu,sizeof(StudentInfor),1,fp);
			if (number==varStu.number){
				flag=1;
				printf("%d %s %.2f ",varStu.number, varStu.name, varStu.math);
				printf("%.2f %.2f\n",varStu.chinese, varStu.average);
			}
		}
		if (!flag)
			printf("您要查詢的學生資訊不存在!\n");
		printf("你是否繼續查詢?(y/n)");
		scanf("%c",&ch);
		ch=(ch=='Y')?ch+32:ch;
	}
	fclose(fp);
}
//*******************************************************************
//功能:根據讀入的學生資訊,將其插入到檔案中
//引數:無
//返回值:無
//主要思路:通過鍵盤輸入學生的相關資訊,使用fprintf函式將該資訊寫入指定檔案的末尾。
//*******************************************************************
void Insert()		
{	
	FILE *fp;
	StudentInfor varStu;
	printf("請輸入學生的學號,姓名,數學成績,語文成績\n");
	scanf("%d", &varStu.number);
	getchar();
	scanf("%s",varStu.name);
	scanf("%f%f",&varStu.math,&varStu.chinese);
	varStu.average=(varStu.math+varStu.chinese)/2;
	if((fp=fopen("studentScore.dat","ab"))==NULL)
	{
		printf("檔案無法開啟!");
		return;
	}
	fwrite(&varStu,sizeof(StudentInfor),1,fp);
	fclose(fp);
}
//*******************************************************************
//功能:根據讀入的學生學號,從檔案中將與其學號相同的記錄從檔案中刪除
//引數:無
//返回值:無
//主要思路:通過鍵盤輸入學生的學號,在學生檔案中查詢與該學號相同的記錄,並將其刪除。
//*******************************************************************
void Delete()
{
	StudentInfor varStu;
	int number,exists,i;
	FILE *fp,*fp1;
	exists=0;		//用於記錄待查詢的資訊是否在檔案中
	if((fp=fopen("studentScore.dat","rb"))==NULL)
	{
		printf("檔案無法開啟!\n");
		return;
	}
	if((fp1=fopen("studentScore1.dat","wb"))==NULL)
	{
		printf("檔案無法開啟!\n");
		return;
	}
	printf("請輸入要刪除的學生學號:");
	scanf("%d", &number);
	//將檔案中的未被刪除的學生資訊儲存到檔案studentScore1.dat中
	fread(&varStu,sizeof(varStu),1,fp);
	while(!feof(fp))
	{
		if(varStu.number!=number)
			fwrite(&varStu,sizeof(StudentInfor),1,fp1);
		else
			exists=1;
		fread(&varStu,sizeof(varStu),1,fp);
	}
	fclose(fp);    fclose(fp1);
	//將刪除相關學生資訊後的其它學生資訊copy到檔案studentScore.dat中
	system("copy studentScore1.dat  studentScore.dat");
	if (exists)
		printf("學號為%d的學生資訊已成功刪除!\n", number);
	else
		printf("您要刪除的學生資訊不存在!");
}
//*******************************************************************
//功能:分別統計數學、語文成績和平均分在不同分數段的人數
//引數:無
//返回值:無
//主要思路:掃描檔案中的每條記錄,通過呼叫Select函式,統計每個分數段的學生人數。
//*******************************************************************
void Select(float score,int Num[])
{//判斷某一門課的等級
	int level;
	level=(int)(score)/10;
	switch(level)
	{
	case 0:
	case 1:
	case 2:
	case 3:
	case 4:
	case 5: Num[0]++; break;
	case 6: Num[1]++; break;
	case 7: Num[2]++; break;
	case 8: Num[3]++; break;
	case 9:
	case 10: Num[4]++; break;
	}
}
void Count()
{
	FILE *fp;
	int mathNum[5], chineseNum[5], averageNum[5]; //統計五分制的人數
	int i,level;
	StudentInfor varStu;
	for(i=0;i<5;i++)
	{
		mathNum[i]=0;
		chineseNum[i]=0;
		averageNum[i]=0;
	}
	if((fp=fopen("studentScore.dat","rb"))==NULL)
	{
		printf("檔案無法開啟!");
		return;
	}
	while(!feof(fp))
	{
		fread(&varStu,sizeof(varStu),1,fp);
		Select(varStu.math,mathNum);
		Select(varStu.chinese,chineseNum);
		Select(varStu.average,averageNum);
	}	
	fclose(fp);
	printf("統計結果如下:\n");
	printf("=====================\n");
	printf("數學成績:\n");
	printf("\t 60分以下人數:%d\n", mathNum[0]);
	printf("\t 60分到70分之間:%d\n", mathNum[1]);
	printf("\t 70分到80分之間:%d\n", mathNum[2]);
	printf("\t 80分到90分之間:%d\n", mathNum[3]);
	printf("\t 90分以上人數:%d\n", mathNum[4]);
	printf("=====================\n");
	printf("語文成績:\n");
	printf("\t 60分以下人數:%d\n", chineseNum[0]);
	printf("\t 60分到70分之間:%d\n", chineseNum[1]);
	printf("\t 70分到80分之間:%d\n", chineseNum[2]);
	printf("\t 80分到90分之間:%d\n", chineseNum[3]);
	printf("\t 90分以上人數:%d\n", chineseNum[4]);
	printf("=====================\n");
	printf("平均成績:\n");
	printf("\t 60分以下人數:%d\n", averageNum[0]);
	printf("\t 60分到70分之間:%d\n", averageNum[1]);
	printf("\t 70分到80分之間:%d\n", averageNum[2]);
	printf("\t 80分到90分之間:%d\n", averageNum[3]);
	printf("\t 90分以上人數:%d\n", averageNum[4]);	
}
//*******************************************************************
//功能:顯示所有學生的資訊
//引數:無
//返回值:無
//主要思路:掃描檔案中的每條記錄,並將記錄在螢幕上顯示出來。
//*******************************************************************
void Show()
{
	FILE *fp;
	StudentInfor varStu;
	if((fp=fopen("studentScore.dat","rb"))==NULL)
	{
		printf("檔案無法開啟!\n");
		return;
	}
	printf("輸出學生的所有資訊\n");
	printf("  學號    姓名   數學     語文  平均分\n");
	fread(&varStu,sizeof(varStu),1,fp);
while(!feof(fp))
	{
		printf("%6d%8s%7.1f ",varStu.number,varStu.name,varStu.math);
		printf("%8.1f%8.2f\n",varStu.chinese, varStu.average);
		fread(&varStu,sizeof(varStu),1,fp);
	}
	fclose(fp);
}




相關文章