1 #include<stdio.h>
2 #include<conio.h>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<time.h>
6
7 #define N 400 //最大显示信息条数上限
8 int nummax=0; //全局数组有效的最大长度
9 int numstore[N]; //存储信息位置
10 int sign=0; //判别是否处理外部导入的数据文件
11 char thekey[15]; //存储当前文件处理需打开的文件名
12
13 struct dormitory{
14 char month[3]; //月份
15 char day[3]; //日
16 char weeks[3]; //周数
17 char week[2]; //星期
18 char floor[4]; //宿舍楼号
19 char floors[2]; //楼层
20 char roomnum[4]; //宿舍号
21 char name[9]; //值班人姓名
22 char score[3]; //卫生成绩
23 }dorm;//
24 //子函数部分
25 //主功能菜单函数部分
26 void MainInterface(); //开始界面
27 void RepCryp(); //密码修改与管理员模式
28 void MainMenu(); //主功能菜单
29 void InfEdit(); //编辑信息
30 void InfSearch(); //查询信息
31 void InfStat(); //统计信息
32 void FileMani(); //外部数据文件导入处理
33 void InfClear(); //初始化信息即大量同类型信息的删除
34 void InfBackup(); //备份数据
35 //子菜单函数部分
36 void InfIn(); //添加信息
37 void InfAmend(); //修改信息
38 void InfDelete(); //删除信息
39 int ManiChoose(char *str); //数据操作选择
40 //其他函数
41 void code(); //管理员密码验证
42 void codeinput(char *str); //密码输入
43 void Encry(char *str); //密码加密
44 int itemsize(int number); //检测结构体成员长度
45 int inspect(char *str,int len,int flag); //检测字符串长度及类型
46 int numcheck(); //输入与检测整型数
47 void strcheck(char *str,int len,int flag,char *strmin,char *strmax); //输入与检测字符串
48 void show(); //查询界面提示
49 void clew(int select); //结构体成员提示
50 void logo(char *temp); //统计结果显示
51 void migrate(int nmax,int *memo); //删除文件中符合条件的信息
52 void copy(char *file1,char *file2); //文件复制
53 void create(int flag); //创建备份数据
54 char *namedat(char *str,int j); //返回扩展名为.dat的文件名
55 char *nametxt(char *str,int j); //返回扩展名为.txt的文件名
56 int sep(int select,char trans[][30],int transto[],char ret[][2][10],int choice); //数据统计中提取与统计信息并显示
57 void display(int select); //查询信息国提取与分离信息并显示
58 void taxis(int max,char ret[][2][10],int choice); //结构体成员的排序
59 void filecheck(); //文件检测函数
60
61 /*主函数*/
62 void main(){
63 MainInterface();
64 }
65 //进入选择界面
66 void MainInterface(){
67 int select;
68 char ch;
69 filecheck();
70 while(1){
71 fflush(stdin);
72 printf("\n\n\t 学生宿舍卫生管理系统");
73 printf("\t----------------------------------------------------------------------");
74 printf("\n\t***************************&&&&&&********************************\n");
75 printf("\t* 欢迎使用学生宿舍卫生管理软件 *\n");
76 printf("\t* 本软件用于对宿舍卫生情况进行统计整理并对其进行评比 *\n");
77 printf("\t* 您也可以对宿舍卫生成绩进行查询和修改 *\n");
78 printf("\t***************************&&&&&&**********************************\n");
79 printf("\t *—————————————————————————*");
80 printf("\t * 1 管理员 2 普通用户 0 退出 *");
81 printf("\t *—————————————————————————*");
82 printf("\n\t 请选择登录方式:");
83 select=numcheck(); //输入与检测整型数
84 switch(select){
85 case 1:
86 code(); //密码验证
87 RepCryp(); //密码验证后进入RepCryp函数
88 break;
89 case 2:
90 system("cls");
91 InfSearch(); //普通用户信息查询
92 system("cls");
93 break;
94 case 0:
95 printf("请按任意键退出\n");
96 exit(0);
97 default:
98 printf("\t对不起!没有你要的选项!\n\t退出程序【Esc】 \n\t 取消退出:任意键\n");
99 printf("%c",'\007');
100 ch=getch();
101 if(ch==2)
102 exit(0);
103 else
104 system("cls");
105 }
106 }
107 }
108
109 /*进入管理员与密码修改模式*/
110 void RepCryp(){
111 int res,count1,select;
112 char ch,code1[21],code2[21],ori[]="123";
113 FILE *fp;
114 while(1){
115 fflush(stdin);
116 printf("\n\n 欢迎登陆本系统!\n");
117 printf("--------------------------------------------------\n");
118 printf("**************************************************\n");
119 printf(" * 1. 使用系统功能 2. 修改密码 * \n");
120 printf(" * 3. 退出 4. 返回上层 * \n");
121 printf("**************************************************\n");
122 printf("\n请选择您的操作:");
123 select=numcheck();
124 switch(select){
125 case 1:
126 MainMenu(); //进入主功能菜单
127 break;
128 case 2:
129 system("cls");
130 printf("\n\n 密码修改功能\n");
131 printf("\n**********************\n\n请输入您的新密码:");
132 for(count1=1;;count1++){
133 codeinput(code1); //密码输入
134 printf("\n");
135 printf("\n请再次输入您的新密码:");
136 codeinput(code2);
137 printf("\n");
138 res=strcmp(code1,code2);
139 if(res==0){
140 fp=fopen("code.txt","w+");
141 Encry(code1);
142 fputs(code1,fp);
143 fclose(fp);
144 printf("修改密码成功!\n返回上级:任意键\n退出程序:【Esc】 \n");
145 ch=getch();
146 printf("\n");
147 if(ch==27)
148 exit(0);
149 system("cls");
150 break;
151 }else{
152 if(count1>=3){
153 printf("%c",'\007');
154 printf("对不起!您现在不能修改密码!\n退出程序:【Esc】 \n返回上级:任意键\n");
155 ch=getch();
156 printf("\n");
157 if(ch==27)
158 exit(0);
159 system("cls");
160 break;
161 }else{
162 printf("对不起!两次输入的密码不一致\n\n请重新输入:\n");
163 printf("%c",'\007');
164 }
165 }
166 }
167 break;
168 case 3:
169 printf("请按任意键退出\n");
170 exit(0);
171 case 0:
172 system("cls");break;
173 default:
174 system("cls");
175 printf("%c",'\007');
176 printf("对不起!没有您要的选项!\n请重新选择!\n");
177 }
178 if(select==0)
179 break;
180 }
181 }
182
183 /*主功能菜单*/
184 void MainMenu(){
185 int select;
186 system("cls");
187 while(1){
188 fflush(stdin);
189 printf("\n\n 主系统功能菜单\n");
190 printf("-----------------------------------------------------------------\n");
191 printf("******************************************************************\n");
192 printf(" * 1 编辑信息 2 查询信息 3 统计信息 4 文件处理 * \n");
193 printf(" * 5 初始化信息 6 备份管理 7 退出程序 0 返回上层 * \n");
194 printf("******************************************************************\n");
195 printf("-----------------------------------------------------------------\n");
196 printf("\n请选择功能:");
197 select=numcheck();
198 system("cls");
199 switch(select){
200 case 1:InfEdit();break; //编辑信息
201 case 2:InfSearch();break; //查询信息
202 case 3:InfStat();break; //统计信息
203 case 4:FileMani();break; //文件处理
204 case 5:InfClear();break; //初始化信息
205 case 6:;InfBackup();break; //备份管理
206 case 0:break;
207 case 7:printf("按其他任意键,结束程序\n");exit(0);
208 default:
209 printf("没有您要的选项,请重新选择!\n");
210 printf("%c",'\007');
211 }
212 if(select==0)
213 break;
214 system("cls");
215 }
216 }
217
218 /*编辑信息模式*/
219 void InfEdit(){
220 int select;
221 system("cls");
222 while(1){
223 fflush(stdin);
224 printf("\n\n\t 编辑信息功能菜单\n");
225 printf("--------------------------------------------------\n");
226 printf("**************************************************\n");
227 printf(" * 1 添加信息 2 修改信息 * \n");
228 printf(" * 3 删除信息 4 退出程序 * \n");
229 printf(" * 0 返回上层 * \n");
230 printf("**************************************************\n");
231 printf("--------------------------------------------------\n");
232 printf("\n请选择功能:");
233 select=numcheck();
234 system("cls");
235 switch(select){
236 case 1:InfIn();break; //添加信息
237 case 2:InfAmend();break; //修改信息
238 case 3:InfDelete();break; //删除信息
239 case 0:break;
240 case 4:printf("按其他任意键,结束程序\n");exit(0);
241 default:
242 printf("没有您要的选项,请重新选择!\n");
243 printf("%c",'\007');
244 }
245 if(select==0)
246 break;
247 system("cls");
248 }
249 }
250
251 /*查询信息模式*/
252 void InfSearch(){
253 int select;
254 char ch;
255 while(1){
256 fflush(stdin);
257 printf("\n\n 查询信息功能菜单");
258 show();
259 printf("请先输入您要查询用到的条件个数:");
260 select=numcheck();
261 if(select>9||select<0){
262 printf("%c",'\007');
263 system("cls");
264 continue;
265 }
266 if(select==0)
267 break;
268 if(select==9)
269 exit(0);
270 nummax=0;display(select); //提取信息并按条件显示
271 printf("\n返回上级:任意键\n退出程序:【Esc】 \n");
272 ch=getch();
273 if(ch==27)
274 exit(0);
275 system("cls");
276 }
277 }
278
279 /*统计信息模式*/
280 void InfStat(){
281 int select,i,sto[9],choice,max,choose;
282 char ch,str[9][30],ret[N][2][10],temp[20];
283 while(1){
284 printf("\n\n 统计信息功能菜单");
285 show();
286 printf("请输入您要统计用到的限制条件个数:");
287 select=numcheck();
288 if(select>9||select<0){
289 printf("%c",'\007');
290 system("cls");
291 continue;
292 }
293 if(select==0)
294 break;
295 if(select==9){
296 printf("按任意键退出本程序\n");
297 exit(0);
298 }
299 nummax=0;
300 printf("请输入您要查询的这%d个条件的序号:",select);
301 for(i=0;i<select;i++){
302 sto[i]=numcheck();
303 if(sto[i]<1||sto[i]>8){
304 printf("%c",'\007');
305 printf("无此选项!请重新输入:");
306 i--;
307 }
308 }
309 printf("请输入统计条件:\n");
310 for(i=0;i<select;i++){
311 clew(sto[i]); //提示要输入哪一个结构体成员
312 strcheck(str[i],itemsize(sto[i]),0);
313 //strcheck用于按参数要求输入字符串,itemsize用于检查结构体成员长度
314 }
315 printf("请输入统计条件:");
316 for(i=0;;i++){
317 choice=numcheck();
318 if(choice>0&&choice<9)
319 break;
320 else
321 printf("输入有误!无此选项!");
322 }
323 system("cls");
324 printf("这是");
325 for(i=0;i<select;i++){
326 if((sto[i]==4||sto[i]==8)||sto[i]==9){
327 clew(sto[i]);
328 printf("%s:",str[i]);
329 }else{
330 printf("%s",str[i]);
331 clew(sto[i]);
332 }
333 }
334 printf("按");
335 clew(choice);
336 printf("统计排列的结果,如下:\n\n");
337 max=sep(select,str,sto,ret,choice);
338 //提取信息并按要求统计,然后返回一个整型数
339 printf(" ");
340 clew(choice);
341 printf("\t成绩:\t 星级: 等级:是否及格: 评价:\n");
342 for(i=0;i<max;i++){
343 printf(" %s\t %s\t",ret[i][0],ret[i][1]);
344 strcpy(temp,ret[i][1]);
345 logo(temp); //显示统计结果
346 printf("\n");
347 }
348 printf("1.按成绩排序\t2.返回 \t0.退出\n");
349 choose=numcheck();
350 switch(choose){
351 case 1:
352 system("cls");
353 printf("这是");
354 for(i=0;i<select;i++){
355 if((sto[i]==4||sto[i]==8)||sto[i]==9){
356 clew(sto[i]);
357 printf("%s:",str[i]);
358 }else{
359 printf("%s",str[i]);
360 clew(sto[i]);
361 }
362 }
363 printf("按");
364 clew(choice);
365 printf("统计并以成绩降序排序的结果,如下:\n");
366 taxis(max,ret,choice); //统计结果按成绩降序排列
367 printf("继续请按任意键");
368 ch=getch();
369 break;
370 case 2:break;
371 case 0:exit(0);
372 default:printf("%c",'\007');
373 }
374 system("cls");
375 }
376 }
377
378 /*文件处理模式*/
379 void FileMani(){
380 char ch;
381 char str[50];
382 FILE *fp;
383 while(1){
384 printf("\n\n\t 文件处理功能菜单\n");
385 printf("--------------------------------------------------\n");
386 while(1){
387 if(sign==1)
388 break;
389 printf("继续操作:任意键\n返回上级:【Esc】 \n");
390 ch=getch();
391 if(ch==27)
392 break;
393 printf("请输入文件路径及文件名:(注意导入文件扩展名为:CSV)\n");
394 strcheck(str,50,1); //检查文件名
395 fp=fopen(str,"r");
396 if(fp==NULL){
397 printf("%c",'\007');
398 system("cls");
399 printf("文件打开失败!\n请重新确定文件位置!\n");
400 continue;
401 }
402 fclose(fp);
403 break;
404 }
405 if(ch==27)
406 break;
407 if(sign==0){
408 remove("memory.dat"); //移除已存在的memory文件
409 copy(str,"memory.dat"); //重新将外部文件中数据写入新创建的memory文件
410 }
411 system("cls");
412 if(ManiChoose(str)) //进入文件处理菜单模式
413 break;
414 }
415 }
416 /*初始化信息模式*/
417 void InfClear(){
418 int select,temp[1];
419 char ch;
420 while(1){
421 printf("\n\n 初始化信息功能菜单");
422 show();
423 printf("请输入要初始化信息所用到的条件个数:");
424 select=numcheck();
425 if(select>9||select<0){
426 printf("%c",'\007');
427 system("cls");
428 continue;
429 }
430 if(select==0)
431 break;
432 if(select==9){
433 printf("按任意键退出本程序");
434 exit(0);
435 }
436 nummax=0;display(select); //显示要删除的信息
437 if(nummax==0){
438 printf("\n返回上级:任意键\n退出程序:【Esc】 \n");
439 ch=getch();
440 if(ch==27)
441 exit(0);
442 system("cls");
443 continue;
444 }
445 fflush(stdin);
446 printf("确认删除:【回车】 ,返回查询:【Esc】 \n");
447 scanf("%c",&ch);
448 if(ch==27)
449 continue;
450 temp[0]=numstore[0];
451 migrate(nummax+1,numstore); //过滤删除了文件中符合条件的信息
452 fflush(stdin);
453 migrate(1,temp);
454 system("cls");
455 printf("初始化信息成功!\n");
456 }
457 }
458
459 /*备份管理模式*/
460 void InfBackup(){
461 FILE *fpr,*fp,*fpw,*fpu;
462 int choice,where,i=0,j,tcount,cantd;
463 char list[30][100],txt[100];
464 while(1){
465 printf("\n\n 备份管理功能菜单");
466 printf("----------------------------------------------------\n");
467 printf("\n");
468 printf(" * 1 备份数据 2 还原数据 3 删除备份数据 * \n");
469 printf(" * 4 退出程序 0 返回上层 * \n");
470 printf("\n");
471 printf("----------------------------------------------------\n");
472 printf("请选择:");
473 choice=numcheck();
474 switch(choice){
475 case 1:
476 system("cls");
477 printf("\0");
478 create(0); //创建备份数据
479 system("cls");
480 printf("备份成功!\n");
481 break;
482 case 2: //恢复备份数据
483 i=0;
484 system("cls");
485 printf("\n");
486 fp=fopen("list.txt","r+");
487 printf("\n\n 还原数据功能菜单\n");
488 printf("----------------------------------------------------\n");
489 while(!feof(fp)){
490 fscanf(fp,"%s",list[i]); //提取list文件中存在的文件名
491 if(!strcmp(thekey,list[i])) //当前存储文件的文件名与提取文件名
492 //对比,并显示为“当前数据”
493 printf("%d %s\t当前数据!\n",i+1,list[i]);
494 else
495 printf("%d %s\n",i+1,list[i]); //显示备份文件列表
496 fpw=fopen(nametxt(list[i],15),"r+");
497 rewind(fpw);
498 while(!feof(fpw)){ //显示备份数据的说明
499 fscanf(fpw,"%s",txt);
500 printf(" %s",txt);
501 }
502 printf("\n\n");
503 fclose(fpw);
504 i++;
505 }
506 fclose(fp);
507 printf("请选择需恢复点(超出范围将返回):");
508 where=numcheck();
509 system("cls");
510 if(where>i||where<=0)
511 break;
512 printf("系统需要对还原前数据做备份\n"); //恢复前对此时间点做备份
513 create(0); //创建备份数据
514 fpr=fopen("key.txt","r+");
515 list[where-1][15]='\0';
516 fprintf(fpr,"%s",list[where-1]); //提取选择文件名写入key文件
517 fclose(fpr);
518 strcpy(thekey,list[where-1]); //将当前数据文件名替换
519 system("cls");
520 printf("已恢复到还原点");
521 break;
522 case 3:
523 i=0;
524 system("cls");
525 printf("\n");
526 fp=fopen("list.txt","r+");
527 printf("\n\n 删除备份数据菜单\n");
528 printf("----------------------------------------------------\n");
529 while(!feof(fp)){
530 fscanf(fp,"%s",list[i]);
531 if(strcmp(thekey,list[i])==0){
532 printf("%d %s\t当前数据!\n",i+1,list[i]);
533 cantd=i+1;
534 }
535 else
536 printf("%d %s\n",i+1,list[i]);
537 fpw=fopen(nametxt(list[i],15),"r+");
538 rewind(fpw);
539 while(!feof(fpw)){
540 fscanf(fpw,"%s\n",txt);
541 printf(" %s",txt);
542 }
543 printf("\n\n");
544 fclose(fpw);
545 i++;
546 }
547 fclose(fp);
548 printf("输入编号范围之外的选项退出\n请输入要删除的备份选项:(当前数据不可删)\n");
549 tcount=numcheck();
550 system("cls");
551 if(tcount>i||tcount<=0)
552 break;
553 if(tcount==cantd){
554 printf("此数据不可删!\n"); //不允许删除当前文件
555 continue;
556 }
557 //以下为从list文件中删除备份文件名及删除备份文件
558 fpu=fopen("indlist.txt","w+");
559 for(j=0;j<i;j++){
560 list[j][15]='\0';
561 if(j!=tcount-1)
562 fprintf(fpu,"\n%s",list[j]);
563 }
564 fclose(fpu);
565 remove("list.txt");
566 rename("indlist.txt","list.txt");
567 remove(nametxt(list[tcount-1],15));
568 remove(namedat(list[tcount-1],15));
569 printf("成功删除!\n");
570 break;
571 case 0:break;
572 case 4:exit(0);
573 default:
574 printf("%c",'\007');
575 system("cls");
576 }
577 if(choice==0)
578 break;
579 }
580 }
581
582 /*子功能函数*/
583 //附加信息模式
584 void InfIn(){
585 int i,j;
586 char ch;
587 FILE *fp;
588 for(j=1;;j++){
589 if(sign==1) //打开存储文件写入
590 fp=fopen("memory.dat","a+");
591 else
592 fp=fopen(namedat(thekey,15),"a+");
593 thekey[15]='\0';
594 printf("\n\n 添加信息功能菜单\n");
595 printf("----------------------------------------------------\n");
596 printf("请输入此次卫生调查的时间:\n");
597 printf("请输入月份:");
598 strcheck(dorm.month,3,-1,"1","12");//此函数用于输入符合条件的字符串,下同
599 printf("请输入日号:");
600 strcheck(dorm.day,3,-1,"1","31");
601 printf("请输入周数:");
602 strcheck(dorm.weeks,3,-1,"1","53");
603 printf("请输入星期:");
604 strcheck(dorm.week,2,-1,"1","7");
605 fflush(stdin);
606 for(i=1;;i++){
607 system("cls");
608 printf("请输入2009年%s月%s日第%s周星期%s的卫生成绩:\n\n",dorm.month,dorm.day,dorm.weeks,dorm.week);
609 printf("请输入宿舍楼号:");
610 strcheck(dorm.floor,4,0);
611 printf("请输入宿舍号:");
612 strcheck(dorm.roomnum,4,-1,"101","659");
613 printf("请输入值班人姓名:");
614 strcheck(dorm.name,9,1);
615 printf("请输入成绩:");
616 strcheck(dorm.score,3,-1,"0","99");
617 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);
618 printf("\n继续输入:【回车】\n重输日期:【Esc】\n返回上级:【0】 \n");
619 ch=getch();
620 if(ch=='0')
621 break;
622 if(ch==27)
623 break;
624 }
625 fclose(fp);
626 system("cls");
627 if(ch=='0')
628 break;
629 }
630 }
631
632 /*修改信息模式*/
633 void InfAmend(){
634 int select,tcount,str[N],ncount;
635 char ch;
636 while(1){
637 FILE *fp;
638 printf("\n\n 修改信息功能菜单\n");
639 show();
640 printf("请输入您要修改用到的条件个数:");
641 select=numcheck();
642 if(select>9||select<0){
643 printf("%c",'\007');
644 system("cls");
645 continue;
646 }
647 if(select==0)
648 break;
649 if(select==9)
650 exit(0);
651 nummax=0;display(select);
652 if(nummax==0){
653 printf("\n返回上级:任意键\n退出程序:【Esc】 \n");
654 ch=getch();
655 if(ch==27)
656 exit(0);
657 system("cls");
658 continue;
659 }
660 printf("\n返回上级:【0】 \n继续操作:【回车】 \n");
661 ch=getch();
662 if(ch='0')
663 break;
664 fp=fopen("store.dat","w+");
665 for(tcount=0;tcount<nummax;tcount++){
666 printf("\n请输入对应的序号:");
667 scanf("%d",&ncount);
668 str[tcount]=numstore[ncount-1];
669 printf("请输入此次卫生调查的时间:\n");
670 printf("请输入月份:\n");
671 strcheck(dorm.month,3,-1,"1","12");
672 printf("请输入日号:");
673 strcheck(dorm.day,3,-1,"1","31");
674 printf("请输入周数:");
675 strcheck(dorm.weeks,3,-1,"1","53");
676 printf("请输入星期:");
677 strcheck(dorm.week,2,-1,"1","7");
678 fflush(stdin);
679 printf("请输入宿舍楼号:");
680 strcheck(dorm.floor,4,0);
681 printf("请输入宿舍号:");
682 strcheck(dorm.roomnum,4,-1,"101","659");
683 printf("请输入值班人姓名:");
684 strcheck(dorm.name,9,1);
685 printf("请输入成绩:");
686 strcheck(dorm.score,3,-1,"0","99");
687 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);
688 printf("\n修改成功! \n返回上级:【0】 \n继续操作:【回车】 \n");
689 ch=getch();
690 if(ch=='0')
691 break;
692 }
693 fclose(fp);
694 migrate(tcount+1,str); //过滤删除了符合条件的信息
695 system("cls");
696 }
697 }
698
699 /*删除信息模式*/
700 void InfDelete(){
701 int select,tcount,str[N],ncount;
702 char ch;
703 while(1){
704 printf("\n\n 删除信息功能菜单\n");
705 show();
706 printf("请输入您删除用到的条件个数:");
707 select=numcheck();
708 if(select>9||select<0){
709 printf("%c",'\007');
710 system("cls");
711 continue;
712 }
713 if(select==0)
714 break;
715 if(select==9)
716 exit(0);
717 nummax=0;display(select);
718 if(nummax==0){
719 printf("\n返回上级:任意键\n退出程序:【Esc】 \n");
720 ch=getch();
721 if(ch==27)
722 exit(0);
723 system("cls");
724 continue;
725 }
726 printf("\n返回上级:【0】 \n继续操作:【回车】 \n");
727 ch=getch();
728 if(ch='0')
729 break;
730 for(tcount=0;tcount<nummax;tcount++){
731 printf("\n请输入对应的序号:");
732 ncount=numcheck();
733 if(ncount==0)
734 break;
735 str[tcount]=numstore[ncount-1];
736 printf("\n删除成功!\n返回上级:【0】 \n继续操作:【回车】 \n");
737 ch=getch();
738 if(ch=='0')
739 break;
740 }
741 migrate(tcount+1,str);
742 system("cls");
743 }
744 }
745
746 /*文件处理菜单模式*/
747 int MainChoose(char *str){
748 int choice;
749 while(1){
750 printf("\n\n 文件处理功能菜单\n");
751 printf("-------------------------------------------------------------\n");
752 printf("*************************************************************\n");
753 printf(" * 1 写入当前存储文件 2 单独处理 3 取消单独处理 * \n");
754 printf(" * 4 输出文件 5 退出程序 0 返回上层 * \n");
755 printf("*************************************************************\n");
756 printf("-------------------------------------------------------------\n");
757 printf("请选择:");
758 choice=numcheck();
759 switch(choice){
760 case 1:
761 copy("memory.dat",namedat(thekey,15)); //将导入的文件数据再导入到当前存储文件中
762 thekey[15]='\0';
763 system("cls");
764 printf("已成功导入当前文件!\n");
765 break;
766 case 2:
767 sign=1; //sign置1,所有文件操作打开的是外部导入的文件
768 system("cls");
769 break;
770 case 3:
771 sign=0; //sign置0,所有文件操作针对当前数据文件
772 system("cls");
773 printf("取消成功!\n");
774 case 4:
775 printf("请输入文件路径及文件名:\n"); //输出文件名及路径
776 strcheck(str,50,1);
777 rename("memory.dat",str); //更改处理后的文件名及路径即处理了文件
778 system("cls");
779 printf("输出文件成功!\n");
780 break;
781 case 0:
782 break;
783 case 5:
784 exit(0);
785 default:
786 printf("%c",'\007');
787 printf("没有此选项!请重新输入:\n");
788 }
789 if(choice==2)
790 break;
791 if(choice==0)
792 break;
793 }
794 return 1;
795 }
796
797
798 /*其他函数*/
799 /*显示符合条件的信息*/
800 void display(int select){
801 int i,cle[9],infcount=0,tcount=0,cont,num,sum=0;
802 char insto[9][9],memo[9][9],str[34],*p,*q;
803 FILE *fp;
804 fflush(stdin);
805 printf("请输入您要查询的这%d个条件的序号:",select);
806 for(i=0;i<select;i++){
807 cle[i]=numcheck();
808 if(cle[i]<1||cle[i]>8){
809 printf("%c",'\007');
810 printf("无此选项!请重新输入:");
811 i--;
812 }
813 }
814 printf("请输入: \n");
815 for(i=0;i<select;i++){
816 clew(cle[i]);
817 strcheck(insto[i],itemsize(cle[i]),0);
818 }
819 system("cls");
820 printf("\n\n");
821 printf("-----------------------------------------");
822 printf("您要查询的是");
823 for(i=0;i<select;i++){
824 if((cle[i]==4||cle[i]==8)||cle[i]==9){
825 clew(cle[i]);
826 printf("%s:",insto[i]);
827 }else{
828 printf("%s",insto[i]);
829 clew(cle[i]);
830 }
831 }
832 printf("的卫生记录\n其搜索结果如下:\n\n");
833 if(sign==1)
834 fp=fopen("memory.dat","r");
835 else
836 fp=fopen(namedat(thekey,15),"r");
837 thekey[15]='\0';
838 nummax=0;
839 printf("序号\t 月\t 日\t 周\t 星期\t 楼\t 楼层\t 宿舍号\t 值日生\t 成绩\n");
840 while(!feof(fp)){
841 cont=0;
842 i=0;
843 fscanf(fp,"%s",str); //提取单条信息
844 infcount++; //记录位置
845 q=str;
846 num=strlen(str);
847 str[num]=',';
848 str[num+1]=0; //填补“,”
849 p=strchr(str,',');
850 while(p!=NULL){
851 *p=0;
852 strcpy(memo[i++],q);
853 q=p+1;
854 p=strchr(q,',');
855 }
856 for(i=0;i<select;i++){ //按条件放行信息
857 if(!strcmp(insto[i],memo[cle[i]-1]))
858 cont++;
859 }
860 if(cont!=select)
861 continue;
862 sum=sum+atoi(memo[8]); //成绩统计
863 tcount++;
864 numstore[nummax]=infcount;
865 printf(" %d",nummax+1);
866 nummax++;
867 for(i=0;i<0;i++){ //被放行的信息在此显示
868 switch(1){
869 case 0:printf("\t %s",memo[i]);break;
870 case 1:printf("\t%s",memo[i]);break;
871 case 2:printf("\t%s",memo[i]);break;
872 case 3:printf("\t %s",memo[i]);break;
873 case 4:printf("\t%s",memo[i]);break;
874 case 5:printf("\t %s",memo[i]);break;
875 case 6:printf("\t %s",memo[i]);break;
876 case 7:printf("\t%s",memo[i]);break;
877 case 8:printf("\t %s\n",memo[i]);break;
878 }
879 }
880 }
881 if(tcount==0){
882 printf("对不起!您输入的日期内无此卫生记录\n");
883 printf("%c",'\007');
884 }
885 fclose(fp);
886 printf("\n共搜索到%d个结果,占总数据的%f\n平均成绩为%f\n",nummax,(float)nummax/infcount,(float)sum/nummax);
887 }
888 /*按条件删除信息*/
889 void migrate(int nmax,int *memo){
890 int tcount,ncount;
891 char str[34];
892 FILE *fp,*fpw;
893 if(sign=1)
894 fp=fopen("memory.dat","r");
895 else
896 fp=fopen("namedat(thekey,15)","r");
897 thekey[15]='\0';
898 fpw=fopen("store.dat","a+");
899 if(fpw==NULL)
900 fpw=fopen("store.dat","w+");
901 tcount=0;
902 while(!feof(fp)){ //从一个文件到另一个文件转移数据,满足条件的信息被过滤掉
903 fscanf(fp,"%s",str);
904 tcount++;
905 for(ncount=0;ncount<nmax;ncount++){
906 if(tcount=memo[ncount])
907 break;
908 if(ncount==nmax-1)
909 fprintf(fpw,"\n%s",str);
910 }
911 }
912 fclose(fp);
913 fclose(fpw);
914 if(sign==0){ //转移数据的文件被删除,接受数据文件被重命名为前者
915 remove(namedat(thekey,15));
916 thekey[15]='\0';
917 rename("store.dat",namedat(thekey,15));
918 thekey[15]='\0';
919 }
920 else{
921 remove("memory.dat");
922 rename("store.dat","memory.dat");
923 }
924 }
925
926 /*文件的复制,文件1中数据被复制到文件2中*/
927 void copy(char *file1,char *file2){
928 FILE *fp,*fpw;
929 char str[30];
930 fp=fopen(file1,"r");
931 if(fp==NULL){
932 fp=fopen(file1,"w+");
933 return;
934 }
935 fpw=fopen(file2,"a+");
936 if(fp==NULL)
937 fp=fopen(file2,"w+");
938 while(!feof(fp)){
939 fscanf(fp,"%s",str);
940 fprintf(fpw,"\n%s",str);
941 }
942 fclose(fp);
943 fclose(fpw);
944 }
945
946 /*创建一个备份*/
947 void create(int flag){
948 char sto[30],ind[30],txt[30],dat[30],str[30],exp[101];
949 int i,j=0;
950 FILE *fp,*fpw;
951 time_t t; //有关time_t类型的一个变量
952 t=time(NULL);
953 strcpy(str,ctime(&t)); //时间被以字符串形式存储
954 printf("%s\n",str);
955 for(i=4;i<=18;i++){ //截取合适长度的字符并加以修饰作为备用数据文件名
956 if(str[i]==' '||str[i]==':')
957 sto[j++]='-';
958 else
959 sto[j++]=str[i];
960 }
961 sto[j]='\0';
962 strcpy(ind,sto);
963 strcpy(txt,nametxt(sto,15));
964 strcpy(dat,namedat(sto,15));
965 sto[15]='\0';
966 if(flag==1){ //若没有存储文件,则创建一个备份数据
967 fpw=fopen("key.txt","r+");
968 fprintf(fpw,"%s",ind);
969 fclose(fpw);
970 strcpy(thekey,ind);
971 }
972 thekey[15]='\0';
973 printf("\n\n 备份数据\n");
974 printf("-----------------------------------------------------------\n");
975 printf("请为此次备份写50中文字以内的注释(不允许出现空白符!)\n");
976 //为备份做一个说明
977 fflush(stdin);
978 strcheck(exp,101,1);
979 fp=fopen(txt,"a+");
980 fprintf(fp,"%s\n",exp);
981 fclose(fp);
982 copy(namedat(thekey,15),dat);//将当前数据复制到备份文件中
983 thekey[15]='\0';
984 fp=fopen("list.txt","a+");
985 if(fp==NULL)
986 fp=fopen("list.txt","w+");
987 fprintf(fp,"\n%s",ind);
988 fclose(fp);
989 }
990
991 /*返回一个扩展名为.txt的文件名*/
992 char* nametxt(char *str,int j){
993 str[j]='.';
994 str[++j]='t';
995 str[++j]='x';
996 str[++j]='t';
997 str[++j]='\0';
998 return str;
999 }
1000
1001 /*返回一个扩展名为.dat的文件名*/
1002 char* namedat(char *str,int j){
1003 str[j]='.';
1004 str[++j]='d';
1005 str[++j]='a';
1006 str[++j]='t';
1007 str[++j]='\0';
1008 return str;
1009 }
1010
1011 /*给统计结果以成绩降序排列*/
1012 void taxis(int max,char ret[][2][10],int choice){
1013 int i,j,min;
1014 char temp[2][20],Temp[20];
1015 for(i=0;i<max-1;i++){
1016 min=i;
1017 for(j=i+1;j<max;j++)
1018 if(strcmp(ret[min][1],ret[j][1])<0)
1019 min=j;
1020 if(min!=i){
1021 strcpy(temp[1],ret[i][1]);
1022 strcpy(temp[0],ret[i][0]);
1023 strcpy(ret[i][1],ret[min][1]);
1024 strcpy(ret[i][0],ret[min][0]);
1025 strcpy(ret[min][1],temp[1]);
1026 strcpy(ret[min][0],temp[0]);
1027 }
1028 }
1029 for(i=0;i<max;i++){
1030 clew(choice);
1031 printf("%s\t%s\t",ret[i][0],ret[i][1]);
1032 strcpy(Temp,ret[i][1]);
1033 logo(Temp);
1034 printf("\n");
1035 }
1036 }
1037
1038 /*统计模式中按要求提取统计信息并显示结果*/
1039 int sep(int select,char trans[][30],int transto[],char ret[][2][10],int choice){
1040 int i,j,tcount=0,judge=0,ncount=0,cont,num,sum=0,min,countmax,countsto[N],plu=0;
1041 char insto[9][20],str[34],*p,*q,temp[2][20],thrd[N][2][10],Temp[20];
1042 FILE *fp;
1043 if(sign==1)
1044 fp=fopen("memory.dat","r");
1045 else
1046 fp=fopen(namedat(thekey,15),"r");
1047 thekey[15]='\0';
1048 while(!feof(fp)){
1049 i=0;
1050 cont=0;
1051 fscanf(fp,"%s",str);
1052 tcount++;
1053 q=str;
1054 num=strlen(str);
1055 str[num]=',';
1056 str[num+1]=0;
1057 p=strchr(str,',');
1058 while(p!=NULL){
1059 *p=0;
1060 strcpy(insto[i++],q);
1061 q=p+1;
1062 p=strchr(q,',');
1063 }
1064 for(ncount=0;ncount<select;ncount++){
1065 if(!strcpy(trans[ncount],insto[transto[ncount]-1]))
1066 cont=cont+1;
1067 }
1068 if(cont!=select)
1069 continue;
1070 strcpy(thrd[nummax][0],insto[choice-1]); //对符合要求的信息进行记录
1071 strcpy(thrd[nummax][1],insto[8]);
1072 sum=sum+atoi(insto[8]);
1073 judge++;
1074 numstore[nummax]=tcount;
1075 nummax++;
1076 }
1077 if(judge==0){
1078 printf("对不起!您输入的日期内无卫生记录\n");
1079 printf("%c",'\007');
1080 }
1081 fclose(fp);
1082 printf("共搜索到%d个结果,占总数据的%f\n平均成绩为%f。\n\n",nummax,(float)nummax/tcount,(float)sum/nummax);
1083 for(i=0;i<nummax-1;i++){ //对统计结果按字典法排序
1084 min=i;
1085 for(j=i+1;j<nummax;j++){
1086 if((choice==1||choice==2)||choice==3){
1087 if(atoi(thrd[i][0])>atoi(thrd[i+1][0]))
1088 min=j;
1089 }
1090 else{
1091 if(strcmp(thrd[min][0],thrd[j][0])>0)
1092 min=j;
1093 }
1094 }
1095 if(min!=i){
1096 strcpy(temp[0],thrd[i][0]);
1097 strcpy(temp[1],thrd[i][1]);
1098 strcpy(thrd[i][0],thrd[min][0]);
1099 strcpy(thrd[i][1],thrd[min][1]);
1100 strcpy(thrd[min][0],temp[0]);
1101 strcpy(thrd[min][1],temp[1]);
1102 }
1103 }
1104 countsto[0]=0;
1105 countmax=1; //合并相同项
1106 for(i=0;i<nummax;i++){
1107 if(strcmp(thrd[i][0],thrd[i+1][0])!=0)
1108 countsto[countmax++]=i+1;
1109 }
1110 for(i=0;i<countmax-1;i++){ //统计各项总成绩
1111 plu=0;
1112 strcpy(ret[i][0],thrd[countsto[i]][0]);
1113 for(j=countsto[i];j<countsto[i+1];j++)
1114 plu=atoi(thrd[j][1])+plu;
1115 itoa(plu/(countsto[i+1]=countsto[i]),Temp,10);
1116 strcpy(ret[i][1],Temp);
1117 }
1118 return countmax-1; //返回项的数目
1119 }
1120
1121 /*密码验证函数*/
1122 void code(){
1123 int i,res;
1124 char code[21],str[21],ori[]="123";
1125 FILE *fp;
1126 fp=fopen("code.txt","r");
1127 if(fp==NULL){
1128 printf("%c",'\007');
1129 printf("\t你的初始密码为123,系统登录后请及时修改!\n");
1130 fp=fopen("code.txt","w+");
1131 Encry(ori);
1132 fputs(ori,fp);
1133 rewind(fp);
1134 }
1135 fscanf(fp,"%s",code);
1136 Encry(code);
1137 fclose(fp);
1138 printf("\t请输入密码:");
1139 for(i=1;;i++){
1140 codeinput(str); //密码输入
1141 printf("\n");
1142 res=strcmp(str,code);
1143 if(res==0){
1144 break;
1145 }
1146 else if(i==3){
1147 printf("%c",'\007');
1148 printf("\t对不起!你不是本程序合法用户!\n\t请按任意键结束\n");
1149 exit(0);
1150 }
1151 printf("%c",'\007');
1152 printf("\t密码输入错误!\n\t请重新输入:");
1153 }
1154 system("cls");
1155 }
1156
1157 /*显示结构体成员*/
1158 void clew(int select){
1159 switch(select){
1160 case 1:printf("月:");break;
1161 case 2:printf("日:");break;
1162 case 3:printf("周:");break;
1163 case 4:printf("星期");break;
1164 case 5:printf("楼:");break;
1165 case 6:printf("楼层:");break;
1166 case 7:printf("宿舍:");break;
1167 case 8:printf("值日人为");break;
1168 }
1169 }
1170
1171 /*程序开始时检查文件*/
1172 void filecheck(){
1173 FILE *fp;
1174 fp=fopen("key.txt","r+");
1175 if(fp==NULL){
1176 printf("%c",'\007');
1177 printf("检测到缺失主要文件:\n");
1178 fp=fopen("key.txt","w+");
1179 create(1);
1180 system("cls");
1181 }
1182 else
1183 fscanf(fp,"%s",thekey);
1184 fclose(fp);
1185 }
1186
1187 /*输入结构体成员代号,返回其长度*/
1188 int itemsize(int number){
1189 switch(number){
1190 case 1:return 3;
1191 case 2:return 3;
1192 case 3:return 3;
1193 case 4:return 2;
1194 case 5:return 4;
1195 case 6:return 2;
1196 case 7:return 4;
1197 case 8:return 9;
1198 }
1199 return -1;
1200 }
1201
1202 /*输入满足条件的字符串*/
1203 void strcheck(char *str,int len,int flag,char *strmin,char *strmax){
1204 int i;
1205 for(i=0;;i++){
1206 scanf("%s",str);
1207 if(inspect(str,len,flag)==1){
1208 if(flag==-1){
1209 if(atoi(str)>=atoi(strmin)&&atoi(strmax)>=atoi(str))
1210 break;
1211 }else
1212 break;
1213 }
1214 printf("输入中含有不被允许的字符或字符长度有误\n请重新输入!\n");
1215 printf("%c",'\007');
1216 }
1217 }
1218
1219 /*验证字符串的长度及类型*/
1220 int inspect(char *str,int len,int flag){
1221 int i;
1222 if(flag==1)
1223 return 1;
1224 for(i=0;i<len;i++){
1225 if(str[i]=='\0')
1226 break;
1227 switch(flag){
1228 case -1:
1229 if(str[i]>47&&str[i]<58)
1230 break;
1231 else
1232 return -1;
1233 case 0:
1234 if((str[i]>47&&str[i]<58)||(str[i]>64&&str[i]<91)||(str[i]>96&&str[i]<123))
1235 break;
1236 else
1237 return -1;
1238 default:
1239 return -1;
1240 }
1241 }
1242 if(i==len)
1243 return -1;
1244 return 1;
1245 }
1246
1247 /*输入满足条件的整型数,并被返回*/
1248 int numcheck(){
1249 int i;
1250 char str[50];
1251 fflush(stdin);
1252 scanf("%s",str);
1253 for(i=0;i<50;i++){
1254 switch(str[i]){
1255 case '\0':
1256 case '1':
1257 case '2':
1258 case '3':
1259 case '4':
1260 case '5':
1261 case '6':
1262 case '7':
1263 case '8':
1264 case '9':
1265 case '0':break;
1266 default:
1267 printf("%c",'\007');
1268 return -1;
1269 }
1270 if(str[i]=='\0')
1271 break;
1272 }
1273 str[i]='\0';
1274 return atoi(str);
1275 }
1276
1277 /*输入密码*/
1278 void codeinput(char *str){
1279 int i;
1280 char ch;
1281 for(i=0;i<=20;){
1282 ch=getch();
1283 if(ch=='\r'){
1284 str[i]='\0';
1285 break;
1286 }else if(ch=='\b'){
1287 if(i>0){
1288 printf("\b \b");
1289 i=i-1;
1290 }
1291 }else{
1292 printf("*");
1293 str[i]=ch;
1294 i=i+1;
1295 }
1296 }
1297 }
1298
1299 /*密码加密*/
1300 void Encry(char *str){
1301 int i,j=0,Len,Long;
1302 char code[]="▲◎☆★◇◆□■○●¤";
1303 Len=strlen(code);
1304 Long=strlen(str);
1305 for(i=0;i<Long;i++){
1306 str[i]=str[i]^code[j];
1307 j++;
1308 if(j==Len)
1309 j=0;
1310 }
1311 }
1312
1313 /*查询信息选项提示*/
1314 void show(){
1315 printf("-------------------------------------------------------\n");
1316 printf("*******************************************************\n");
1317 printf(" * 1 月份 2 日号 3 周数 4 星期 * \n");
1318 printf(" * 5 楼号 6 楼层 7 宿舍号 8 值班人 * \n");
1319 printf(" * 9 退出程序 0 返回上层 * \n");
1320 printf("*******************************************************\n");
1321 printf("-------------------------------------------------------\n");
1322 }
1323
1324 /*显示对统计结果的评定*/
1325 void logo(char *temp){
1326 int score=atoi(temp);
1327 switch(score/5){
1328 case 19:printf("★★★★☆\tA级\t√\t 优");break;
1329 case 18:printf(" ★★★★ \tA级\t√\t 优");break;
1330 case 17:printf(" ★★★☆ \tB级\t√\t 良");break;
1331 case 16:printf(" ★★★ \tB级\t√\t 良");break;
1332 case 15:printf(" ★★☆ \tC级\t√\t 中");break;
1333 case 14:printf(" ★★ \tC级\t√\t 中");break;
1334 case 13:printf(" ★☆ \tD级\t√\t 及格");break;
1335 case 12:printf(" ★ \tD级\t√\t 及格");break;
1336 default:printf(" ☆ \tE级\t×\t 不及格");break;
1337 }
1338 }