应用--学生宿舍卫生管理系统

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值