大一C语言课程设计——班级档案管理系统

2022-10-14,,,

记录我在大一第二学期期末做的c语言课程毕业设计

1. 班级档案管理系统运用到的主要结构体

typedef struct birthday //出生日期
{
int year;
int month;
int day;
}birthday;
struct file //学生档案信息
{
char id[20];//学号
char name[20];//姓名
char sex[2];//性别
int age;//年龄
birthday birthday;//出生日期
char desc[20];//备注
}file[n];

2.班级档案管理系统任务目标

对一个有n个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。
功能要求:
(1)本系统采用一个包含n个数据的结构体数组,每个数据的结构应当包括:学号、姓名、性别、年龄、备注。
(2)本系统显示这样的菜单:
请选择系统功能项:
a 学生基本信息录入
b 学生基本信息显示
c 学生基本信息保存
d 学生基本信息删除
e 学生基本信息修改(要求先输入密码)
f 学生基本信息查询
(1)按学号查询
(2)按姓名查询
(3)按性别查询
(4)按年龄查询
g. 退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生基本信息保存到文件中。
(5)进入系统之前要先输入密码。

3.c程序源码

   1 #include<stdio.h>
   2 #include<windows.h>
   3 #include<stdlib.h>
   4 #include<string.h>
   5 #include<conio.h>
   6 #define n 200
   7 typedef struct birthday
   8 {
   9     int year;
  10     int month;
  11     int day;
  12 }birthday;
  13 struct file
  14 {
  15     char id[20];//学号
  16     char name[20];//姓名
  17     char sex[2];//性别
  18     int age;//年龄
  19     birthday birthday;//出生日期
  20     char desc[20];//备注
  21 }file[n];
  22 
  23 void toxy(int x, int y)      //将光标移动到x,y坐标处
  24 {
  25 coord pos = { x , y };
  26 handle out = getstdhandle(std_output_handle);
  27 setconsolecursorposition(out, pos); 
  28 }
  29 
  30 
  31 
  32 void load();//系统登陆页面
  33 void save_password(char str[]);//保存密码
  34 void menu();//系统主菜单
  35 void input(int n);//学生信息录入
  36 void output();//学生信息显示
  37 void save(int n);//学生信息保存
  38 void dele();//学生信息删除
  39 void change();//学生信息修改
  40 void invest();//学生信息查询
  41 void change_password();//修改密码
  42 void over();//退出系统
  43 
  44 void input(int n)//信息录入,录入学生的基本信息
  45 {   
  46     int i;
  47     for(i=0;i<n;i++)
  48     {
  49         system("cls");//清屏
  50         toxy(15,6);
  51         printf("请输入学生学号:");
  52         scanf("%s",file[i].id);
  53         toxy(15,7);
  54         printf("请输入学生姓名:");
  55         scanf("%s",file[i].name);
  56         toxy(15,8);
  57         printf("请输入学生性别(男/女):");
  58         scanf("%s",file[i].sex);
  59         toxy(15,9);
  60         printf("请输入学生年龄:");
  61         scanf("%d",&file[i].age);
  62         toxy(15,10);
  63         printf("请输入学生的出生日期(年月日,以空格隔开):");
  64         scanf("%d%d%d",&file[i].birthday.year,&file[i].birthday.month,&file[i].birthday.day);
  65         toxy(15,11);
  66         printf("请输入备注:");
  67       scanf("%s",file[i].desc);
  68     }
  69     system("cls");//清屏
  70     toxy(15,6);
  71     printf("录入完毕,请记得返回保存(*^▽^*)");
  72     toxy(15,8);
  73     printf("按任意键可返回主菜单!");
  74     getch();
  75 
  76 }
  77 
  78 void output()//信息显示,将学生的基本信息显示到屏幕上
  79 {
  80     system("cls");//清屏
  81     system("color f");//字体颜色为亮白色
  82     int i;
  83     file*fp;
  84     toxy(15,6);
  85     printf("***********学生基本信息*************\n");
  86     toxy(15,8);
  87     printf(" 学号       姓名     性别     年龄    出生日期    备注");
  88     toxy(15,10);
  89     if((fp=fopen("stu","r"))==null)//只用读,用r打开stu文件
  90     {
  91         system("cls");
  92         toxy(15,6);
  93         printf("cannot open file");
  94         toxy(15,8);
  95         exit(0);
  96     }
  97     else
  98     {
  99 
 100       for(i=0;i<n;i++)
 101       {
 102         fread(&file[i],sizeof(struct file),1,fp);//从文件中读取数据到file中
 103         if(feof(fp))//判断文件是否读到了最后
 104             break;
 105         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s\n",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 106         toxy(15,11+i);  
 107       }
 108     memset(file,null,sizeof(file));//重置file
 109     }
 110     printf("显示完毕,请按任意键返回主菜单");
 111     getch();
 112 
 113 }
 114 
 115 void save(int n) //信息保存,将录入的学生信息保存到文件中
 116 {   
 117     system("cls");//清屏
 118     system("color f");//字体颜色为亮白色
 119     file*fp;
 120     fp=fopen("stu","a+");//以追加的方式打开文件,结束时指针停在文件尾
 121     int i;
 122     for(i=0;i<n;i++)
 123     {
 124         if(file[i].age==null) continue;//避免空白数据
 125          fwrite(&file[i],sizeof(struct file),1,fp);//向指定的文件中写入数据
 126     }
 127     fclose(fp);
 128     n=null;//重置
 129     memset(file,null,sizeof(file));//重置结构体数组file
 130     toxy(15,8);
 131     printf("档案保存成功!即将返回主菜单……");
 132     sleep(800);
 133 
 134 }
 135 
 136 void dele()//信息删除,把不要的学生基本信息删除
 137 {
 138   
 139    system("cls");//清屏
 140    system("color f");//字体颜色为亮白色
 141    int i,flag=0;//flag是否找到删除学生的标志
 142    char number[20];
 143    char name[20];
 144    char c;
 145  do
 146  {
 147      toxy(15,6);
 148      printf("请输入要删除学生的学号和姓名:");
 149      toxy(15,8);
 150   scanf("%s%s",number,name);
 151   file*fp1,*fp2;
 152   fp1=fopen("stu","r+");//为了读和写,用r+打开stu文本文件
 153   fp2=fopen("linshi","w+");//用w+打开一个临时的文本文件
 154   if(fp1==null||fp2==null)
 155   {
 156       toxy(15,10);
 157       printf("cannot open file!");
 158       toxy(15,12);
 159       exit(0);
 160   }
 161   for(i=0;i<n;i++)
 162   {
 163       while(fread(&file[i],sizeof(struct file),1,fp1))//从文件中读取数据到file
 164       {
 165           if(feof(fp1))// 判断文件是否读到了最后
 166               break;
 167           if(strcmp(number,file[i].id)==0&&strcmp(name,file[i].name)==0)//判断要删除的学号和姓名是否与文件数据有相同,若相同则跳过这次循环
 168           {
 169               flag=1;
 170               continue;
 171           }
 172           else
 173           {
 174               fwrite(&file[i],sizeof(struct file),1,fp2);//将file的信息写入文件
 175           }
 176       }
 177   }
 178   fclose(fp1);
 179   fclose(fp2);
 180   if(system("copy linshi stu")==0)//将linshi文件的内容复制覆盖到stu文件,若成功则返回0
 181   {   
 182       system("cls");//清屏
 183       system("del linshi");//删除linshi文件
 184       system("cls");//清屏
 185   }
 186   if(flag==1)//找到删除学生            
 187   {
 188                     
 189       toxy(15,10);   
 190       printf("成功删除该学生,系统将自动帮您更新并保存档案\n");
 191       sleep(800);
 192       menu();
 193                      
 194   }
 195   if(flag==0)//无法找到被删除学生
 196   {
 197       toxy(15,10);
 198       printf("删除失败!学号或姓名输入错误");
 199       toxy(15,11);
 200       printf("按1返回主菜单,按2重新输入\n");
 201       toxy(15,11);
 202       while(1)
 203       {
 204           c=getch();
 205           if(c=='1')
 206           {
 207               menu();
 208           }
 209           else if(c=='2')
 210               dele();
 211       }
 212   }
 213  
 214  }while(1);
 215 }
 216 void change()//修改信息,修改错误的学生信息
 217 {   
 218     int sign=0;//用来标志密码验证成功或否
 219     int j=3;//每次进入此功能,用户有3次验证密码机会
 220     do
 221     {
 222     system("cls");//清屏
 223     system("color f");//字体颜色为亮白色
 224     char str[18];
 225     file*fp;
 226     if((fp=fopen("password","r"))==null)
 227     {
 228         printf("cannot open file\n");
 229         exit(0);
 230     }
 231     fgets(str,18,fp);//从文件中读取密码数据保存到str数组中
 232     fclose(fp);
 233     toxy(15,6);
 234     printf("进入该功能,须再次验证登陆密码:\n");
 235     toxy(15,8);
 236         char c;
 237         char password[18];
 238         int i=0;
 239         for(;;)//此处为输入密码不回显操作
 240         {
 241             c=getch();//输入c
 242             if(c=='\r')//如果输入c为回车,则跳出循环
 243             {
 244                 break;
 245             }
 246             if(c=='\b') //如果输入c为删除键
 247             {
 248                 printf("\b");
 249                 printf(" ");
 250                 printf("\b");
 251             }
 252             else
 253             {
 254                 password[i]=c;
 255                 printf("*");
 256                 i++;
 257             }
 258         }
 259         password[i]='\0';//在字符串结尾作结束符标记
 260         if(strcmp(str,password)==0)//验证密码是否正确
 261         {
 262           system("cls");//清屏
 263           toxy(15,10);
 264           printf("验证成功!即将进入修改功能!");
 265           sleep(600);
 266           sign=1;
 267           break;
 268         }
 269         else
 270         {
 271             toxy(15,10);
 272             j--;
 273             printf("密码错误!您还有%d次验证机会",j);
 274             sleep(600);
 275         }
 276     }while(j>0);//验证机会不为0
 277     if(j==0)
 278     {
 279         system("cls");
 280         toxy(15,6);
 281         printf("验证机会已用完,即将返回主菜单……");
 282         sleep(600);
 283         menu();
 284     }
 285     
 286     int select,i;
 287     char number[20];
 288     int count=0;
 289     if(sign)
 290     {
 291         system("cls");
 292         while(select!=7)
 293         {
 294         system("cls");
 295         toxy(15,6);
 296         printf("--------------1.修改学号-------------");
 297         toxy(15,7);
 298         printf("--------------2.修改姓名-------------");
 299         toxy(15,8);
 300         printf("--------------3.修改性别-------------");
 301         toxy(15,9);
 302         printf("--------------4.修改年龄-------------");
 303         toxy(15,10);
 304         printf("--------------5.修改出生日期---------");
 305         toxy(15,11);
 306         printf("--------------6.修改备注 ------------");
 307         toxy(15,12);
 308         printf("--------------7. 退出 ---------------");
 309         toxy(15,13);
 310         printf("请输入1~6进行选择:");
 311         toxy(15,14);
 312         scanf("%d",&select);
 313         file*fp1;
 314         toxy(15,15);
 315      if((fp1=fopen("stu","r+"))==null)//为了读和写,用r+打开stu文件
 316      {
 317          system("cls");//清屏
 318          toxy(15,6);
 319         printf("cannot open file!");
 320         toxy(15,8);
 321         exit(0);
 322      }  
 323      for(i=0;i<n;i++)
 324     {
 325         fread(&file[i],sizeof(struct file),1,fp1);//从文件中读取数据到file
 326          if(feof(fp1))//判断文件是否读到了最后
 327             break;
 328         count++;//每次成功从stu文件中读取信息,则学生数据个数加1
 329     }
 330      int flag=0;
 331         switch(select)
 332         {
 333         case 1://修改学号
 334                 system("cls");//清屏
 335                 toxy(15,5);
 336                 printf("请输入要修改学生的学号:");
 337                 toxy(15,6);
 338                 scanf("%s",number);
 339                 for(i=0;i<count;i++)
 340                 {
 341                     if((strcmp(number,file[i].id))==0)
 342                     {
 343                         toxy(15,7);
 344                         printf("*********************学生基本信息*********************");
 345                         toxy(15,8);
 346                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 347                         toxy(15,9);
 348                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 349                         toxy(15,10);
 350                         printf("重新输入该学生的学号进行修改:");
 351                         toxy(15,11);
 352                         scanf("%s",file[i].id);
 353                         flag=1;
 354                         break;
 355                     }
 356                 }
 357                 fclose(fp1);
 358                 if(flag==1)
 359                 {
 360                     system("cls");//清屏
 361                     toxy(15,12);
 362                     printf("修改成功!系统已自动保存!");
 363                     toxy(15,13);
 364                     printf("正在自动跳转到主菜单....");
 365                     file*fp2;
 366                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 367                     {
 368                         printf("cannot open file!");
 369                         exit(0);
 370                     }
 371                     for(i=0;i<count;i++)
 372                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 373                     fclose(fp2);
 374                     sleep(600);
 375                     menu();
 376                     
 377                 }
 378                 if(flag==0)
 379                 {
 380                     toxy(15,12);
 381                     printf("该学生不存在!");
 382                     toxy(15,13);
 383                     char c;
 384                     printf("1.返回上一级  2.返回主菜单");
 385                     toxy(15,14);
 386                     c=getch();
 387                     if(c=='1') break;
 388                     if(c=='2') menu();
 389                 }
 390 
 391         case 2://修改姓名
 392             system("cls");//清屏
 393             toxy(15,5);
 394                 printf("请输入要修改学生的学号:");
 395                 toxy(15,6);
 396                 scanf("%s",number);
 397                 for(i=0;i<count;i++)
 398                 {
 399                     if((strcmp(number,file[i].id))==0)
 400                     {
 401                         toxy(15,7);
 402                         printf("*********************学生基本信息*********************");
 403                         toxy(15,8);
 404                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 405                         toxy(15,9);
 406                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 407                         toxy(15,10);
 408                         printf("重新输入该学生的姓名进行修改:");
 409                         toxy(15,11);
 410                         scanf("%s",file[i].name);
 411                         flag=1;
 412                         break;
 413                     }
 414                 }
 415                 if(flag==1)
 416                 {
 417                     system("cls");//清屏
 418                     toxy(15,12);
 419                     printf("修改成功!系统已自动保存!");
 420                     toxy(15,13);
 421                     printf("正在自动跳转到主菜单....");
 422                     file*fp2;
 423                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 424                     {
 425                         printf("cannot open file!");
 426                         exit(0);
 427                     }
 428                     for(i=0;i<count;i++)
 429                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 430                     fclose(fp2);
 431                     sleep(600);
 432                     menu();
 433                     
 434                 }
 435                 if(flag==0)
 436                 {
 437                     toxy(15,12);
 438                     printf("该学生不存在!");
 439                     toxy(15,13);
 440                     char c;
 441                     printf("1.返回上一级  2.返回主菜单");
 442                     toxy(15,14);
 443                     c=getch();
 444                     if(c=='1') break;
 445                     if(c=='2') menu();
 446                 }
 447 
 448         case 3://修改性别
 449             system("cls");//清屏
 450             toxy(15,5);
 451                 printf("请输入要修改学生的学号:");
 452                 toxy(15,6);
 453                 scanf("%s",number);
 454                 for(i=0;i<count;i++)
 455                 {
 456                     if((strcmp(number,file[i].id))==0)
 457                     {
 458                         toxy(15,7);
 459                         printf("*********************学生基本信息*********************");
 460                         toxy(15,8);
 461                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 462                         toxy(15,9);
 463                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 464                         toxy(15,10);
 465                         printf("重新输入该学生的性别进行修改:");
 466                         toxy(15,11);
 467                         scanf("%s",file[i].sex);
 468                         flag=1;
 469                         break;
 470                     }
 471                 }
 472                 if(flag==1)
 473                 {
 474                     system("cls");//清屏
 475                     toxy(15,12);
 476                     printf("修改成功!系统已自动保存!");
 477                     toxy(15,13);
 478                     printf("正在自动跳转到主菜单....");
 479                     file*fp2;
 480                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 481                     {
 482                         printf("cannot open file!");
 483                         exit(0);
 484                     }
 485                     for(i=0;i<count;i++)
 486                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 487                     fclose(fp2);
 488                     sleep(600);
 489                     menu();
 490                     
 491                 }
 492                 if(flag==0)
 493                 {
 494                     toxy(15,12);
 495                     printf("该学生不存在!");
 496                     toxy(15,13);
 497                     char c;
 498                     printf("1.返回上一级  2.返回主菜单");
 499                     toxy(15,14);
 500                     c=getch();
 501                     if(c=='1') break;
 502                     if(c=='2') menu();
 503                 }
 504         case 4://修改年龄
 505             system("cls");//清屏
 506             toxy(15,5);
 507                 printf("请输入要修改学生的学号:");
 508                 toxy(15,6);
 509                 scanf("%s",number);
 510                 for(i=0;i<count;i++)
 511                 {
 512                     if((strcmp(number,file[i].id))==0)
 513                     {
 514                         toxy(15,7);
 515                         printf("*********************学生基本信息*********************");
 516                         toxy(15,8);
 517                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 518                         toxy(15,9);
 519                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 520                         toxy(15,10);
 521                         printf("重新输入该学生的年龄进行修改:");
 522                         toxy(15,11);
 523                         scanf("%d",&file[i].age);
 524                         flag=1;
 525                     }
 526                 }
 527                 if(flag==1)
 528                 {
 529                     system("cls");//清屏
 530                     toxy(15,12);
 531                     printf("修改成功!系统已自动保存!");
 532                     toxy(15,13);
 533                     printf("正在自动跳转到主菜单....");
 534                     file*fp2;
 535                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 536                     {
 537                         printf("cannot open file!");
 538                         exit(0);
 539                     }
 540                     for(i=0;i<count;i++)
 541                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 542                     fclose(fp2);
 543                     sleep(600);
 544                     menu();
 545                     
 546                 }
 547                 if(flag==0)
 548                 {
 549                     toxy(15,12);
 550                     printf("该学生不存在!");
 551                     toxy(15,13);
 552                     char c;
 553                     printf("1.返回上一级  2.返回主菜单");
 554                     toxy(15,14);
 555                     c=getch();
 556                     if(c=='1') break;
 557                     if(c=='2') menu();
 558                 }
 559 
 560         case 5://修改出生日期
 561             system("cls");//清屏
 562             toxy(15,5);
 563             printf("请输入要修改学生的学号:");
 564             toxy(15,6);
 565                 scanf("%s",number);
 566                 for(i=0;i<count;i++)
 567                 {
 568                     if((strcmp(number,file[i].id))==0)
 569                     {
 570                         toxy(15,7);
 571                         printf("*********************学生基本信息*********************");
 572                         toxy(15,8);
 573                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 574                         toxy(15,9);
 575                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 576                         toxy(15,10);
 577                         printf("重新输入该学生的出生日期(年 月 日)进行修改:");
 578                         toxy(15,11);
 579                         scanf("%d%d%d",&file[i].birthday.year,&file[i].birthday.month,&file[i].birthday.day);
 580                         flag=1;
 581                     }
 582                 }
 583                 if(flag==1)
 584                 {
 585                     system("cls");//清屏
 586                     toxy(15,12);
 587                     printf("修改成功!系统已自动保存!");
 588                     toxy(15,13);
 589                     printf("正在自动跳转到主菜单....");
 590                     file*fp2;
 591                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 592                     {
 593                         printf("cannot open file!");
 594                         exit(0);
 595                     }
 596                     for(i=0;i<count;i++)
 597                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 598                     fclose(fp2);
 599                     sleep(600);
 600                     menu();
 601                     
 602                 }
 603                 if(flag==0)
 604                 {
 605                     toxy(15,12);
 606                     printf("该学生不存在!");
 607                     toxy(15,13);
 608                     char c;
 609                     printf("1.返回上一级  2.返回主菜单");
 610                     toxy(15,14);
 611                     c=getch();
 612                     if(c=='1') break;
 613                     if(c=='2') menu();
 614                 }
 615 
 616         case 6://修改备注
 617         system("cls");//清屏
 618             toxy(15,5);
 619                 printf("请输入要修改学生的学号:");
 620                 toxy(15,6);
 621                 scanf("%s",number);
 622                 for(i=0;i<count;i++)
 623                 {
 624                     if((strcmp(number,file[i].id))==0)
 625                     {
 626                         toxy(15,7);
 627                         printf("*********************学生基本信息*********************");
 628                         toxy(15,8);
 629                         printf(" 学号       姓名     性别     年龄    出生日期    备注");
 630                         toxy(15,9);
 631                         printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 632                         toxy(15,10);
 633                         printf("重新输入该学生的备注进行修改:");
 634                         toxy(15,11);
 635                         scanf("%s",&file[i].desc);
 636                         flag=1;
 637                     }
 638                 }
 639                 if(flag==1)
 640                 {
 641                     system("cls");//清屏
 642                     toxy(15,12);
 643                     printf("修改成功!系统已自动保存!");
 644                     toxy(15,13);
 645                     printf("正在自动跳转到主菜单....");
 646                     file*fp2;
 647                     if((fp2=fopen("stu","w+"))==null)//用w+打开stu文件同时清空文件内容
 648                     {
 649                         printf("cannot open file!");
 650                         exit(0);
 651                     }
 652                     for(i=0;i<count;i++)
 653                         fwrite(&file[i],sizeof(file),1,fp2);//将file的信息写入stu文件
 654                     fclose(fp2);
 655                     sleep(600);
 656                     menu();
 657                     
 658                 }
 659                 if(flag==0)
 660                 {
 661                     toxy(15,12);
 662                     printf("该学生不存在!");
 663                     toxy(15,13);
 664                     char c;
 665                     printf("1.返回上一级  2.返回主菜单");
 666                     toxy(15,14);
 667                     c=getch();
 668                     if(c=='1') break;
 669                     if(c=='2') menu();
 670                 }
 671 
 672         case 7:system("cls");//清屏
 673         default:break;
 674         }
 675         }
 676 
 677     }
 678 }
 679 void invest()//查询信息,可按学号、姓名、性别、年龄、出生日期查询学生的基本信息
 680 {   
 681     system("cls");//清屏
 682     system("color f");//字体颜色为亮白色
 683     int i,x,flag,year,month,day,age;
 684     char number[20];
 685     char name[20];
 686     char sex[5];
 687     while(x!=6)
 688     {
 689     system("cls");
 690     toxy(15,6);
 691     printf("请选择查询功能:\n");
 692     toxy(15,7);
 693     printf("\t1.查询学号\n");
 694     toxy(15,8);
 695     printf("\t2.查询姓名\n");
 696     toxy(15,9);
 697     printf("\t3.查询性别\n");
 698     toxy(15,10);
 699     printf("\t4.查询出生日期\n");
 700     toxy(15,11);
 701     printf("\t5.查询年龄\n");
 702     toxy(15,12);
 703     printf("\t6.退出\n");
 704     toxy(15,13);
 705     printf("请输入选择:");
 706     scanf("%d",&x);
 707     file*fp;
 708     if((fp=fopen("stu","r"))==null)//只用读,用r打开stu文件
 709     {
 710         system("cls");//清屏
 711         toxy(15,6);
 712         printf("cannot open file\n");
 713         toxy(15,8);
 714         exit(0);
 715     }
 716     int count=0;//用来记录文件中学生数据的个数
 717     for(i=0;i<n;i++)
 718         {
 719         fread(&file[i],sizeof(struct file),1,fp);//将stu文件信息传到file中
 720         if(feof(fp))//判断文件是否读到了最后
 721              break;
 722         count++;//每次成功从stu文件中读取信息,则学生数据个数加1
 723         }
 724     fclose(fp);
 725     switch(x)
 726     {
 727     case 1:
 728         system("cls");//清屏
 729         toxy(15,6);
 730         printf("请输入学号:");
 731         toxy(15,8);
 732         scanf("%s",number);
 733         system("cls");//清屏
 734         flag=0;
 735         toxy(15,6);
 736         printf("学号为%s的学生信息如下:",number);
 737         for(i=0;i<count;i++)
 738         {   
 739             if((strcmp(number,file[i].id))==0)
 740             {
 741                 toxy(15,7+i);
 742                 printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 743                 flag=1;
 744             }
 745         }
 746         if(flag==0)
 747         {   
 748             toxy(15,8);
 749             printf("无法找到你要找的学生!");
 750         }
 751         toxy(15,11+count);
 752         printf("按任意键后可返回……");
 753                 getch();
 754         break;
 755     case 2:
 756         system("cls");//清屏
 757         toxy(15,6);
 758         printf("请输入姓名:");
 759         toxy(15,8);
 760          scanf("%s",name);
 761          flag=0;
 762          system("cls");//清屏
 763          toxy(15,6);
 764          printf("姓名为%s的学生信息如下:",name);
 765         for(i=0;i<count;i++)
 766         {
 767             if(strcmp(name,file[i].name)==0)
 768             {
 769                toxy(15,7+i);
 770                printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 771                flag=1;
 772             }
 773         }
 774         if(flag==0)
 775         {
 776             toxy(15,8);
 777             printf("无法找到你要找的学生!");
 778         }
 779         toxy(15,11+count);
 780         printf("按任意键后可返回……");
 781         getch();
 782         break;
 783     case 3:
 784         system("cls");//清屏
 785         toxy(15,6);
 786         printf("请输入性别(男/女):");
 787         toxy(15,8);
 788         scanf("%s",sex);
 789         system("cls");//清屏
 790         flag=0;
 791         toxy(15,6);
 792         printf("性别为%s的学生信息如下:",sex);
 793         for(i=0;i<count;i++)
 794         {     
 795             if(strcmp(sex,file[i].sex)==0)
 796             {
 797                toxy(15,7+i);
 798                printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 799                flag=1;
 800             }
 801         }
 802         if(flag==0)
 803         {
 804             toxy(15,8);
 805             printf("无法找到你要找的学生!");
 806         }
 807         toxy(15,11+count);
 808         printf("按任意键后可返回……");
 809         getch();
 810             break;
 811     case 4:
 812         system("cls");//清屏
 813         toxy(15,6);
 814         printf("请输入出生日期(年 月 日):");
 815         toxy(15,8);
 816         scanf("%d%d%d",&year,&month,&day);
 817         system("cls");//清屏
 818         flag=0;
 819         toxy(15,6);
 820         printf("出生日期为%d年%d月%d日的学生信息如下:",year,month,day);
 821         for(i=0;i<count;i++)
 822         {
 823            if(year==file[i].birthday.year&&year==file[i].birthday.month&&year==file[i].birthday.day)
 824            {
 825                toxy(15,7+i);
 826                printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 827                flag=1;
 828            }
 829         }
 830         if(flag==0)
 831         {
 832             toxy(15,8);
 833             printf("无法找到你要找的学生!");
 834         }
 835         toxy(15,11+count);
 836         printf("按任意键后可返回……");
 837         getch();
 838         break;
 839     case 5:
 840         system("cls");//清屏
 841         toxy(15,6);
 842         printf("请输入年龄:");
 843         toxy(15,8);
 844         scanf("%d",&age);
 845         system("cls");//清屏
 846         flag=0;
 847         toxy(15,6);
 848         printf("年龄为%d的学生信息如下:",age);
 849        for(i=0;i<count;i++)
 850        {
 851            if(age==file[i].age)
 852            {
 853                toxy(15,7+i);
 854                printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",file[i].id,file[i].name,file[i].sex,file[i].age,file[i].birthday.year,file[i].birthday.month,file[i].birthday.day,file[i].desc);
 855                flag=1;
 856            }
 857         }
 858        if(flag==0)
 859        {
 860            toxy(15,8);
 861            printf("无法找到你要找的学生!");
 862        }
 863        toxy(15,11+count);
 864        printf("按任意键后可返回……");
 865         getch();
 866        break;
 867     case 6:system("cls");//清屏
 868         toxy(15,8);
 869         printf("即将返回主菜单……");
 870         sleep(700);
 871         break;
 872     }
 873     }
 874 }
 875 void over()//退出功能,显示退出软件的提示 
 876 {
 877     char t;
 878     system("color f");//字体颜色为亮白色
 879     toxy(15,11);
 880     printf("--------------------------");
 881     toxy(15,12);
 882     printf("|    您确定要退出吗?    |");
 883     toxy(15,14);
 884     printf("|  1.确定      2.取消    |");
 885     toxy(15,15);
 886     printf("--------------------------");
 887     while(1)
 888     {
 889         t=getch();         //输入t
 890         switch(t)
 891         {
 892             case '1':
 893             system("cls");//清屏
 894             system("color f");//字体颜色为亮白色
 895             toxy(15,10);
 896             printf("正在安全退出....");
 897             sleep(1000);     //暂停1秒 
 898             system("cls");
 899             system("color f");//字体颜色为亮白色
 900             toxy(15,10);
 901             printf("已安全退出软件");
 902             toxy(15,12);
 903             printf("谢谢使用!");
 904             toxy(15,14);
 905             printf("bye-bye^_^");
 906             toxy(15,16);
 907             exit(0);  break; //终止程序 
 908             case '2':
 909             menu(); break;   //调用函数,进入菜单 
 910             default :break;
 911         }
 912     }
 913 }
 914 
 915 void menu()//菜单功能,显示各种操作功能
 916 { 
 917     system("cls");//清屏
 918     fflush(stdin);//清空缓存
 919     char x;
 920     int n;
 921     while(x!='h')
 922     {
 923         system("color f");//字体颜色为亮白色
 924         system("cls");
 925         toxy(15,4);
 926         printf("-----班级档案管理系统-----");
 927         toxy(15,5);
 928         printf("|                        |");
 929         toxy(15,6);
 930         printf("|    a.学生基本信息录入  |");
 931         toxy(15,7);
 932         printf("|                        |");
 933         toxy(15,8);
 934         printf("|    b.学生基本信息显示  |");
 935         toxy(15,9);
 936         printf("|                        |");
 937         toxy(15,10);
 938         printf("|    c.学生基本信息保存  |");
 939         toxy(15,11);
 940         printf("|                        |");
 941         toxy(15,12);
 942         printf("|    d.学生基本信息删除  |");
 943         toxy(15,13);
 944         printf("|                        |");
 945         toxy(15,14);
 946         printf("|    e.学生基本信息修改  |");
 947         toxy(15,15);
 948         printf("|                        |");
 949         toxy(15,16);
 950         printf("|    f.学生基本信息查询  |");
 951         toxy(15,17);
 952         printf("|                        |");
 953         toxy(15,18);
 954         printf("|    g.修  改   密   码  |");
 955         toxy(15,19);
 956         printf("|                        |");
 957         toxy(15,20);
 958         printf("|    h.退  出   系   统  |");
 959         toxy(15,21);
 960         printf("|                        |");
 961         toxy(15,22);
 962         printf("--------------------------");
 963         toxy(15,23);
 964         printf("请输入选择:");
 965         x=getch();
 966         if(x<'a'||x>'h'&&x<'a'||x>'h')//如果输入的范围不是在a-h或a-h
 967         {
 968             toxy(15,25);
 969             printf("输入选项有误,请重新输入");
 970             sleep(700);
 971             continue;
 972         }
 973         if(x>='a'&&x<='h')
 974             x=x+32;//将大写转换为小写
 975         switch(x)
 976         {
 977         case 'a':
 978             system("cls");
 979             system("color f");//字体颜色为亮白色
 980             toxy(15,8);
 981             printf("请输入录入学生人数:");
 982             scanf("%d",&n);
 983             input(n);
 984             break;
 985         case 'b':
 986             output();
 987                  break;
 988         case 'c':
 989             save(n);
 990                  break;
 991         case 'd':dele();
 992                  break;
 993         case 'e':
 994             change();
 995                 break;
 996         case 'f':invest();break;
 997         case 'g':change_password();
 998             break;
 999         case'h':
1000             over();
1001             break;
1002             
1003         default:break;
1004         }
1005     }
1006 }
1007 
1008 void save_password(char str[])//保存密码到password文本文件中
1009 {
1010     file*fp;
1011     fp=fopen("password","w");//打开文本文件
1012     if(fp==null)
1013     {
1014         printf("cannot open file");
1015     }
1016     if(fputs(str,fp)!=0)//使用fputs将密码写入密码文件,成功则返回0,否则返回非0值
1017     {
1018         printf("write error!");
1019     }
1020     fclose(fp);
1021 }
1022 
1023 void load()//密码登陆,通过验证读取文件的密码与用户输入的密码是否一致,从而进入系统
1024 {
1025     char _password[18];
1026     int p=3;//有3次验证密码机会
1027     do
1028     {
1029         system("cls");//清屏
1030         system("color f");//字体颜色为亮白色
1031         int i=0;
1032         char password[18];
1033         char str[]="hstc2018";//第一次登陆的初始密码
1034         char k;
1035         file*fp;
1036         if((fp=fopen("password","a+"))==null)
1037         {
1038             printf("cannot open file");
1039             exit(0);
1040         }
1041         fseek(fp,0l,seek_end);//把文件指针移到最后
1042         int size=ftell(fp);//用ftell函数测定文件位置标记的当前位置
1043         rewind(fp);//使文件位置标记重新返回文件的开头
1044         if(size==0)//如果文件的长度为空,则说明是第一次登陆使用
1045         {
1046             strcpy(password,str);//将初始密码复制到password数组
1047             save_password(password);//保存密码到文件中
1048         }
1049         else
1050             fgets(password,18,fp);//从文件中读取密码
1051         toxy(15,6);
1052         printf("----------学生档案管理系统---------\n");
1053         toxy(15,8);
1054         printf("请输入管理者密码:");
1055         for(;;)//此处为输入密码不回显操作 
1056         {
1057             k=getch();//输入k
1058             if(k=='\r') //如果输入k为回车,则跳出循环 
1059             {
1060                 break;
1061             }
1062             if(k=='\b')//如果输入k为删除键 
1063             {
1064                 if(i>0)//如果密码还没完全删除 
1065                 {
1066                     printf("\b");
1067                     printf(" ");
1068                     printf("\b");
1069                     i--;
1070                 }
1071             }
1072             else  //如果输入的k既不是删除键,也不是回车键
1073             {
1074                 _password[i]=k;
1075                 printf("*");
1076                 i++;
1077             }
1078         }
1079         _password[i]='\0';//在字符串结尾作结束符标记
1080         if(strcmp(password,_password)==0)//判断密码是否输入正确
1081         {
1082             system("cls");//清屏
1083             toxy(15,10);
1084             printf("正在登陆……");
1085             sleep(500);
1086             menu();
1087         }
1088         else
1089         {
1090             toxy(15,10);
1091             p--;
1092             printf("密码错误!您还有%d次机会",p);
1093             sleep(600);
1094         }
1095 
1096     }while(p>0);//验证机会不为0
1097     if(p==0)
1098     {
1099         system("cls");//清屏
1100         toxy(15,6);
1101         printf("机会已用完!");
1102         toxy(15,8);
1103     }
1104 }
1105 void change_password()//修改密码,需要输入旧密码和新密码,如果旧密码验证正确则可成功修改
1106 {
1107     system("cls");//清屏
1108     system("color f");//字体颜色为亮白色
1109     char str[18];
1110     file*fp;
1111     if((fp=fopen("password","r"))==null)//只用读,用r打开stu文件
1112     {
1113         printf("cannot open file");
1114         exit(0);
1115     }
1116     fgets(str,18,fp);//从fp指向的password文件读入字符串,存放到字符数组str中
1117     fclose(fp);
1118     do
1119     {
1120         system("cls");//清屏
1121         char password[18],newpassword[18],c,t;
1122         int i=0;
1123         toxy(15,6);
1124         printf("学生管理系统");
1125         toxy(15,8);
1126         printf("修改密码");
1127         toxy(15,10);
1128         printf("请输入旧密码:");
1129         for(;;)//此处为密码不回显操作
1130         {
1131             c=getch();
1132             if(c=='\r')//如果输入为回车键
1133             {
1134                 break;
1135             }
1136             else if(c=='\b')//如果输入c为删除键
1137             {
1138                 if(i>0) //如果密码还没完全删除
1139                 {
1140                     printf("\b");
1141                     printf(" ");
1142                     printf("\b");
1143                     i--;
1144                 }
1145             }
1146             else  //如果输入的c既不是删除键,也不是回车键
1147             {
1148                 password[i]=c;
1149                 printf("*");
1150                 i++;
1151             }
1152         }
1153         password[i]='\0';//在字符串结尾作结束符标记
1154         i=0;
1155         toxy(15,12);
1156         printf("请输入新密码:");
1157         for(;;)//此处为输入密码不回显操作
1158         {
1159             c=getch();
1160             if(c=='\r') //如果输入c为回车,则跳出循环
1161             {
1162                 break;
1163             }
1164             else if(c=='\b')//如果输入c为删除键
1165             {
1166                 if(i>0)//如果密码还没完全删除
1167                 {
1168                     printf("\b");
1169                     printf(" ");
1170                     printf("\b");
1171                     i--;
1172                 }
1173             }
1174             else
1175             {
1176                 newpassword[i]=c;
1177                 printf("*");
1178                 i++;
1179             }
1180         }
1181         newpassword[i]='\0';//在字符串结尾作结束符标记
1182         if(strcmp(str,password)==0)//如果旧密码与原来密码验证成功
1183         {
1184             save_password(newpassword);//保存新密码
1185             system("cls");//清屏
1186             toxy(15,6);
1187             printf("修改成功,即将返回主菜单……");
1188             sleep(600);
1189             menu();
1190         }
1191         else
1192         {
1193             system("cls");//清屏
1194                 toxy(15,8);
1195                 printf("-------------------------------------");
1196                 toxy(15,9);
1197                 printf("|                                   |");
1198                 toxy(15,10);
1199                 printf("|        密码错误!是否继续?        |");
1200                 toxy(15,11);
1201                 printf("|                                   |");
1202                 toxy(15,12);
1203                 printf("| 1.是                      2.否    |");
1204                 toxy(15,13);
1205                 printf("|                                   |");
1206                 toxy(15,14);
1207                 printf("-------------------------------------");
1208                 while(1)
1209                 {
1210                     t=getch();
1211                     if(t=='1')
1212                     {
1213                         system("cls");//清屏
1214                         break;
1215                     }
1216                     else if(t=='2')
1217                     {
1218                         menu();
1219                     }
1220                 }
1221         }
1222     }while(1);
1223 
1224 }
1225 int main()
1226 {
1227     load();
1228     return 0;
1229 }

4.总结与展望

完成了该课程设计后,对文件的输入输出有了更深一层的了解。还学会了利用windows.h函数库里的system函数去进行
清屏-system("cls"),
延时-sleep(),
设置字体颜色-system("color x")
删除文件-system("del xx")
复制文件-system("copy x1 x2")
虽然较为成功地完成了课程设计,但由于知识和时间的局限性,系统仍然存在缺陷。我认为此系统还可以链接数据库,增加用户权限等,这样能够使系统更具有实用性。

《大一C语言课程设计——班级档案管理系统.doc》

下载本文的Word格式文档,以方便收藏与打印。