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

   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 }

 

posted on 2018-10-11 09:44  梓离  阅读(686)  评论(0)    收藏  举报

导航