1. 程式人生 > >應用--學生宿舍衛生管理系統

應用--學生宿舍衛生管理系統

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define N 400			//最大顯示資訊條數上限
int nummax=0;			//全域性陣列有效的最大長度
int numstore[N];		//儲存資訊位置
int sign=0;				//判別是否處理外部匯入的資料檔案
char thekey[15];		//儲存當前檔案處理需開啟的檔名

struct dormitory{
	char month[3];		//月份
	char day[3];		//日
	char weeks[3];		//週數
	char week[2];		//星期
	char floor[4];		//宿舍樓號
	char floors[2];		//樓層
	char roomnum[4];	//宿舍號
	char name[9];		//值班人姓名
	char score[3];		//衛生成績
}dorm;//
//子函式部分
//主功能選單函式部分
void MainInterface();	//開始介面
void RepCryp();			//密碼修改與管理員模式
void MainMenu();		//主功能選單
void InfEdit();			//編輯資訊
void InfSearch();		//查詢資訊
void InfStat();			//統計資訊
void FileMani();		//外部資料檔案匯入處理
void InfClear();		//初始化資訊即大量同類型資訊的刪除
void InfBackup();		//備份資料
//子選單函式部分
void InfIn();			//新增資訊
void InfAmend();		//修改資訊
void InfDelete();		//刪除資訊
int ManiChoose(char *str);		//資料操作選擇
//其他函式
void code();					//管理員密碼驗證
void codeinput(char *str);		//密碼輸入
void Encry(char *str);			//密碼加密
int itemsize(int number);		//檢測結構體成員長度
int inspect(char *str,int len,int flag);	//檢測字串長度及型別
int numcheck();					//輸入與檢測整型數
void strcheck(char *str,int len,int flag,char *strmin,char *strmax);	//輸入與檢測字串
void show();					//查詢介面提示
void clew(int select);			//結構體成員提示
void logo(char *temp);			//統計結果顯示
void migrate(int nmax,int *memo);			//刪除檔案中符合條件的資訊
void copy(char *file1,char *file2);			//檔案複製
void create(int flag);			//建立備份資料
char *namedat(char *str,int j);				//返回副檔名為.dat的檔名
char *nametxt(char *str,int j);				//返回副檔名為.txt的檔名
int sep(int select,char trans[][30],int transto[],char ret[][2][10],int choice);	//資料統計中提取與統計資訊並顯示
void display(int select);		//查詢資訊國提取與分離資訊並顯示
void taxis(int max,char ret[][2][10],int choice);	//結構體成員的排序
void filecheck();				//檔案檢測函式

/*主函式*/
void main(){
	MainInterface();
}
//進入選擇介面
void MainInterface(){
	int select;
	char ch;
	filecheck();
	while(1){
		fflush(stdin);
		printf("\n\n\t                          學生宿舍衛生管理系統");
		printf("\t----------------------------------------------------------------------");
		printf("\n\t***************************&&&&&&********************************\n");
		printf("\t*                 歡迎使用學生宿舍衛生管理軟體               *\n");
		printf("\t*     本軟體用於對宿舍衛生情況進行統計整理並對其進行評比      *\n");
		printf("\t*              您也可以對宿舍衛生成績進行查詢和修改           *\n");
		printf("\t***************************&&&&&&**********************************\n");
		printf("\t   *—————————————————————————*");
		printf("\t   *        1 管理員    2 普通使用者    0 退出          *");
		printf("\t   *—————————————————————————*");
		printf("\n\t 請選擇登入方式:");
		select=numcheck();		//輸入與檢測整型數
		switch(select){
			case 1:
				code();			//密碼驗證
				RepCryp();		//密碼驗證後進入RepCryp函式
				break;
			case 2:
				system("cls");
				InfSearch();	//普通使用者資訊查詢
				system("cls");
				break;
			case 0:
				printf("請按任意鍵退出\n");
				exit(0);
			default:
				printf("\t對不起!沒有你要的選項!\n\t退出程式【Esc】  \n\t 取消退出:任意鍵\n");
				printf("%c",'\007');
				ch=getch();
				if(ch==2)
					exit(0);
				else
					system("cls");
		}
	}
}

/*進入管理員與密碼修改模式*/
void RepCryp(){
	int res,count1,select;
	char ch,code1[21],code2[21],ori[]="123";
	FILE *fp;
	while(1){
		fflush(stdin);
		printf("\n\n                    歡迎登陸本系統!\n");
		printf("--------------------------------------------------\n");
		printf("**************************************************\n");
		printf("  *     1. 使用系統功能        2. 修改密碼     *  \n");
		printf("  *     3. 退出                4. 返回上層     *  \n");
		printf("**************************************************\n");
		printf("\n請選擇您的操作:");
		select=numcheck();
		switch(select){
			case 1:
				MainMenu();				//進入主功能選單
				break;
			case 2:
				system("cls");
				printf("\n\n                    密碼修改功能\n");
				printf("\n**********************\n\n請輸入您的新密碼:");
				for(count1=1;;count1++){
					codeinput(code1);	//密碼輸入
					printf("\n");
					printf("\n請再次輸入您的新密碼:");
					codeinput(code2);
					printf("\n");
					res=strcmp(code1,code2);
					if(res==0){
						fp=fopen("code.txt","w+");
						Encry(code1);
						fputs(code1,fp);
						fclose(fp);
						printf("修改密碼成功!\n返回上級:任意鍵\n退出程式:【Esc】   \n");
						ch=getch();
						printf("\n");
						if(ch==27)
							exit(0);
						system("cls");
						break;
					}else{
						if(count1>=3){
							printf("%c",'\007');
							printf("對不起!您現在不能修改密碼!\n退出程式:【Esc】   \n返回上級:任意鍵\n");
							ch=getch();
							printf("\n");
							if(ch==27)
								exit(0);
							system("cls");
							break;
						}else{
							printf("對不起!兩次輸入的密碼不一致\n\n請重新輸入:\n");
							printf("%c",'\007');
						}
					}
				}
				break;
			case 3:
				printf("請按任意鍵退出\n");
				exit(0);
			case 0:
				system("cls");break;
			default:
				system("cls");
				printf("%c",'\007');
				printf("對不起!沒有您要的選項!\n請重新選擇!\n");
		}
		if(select==0)
			break;
	}
}

