1. 程式人生 > >c語言實現學生檔案管理系統

c語言實現學生檔案管理系統

/*
	課程設計專案名稱:學生檔案管理系統
	作者:施瑞文 
	時間:2018.3.3 
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define N sizeof(struct Student)
#define M sizeof(struct Password)
#define MAX 1000


struct Student
{
	char number[10];   //學號
	char name[10];   //姓名
	char sex[2];  //性別
	struct Birthday  //出生日期 
	{
		int year;   //年
		int month;  //月
		int day;    //日 
	}birtnday;
	struct Score  //成績
	{
		float c_language;  //c語言
		float math;  //高數
		float Russian;//俄語
		float Russian_hearing; //俄語聽力
		float professional;  //專業導論
		float politics;  //政治 
	}score;
	char remark[100];  //備註 
	int num;
	struct Student *next;
};
typedef struct Student Stu;
typedef Stu *Stup;


typedef struct Password
{
	char password[18];
	struct Password *next;
}pass;
typedef pass *passw;

typedef struct TOTAL    //總分 
{
	char number[10];
	char name[10];
	char sex[2];
	float c_language;  //c語言
	float math;  //高數
	float Russian;//俄語
	float Russian_hearing; //俄語聽力
	float professional;  //專業導論
	float politics;  //政治
	float sum;
}Total; 
Total total[MAX];


//好多自定義函式 
void color(short x);//設定顏色
void HideCursor();     //隱藏游標
void toxy(int x, int y);     //將游標移動到X,Y座標處
void menu();    //主選單 
void over();   //退出軟體
void signin();   //登陸 
passw ff();    //將檔案中的內容讀入連結串列,返回值為表頭地址 
void save_password(passw p);//儲存密碼 
void amend_password();   //修改密碼 
void input_information();  //資訊錄入 
void amend_information();  //修改資訊 
void delete_information();  //刪除資訊 
void delete_number();  //按學號查詢刪除
void delete_name();   //按姓名查詢刪除 
void save_information(Stup p);   //儲存資訊 
void print_information();    //資訊顯示 
Stup ss();   //將檔案中的內容讀入連結串列,返回值為表頭地址
void find_information();   ///查詢資訊 
void find_number_information();   //按學號查詢 
void find_name_information();   //按姓名查詢 
void statistics_information();  //資訊統計 
void average_score();   //平均分
void total_score_ranked();   //總分排名
void fail_numbers();     //各科不及格人數 
void assignment();   //將資訊賦值到一個結構體中 
void grade_table();   //各科成績分佈 
void analyze_c();   //c語言 
void analyze_math();//高數 
void analyze_Russian();//俄語 
void analyze_Russian_hearing();//俄語聽力 
void analyze_professional();//專業導論 
void analyze_politics();   //政治 
int cmp(const void *a,const void *b);
int cmp1(const void *a,const void *b);  //快速排序 
int cmp2(const void *a,const void *b);
int cmp3(const void *a,const void *b);
int cmp4(const void *a,const void *b);
int cmp5(const void *a,const void *b);
int cmp6(const void *a,const void *b);



char _password[18];
passw password_head;
int len;

void color(short x)    //設定顏色 
{
	if(x>=0&&x<=15)
	{
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
	}
	else
	{
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
	}
} 

void HideCursor()     //隱藏游標
{
 CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void toxy(int x, int y)      //將游標移動到X,Y座標處
{
COORD pos = { x , y };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos); 
}

int cmp(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).sum)-((*(Total *)a).sum);
}

int cmp1(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).c_language)-((*(Total *)a).c_language);
}

int cmp2(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).math)-((*(Total *)a).math);
}

int cmp3(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).Russian)-((*(Total *)a).Russian);
}

int cmp4(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).Russian_hearing)-((*(Total *)a).Russian_hearing);
}

int cmp5(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).professional)-((*(Total *)a).professional);
}

int cmp6(const void *a,const void *b)  //快速排序 
{
	return ((*(Total *)b).politics)-((*(Total *)a).politics);
}

void menu()   //主選單
{
	do
	{
		system("cls");    //清屏 
		fflush(stdin);   //清空快取 
		color(14);
		char t;
		toxy(45,6);
		printf("-----學生檔案管理系統-----"); 
		toxy(45,7);
		printf("|                        |");
		toxy(45,8);
		printf("|       1.資訊錄入       |");
		toxy(45,9);
		printf("|                        |");
		toxy(45,10);
		printf("|       2.資訊修改       |");
		toxy(45,11);
		printf("|                        |");
		toxy(45,12);
		printf("|       3.資訊刪除       |");
		toxy(45,13);
		printf("|                        |");
		toxy(45,14);
		printf("|       4.資訊顯示       |");
		toxy(45,15);
		printf("|                        |");
		toxy(45,16);
		printf("|       5.資訊查詢       |");
		toxy(45,17);
		printf("|                        |");
		toxy(45,18);
		printf("|       6.資訊統計       |");
		toxy(45,19);
		printf("|                        |");
		toxy(45,20);
		printf("|       7.修改密碼       |");
		toxy(45,21);
		printf("|                        |");
		toxy(45,22);
		printf("|       8.退出軟體       |");
		toxy(45,23);
		printf("--------------------------");
		t=getch();
		switch(t)
		{
			case '1':input_information();break;
			case '2':amend_information();break;
			case '3':delete_information();break;
			case '4':print_information();break;
			case '5':find_information();break;
			case '6':statistics_information();break;
			case '7':amend_password();break;
			case '8':over();break;
			default :break;
		}
	}while(1);//永遠為真 
} 

passw ff()     //將檔案中的內容讀入連結串列,返回值為表頭地址 
{
	FILE *fp;  //檔案指標 
	passw password_head=NULL;
	fp=fopen("password","a+");   //以追加和讀的方式開啟名為password的檔案 
	if(fp==NULL)
	{
		printf("cannot open file"); 
	}
	//printf("%p\n",password_head);
	password_head=(passw)malloc(M);   //申請空間 
	strcpy(password_head->password," ");  //初始化密碼 
	//printf("%s\n",password_head);
	fread(password_head,M,1,fp);   
	fclose(fp);    //關閉檔案 
	return password_head;   //返回值表頭地址 
}

void signin()    //登入 
{
	do
	{
		system("cls");
		color(13);   //好看的顏色 
		passw p,head;
		int i=0;
		char k;
		head=ff();   //呼叫函式,返回值為表頭地址 
		p=head;     
		//printf("%s\n",p->password);
		//printf("%p\n",p);
		char str[]="000000";   //初始密碼 
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(45,8);
		printf("請輸入管理者密碼:");
		for(;;)              //此處為輸入密碼不回顯操作 
		{
			k=getch();       //輸入k 
			if(k=='\r')      //如果輸入k為回車,則跳出迴圈 
			{
				break;
			}
			else if(k=='\b')  //如果輸入k為刪除鍵 
			{
				if(i>0)       //如若密碼還沒完全刪除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i--;
				}
			}
			else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
			{
				_password[i]=k;   //把k的值賦給_password[i]; 
				printf("*");      //輸出*號,保護使用者隱私 
				i++;              //密碼位數加1 
			}
		}
		_password[i]='\0';
		if(strcmp(p->password," ")==0)   //判斷程式是否是第一次執行,
		{
			strcpy(p->password,str);//如果是,則將初始密碼000000賦值給p->password 
			save_password(p);   //儲存p 
		}
		if(strcmp(head->password,_password)==0)   //判斷密碼是否輸入正確 
		{
			system("cls");
			toxy(45,8);
			printf("正在登陸....");
			Sleep(500);
			menu();
		}
		else
		{
			toxy(45,10);
			printf("密碼錯誤!");
			Sleep(500);
		}
	}while(1);
}

void amend_password()   //修改密碼 
{
	system("cls");         //清屏 
	color(12);    //看著舒服的顏色  
	passw p,head;       //隱藏游標,看著更舒服 
	head=ff();
    do
    { 
        system("cls");         //清屏
    	p=head;
    	char password[18],newpassword[18],t,k;
    	int i=0;
    	toxy(45,6);          //將游標移動到座標為(50,5)的位置 
		printf("學生檔案管理系統");
		toxy(48,8);
		printf("修改密碼");
		toxy(45,10);
		printf("請輸入舊密碼:");
		for(;;)              //此處為輸入密碼不回顯操作 
		{
			k=getch();       //輸入k 
			if(k=='\r')      //如果輸入k為回車,則跳出迴圈 
			{
				break;
			}
			else if(k=='\b')  //如果輸入k為刪除鍵 
			{
				if(i>0)       //如若密碼還沒完全刪除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i--;
				}
			}
			else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
			{
				password[i]=k;   //把k的值賦給_password[i]; 
				printf("*");      //輸出*號,保護使用者隱私 
				i++;              //密碼位數加1 
			}
		}
		password[i]='\0';
		i=0;
		toxy(45,12);
		printf("請輸入新密碼:");
		for(;;)              //此處為輸入密碼不回顯操作 
		{
			k=getch();       //輸入k 
			if(k=='\r')      //如果輸入k為回車,則跳出迴圈 
			{
				break;
			}
			else if(k=='\b')  //如果輸入k為刪除鍵 
			{
				if(i>0)       //如若密碼還沒完全刪除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i--;
				}
			}
			else              //如果輸入的k既不是刪除鍵,也不是回車鍵 
			{
				newpassword[i]=k;   //把k的值賦給_password[i]; 
				printf("*");      //輸出*號,保護使用者隱私 
				i++;              //密碼位數加1 
			}
		}
		newpassword[i]='\0';
		if(p!=NULL)                   //如果p不為空 
		{
			if(strcmp(p->password,password)==0)          //如果舊密碼輸入正確 
			{
				strcpy(p->password,newpassword);         //將舊密碼改為新密碼 
				break;                                   //跳出迴圈 
			}
			else                                         //如果舊密碼輸入錯誤 
			{
				system("cls");
				toxy(46,8);
				printf("--------------------------");
				toxy(46,9);
				printf("|                        |");
				toxy(46,10);
				printf("|  密碼錯誤!是否繼續?  |");
				toxy(46,11);
				printf("|                        |");
				toxy(46,12);
				printf("|  1.是           2.否   |");
				toxy(46,13);
				printf("|                        |");
				toxy(46,14);
				printf("--------------------------");
				while(1)
				{
					t=getch();                              //輸入t 
					if(t=='1')
					{
						system("cls");
						break;
					}
					else if(t=='2')
					  menu();
				}
			}
		}
	}while(1);       
	save_password(p);                         //永遠為真 
	system("cls");
	toxy(45,10);
	printf("修改成功!即將返回主選單...."); 
	Sleep(500);
	menu();
} 

void save_password(passw p)   //將p所指向的內容儲存到檔案中 
{
	FILE *fp;
	fp=fopen("password","w");   //以只寫的方式開啟名為password的檔案 
	if(fp==NULL)
	{
		printf("cannot open file"); 
	}
	if(fwrite(p,M,1,fp)!=1)   //將p所指向的一段大小為M的內容寫入fp所指向的檔案中 
	{
		printf("write error!"); 
	}
	fclose(fp);   //關閉檔案 
}

Stup ss()     //將檔案中的內容讀出到連結串列中 
{
	FILE *fp;    //檔案指標 
	Stup head=NULL,p,p1,pr=NULL;
	int n=0;
	fp=fopen("student","ab+");
	if(fp==NULL)
	{
		printf("cannot open file");
	}
	while(!feof(fp))// feof函式可以檢查檔案讀寫位置標誌是否移動到檔案末尾,feof(fp)檢查fp所指向的檔案是否結束,如果是
	{                //則函式值為真,否則為假,即“!feof(fp)”為真,在while迴圈中檢查 “!feof(fp)”為真,就執行迴圈體
		n++;
		p=(Stup)malloc(N); //向記憶體申請一段空間
		fread(p,N,1,fp); //從fp所指向的檔案讀入1個大小為M的資料,儲存到p所指向的空間中 
		if(n==1)
		{
			head=p;
			p1=p;
		}
		else
		{
			pr=p1;
			p1->next=p;
			p1=p;
		}
	}
	if(pr!=NULL)
	   pr->next=NULL;
	else if(pr==NULL)
		head=NULL;
	fclose(fp);
	return head;
}

void input_information()//錄入資訊 
{
	system("cls");
	color(15);
	int i=0,n;
	Stup p;
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("資訊錄入");
	toxy(45,8);
	printf("你需要錄入多少個學生的資訊?請輸入:");
	scanf("%d",&n);getchar();	
	while(i!=n)
	{
		system("cls");
		i++;
		p=(Stup)malloc(N);
		toxy(45,6);
	    printf("-----學生檔案管理系統-----");
	    toxy(50,7);
	    printf("資訊錄入");
	    toxy(45,8);
	    printf("請輸入學生學號:");
	    gets(p->number);
	    toxy(45,9);
	    printf("請輸入學生姓名:");
		gets(p->name);
		toxy(45,10);
		printf("請輸入學生性別(男或女):");
		gets(p->sex);
		toxy(45,11);
		printf("請輸入學生出生日期(年月日,以空格隔開):");
		scanf("%d%d%d",&p->birtnday.year,&p->birtnday.month,&p->birtnday.day);getchar();
		toxy(45,12);
		printf("請輸入c語言成績:");
		scanf("%f",&p->score.c_language);getchar();
		toxy(45,13);
		printf("請輸入高數成績:");
		scanf("%f",&p->score.math);getchar();
		toxy(45,14);
		printf("請輸入俄語成績:");
		scanf("%f",&p->score.Russian);getchar();
		toxy(45,15);
		printf("請輸入俄語聽力成績:");
		scanf("%f",&p->score.Russian_hearing);getchar();
		toxy(45,16);
		printf("請輸入專業導論成績:");
		scanf("%f",&p->score.professional);getchar();
		toxy(45,17);
		printf("請輸入政治成績:");
		scanf("%f",&p->score.politics);getchar();
		toxy(45,18);
		printf("請輸入備註:");
		gets(p->remark);
		save_information(p);
	}
	toxy(48,19);
	printf("錄入完畢!按任意鍵返回主選單!");
	getch();
}

void amend_information()  //修改資訊 
{
	system("cls");         //清屏 
	color(11);
	Stup p,head;
	FILE *fp;
	int i=15,j=0,c; 
	char number[10];   //學號
	char name[10],_name[10];   //姓名
	char sex[2];  //性別
	int year;   //年
	int month;  //月
	int day;    //日
	float c_language;  //c語言
	float math;  //高數
	float Russian;//俄語
	float Russian_hearing; //俄語聽力
	float professional;  //專業導論
	float politics;  //政治 
	char remark[100];  //備註
	char ch,t;
	head=ss();
	p=head;
	do
	{
		system("cls");
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(45,7);
		printf("修改資訊");
		toxy(40,9);
		printf("請輸入您要修改的資訊:");
		gets(_name);
		toxy(20,8);
		printf("----------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
		toxy(20,10);
		printf("----------------------------------------------------------------------------------------------");
		i=11;j=0;
		while(p!=NULL)   //將每個結點的p->num都賦為0,以免後面資料干擾 
		{
			p->num=0;
			p=p->next;
		}
		p=head;      //重新讓p指向head 
		while(p!=NULL)
		{
			if(strcmp(p->name,_name)==0)
			{
				toxy(18,i);
				j++;
				if(p->birtnday.month<10&&p->birtnday.day<10) 
					printf("%d.%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month<10&&p->birtnday.day>=10)
					printf("%d.%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month>=10&&p->birtnday.day<10)
					printf("%d.%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else
					printf("%d.%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				i++;
			    p->num=j;      //給p->num賦值,即給滿足搜尋要求的結點編號 
			}
			p=p->next;
		}
		if(j==0)                   //如果j=0,即沒有進入前面的搜尋迴圈,也就是沒有找到相應的資訊 
		{ 
			toxy(50,i);
			printf("沒有找到相應的資訊!(按0返回,按1重新搜尋)");
			while(1)               //死迴圈是為了防止除0和1的其他按鍵干擾 
			{
				ch=getch();     
				if(ch=='0')
				{
					menu();break;
				}
				else if(ch=='1')
				{
					break;
				}
			}
			if(ch=='1')     //如果輸入的ch等於1,則結束本次迴圈 
			   continue;
		}
		while(1)
		{
			toxy(50,i);
			printf("請輸入您要修改的資訊的標號:");
			scanf("%d",&c);
			getchar();
			i++;  
			if(c<=j)              //如果c<=j,即輸入正確 
			    break;
			else if(c>j)         //否則,輸入錯誤 
			{
				toxy(50,i);
				printf("沒有找到您所要修改的資訊,請重新輸入!");
				i++;
				Sleep(500);      //暫停0.5秒 
			}
		}
		p=head;      //讓p重新指向head,即第一個結點 
		while(p!=NULL&&p->num!=c)    //遍歷連結串列,尋找滿足要求的結點 
		{
			p=p->next;
		}
		if(p!=NULL)      //如果尋找成功,進入修改部分 
		{
			system("cls");    //清屏 
			toxy(45,8);
		    printf("請輸入學生學號:");
		    gets(number);
		    strcpy(p->number,number);
		    toxy(45,9);
		    printf("請輸入學生姓名:");
			gets(name);
			strcpy(p->name,name);
			toxy(45,10);
			printf("請輸入學生性別(男或女):");
			gets(sex);
			strcpy(p->sex,sex);
			toxy(45,11);
			printf("請輸入學生出生日期(年月日,以空格隔開):");
			scanf("%d%d%d",&year,&month,&day);getchar();
			p->birtnday.year=year;
			p->birtnday.month=month;
			p->birtnday.day=day;
			toxy(45,12);
			printf("請輸入c語言成績:");
			scanf("%f",&c_language);getchar();
			p->score.c_language=c_language;
			toxy(45,13);
			printf("請輸入高數成績:");
			scanf("%f",&math);getchar();
			p->score.math=math;
			toxy(45,14);
			printf("請輸入俄語成績:");
			scanf("%f",&Russian);getchar();
			p->score.Russian=Russian;
			toxy(45,15);
			printf("請輸入俄語聽力成績:");
			scanf("%f",&Russian_hearing);getchar();
			p->score.Russian_hearing=Russian_hearing;
			toxy(45,16);
			printf("請輸入專業導論成績:");
			scanf("%f",&professional);getchar();
			p->score.professional=professional;
			toxy(45,17);
			printf("請輸入政治成績:");
			scanf("%f",&politics);getchar();
			p->score.politics=politics;
			toxy(45,18);
			printf("請輸入備註:");
			gets(remark);
			strcpy(p->remark,remark);
			toxy(46,16);
			printf("-------------------------");
			toxy(46,17);
			printf("|                       |");
			toxy(46,18);
			printf("|     是否確認修改?    |");
			toxy(46,19);
			printf("| 1.確認         2.取消 |");
			toxy(46,20);
			printf("|                       |");
			toxy(46,21);
			printf("-------------------------");
			while(1)    //死迴圈為防止其他按鍵干擾 
			{
				t=getch();
				if(t=='1')
				   break;
				else if(t=='2')
				{
					menu();
				}
			 } 
			 if(t=='1')  //如果t等於1,則跳出迴圈 
			 {
			 	break; 
			 }
		}
	}while(1);
	p=head;     //p重新指向頭節點 
	system("cls");
	toxy(44,12);
	printf("正在修改....");
	fp=fopen("student","wb");   //開啟檔案的同時清除檔案內的內容 
	if(fp==NULL)
	{
		printf("cannot open file");
	}
	while(p!=NULL)
	{
		if(fwrite(p,N,1,fp)!=1)    //將p所指向的內容存入fp所指向的檔案中 
		{
			printf("file write error\n");
		}
		p=p->next;
	}
	fclose(fp);     //關閉檔案 
	Sleep(500);
	system("cls");
	toxy(44,12);
	printf("修改成功!正在自動跳轉到主選單....");
	Sleep(500);
	menu();
}

void delete_information()  //刪除資訊 
{
	do
	{
		system("cls");
		color(12);
		char t;
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(48,7);
		printf("資訊刪除");
		toxy(45,9);
		printf("1)  按學號查詢刪除");
		toxy(45,11);
		printf("2)  按姓名查詢刪除");
		toxy(48,13);
		printf("按0返回主選單");
		t=getch();
		switch(t)
		{
			case '0':menu();break;
			case '1':delete_number();break;
			case '2':delete_name();break;
			default :break;
		}
	}while(1);
}

void delete_number()  //按學號查詢刪除 
{
	do
	{
		system("cls");
		color(10);
		char number[10];
		char t,c;
		int i=11,j=0;
		Stup head,p,pre=NULL ;
		FILE *fp;
		toxy(48,9);
		printf("請輸入你要刪除的學生的學號:");
		gets(number);
		head=ss();
		p=head;
		toxy(45,6);
		printf("-----學生檔案管理系統-----"); 
		toxy(20,8);
		printf("----------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
		toxy(20,10);
		printf("----------------------------------------------------------------------------------------------");
		while(p!=NULL&&strcmp(p->number,number)!=0)
		{
			pre=p;
			p=p->next;
		}
		if(p!=NULL)
		{
			toxy(20,i);
			if(p->birtnday.month<10&&p->birtnday.day<10) 
				printf("%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
			else if(p->birtnday.month<10&&p->birtnday.day>=10)
				printf("%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
			else if(p->birtnday.month>=10&&p->birtnday.day<10)
				printf("%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
			else
				printf("%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
			toxy(45,i+1);
			printf("1.刪除        2.取消");
			while(1)
			{
				c=getch();
				if(c=='1')
					break;
				else if(c=='2')
					delete_number();
			}
			if(pre==NULL)
				head=head->next;
			else
				pre->next=p->next;
			system("cls"); 
			toxy(45,10);
			printf("正在刪除....");
			p=head->next;
			fp=fopen("student","wb");
			if(fp==NULL)
			{
				printf("cannot open file"); 
			}
			if(fwrite(head,N,1,fp)!=1)
			{
				printf("write error");
			} 
			fclose(fp);
			fp=fopen("student","ab");
			if(fp==NULL)
			{
				printf("cannot open file"); 
			}
			while(p!=NULL)
			{
				if(fwrite(p,N,1,fp)!=1)
				{
					printf("write error");
				} 
				p=p->next;
			}
			fclose(fp);
			Sleep(500);
			system("cls");
			toxy(45,10);
			printf("刪除成功!正在返回....");
			Sleep(500);
			delete_information(); 
		}
	    else if(p==NULL)
	    {
	    	toxy(48,i);
	    	printf("您輸入的資訊不存在!按0返回主選單,1返回上一級選單,2重新查詢");
	    	while(1)
	    	{
	    		t=getch();
	    		if(t=='0')
	    		{
	    			menu();
				}
				else if(t=='1')
				{
					delete_information();
				}
				else if(t=='2')
				{
					break;
				}
			}
		}
		free(p);
	}while(1);
}

void delete_name()   //按姓名查詢刪除 
{
	do
	{
		system("cls");
		color(10);
		char name[10];
		char t,c;
		int i=11,j=0,key;
		Stup head,p,pre;
		FILE *fp;
		toxy(48,9);
		printf("請輸入你要刪除的學生的姓名:");
		gets(name);
		head=ss();
		p=head;
		while(p!=NULL)
		{
			p->num=0;
			p=p->next;
		}
		p=head;
		toxy(45,6);
		printf("-----學生檔案管理系統-----"); 
		toxy(20,8);
		printf("----------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
		toxy(20,10);
		printf("----------------------------------------------------------------------------------------------");
		while(p!=NULL)
		{
			if(strcmp(p->name,name)==0)
			{
				toxy(18,i);
				j++;
				if(p->birtnday.month<10&&p->birtnday.day<10) 
					printf("%d.%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month<10&&p->birtnday.day>=10)
					printf("%d.%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month>=10&&p->birtnday.day<10)
					printf("%d.%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else
					printf("%d.%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",j,p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				i++;
				p->num=j;
			}
			p=p->next;
		}
		if(j==0)
	    {
	    	toxy(48,i);
	    	printf("您輸入的資訊不存在!按0返回主選單,1返回上一級選單,2重新查詢");
	    	while(1)
	    	{
	    		t=getch();
	    		if(t=='0')
	    		{
	    			menu();
				}
				else if(t=='1')
				{
					delete_information();
				}
				else if(t=='2')
				{
					break;
				}
			}
			if(t=='2')
				continue;
		}
		while(1)
		{
			toxy(50,i);
			printf("請輸入您要刪除的資訊的標號:");
			scanf("%d",&key);
			getchar();
			i++;
			if(key<=j)              //如果c<=j,即輸入正確 
			    break;
			else if(key>j)         //否則,輸入錯誤 
			{
				toxy(50,i);
				printf("沒有找到您所要刪除的資訊,請重新輸入!");
				i++;
				Sleep(500);      //暫停0.5秒 
			}
		}
		toxy(46,16);
		printf("-------------------------");
		toxy(46,17);
		printf("|                       |");
		toxy(46,18);
		printf("|       確認刪除?      |");
		toxy(46,19);
		printf("| 1.確認         2.取消 |");
		toxy(46,20);
		printf("|                       |");
		toxy(46,21);
		printf("-------------------------");
		
		while(1)
		{
			p=head;
			pre=NULL;
			c=getch();
			if(c=='1')
			{
				while(p!=NULL&&p->num!=key)
				{
					pre=p;
					p=p->next;
				}
				if(p!=NULL)
				{
					if(pre==NULL)
						head=head->next;
					else
						pre->next=p->next;
				}
				free(p);
				break;
			}
			else if(c=='2')
				delete_number();
		}
		system("cls"); 
		toxy(45,10);
		printf("正在刪除....");
		fp=fopen("student","wb");
		if(fp==NULL)
		{
			printf("cannot open file"); 
		}
		if(head!=NULL&&fwrite(head,N,1,fp)!=1)
		{
			printf("write error");
		} 
		fclose(fp);
		if(head!=NULL)
		{
			p=head->next;
			fp=fopen("student","ab");
			if(fp==NULL)
			{
				printf("cannot open file"); 
			}
			while(p!=NULL)
			{
				if(fwrite(p,N,1,fp)!=1)
				{
					printf("write error");
				} 
				p=p->next;
			}
			fclose(fp);
		}
		Sleep(500);
		system("cls");
		toxy(45,10);
		printf("刪除成功!正在返回....");
		Sleep(500);
		delete_information(); 
	}while(1);
}

void print_information()  //輸出資訊 
{
	system("cls");
	color(11);
	Stup head,p;
	int i=11;
	head=ss();
	p=head;
	toxy(45,6);
	printf("-----學生檔案管理系統-----"); 
	toxy(20,8);
	printf("----------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
	toxy(20,10);
	printf("----------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		toxy(20,i);
		if(p->birtnday.month<10&&p->birtnday.day<10) 
			printf("%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
		else if(p->birtnday.month<10&&p->birtnday.day>=10)
			printf("%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
		else if(p->birtnday.month>=10&&p->birtnday.day<10)
			printf("%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
		else
			printf("%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
		i++;
		p=p->next;
	}
	toxy(45,i);
	printf("按任意鍵返回主選單!");
	getch();
}

void find_information()  //查詢資訊 
{ 
	do
	{
		system("cls");
		char t;
		color(10);
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(50,7);
		printf("查詢資訊");
		toxy(48,9);
		printf("1)  學號查詢");
		toxy(48,11);
		printf("2)  姓名查詢");
		toxy(48,13);
		printf("按0返回主選單");
		t=getch();
		switch(t)
		{
			case '0':menu();break;
			case '1':find_number_information();break;
			case '2':find_name_information();break;
			default :break;
		}
	}while(1);
}

void find_number_information()  //按學號查詢 
{
	do
	{
		system("cls");
		color(10);
		char number[10];
		char t;
		int i=11,j=0;
		Stup head,p;
		toxy(48,9);
		printf("請輸入你要查詢的學生的學號:");
		gets(number);
		head=ss();
		p=head;
		toxy(45,6);
		printf("-----學生檔案管理系統-----"); 
		toxy(20,8);
		printf("----------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
		toxy(20,10);
		printf("----------------------------------------------------------------------------------------------");
		while(p!=NULL)
		{
			if(strcmp(p->number,number)==0)
			{
				toxy(20,i);
				if(p->birtnday.month<10&&p->birtnday.day<10) 
					printf("%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month<10&&p->birtnday.day>=10)
					printf("%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month>=10&&p->birtnday.day<10)
					printf("%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else
					printf("%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				i++;
				j++;
		   }
			p=p->next;
	    }
	    if(j==0)
	    {
	    	toxy(48,i);
	    	printf("您輸入的資訊不存在!");
		}
	    toxy(48,i+1);
	    printf("按0繼續查詢,按1返回");
		while(1)
		{
			t=getch();
			if(t=='0')
			{
				break;
			}
			else if(t=='1')
			{
				find_information();
			}
		 } 
	}while(1);
}

void find_name_information()   //按姓名查詢 
{
	do
	{
		system("cls");
		color(10);
		char name[10];
		char t;
		int i=11,j=0;
		Stup head,p;
		toxy(48,9);
		printf("請輸入你要查詢的學生的姓名:");
		gets(name);
		head=ss();
		p=head;
		toxy(45,6);
		printf("-----學生檔案管理系統-----"); 
		toxy(20,8);
		printf("----------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("學號   姓名   性別   出生--日期     c語言   高 數   俄 語   俄語聽力   專業導論   政 治   備註");
		toxy(20,10);
		printf("----------------------------------------------------------------------------------------------");
		while(p!=NULL)
		{
			if(strcmp(p->name,name)==0)
			{
				toxy(20,i);
				if(p->birtnday.month<10&&p->birtnday.day<10) 
					printf("%s    %s    %s     %d.0%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month<10&&p->birtnday.day>=10)
					printf("%s    %s    %s     %d.0%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else if(p->birtnday.month>=10&&p->birtnday.day<10)
					printf("%s    %s    %s     %d.%d.0%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				else
					printf("%s    %s    %s     %d.%d.%d     %.2f   %.2f   %.2f     %.2f     %.2f     %.2f    %s\n",p->number,p->name,p->sex,p->birtnday.year,p->birtnday.month,p->birtnday.day,p->score.c_language,p->score.math,p->score.Russian,p->score.Russian_hearing,p->score.professional,p->score.politics,p->remark);
				i++;
				j++;
		   }
			p=p->next;
	    }
	    if(j==0)
	    {
	    	toxy(48,i);
	    	printf("您輸入的資訊不存在!");
		}
	    toxy(48,i+1);
	    printf("按0繼續查詢,按1返回");
		while(1)
		{
			t=getch();
			if(t=='0')
			{
				break;
			}
			else if(t=='1')
			{
				find_information();
			}
		 } 
	}while(1);
}

void assignment()   //將連結串列的內容賦值給一個結構體陣列 
{
	Stup head,p;
	head=ss();
	p=head;
	int i=0;
	while(p!=NULL)
	{
		strcpy(total[i].number,p->number);
		strcpy(total[i].name,p->name);
		strcpy(total[i].sex,p->sex);
		total[i].c_language=p->score.c_language;
		total[i].math=p->score.math;
		total[i].Russian=p->score.Russian;
		total[i].Russian_hearing=p->score.Russian_hearing;
		total[i].professional=p->score.professional;
		total[i].politics=p->score.politics;
		total[i].sum=total[i].c_language+total[i].math+total[i].Russian+total[i].Russian_hearing+total[i].professional+total[i].politics;
		i++;
		p=p->next;
	}
	len=i;
}

void statistics_information()   //資料統計 
{
	do
	{
		system("cls");
		color(6);
		char t;
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(50,7);
		printf("資料統計");
		toxy(48,9);
		printf("1)  平均分");
		toxy(48,11);
		printf("2)  總分排名");
		toxy(48,13);
		printf("3)  各學科不及格人數");
		toxy(48,15);
		printf("4)  各科成績分佈分析"); 
		toxy(45,17);
		printf("按0返回主選單");
		t=getch();
		switch(t)
		{
			case '0':menu();break;
			case '1':average_score();break;
			case '2':total_score_ranked();break;
			case '3':fail_numbers();break;
			case '4':grade_table();break;
			default :break;
		}
	}while(1);
}

void average_score()   //平均分 
{
	system("cls");
	color(10);
	float sum_c=0,sum_math=0,sum_Russian=0,sum_Russian_hearing=0,sum_professional=0,sum_politics=0;
	float average_c,average_math,average_Russian,average_Russian_hearing,average_professional,average_politics;
	int i=0;
	Stup head,p;
	head=ss();
	p=head;
	while(p!=NULL)
	{
		sum_c+=p->score.c_language;
		sum_math+=p->score.math;
		sum_Russian+=p->score.Russian;
		sum_Russian_hearing+=p->score.Russian_hearing;
		sum_professional+=p->score.professional;
		sum_politics+=p->score.politics;
		p=p->next;
		i++;
	}
	average_c=sum_c*1.0/i;
	average_math=sum_math*1.0/i;
	average_Russian=sum_Russian*1.0/i;
	average_Russian_hearing=sum_Russian_hearing*1.0/i;
	average_professional=sum_professional*1.0/i;
	average_politics=sum_politics*1.0/i;
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(48,7);
	printf("各學科平均分");
	toxy(30,8);
	printf("----------------------------------------------------");
	toxy(30,9);
	printf("  c語言   高數   俄語   俄語聽力   專業導論   政治");
	toxy(30,10);
	printf("----------------------------------------------------");
	toxy(30,11);
	printf("  %.2f   %.2f  %.2f    %.2f     %.2f    %.2f",average_c,average_math,average_Russian,average_Russian_hearing,average_professional,average_politics);
	toxy(45,12);
	printf("總人數為:%d",i);
	toxy(50,13);
	printf("按任意鍵返回主選單");
	getch(); 
	
}

void total_score_ranked()  //總分排名 
{
	system("cls");
	color(10);
	assignment();
	int j,k=11;
	qsort(total,len,sizeof(Total),cmp);   //快速排序 
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(48,7);
	printf("總分排名");
	toxy(20,8);
	printf("--------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("學號   姓名   性別     c語言    高 數    俄 語   俄語聽力   專業導論   政 治     總分   名次");
	toxy(20,10);
	printf("--------------------------------------------------------------------------------------------");
	for(j=0;j<len;j++)
	{
		toxy(20,k);
		printf("%s     %s    %s      %.2f    %.2f    %.2f    %.2f      %.2f     %.2f    %.2f    %d\n",total[j].number,total[j].name,total[j].sex,total[j].c_language,total[j].math,total[j].Russian,total[j].Russian_hearing,total[j].professional,total[j].politics,total[j].sum,j+1);
		k++;
	}
	toxy(45,k);
	printf("按任意鍵返回主選單");
	getch();
}

void fail_numbers()   //各科不及格人數 
{
	system("cls");
	color(10);
	int fail_c=0,fail_math=0,fail_Russian=0,fail_Russian_hearing=0,fail_professional=0,fail_politics=0; 
	int i;
	assignment();
	for(i=0;i<len;i++)
	{
		if(total[i].c_language<60)
			fail_c++;
		if(total[i].math<60)
			fail_math++;
		if(total[i].Russian<60)
			fail_Russian++;
		if(total[i].Russian_hearing<60)
			fail_Russian_hearing++;
		if(total[i].professional<60)
			fail_professional++;
		if(total[i].politics<60)
			fail_politics++;
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(48,7);
	printf("各科不及格人數");
	toxy(30,8);
	printf("-----------------------------------------------------");
	toxy(30,9);
	printf("c語言    高 數    俄 語   俄語聽力   專業導論   政 治");
	toxy(30,10);
	printf("-----------------------------------------------------");
	toxy(30,11);
	printf("%-10d%-10d%-10d%-10d%-10d%-10d",fail_c,fail_math,fail_Russian,fail_Russian_hearing,fail_professional,fail_politics);
	toxy(45,12);
	printf("請按任意鍵返回");
	getch();
}

void grade_table()    //各科各分數段人數資訊統計 
{
	do
	{
		system("cls");
		color(10);
		char t;
		toxy(45,6);
		printf("-----學生檔案管理系統-----");
		toxy(50,7);
		printf("各分數段統計");
		toxy(48,9);
		printf("(1)  c語言");
		toxy(48,11);
		printf("(2)  高等數學");
		toxy(48,13);
		printf("(3)  俄語");
		toxy(48,15);
		printf("(4)  俄語聽力");
		toxy(48,17);
		printf("(5)  專業導論");
		toxy(48,19);
		printf("(6)  政治");
		toxy(48,21);
		printf("按0返回上一級");
		t=getch();
		switch(t)
		{
			case '0':statistics_information();break;
			case '1':analyze_c();break;
			case '2':analyze_math();break;
			case '3':analyze_Russian();break;
			case '4':analyze_Russian_hearing();break;
			case '5':analyze_professional();break;
			case '6':analyze_politics();break;
			default :break;
		}
	}while(1);
}

void analyze_c()  //c語言 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp1);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].c_language/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("c語言--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].c_language);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].c_language);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].c_language);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].c_language);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].c_language);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
} 

void analyze_math()  //高數 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp2);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].math/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("高數--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].math);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].math);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].math);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].math);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].math);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
}

void analyze_Russian()   //俄語 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp3);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].Russian/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("俄語--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
}

void analyze_Russian_hearing()  //俄語聽力 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp4);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].Russian_hearing/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("俄語聽力--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian_hearing);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian_hearing);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian_hearing);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian_hearing);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].Russian_hearing);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
}

void analyze_professional()  //專業導論 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp5);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].professional/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("專業導論--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].professional);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].professional);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].professional);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].professional);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].professional);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
}

void analyze_politics()  //政治 
{
	system("cls");
	color(11);
	assignment();
	qsort(total,len,sizeof(Total),cmp6);   //快速排序 
	int numbers_A=0,numbers_B=0,numbers_C=0,numbers_D=0,numbers_E=0;
	int i,j,k=12;
	for(i=0;i<len;i++)
	{
		switch((int)(total[i].politics/10))
		{
			case 10:
			case 9:numbers_A++;break;
			case 8:numbers_B++;break;
			case 7:numbers_C++;break;
			case 6:numbers_D++;break;
			default:numbers_E++;break;
		}
	}
	toxy(45,6);
	printf("-----學生檔案管理系統-----");
	toxy(50,7);
	printf("政治--各分數段統計");
	toxy(36,9);
	printf("-------------------------------------------------");
	toxy(36,10);
	printf("學號           姓名           性別           分數");
	toxy(36,11);
	printf("-------------------------------------------------");
	toxy(18,12);
	printf("90~100人數為:%d",numbers_A);
	for(j=0;j<numbers_A;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].politics);
		k++;
	}
	k++;
	toxy(18,k);
	printf("80~90人數為:%d",numbers_B);
	for(j=numbers_A;j<numbers_A+numbers_B;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].politics);
		k++;
	}
	k++;
	toxy(18,k);
	printf("70~80人數為:%d",numbers_C);
	for(j=numbers_A+numbers_B;j<numbers_A+numbers_B+numbers_C;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].politics);
		k++;
	}
	k++;
	toxy(18,k);
	printf("60~70人數為:%d",numbers_D);
	for(j=numbers_A+numbers_B+numbers_C;j<numbers_A+numbers_B+numbers_C+numbers_D;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].politics);
		k++;
	}
	k++;
	toxy(18,k);
	printf("0~60人數為:%d",numbers_E);
	for(j=numbers_A+numbers_B+numbers_C+numbers_D;j<len;j++)
	{
		toxy(36,k);
		printf("%s             %s           %s             %.2f",total[j].number,total[j].name,total[j].sex,total[j].politics);
		k++;
	}
	toxy(48,k);
	printf("按任意鍵返回上一級");
	getch();
}

void save_information(Stup p)   //將p所指向的內容寫入檔案中 
{
	FILE *fp;
	fp=fopen("student","ab+");
	if(fp==NULL)
	{
		printf("cannot open file"); 
	}
	if(fwrite(p,N,1,fp)!=1)
	{
		printf("write error");
	} 
	fclose(fp);
}

void over()       //退出軟體 
{
	char t;
	toxy(45,11);
	printf("--------------------------");
	toxy(45,12);
	printf("|    您確定要退出嗎?    |");
	toxy(45,14);
	printf("|  1.確定      2.取消    |");
	toxy(45,15);
	printf("--------------------------");
	while(1)
	{
		t=getch();         //輸入t
		switch(t)
		{
			case '1':
			system("cls");
		    color(6);
			toxy(48,10);
			printf("正在安全退出....");
			Sleep(1000);     //暫停1秒 
			system("cls");
			color(8);
			toxy(48,10);
			printf("已安全退出軟體");
			toxy(48,12);
			printf("謝謝使用!");
			toxy(48,14);
			printf("by-by^_^");
			free(password_head);
			exit(0);  break; //終止程式 
			case '2':
			menu(); break;   //呼叫函式,進入選單 
			default :break;
		}
	}
}

main()  //簡單明瞭的主函式^_^ 
{
	HideCursor();
	signin();  //登入介面 
}