#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);elsesystem("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;elseprintf("输入有误!无此选项!");}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]);elseprintf("%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;}elseprintf("%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+");elsefp=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");elsefp=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");elsefp=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++]='-';elsesto[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");elsefp=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");}elsefscanf(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;}elsebreak;}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;elsereturn -1;case 0:if((str[i]>47&&str[i]<58)||(str[i]>64&&str[i]<91)||(str[i]>96&&str[i]<123))break;elsereturn -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;}
}

转载于:https://my.oschina.net/u/3761238/blog/2243338

应用--学生宿舍卫生管理系统相关推荐

  1. jsp学生宿舍人员管理系统

    本系统采用了Browser/Server体系结构,JSP(Java Server Page)作为前台开发工具,MySQL作为后台数据库进行开发.最终系统实现的系统将分为超级管理员.宿舍楼管理员和学生三 ...

  2. 数据库课程设计——学生宿舍信息管理系统

    数据库课程设计--学生宿舍信息管理系统 目录 1.设计目的... 2 2.任务与要求... 2 3.学生宿舍管理系统课程设计... 2 3.1 引言... 2 3.2需求分析... 2 3.2.1. ...

  3. 基于java的学生宿舍公寓管理系统

    学生宿舍公寓管理系统的功能,使学生的生活信息和学习信息充分结合在一起,为宿舍管理员.年级辅导员提供全方位的学生在校信息,以及时跟进学生学习状况,达到人性化.全方位.高效率的管理. 系统采用jsp语言开 ...

  4. 任务6 学生宿舍信息管理系统

    系列文章 任务6 学生宿舍信息管理系统 已知宿舍的信息包括:宿舍楼号,宿舍号,床位号,对应床位号的学生学号,楼长姓名等.设计程序能实现以下功能: (1)宿舍信息录入:可随时增加宿舍信息到数据文件中 ( ...

  5. java-php-python-ssm学生宿舍信息管理系统计算机毕业设计

    java-php-python-ssm学生宿舍信息管理系统计算机毕业设计 java-php-python-ssm学生宿舍信息管理系统计算机毕业设计 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  6. 基于java的学生宿舍公寓管理系统-计算机毕业设计

    项目介绍 学生宿舍公寓管理系统的功能,使学生的生活信息和学习信息充分结合在一起,为宿舍管理员.年级辅导员提供全方位的学生在校信息,以及时跟进学生学习状况,达到人性化.全方位.高效率的管理. 系统采用j ...

  7. JavaWeb数据库学生宿舍图书管理系统+地图

    原文链接:JavaWeb数据库学生宿舍图书管理系统+地图 登陆之后现实主页面,账号密码储存在数据库中. 实现对数据库的增删改查 java 9.0.4 + mysql 8.0.19 + Navicat ...

  8. Java高校学生宿舍信息管理系统

    技术:Java.JSP等 摘要:随着信息化技术的高速发展,每个高校都在利用信息技术来增强学校的管理水平.数字化校园建设就是能高度体现学校信息化管理水平的一个重要依据.学生宿舍管理的信息化建设是学校构建 ...

  9. 基于JAVA+Servlet+JSP+MYSQL的学生宿舍卫生评分系统

    项目功能: 登录模块 宿舍管理 宿舍评分 学生查询 个人信息 学生管理 退出系统 页面效果:

  10. php计算机毕业设计基于thinkph框架的学生宿舍公寓管理系统

    本学生公寓管理系统是针对目前学生公寓管理的实际需求,从实际工作出发,对过去的学生公寓管理系统存在的问题进行分析,完善学生的使用体会.采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高, ...

最新文章

  1. 奇葩错误:不同变量名称相同
  2. 【MATLAB】符号数学计算(五):符号函数的替换
  3. java在何时获得对象的确切类型_JAVA面试题(1)
  4. python设计及论文-python能否实现学术论文文本分析的功能?
  5. boost::all_clustering_coefficients用法的测试程序
  6. Oracle 数据库创建表空间、创建用户指定表空间
  7. MySQL高级 - 案例 - 系统性能优化 - 索引优化
  8. Effective Java~46. 优先选择Stream 中无副作用的函数
  9. MPEG-4 压缩编码标准
  10. 迅雷java_Java实现迅雷地址转成普通地址
  11. 机器视觉检测:电阻电容的二次筛选提高效率及达成环保目的
  12. 常见线缆接口类型总结
  13. 加密公司如何获得硅谷传奇风投a16z的青睐
  14. SpringBoot 如何执行定时任务
  15. post 防篡改_表单提交数据防篡改
  16. Allegro基本规则设置指导书之Electrical Total Etch Length
  17. 董卫凤:不服输是成功最好的催化剂
  18. AI对项目管理的影响
  19. 板端电源硬件调试BUG
  20. Android 打包apk出错问题

热门文章

  1. matlab 冒泡排序函数,Matlab排序算法-遍历排序、冒泡排序
  2. C#试玩程序设计试题——定向越野(迷宫)
  3. HashMap hash冲突解决方法
  4. catia怎么添加毛坯_CATIA教程
  5. Android Studio 的蓝牙串口通信(附Demo源码下载)
  6. 升级JUnit5及其特性介绍
  7. 暴雪总裁总结游戏十条经验
  8. srt,ass,ssa三种字幕的区别
  9. SQL语句多表连接查询语法
  10. python风格迁移_Python简单实现图像风格迁移