/*主功能選單*/
void MainMenu(){
	int select;
	system("cls");
	while(1){
		fflush(stdin);
		printf("\n\n                                  主系統功能選單\n");
		printf("-----------------------------------------------------------------\n");
		printf("******************************************************************\n");
		printf("  *   1 編輯資訊    2 查詢資訊    3 統計資訊    4 檔案處理     *  \n");
		printf("  *   5 初始化資訊  6 備份管理    7 退出程式    0 返回上層     *  \n");
		printf("******************************************************************\n");
		printf("-----------------------------------------------------------------\n");
		printf("\n請選擇功能:");
		select=numcheck();
		system("cls");
		switch(select){
			case 1:InfEdit();break;		//編輯資訊
			case 2:InfSearch();break;	//查詢資訊
			case 3:InfStat();break;		//統計資訊
			case 4:FileMani();break;	//檔案處理
			case 5:InfClear();break;	//初始化資訊
			case 6:;InfBackup();break;	//備份管理
			case 0:break;
			case 7:printf("按其他任意鍵,結束程式\n");exit(0);
			default:
				printf("沒有您要的選項,請重新選擇!\n");
				printf("%c",'\007');
		}
		if(select==0)
			break;
		system("cls");
	}
}

/*編輯資訊模式*/
void InfEdit(){
	int select;
	system("cls");
	while(1){
		fflush(stdin);
		printf("\n\n\t                    編輯資訊功能選單\n");
		printf("--------------------------------------------------\n");
		printf("**************************************************\n");
		printf("  *       1 新增資訊          2 修改資訊       *  \n");
		printf("  *       3 刪除資訊          4 退出程式       *  \n");
		printf("  *                 0 返回上層                 *  \n");
		printf("**************************************************\n");
		printf("--------------------------------------------------\n");
		printf("\n請選擇功能:");
		select=numcheck();
		system("cls");
		switch(select){
			case 1:InfIn();break;		//新增資訊
			case 2:InfAmend();break;	//修改資訊
			case 3:InfDelete();break;	//刪除資訊
			case 0:break;
			case 4:printf("按其他任意鍵,結束程式\n");exit(0);
			default:
				printf("沒有您要的選項,請重新選擇!\n");
				printf("%c",'\007');
		}
		if(select==0)
			break;
		system("cls");
	}
}

/*查詢資訊模式*/
void InfSearch(){
	int select;
	char ch;
	while(1){
		fflush(stdin);
		printf("\n\n                   查詢資訊功能選單");
		show();
		printf("請先輸入您要查詢用到的條件個數:");
		select=numcheck();
		if(select>9||select<0){
			printf("%c",'\007');
			system("cls");
			continue;
		}
		if(select==0)
			break;
		if(select==9)
			exit(0);
		nummax=0;display(select);	//提取資訊並按條件顯示
		printf("\n返回上級:任意鍵\n退出程式:【Esc】  \n");
		ch=getch();
		if(ch==27)
			exit(0);
		system("cls");
	}
}

/*統計資訊模式*/
void InfStat(){
	int select,i,sto[9],choice,max,choose;
	char ch,str[9][30],ret[N][2][10],temp[20];
	while(1){
		printf("\n\n                   統計資訊功能選單");
		show();
		printf("請輸入您要統計用到的限制條件個數:");
		select=numcheck();
		if(select>9||select<0){
			printf("%c",'\007');
			system("cls");
			continue;
		}
		if(select==0)
			break;
		if(select==9){
			printf("按任意鍵退出本程式\n");
			exit(0);
		}
		nummax=0;
		printf("請輸入您要查詢的這%d個條件的序號:",select);
		for(i=0;i<select;i++){
			sto[i]=numcheck();
			if(sto[i]<1||sto[i]>8){
				printf("%c",'\007');
				printf("無此選項!請重新輸入:");
				i--;
			}
		}
		printf("請輸入統計條件:\n");
		for(i=0;i<select;i++){
			clew(sto[i]);		//提示要輸入哪一個結構體成員
			strcheck(str[i],itemsize(sto[i]),0);
			//strcheck用於按引數要求輸入字串,itemsize用於檢查結構體成員長度
		}
		printf("請輸入統計條件:");
		for(i=0;;i++){
			choice=numcheck();
			if(choice>0&&choice<9)
				break;
			else
				printf("輸入有誤!無此選項!");
		}
		system("cls");
		printf("這是");
		for(i=0;i<select;i++){
			if((sto[i]==4||sto[i]==8)||sto[i]==9){
				clew(sto[i]);
				printf("%s:",str[i]);
			}else{
				printf("%s",str[i]);
				clew(sto[i]);
			}
		}
		printf("按");
		clew(choice);
		printf("統計排列的結果,如下:\n\n");
		max=sep(select,str,sto,ret,choice);
			//提取資訊並按要求統計,然後返回一個整型數
		printf(" ");
		clew(choice);
		printf("\t成績:\t	星級:	等級:是否及格:	評價:\n");
		for(i=0;i<max;i++){
			printf("	%s\t	%s\t",ret[i][0],ret[i][1]);
			strcpy(temp,ret[i][1]);
			logo(temp);				//顯示統計結果
			printf("\n");
		}
		printf("1.按成績排序\t2.返回	\t0.退出\n");
		choose=numcheck();
		switch(choose){
		case 1:
			system("cls");
			printf("這是");
			for(i=0;i<select;i++){
				if((sto[i]==4||sto[i]==8)||sto[i]==9){
					clew(sto[i]);
					printf("%s:",str[i]);
				}else{
					printf("%s",str[i]);
					clew(sto[i]);
				}
			}
			printf("按");
			clew(choice);
			printf("統計並以成績降序排序的結果,如下:\n");
			taxis(max,ret,choice);	//統計結果按成績降序排列
			printf("繼續請按任意鍵");
			ch=getch();
			break;
		case 2:break;
		case 0:exit(0);
		default:printf("%c",'\007');
		}
		system("cls");
	}
}

