#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;
}
}