欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-24 07:56:37
记录我在大一第二学期期末做的C语言课程毕业设计 1. 班级档案管理系统运用到的主要结构体 typedef struct birthday //出生日期{int year;int month;int day;}Birthday;struct file //学生档案信息{char id[20];//学号 ......

记录我在大一第二学期期末做的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")
虽然较为成功地完成了课程设计,但由于知识和时间的局限性,系统仍然存在缺陷。我认为此系统还可以链接数据库,增加用户权限等,这样能够使系统更具有实用性。