/*檔案處理模式*/
void FileMani(){
	char ch;
	char str[50];
	FILE *fp;
	while(1){
		printf("\n\n\t                    檔案處理功能選單\n");
		printf("--------------------------------------------------\n");
		while(1){
			if(sign==1)
				break;
			printf("繼續操作:任意鍵\n返回上級:【Esc】	\n");
			ch=getch();
			if(ch==27)
				break;
			printf("請輸入檔案路徑及檔名:(注意匯入副檔名為:CSV)\n");
			strcheck(str,50,1);		//檢查檔名
			fp=fopen(str,"r");
			if(fp==NULL){
				printf("%c",'\007');
				system("cls");
				printf("檔案開啟失敗!\n請重新確定檔案位置!\n");
				continue;
			}
			fclose(fp);
			break;
		}
		if(ch==27)
			break;
		if(sign==0){
			remove("memory.dat");		//移除已存在的memory檔案
			copy(str,"memory.dat");		//重新將外部檔案中資料寫入新建立的memory檔案
		}
		system("cls");
		if(ManiChoose(str))				//進入檔案處理選單模式
			break;	
	}
}
/*初始化資訊模式*/
void InfClear(){
	int select,temp[1];
	char ch;
	while(1){
		printf("\n\n                   初始化資訊功能選單");
		show();
		printf("請輸入要初始化資訊所用到的條件個數:");
		select=numcheck();
		if(select>9||select<0){
			printf("%c",'\007');
			system("cls");
			continue;
		}
		if(select==0)
			break;
		if(select==9){
			printf("按任意鍵退出本程式");
			exit(0);
		}
		nummax=0;display(select);		//顯示要刪除的資訊
		if(nummax==0){
			printf("\n返回上級:任意鍵\n退出程式:【Esc】	\n");
			ch=getch();
			if(ch==27)
				exit(0);
			system("cls");
			continue;
		}
		fflush(stdin);
		printf("確認刪除:【回車】	,返回查詢:【Esc】	\n");
		scanf("%c",&ch);
		if(ch==27)
			continue;
		temp[0]=numstore[0];
		migrate(nummax+1,numstore);		//過濾刪除了檔案中符合條件的資訊
		fflush(stdin);
		migrate(1,temp);
		system("cls");
		printf("初始化資訊成功!\n");
	}
}

