應用--學生宿舍衛生管理系統
阿新 • • 發佈:2018-12-14
#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; } }