大一C语言课程设计——班级档案管理系统
记录我在大一第二学期期末做的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")
虽然较为成功地完成了课程设计,但由于知识和时间的局限性,系统仍然存在缺陷。我认为此系统还可以链接数据库,增加用户权限等,这样能够使系统更具有实用性。
下一篇: Pygame实战练习之保护单身狗游戏