/*備份管理模式*/
void InfBackup(){
	FILE *fpr,*fp,*fpw,*fpu;
	int choice,where,i=0,j,tcount,cantd;
	char list[30][100],txt[100];
	while(1){
		printf("\n\n                   備份管理功能選單");
		printf("----------------------------------------------------\n");
		printf("\n");
		printf("  *   1 備份資料   2 還原資料   3 刪除備份資料   *  \n");
		printf("  *            4 退出程式    0 返回上層          *  \n");
		printf("\n");
		printf("----------------------------------------------------\n");
		printf("請選擇:");
		choice=numcheck();
		switch(choice){
			case 1:
				system("cls");
				printf("\0");
				create(0);		//建立備份資料
				system("cls");
				printf("備份成功!\n");
				break;
			case 2:				//恢復備份資料
				i=0;
				system("cls");
				printf("\n");
				fp=fopen("list.txt","r+");
				printf("\n\n                   還原資料功能選單\n");
				printf("----------------------------------------------------\n");
				while(!feof(fp)){
					fscanf(fp,"%s",list[i]);			//提取list檔案中存在的檔名
					if(!strcmp(thekey,list[i]))			//當前儲存檔案的檔名與提取檔名
														//對比,並顯示為“當前資料”
						printf("%d	%s\t當前資料!\n",i+1,list[i]);
					else
						printf("%d	%s\n",i+1,list[i]);	//顯示備份檔案列表
					fpw=fopen(nametxt(list[i],15),"r+");
					rewind(fpw);
					while(!feof(fpw)){					//顯示備份資料的說明
						fscanf(fpw,"%s",txt);
						printf(" %s",txt);
					}
					printf("\n\n");
					fclose(fpw);
					i++;
				}
				fclose(fp);
				printf("請選擇需恢復點(超出範圍將返回):");
				where=numcheck();
				system("cls");
				if(where>i||where<=0)
					break;
				printf("系統需要對還原前資料做備份\n");	//恢復前對此時間點做備份
				create(0);								//建立備份資料
				fpr=fopen("key.txt","r+");
				list[where-1][15]='\0';
				fprintf(fpr,"%s",list[where-1]);		//提取選擇檔名寫入key檔案
				fclose(fpr);
				strcpy(thekey,list[where-1]);			//將當前資料檔名替換
				system("cls");
				printf("已恢復到還原點");
				break;
			case 3:
				i=0;
				system("cls");
				printf("\n");
				fp=fopen("list.txt","r+");
				printf("\n\n                   刪除備份資料選單\n");
				printf("----------------------------------------------------\n");
				while(!feof(fp)){
					fscanf(fp,"%s",list[i]);
					if(strcmp(thekey,list[i])==0){
						printf("%d	%s\t當前資料!\n",i+1,list[i]);
						cantd=i+1;
					}
					else
						printf("%d	%s\n",i+1,list[i]);
					fpw=fopen(nametxt(list[i],15),"r+");
					rewind(fpw);
					while(!feof(fpw)){
						fscanf(fpw,"%s\n",txt);
						printf(" %s",txt);
					}
					printf("\n\n");
					fclose(fpw);
					i++;
				}
				fclose(fp);
				printf("輸入編號範圍之外的選項退出\n請輸入要刪除的備份選項:(當前資料不可刪)\n");
				tcount=numcheck();
				system("cls");
				if(tcount>i||tcount<=0)
					break;
				if(tcount==cantd){
					printf("此資料不可刪!\n");		//不允許刪除當前檔案
					continue;
				}
				//以下為從list檔案中刪除備份檔名及刪除備份檔案
				fpu=fopen("indlist.txt","w+");
				for(j=0;j<i;j++){
					list[j][15]='\0';
					if(j!=tcount-1)
						fprintf(fpu,"\n%s",list[j]);
				}
				fclose(fpu);
				remove("list.txt");
				rename("indlist.txt","list.txt");
				remove(nametxt(list[tcount-1],15));
				remove(namedat(list[tcount-1],15));
				printf("成功刪除!\n");
				break;
			case 0:break;
			case 4:exit(0);
			default:
				printf("%c",'\007');
				system("cls");
		}
		if(choice==0)
			break;
	}
}

/*子功能函式*/
//附加資訊模式
void InfIn(){
	int i,j;
	char ch;
	FILE *fp;
	for(j=1;;j++){
		if(sign==1)							//開啟儲存檔案寫入
			fp=fopen("memory.dat","a+");
		else
			fp=fopen(namedat(thekey,15),"a+");
		thekey[15]='\0';
		printf("\n\n                   新增資訊功能選單\n");
		printf("----------------------------------------------------\n");
		printf("請輸入此次衛生調查的時間:\n");
		printf("請輸入月份:");
		strcheck(dorm.month,3,-1,"1","12");//此函式用於輸入符合條件的字串,下同
		printf("請輸入日號:");
		strcheck(dorm.day,3,-1,"1","31");
		printf("請輸入週數:");
		strcheck(dorm.weeks,3,-1,"1","53");
		printf("請輸入星期:");
		strcheck(dorm.week,2,-1,"1","7");
		fflush(stdin);
		for(i=1;;i++){
			system("cls");
			printf("請輸入2009年%s月%s日第%s周星期%s的衛生成績:\n\n",dorm.month,dorm.day,dorm.weeks,dorm.week);
			printf("請輸入宿舍樓號:");
			strcheck(dorm.floor,4,0);
			printf("請輸入宿舍號:");
			strcheck(dorm.roomnum,4,-1,"101","659");
			printf("請輸入值班人姓名:");
			strcheck(dorm.name,9,1);
			printf("請輸入成績:");
			strcheck(dorm.score,3,-1,"0","99");
			fprintf(fp,"\n%s,%s,%s,%s,%s,%c,Rs,%,%s",dorm.month,dorm.day,dorm.weeks,dorm.week,dorm.floor,dorm.roomnum[0],dorm.roomnum,dorm.name,dorm.score);
			printf("\n繼續輸入:【回車】\n重輸日期:【Esc】\n返回上級:【0】	\n");
			ch=getch();
			if(ch=='0')
				break;
			if(ch==27)
				break;
		}
		fclose(fp);
		system("cls");
		if(ch=='0')
			break;
	}
}

/*修改資訊模式*/
void InfAmend(){
	int select,tcount,str[N],ncount;
	char ch;
	while(1){
		FILE *fp;
		printf("\n\n			修改資訊功能選單\n");
		show();
		printf("請輸入您要修改用到的條件個數:");
		select=numcheck();
		if(select>9||select<0){
			printf("%c",'\007');
			system("cls");
			continue;
		}
		if(select==0)
			break;
		if(select==9)
			exit(0);
		nummax=0;display(select);
		if(nummax==0){
			printf("\n返回上級:任意鍵\n退出程式:【Esc】		\n");
			ch=getch();
			if(ch==27)
				exit(0);
			system("cls");
			continue;
		}
		printf("\n返回上級:【0】	\n繼續操作:【回車】	\n");
		ch=getch();
		if(ch='0')
			break;
		fp=fopen("store.dat","w+");
		for(tcount=0;tcount<nummax;tcount++){
			printf("\n請輸入對應的序號:");
			scanf("%d",&ncount);
			str[tcount]=numstore[ncount-1];
			printf("請輸入此次衛生調查的時間:\n");
			printf("請輸入月份:\n");
			strcheck(dorm.month,3,-1,"1","12");
			printf("請輸入日號:");
			strcheck(dorm.day,3,-1,"1","31");
			printf("請輸入週數:");
			strcheck(dorm.weeks,3,-1,"1","53");
			printf("請輸入星期:");
			strcheck(dorm.week,2,-1,"1","7");
			fflush(stdin);
			printf("請輸入宿舍樓號:");
			strcheck(dorm.floor,4,0);
			printf("請輸入宿舍號:");
			strcheck(dorm.roomnum,4,-1,"101","659");
			printf("請輸入值班人姓名:");
			strcheck(dorm.name,9,1);
			printf("請輸入成績:");
			strcheck(dorm.score,3,-1,"0","99");
			fprintf(fp,"\n%s,%s,%s,%s,%s,%c,Rs,%,%s",dorm.month,dorm.day,dorm.weeks,dorm.week,dorm.floor,dorm.roomnum[0],dorm.roomnum,dorm.name,dorm.score);
			printf("\n修改成功! \n返回上級:【0】 \n繼續操作:【回車】 \n");
			ch=getch();
			if(ch=='0')
				break;			
		}
		fclose(fp);
		migrate(tcount+1,str);		//過濾刪除了符合條件的資訊
		system("cls");
	}
}

/*刪除資訊模式*/
void InfDelete(){
	int select,tcount,str[N],ncount;
	char ch;
	while(1){
		printf("\n\n			刪除資訊功能選單\n");
		show();
		printf("請輸入您刪除用到的條件個數:");
		select=numcheck();
		if(select>9||select<0){
			printf("%c",'\007');
			system("cls");
			continue;
		}
		if(select==0)
			break;
		if(select==9)
			exit(0);
		nummax=0;display(select);
		if(nummax==0){
			printf("\n返回上級:任意鍵\n退出程式:【Esc】		\n");
			ch=getch();
			if(ch==27)
				exit(0);
			system("cls");
			continue;
		}
		printf("\n返回上級:【0】	\n繼續操作:【回車】	\n");
		ch=getch();
		if(ch='0')
			break;
		for(tcount=0;tcount<nummax;tcount++){
			printf("\n請輸入對應的序號:");
			ncount=numcheck();
			if(ncount==0)
				break;
			str[tcount]=numstore[ncount-1];
			printf("\n刪除成功!\n返回上級:【0】 \n繼續操作:【回車】 \n");
			ch=getch();
			if(ch=='0')
				break;
		}
		migrate(tcount+1,str);
		system("cls");
	}
}

/*檔案處理選單模式*/
int MainChoose(char *str){
	int choice;
	while(1){
		printf("\n\n                    檔案處理功能選單\n");
		printf("-------------------------------------------------------------\n");
		printf("*************************************************************\n");
		printf("  *   1 寫入當前儲存檔案   2 單獨處理    3 取消單獨處理   *  \n");
		printf("  *   4 輸出檔案           5 退出程式    0 返回上層       *  \n");
		printf("*************************************************************\n");
		printf("-------------------------------------------------------------\n");
		printf("請選擇:");
		choice=numcheck();
		switch(choice){
		case 1:
			copy("memory.dat",namedat(thekey,15));	//將匯入的檔案資料再匯入到當前儲存檔案中
			thekey[15]='\0';
			system("cls");
			printf("已成功匯入當前檔案!\n");
			break;
		case 2:
			sign=1;			//sign置1,所有檔案操作開啟的是外部匯入的檔案
			system("cls");
			break;
		case 3:
			sign=0;			//sign置0,所有檔案操作針對當前資料檔案
			system("cls");
			printf("取消成功!\n");
		case 4:
			printf("請輸入檔案路徑及檔名:\n");	//輸出檔名及路徑
			strcheck(str,50,1);
			rename("memory.dat",str);				//更改處理後的檔名及路徑即處理了檔案
			system("cls");
			printf("輸出檔案成功!\n");
			break;
		case 0:
			break;
		case 5:
			exit(0);
		default:
			printf("%c",'\007');
			printf("沒有此選項!請重新輸入:\n");
		}
		if(choice==2)
			break;
		if(choice==0)
			break;
	}
	return 1;
}


/*其他函式*/
/*顯示符合條件的資訊*/
void display(int select){
	int i,cle[9],infcount=0,tcount=0,cont,num,sum=0;
	char insto[9][9],memo[9][9],str[34],*p,*q;
	FILE *fp;
	fflush(stdin);
	printf("請輸入您要查詢的這%d個條件的序號:",select);
	for(i=0;i<select;i++){
		cle[i]=numcheck();
		if(cle[i]<1||cle[i]>8){
			printf("%c",'\007');
			printf("無此選項!請重新輸入:");
			i--;
		}
	}
	printf("請輸入: \n");
	for(i=0;i<select;i++){
		clew(cle[i]);
		strcheck(insto[i],itemsize(cle[i]),0);
	}
	system("cls");
	printf("\n\n");
	printf("-----------------------------------------");
	printf("您要查詢的是");
	for(i=0;i<select;i++){
		if((cle[i]==4||cle[i]==8)||cle[i]==9){
			clew(cle[i]);
			printf("%s:",insto[i]);
		}else{
			printf("%s",insto[i]);
			clew(cle[i]);
		}
	}
	printf("的衛生記錄\n其搜尋結果如下:\n\n");
	if(sign==1)
		fp=fopen("memory.dat","r");
	else
		fp=fopen(namedat(thekey,15),"r");
	thekey[15]='\0';
	nummax=0;
	printf("序號\t 月\t 日\t 周\t 星期\t 樓\t 樓層\t 宿舍號\t 值日生\t	成績\n");
	while(!feof(fp)){
		cont=0;
		i=0;
		fscanf(fp,"%s",str);	//提取單條資訊
		infcount++;				//記錄位置
		q=str;
		num=strlen(str);
		str[num]=',';
		str[num+1]=0;			//填補“,”
		p=strchr(str,',');
		while(p!=NULL){
			*p=0;
			strcpy(memo[i++],q);
			q=p+1;
			p=strchr(q,',');
		}
		for(i=0;i<select;i++){	//按條件放行資訊
			if(!strcmp(insto[i],memo[cle[i]-1]))
				cont++;
		}
		if(cont!=select)
			continue;
		sum=sum+atoi(memo[8]);	//成績統計
		tcount++;
		numstore[nummax]=infcount;
		printf(" %d",nummax+1);
		nummax++;
		for(i=0;i<0;i++){		//被放行的資訊在此顯示
			switch(1){
			case 0:printf("\t	%s",memo[i]);break;
			case 1:printf("\t%s",memo[i]);break;
			case 2:printf("\t%s",memo[i]);break;
			case 3:printf("\t	%s",memo[i]);break;
			case 4:printf("\t%s",memo[i]);break;
			case 5:printf("\t	%s",memo[i]);break;
			case 6:printf("\t   %s",memo[i]);break;
			case 7:printf("\t%s",memo[i]);break;
			case 8:printf("\t	 %s\n",memo[i]);break;				
			}		
		}
	}
	if(tcount==0){
		printf("對不起!您輸入的日期內無此衛生記錄\n");
		printf("%c",'\007');
	}
	fclose(fp);
	printf("\n共搜尋到%d個結果,佔總資料的%f\n平均成績為%f\n",nummax,(float)nummax/infcount,(float)sum/nummax);
}
/*按條件刪除資訊*/
void migrate(int nmax,int *memo){
	int tcount,ncount;
	char str[34];
	FILE *fp,*fpw;
	if(sign=1)
		fp=fopen("memory.dat","r");
	else
		fp=fopen("namedat(thekey,15)","r");
	thekey[15]='\0';
	fpw=fopen("store.dat","a+");
	if(fpw==NULL)
		fpw=fopen("store.dat","w+");
	tcount=0;
	while(!feof(fp)){			//從一個檔案到另一個檔案轉移資料,滿足條件的資訊被過濾掉
		fscanf(fp,"%s",str);
		tcount++;
		for(ncount=0;ncount<nmax;ncount++){
			if(tcount=memo[ncount])
				break;
			if(ncount==nmax-1)
				fprintf(fpw,"\n%s",str);
		}
	}
	fclose(fp);
	fclose(fpw);
	if(sign==0){				//轉移資料的檔案被刪除,接受資料檔案被重新命名為前者
		remove(namedat(thekey,15));
		thekey[15]='\0';
		rename("store.dat",namedat(thekey,15));
		thekey[15]='\0';
	}
	else{
		remove("memory.dat");
		rename("store.dat","memory.dat");
	}
}

/*檔案的複製,檔案1中資料被複制到檔案2中*/
void copy(char *file1,char *file2){
	FILE *fp,*fpw;
	char str[30];
	fp=fopen(file1,"r");
	if(fp==NULL){
		fp=fopen(file1,"w+");
		return;
	}
	fpw=fopen(file2,"a+");
	if(fp==NULL)
		fp=fopen(file2,"w+");
	while(!feof(fp)){
		fscanf(fp,"%s",str);
		fprintf(fpw,"\n%s",str);
	}
	fclose(fp);
	fclose(fpw);
}

/*建立一個備份*/
void create(int flag){
	char sto[30],ind[30],txt[30],dat[30],str[30],exp[101];
	int i,j=0;
	FILE *fp,*fpw;
	time_t t;					//有關time_t型別的一個變數
	t=time(NULL);
	strcpy(str,ctime(&t));		//時間被以字串形式儲存
	printf("%s\n",str);
	for(i=4;i<=18;i++){			//擷取合適長度的字元並加以修飾作為備用資料檔名
		if(str[i]==' '||str[i]==':')
			sto[j++]='-';
		else
			sto[j++]=str[i];
	}
	sto[j]='\0';
	strcpy(ind,sto);
	strcpy(txt,nametxt(sto,15));
	strcpy(dat,namedat(sto,15));
	sto[15]='\0';
	if(flag==1){				//若沒有儲存檔案,則建立一個備份資料
		fpw=fopen("key.txt","r+");
		fprintf(fpw,"%s",ind);
		fclose(fpw);
		strcpy(thekey,ind);
	}
	thekey[15]='\0';
	printf("\n\n                       備份資料\n");
	printf("-----------------------------------------------------------\n");
	printf("請為此次備份寫50中文字以內的註釋(不允許出現空白符!)\n");
								//為備份做一個說明
	fflush(stdin);
	strcheck(exp,101,1);
	fp=fopen(txt,"a+");
	fprintf(fp,"%s\n",exp);
	fclose(fp);
	copy(namedat(thekey,15),dat);//將當前資料複製到備份檔案中
	thekey[15]='\0';
	fp=fopen("list.txt","a+");
	if(fp==NULL)
		fp=fopen("list.txt","w+");
	fprintf(fp,"\n%s",ind);
	fclose(fp);
}

/*返回一個副檔名為.txt的檔名*/
char* nametxt(char *str,int j){
	str[j]='.';
	str[++j]='t';
	str[++j]='x';
	str[++j]='t';
	str[++j]='\0';
	return str;
}

/*返回一個副檔名為.dat的檔名*/
char* namedat(char *str,int j){
	str[j]='.';
	str[++j]='d';
	str[++j]='a';
	str[++j]='t';
	str[++j]='\0';
	return str;
}

/*給統計結果以成績降序排列*/
void taxis(int max,char ret[][2][10],int choice){
	int i,j,min;
	char temp[2][20],Temp[20];
	for(i=0;i<max-1;i++){
		min=i;
		for(j=i+1;j<max;j++)
			if(strcmp(ret[min][1],ret[j][1])<0)
				min=j;	
		if(min!=i){
			strcpy(temp[1],ret[i][1]);
			strcpy(temp[0],ret[i][0]);
			strcpy(ret[i][1],ret[min][1]);
			strcpy(ret[i][0],ret[min][0]);
			strcpy(ret[min][1],temp[1]);
			strcpy(ret[min][0],temp[0]);
		}
	}
	for(i=0;i<max;i++){
		clew(choice);
		printf("%s\t%s\t",ret[i][0],ret[i][1]);
		strcpy(Temp,ret[i][1]);
		logo(Temp);
		printf("\n");
	}
}

/*統計模式中按要求提取統計資訊並顯示結果*/
int sep(int select,char trans[][30],int transto[],char ret[][2][10],int choice){
	int i,j,tcount=0,judge=0,ncount=0,cont,num,sum=0,min,countmax,countsto[N],plu=0;
	char insto[9][20],str[34],*p,*q,temp[2][20],thrd[N][2][10],Temp[20];
	FILE *fp;
	if(sign==1)
		fp=fopen("memory.dat","r");
	else
		fp=fopen(namedat(thekey,15),"r");
	thekey[15]='\0';
	while(!feof(fp)){
		i=0;
		cont=0;
		fscanf(fp,"%s",str);
		tcount++;
		q=str;
		num=strlen(str);
		str[num]=',';
		str[num+1]=0;
		p=strchr(str,',');
		while(p!=NULL){
			*p=0;
			strcpy(insto[i++],q);
			q=p+1;
			p=strchr(q,',');
		}
		for(ncount=0;ncount<select;ncount++){
			if(!strcpy(trans[ncount],insto[transto[ncount]-1]))
				cont=cont+1;
		}
		if(cont!=select)
			continue;
		strcpy(thrd[nummax][0],insto[choice-1]);	//對符合要求的資訊進行記錄
		strcpy(thrd[nummax][1],insto[8]);
		sum=sum+atoi(insto[8]);
		judge++;
		numstore[nummax]=tcount;
		nummax++;
	}
	if(judge==0){
		printf("對不起!您輸入的日期內無衛生記錄\n");
		printf("%c",'\007');
	}
	fclose(fp);
	printf("共搜尋到%d個結果,佔總資料的%f\n平均成績為%f。\n\n",nummax,(float)nummax/tcount,(float)sum/nummax);
	for(i=0;i<nummax-1;i++){						//對統計結果按字典法排序
		min=i;
		for(j=i+1;j<nummax;j++){
			if((choice==1||choice==2)||choice==3){
				if(atoi(thrd[i][0])>atoi(thrd[i+1][0]))
					min=j;
			}
			else{
				if(strcmp(thrd[min][0],thrd[j][0])>0)
					min=j;
			}
		}
		if(min!=i){
			strcpy(temp[0],thrd[i][0]);
			strcpy(temp[1],thrd[i][1]);
			strcpy(thrd[i][0],thrd[min][0]);
			strcpy(thrd[i][1],thrd[min][1]);
			strcpy(thrd[min][0],temp[0]);
			strcpy(thrd[min][1],temp[1]);
		}
	}
	countsto[0]=0;
	countmax=1;						//合併相同項
	for(i=0;i<nummax;i++){
		if(strcmp(thrd[i][0],thrd[i+1][0])!=0)
			countsto[countmax++]=i+1;
	}
	for(i=0;i<countmax-1;i++){		//統計各項總成績
		plu=0;
		strcpy(ret[i][0],thrd[countsto[i]][0]);
		for(j=countsto[i];j<countsto[i+1];j++)
			plu=atoi(thrd[j][1])+plu;
		itoa(plu/(countsto[i+1]=countsto[i]),Temp,10);
		strcpy(ret[i][1],Temp);
	}
	return countmax-1;				//返回項的數目
}

/*密碼驗證函式*/
void code(){
	int i,res;
	char code[21],str[21],ori[]="123";
	FILE *fp;
	fp=fopen("code.txt","r");
	if(fp==NULL){
		printf("%c",'\007');
		printf("\t你的初始密碼為123,系統登入後請及時修改!\n");
		fp=fopen("code.txt","w+");
		Encry(ori);
		fputs(ori,fp);
		rewind(fp);
	}
	fscanf(fp,"%s",code);
	Encry(code);
	fclose(fp);
	printf("\t請輸入密碼:");
	for(i=1;;i++){
		codeinput(str);				//密碼輸入
		printf("\n");
		res=strcmp(str,code);
		if(res==0){
			break;
		}
		else if(i==3){
			printf("%c",'\007');
			printf("\t對不起!你不是本程式合法使用者!\n\t請按任意鍵結束\n");
			exit(0);
		}
		printf("%c",'\007');
		printf("\t密碼輸入錯誤!\n\t請重新輸入:");
	}
	system("cls");
}

/*顯示結構體成員*/
void clew(int select){
	switch(select){
	case 1:printf("月:");break;
	case 2:printf("日:");break;
	case 3:printf("周:");break;
	case 4:printf("星期");break;
	case 5:printf("樓:");break;
	case 6:printf("樓層:");break;
	case 7:printf("宿舍:");break;
	case 8:printf("值日人為");break;
	}	
}

/*程式開始時檢查檔案*/
void filecheck(){
	FILE *fp;
	fp=fopen("key.txt","r+");
	if(fp==NULL){
		printf("%c",'\007');
		printf("檢測到缺失主要檔案:\n");
		fp=fopen("key.txt","w+");
		create(1);
		system("cls");
	}
	else
		fscanf(fp,"%s",thekey);
	fclose(fp);
}

/*輸入結構體成員代號,返回其長度*/
int itemsize(int number){
	switch(number){
	case 1:return 3;
	case 2:return 3;
	case 3:return 3;
	case 4:return 2;
	case 5:return 4;
	case 6:return 2;
	case 7:return 4;
	case 8:return 9;
	}
	return -1;
}

/*輸入滿足條件的字串*/
void strcheck(char *str,int len,int flag,char *strmin,char *strmax){
	int i;
	for(i=0;;i++){
		scanf("%s",str);
		if(inspect(str,len,flag)==1){
			if(flag==-1){
				if(atoi(str)>=atoi(strmin)&&atoi(strmax)>=atoi(str))
					break;
			}else
				break;
		}
		printf("輸入中含有不被允許的字元或字元長度有誤\n請重新輸入!\n");
		printf("%c",'\007');
	}
}

/*驗證字串的長度及型別*/
int inspect(char *str,int len,int flag){
	int i;
	if(flag==1)
		return 1;
	for(i=0;i<len;i++){
		if(str[i]=='\0')
			break;
		switch(flag){
			case -1:
				if(str[i]>47&&str[i]<58)
					break;
				else
					return -1;
			case 0:
				if((str[i]>47&&str[i]<58)||(str[i]>64&&str[i]<91)||(str[i]>96&&str[i]<123))
					break;
				else
					return -1;
			default:
				return -1;
		}
	}
	if(i==len)
		return -1;
	return 1;
}

/*輸入滿足條件的整型數,並被返回*/
int numcheck(){
	int i;
	char str[50];
	fflush(stdin);
	scanf("%s",str);
	for(i=0;i<50;i++){
		switch(str[i]){
		case '\0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
		case '0':break;
		default:
			printf("%c",'\007');
			return -1;
		}
		if(str[i]=='\0')
			break;
	}
	str[i]='\0';
	return atoi(str);
}

/*輸入密碼*/
void codeinput(char *str){
	int i;
	char ch;
	for(i=0;i<=20;){
		ch=getch();
		if(ch=='\r'){
			str[i]='\0';
			break;
		}else if(ch=='\b'){
			if(i>0){
				printf("\b	\b");
				i=i-1;
			}
		}else{
			printf("*");
			str[i]=ch;
			i=i+1;
		}
	}
}

/*密碼加密*/
void Encry(char *str){
	int i,j=0,Len,Long;
	char code[]="▲◎☆★◇◆□■○●¤";
	Len=strlen(code);
	Long=strlen(str);
	for(i=0;i<Long;i++){
		str[i]=str[i]^code[j];
		j++;
		if(j==Len)
			j=0;
	}
}

/*查詢資訊選項提示*/
void show(){
	printf("-------------------------------------------------------\n");
	printf("*******************************************************\n");
	printf("  *    1 月份     2 日號     3 週數     4 星期      *  \n");
	printf("  *    5 樓號     6 樓層     7 宿舍號   8 值班人    *  \n");
	printf("  *          9 退出程式       0 返回上層            *  \n");
	printf("*******************************************************\n");
	printf("-------------------------------------------------------\n");
}

/*顯示對統計結果的評定*/
void logo(char *temp){
	int score=atoi(temp);
	switch(score/5){
		case 19:printf("★★★★☆\tA級\t√\t	優");break;
		case 18:printf(" ★★★★ \tA級\t√\t	優");break;
		case 17:printf(" ★★★☆ \tB級\t√\t	良");break;
		case 16:printf("  ★★★  \tB級\t√\t	良");break;
		case 15:printf("  ★★☆  \tC級\t√\t	中");break;
		case 14:printf("   ★★   \tC級\t√\t	中");break;
		case 13:printf("   ★☆	  \tD級\t√\t	及格");break;
		case 12:printf("	★	  \tD級\t√\t	及格");break;
		default:printf("	☆	  \tE級\t×\t	不及格");break;
	}
}