/*系统特色:(大牛勿笑) *颜色提示 *文字提示 *功能 */ 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 #include <windows.h> 6 #include <conio.h> 7 8 FILE *fp;//定义文件指针 9 10 int count;//这个count在这个系统中起到了莫大的作用,比较参参数,规定参数范围等 11 12 struct add 13 { 14 int SID; 15 char Name[10]; 16 int Age; 17 char Gender[10]; 18 double EntranxeScore; 19 }add1[750], student, *pointer;//定义结构体,最大不得超过750.但我对下面的动态分配还是不清楚 20 //add1 = (char*)malloc(sizeof(struct add)*100); 21 void color(const unsigned short color1) 22 { 23 if (color1 >= 0 && color1 <= 15) 24 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color1); 25 else 26 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); 27 }//定义一个表示颜色(0~15),当然我们也可以直接用system那种形式 28 29 void printinfor();//菜单函数 30 31 void wuyu_1();//按学号排序函数 32 void wuyu_2();//按总成绩排序函数 33 34 void function_1();//添加学生信息函数 35 void function_2();//删除学生信息函数 36 void function_3();//更改学生信息函数 37 void function_4();//查询学生信息函数 38 void function_5();//显示所有学生信息函数 39 void function_6();//附加功能选项函数 40 41 void findfunction_1();//通过学号查询函数 42 void findfunction_2();//通过学生姓名查询函数 43 void findfunction_3();//通过学生年龄查询函数 44 void findfunction_4();//通过学生分数查询函数 45 46 int main(void) 47 { 48 int num_1, k; 49 fp = fopen("D:\studyinfor.txt", "rb+");//打开文本/创建,进行操作 50 fread(add1, sizeof(struct add), 750, fp);//读取文本储存信息 51 for (k = 0; k<750; k++)//判断文本中储存人数(Age==0表示此处无数据) 52 { 53 if (add1[k].Age == 0) 54 { 55 break; 56 } 57 count++; 58 } 59 fclose(fp);//关闭指针 60 printinfor();//显示菜单 61 while (1)//使用者操作 62 { 63 do 64 { 65 printf("请输入要进行操作的序列号:"); 66 scanf("%d", &num_1); 67 } while (num_1<0 || num_1>6); 68 if (num_1 == 0)break; 69 70 switch (num_1) 71 { 72 case 1:function_1(); break; 73 case 2:function_2(); break; 74 case 3:function_3(); break; 75 case 4:function_4(); break; 76 case 5:function_5(); break; 77 case 6:function_6(); break; 78 } 79 system("cls"); 80 printinfor(); 81 } 82 return 0; 83 } 84 85 void checkSID(int j)//检查学号大小函数 86 { 87 while (add1[j].SID <= 0 || add1[j].SID>750) 88 { 89 color(4); 90 printf("warning:SID的取值范围在0~750,请重新输入. "); 91 color(15); 92 printf("请输入学生的学号:"); 93 scanf("%d", &add1[j].SID); 94 if (add1[j].SID > 0 && add1[j].SID <= 750) 95 { 96 break;//符合要求就结束循环 97 } 98 } 99 } 100 101 void checkSID_1(int m)//检查学号是否重复函数 102 { 103 int k; 104 for (k = 1; k < count; k++) 105 { 106 while (add1[k].SID == m) 107 { 108 color(4); 109 printf("学号重复,请重新输入. ");//这里不知道为什么不能检查第一个是否与输入的重复 110 color(15); 111 printf("请输入学号:"); 112 scanf("%d", &m); 113 } 114 } 115 } 116 //因为选择输入的方式是ab+,从新从i=0开始输入进去,所以想要通过 117 void checkName(int m, char Name[])//检查姓名函数 118 { 119 while (strlen(Name)>10) 120 { 121 color(4); 122 printf("warning:Name的字数最多为5,请重新输入. "); 123 color(15); 124 printf("请输入学生的姓名:"); 125 scanf("%s", &add1[m].Name); 126 } 127 } 128 129 void checkAge(int m)//检查年龄函数 130 { 131 while (add1[m].Age<0 || add1[m].Age>122) 132 { 133 color(4); 134 printf("warning:Age的取值范围在0~122,请重新输入,严肃对待! "); 135 color(15); 136 printf("请输入学生的年龄:"); 137 scanf("%d", &add1[m].Age); 138 } 139 } 140 141 void checkGender(int i, char a[])//检查性别函数 142 { 143 while (strcmp(a, "男") && strcmp(a, "女")) 144 { 145 color(4); 146 printf("warning:Gender只能是男或女,请重新输入. "); 147 color(15); 148 printf("请输入学生的性别:"); 149 scanf("%s", &add1[i].Gender); 150 } 151 } 152 153 checkEntranxeScore(int k) 154 { 155 while (add1[k].EntranxeScore<0 || add1[k].EntranxeScore>750) 156 { 157 color(4); 158 printf("warning:EntranxeScore的取值范围在0~750,请重新输入. "); 159 color(15); 160 printf("请输入学生的分数:"); 161 scanf("%lf", &add1[k].EntranxeScore); 162 } 163 } 164 165 void getName(char name[]) { 166 while (1) { 167 printf("请输入学生的姓名:"); 168 fflush(stdin);//刷新内存,现在对为什么要刷新内存还是迷迷糊糊的 169 scanf("%s", name); 170 if (strlen(name)<10) { 171 break; 172 } 173 } 174 }//刷新内存的方式还有很多种,大家可以在网上搜一下 175 176 void printinfor()//主菜单 177 { 178 system("date /t"); 179 system("TIME /t ");//显示当前时间,也可以用预定义宏printf("Time : %s ", __TIME__); 180 printf(" **************欢迎使用学生信息管理系统(当前有%d人)******** ", count); 181 printf(" * (1)添加学生信息 * "); 182 printf(" * (2)删除学生信息 * "); 183 printf(" * (3)更改学生信息 * "); 184 printf(" * (4)查询学生信息 * "); 185 printf(" * (5)显示所有学生信息 * "); 186 printf(" * (6)附加功能选项 * "); 187 printf(" * (0)退出学生系统 * "); 188 printf(" * 作者:liu * "); 189 printf(" ********************************************************* "); 190 } 191 192 void findfunction() 193 { 194 system("cls"); 195 system("date /t"); 196 system("TIME /t "); 197 printf(" ***************查询学生信息(当前有%d人)***************** ", count); 198 printf(" * (1)通过学生学号查询 * "); 199 printf(" "); 200 printf(" * (2)通过学生姓名查询 * "); 201 printf(" "); 202 printf(" * (3)通过学生年龄查询 * "); 203 printf(" "); 204 printf(" * (4)通过学生分数查询 * "); 205 printf(" ********************************************************* "); 206 } 207 208 void Morefunction() 209 { 210 system("cls"); 211 printf(" *******************附加功能***************** "); 212 printf(" * * "); 213 printf(" * (1)按学号进行整理 * "); 214 printf(" * * "); 215 printf(" * (2)按总分进行整理 * "); 216 printf(" * * "); 217 color(3); 218 printf(" *待开发... ... * "); 219 color(15); 220 printf(" ******************************************** "); 221 } 222 223 void inputmomo(int i) 224 { 225 printf("请输入学生的学号:"); 226 scanf("%d", &add1[i].SID); 227 checkSID(i); 228 checkSID_1(add1[i].SID); 229 color(8); 230 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 231 color(15); 232 printf("请输入学生的名字:"); 233 scanf("%s", &add1[i].Name); 234 checkName(i, add1[i].Name); 235 color(8); 236 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 237 color(15); 238 printf("请输入学生的年龄:"); 239 scanf("%d", &add1[i].Age); 240 checkAge(i); 241 color(8); 242 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 243 color(15); 244 printf("请输入学生的性别:"); 245 scanf("%s", &add1[i].Gender); 246 checkGender(i, add1[i].Gender); 247 color(8); 248 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 249 color(15); 250 printf("请输入学生的总成绩:"); 251 scanf("%lf", &add1[i].EntranxeScore); 252 checkEntranxeScore(i); 253 color(8); 254 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 255 color(15); 256 } 257 258 void function_1()//添加学生信息函数 259 { 260 int n, i, m = count; 261 if ((fp = fopen("D:\studyinfor.txt", "ab+")) == NULL)//检测文本是否正常打开 262 { 263 color(8); 264 printf("Can't open the file!"); 265 color(15); 266 system("pause"); 267 exit(1); 268 } 269 printf("请输入您要添加的学生信息人数:"); 270 scanf("%d", &n); 271 272 for (i = count; i<n + m; i++) 273 { 274 printf("请输入No.%d的信息. ", i + 1); 275 inputmomo(i - m);//录入学生信息 276 count++; 277 } 278 fwrite(add1, sizeof(struct add), n, fp); 279 rewind(fp); 280 color(3); 281 printf("添加中"); 282 Sleep(200); 283 printf("."); 284 Sleep(300); 285 printf("."); 286 Sleep(300); 287 printf(". "); 288 Sleep(300); 289 printf("."); 290 Sleep(300); 291 printf("."); 292 Sleep(300); 293 printf(". "); 294 color(2); 295 printf("添加成功! "); 296 printf("学生信息目录已更新. "); 297 fread(add1, sizeof(struct add), count, fp);//读取学生信息 298 color(15); 299 printf("___________________________________________________ "); 300 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 301 for (i = 0; i<count; i++)//打印更新的学生信息 302 { 303 if (add1[i].SID>0) 304 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore); 305 } 306 printf("|-------------------------------------------------| "); 307 fclose(fp); 308 printf("按任意键返回主菜单... .... "); 309 system("pause"); 310 } 311 312 void function_2()//删除学生信息 313 { 314 int m, k, i, j = 0; 315 if ((fp = fopen("D:\studyinfor.txt", "wb+")) == NULL) 316 { 317 printf("Can't open the file! "); 318 system("pause"); 319 exit(1); 320 } 321 if (count == 0) 322 { 323 color(4); 324 printf("The file is NULL!!! "); 325 color(15); 326 return; 327 } 328 printf("请输入你要删除的学生的学号:"); 329 scanf("%d", &m); 330 fread(add1, sizeof(struct add), count, fp); 331 for (k = 0; k<count; k++) 332 { 333 if (add1[k].SID == m) 334 { 335 printf("_____________________________________________________ "); 336 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 337 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[k].SID, add1[k].Name, add1[k].Age, add1[k].Gender, add1[k].EntranxeScore); 338 printf("|---------------------------------------------------| "); 339 for (i = k; i<count - 1; i++)//将要删除的数后面的函数往前进一格,占去要删除的部分 340 { 341 add1[i].SID = add1[i + 1].SID; 342 strcpy(add1[i].Name, add1[i + 1].Name); 343 add1[i].Age = add1[i + 1].Age; 344 strcpy(add1[i].Gender, add1[i + 1].Gender); 345 add1[i].EntranxeScore = add1[i + 1].EntranxeScore; 346 } 347 count--; 348 fwrite(add1, sizeof(struct add), count, fp); 349 rewind(fp);//使指针回到开头 350 fclose(fp); 351 color(3); 352 printf("删除中"); 353 Sleep(200); 354 printf("."); 355 Sleep(300); 356 printf("."); 357 Sleep(300); 358 printf(". "); 359 Sleep(300); 360 printf("."); 361 Sleep(300); 362 printf("."); 363 Sleep(300); 364 printf(". "); 365 Sleep(300); 366 color(2); 367 printf("删除成功!按任意键继续... ... "); 368 color(15); 369 j++; 370 } 371 } 372 if (j == 0) 373 { 374 color(4); 375 printf("查无此人! "); 376 color(15); 377 } 378 system("pause"); 379 } 380 381 void function_3()//更改学生信息 382 { 383 int m, k, j = 0; 384 if ((fp = fopen("D:\studyinfor.txt", "rb+")) == NULL) 385 { 386 printf("Can't open the file! "); 387 getch(); 388 exit(1); 389 } 390 if (count == 0) 391 { 392 color(4); 393 printf("The file is NULL!!! "); 394 color(15); 395 return; 396 } 397 printf("请输入你要更改的学生的学号:"); 398 scanf("%d", &m); 399 fread(add1, sizeof(struct add), count, fp); 400 for (k = 0; k<count; k++) 401 { 402 if (add1[k].SID == m) 403 { 404 printf("_____________________________________________________ "); 405 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 406 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[k].SID, add1[k].Name, add1[k].Age, add1[k].Gender, add1[k].EntranxeScore); 407 printf("|---------------------------------------------------| "); 408 printf("请输入你要修改的内容: "); 409 inputmomo(k); 410 rewind(fp); 411 fwrite(add1, sizeof(struct add), count, fp); 412 //rewind(fp); 413 fclose(fp); 414 color(2); 415 printf("更改成功!按任意键继续... ... "); 416 color(15); 417 j++; 418 } 419 } 420 if (j == 0) 421 { 422 color(4); 423 printf("查无此人! "); 424 color(15); 425 } 426 system("pause"); 427 } 428 429 void function_4()//查询学生信息 430 { 431 int m; 432 findfunction();//进入查询菜单 433 printf("请输入你查询的方式序列号:"); 434 scanf("%d", &m); 435 switch (m) 436 { 437 case 1:findfunction_1(); break; 438 case 2:findfunction_2(); break; 439 case 3:findfunction_3(); break; 440 case 4:findfunction_4(); break; 441 } 442 } 443 444 void function_5()//显示所有学生信息 445 { 446 int i; 447 if ((fp = fopen("D:\studyinfor.txt", "rb")) == NULL) 448 { 449 printf("Can't open the file! "); 450 getch(); 451 exit(1); 452 } 453 fread(add1, sizeof(struct add), count, fp); 454 if (count == 0) 455 { 456 color(4); 457 printf("The file is NULL! "); 458 color(15); 459 system("pause"); 460 return; 461 } 462 else { 463 printf("_____________________________________________________ "); 464 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 465 for (i = 0; i<count; i++) 466 { 467 if (add1[i].SID != 0) 468 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore); 469 } 470 printf("|---------------------------------------------------| "); 471 } 472 fclose(fp); 473 printf("按任意键返回主菜单... ... "); 474 system("pause"); 475 } 476 477 void function_6()//附加功能选项 478 { 479 Morefunction();//附加功能 480 int k; 481 do { 482 printf("请输入你要操作的序号:"); 483 scanf("%d", &k); 484 switch (k) 485 { 486 case 1:wuyu_1(); break; 487 case 2:wuyu_2(); break; 488 default: 489 { 490 color(4); 491 printf("输入有误,请重新输入! "); 492 color(15); 493 } 494 } 495 } while (k < 1 || k>2); 496 } 497 498 void findfunction_1()//学生学号查询 499 { 500 int m, n, i, j = 0; 501 printf("请输入你要搜索的学生学号范围: "); 502 printf("最小值:"); 503 scanf("%d", &m); 504 printf("最大值:"); 505 scanf("%d", &n); 506 fp = fopen("D:\studyinfor.txt", "rb+"); 507 fread(add1, sizeof(struct add), count, fp); 508 printf("_____________________________________________________ "); 509 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 510 for (i = 0; i<count; i++) 511 { 512 if (add1[i].SID >= m && add1[i].SID <= n) 513 { 514 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore); 515 printf("|---------------------------------------------------| "); 516 j++; 517 } 518 } 519 if (j == 0) 520 { 521 printf("无相关学生信息. "); 522 } 523 printf("按任意键返回主菜单... ... "); 524 system("pause"); 525 } 526 527 void findfunction_2()//学生姓名查询 528 { 529 int i, n = 0; 530 char name[10]; 531 getName(name);//输入学生姓名 532 rewind(fp); 533 fp = fopen("D:\studyinfor.txt", "rb+"); 534 fread(add1, sizeof(struct add), count, fp); 535 for (i = 0; i<count; i++) 536 { 537 if (strcmp(add1[i].Name, name) == 0) { 538 printf("_____________________________________________________ "); 539 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 540 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore); 541 printf("|---------------------------------------------------| "); 542 ++n; 543 break; 544 } 545 } 546 if (n == 0) 547 { 548 color(4); 549 printf("无相关学生信息! "); 550 color(15); 551 } 552 printf("按任意键返回主菜单... ... "); 553 system("pause"); 554 } 555 556 void findfunction_3()//学生年龄查询 557 { 558 int m, n, i, j = 0; 559 printf("请输入你要查询的学生年龄范围: "); 560 printf("最小值:"); 561 scanf("%d", &m); 562 printf("最大值:"); 563 scanf("%d", &n); 564 fp = fopen("D:\studyinfor.txt", "rb+"); 565 fread(add1, sizeof(struct add), count, fp); 566 printf("_____________________________________________________ "); 567 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 568 for (i = 0; i<count; i++) 569 { 570 if (add1[i].Age >= m && add1[i].Age <= n) 571 { 572 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i - 1].SID, add1[i - 1].Name, add1[i - 1].Age, add1[i - 1].Gender, add1[i - 1].EntranxeScore); 573 printf("|---------------------------------------------------| "); 574 j++; 575 } 576 } 577 if (j == 0) 578 { 579 printf("无相关学生信息! "); 580 } 581 printf("按任意键返回主菜单... ... "); 582 system("pause"); 583 } 584 585 586 void findfunction_4()//学生分数查询 587 { 588 int m, n, i, j = 0; 589 printf("请输入你要查询的学生总成绩范围: "); 590 printf("最小值:"); 591 scanf("%d", &m); 592 printf("最大值:"); 593 scanf("%d", &n); 594 fp = fopen("D:\studyinfor.txt", "rb+"); 595 fread(add1, sizeof(struct add), count, fp); 596 printf("_____________________________________________________ "); 597 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 598 for (i = 0; i<count; i++) 599 { 600 if (add1[i].EntranxeScore >= m && add1[i].EntranxeScore <= n) 601 { 602 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[i].SID, add1[i].Name, add1[i].Age, add1[i].Gender, add1[i].EntranxeScore); 603 printf("|---------------------------------------------------| "); 604 j++; 605 } 606 } 607 if (j == 0) 608 { 609 printf("无相关学生信息! "); 610 } 611 printf("按任意键返回主菜单... ... "); 612 system("pause"); 613 } 614 615 void ExchangeFunction(int m, int n)//交换数据结构中两个统一结构的不同下标的结构值 616 { 617 double max = 0; 618 int max_1 = 0; 619 max = add1[m].EntranxeScore; 620 add1[m].EntranxeScore = add1[n].EntranxeScore; 621 add1[n].EntranxeScore = max; 622 max_1 = add1[m].Age; 623 add1[m].Age = add1[n].Age; 624 add1[n].Age = max_1; 625 max_1 = add1[m].SID; 626 add1[m].SID = add1[n].SID; 627 add1[n].SID = max_1; 628 strcpy(student.Gender, add1[m].Gender); 629 strcpy(add1[m].Gender, add1[n].Gender); 630 strcpy(add1[n].Gender, student.Gender); 631 strcpy(student.Name, add1[m].Name); 632 strcpy(add1[m].Name, add1[n].Name); 633 strcpy(add1[n].Name, student.Name); 634 } 635 636 void wuyu_1()//按学号查询 637 { 638 if ((fp = fopen("D:\studyinfor.txt", "rb+")) == NULL) 639 { 640 printf("Can't open the file! "); 641 system("PAUSE"); 642 exit(1); 643 } 644 int m, n, j; 645 for (m = 0; m < count - 1; m++)//比较学号大小 646 { 647 for (n = m + 1; n < count; n++) 648 { 649 if (add1[n].SID < add1[m].SID) 650 { 651 ExchangeFunction(m, n);//交换一个结构体整体值 652 } 653 } 654 } 655 color(3); 656 printf("排序中"); 657 Sleep(200); 658 printf("("); 659 Sleep(300); 660 printf(";"); 661 Sleep(300); 662 printf("—"); 663 Sleep(300); 664 printf("_"); 665 Sleep(300); 666 printf("—"); 667 Sleep(300); 668 printf(") "); 669 Sleep(300); 670 color(6); 671 printf("排序成功!按任意键继续... ... "); 672 color(15); 673 printf("_____________________________________________________ "); 674 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 675 for (j = 0; j<count; j++) 676 { 677 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[j].SID, add1[j].Name, add1[j].Age, add1[j].Gender, add1[j].EntranxeScore); 678 printf("|---------------------------------------------------| "); 679 } 680 rewind(fp); 681 //fread(add1,sizeof(struct add),count,fp); 682 fwrite(add1, sizeof(struct add), count, fp); 683 fclose(fp); 684 system("pause"); 685 } 686 687 void wuyu_2()//按总分排序 688 { 689 if ((fp = fopen("D:\studyinfor.txt", "rb+")) == NULL) 690 { 691 printf("Can't open the file! "); 692 getch(); 693 exit(1); 694 } 695 int m, n, j; 696 for (m = 0; m < count - 1; m++)//比较总分大小 697 { 698 for (n = m + 1; n < count; n++) 699 { 700 if (add1[n].EntranxeScore > add1[m].EntranxeScore) 701 { 702 ExchangeFunction(m, n);//交换两个结构体整体值 703 } 704 } 705 } 706 color(3); 707 printf("排序中"); 708 Sleep(200); 709 printf("("); 710 Sleep(300); 711 printf("*"); 712 Sleep(300); 713 printf("— "); 714 Sleep(300); 715 printf("з"); 716 Sleep(300); 717 printf("—"); 718 Sleep(300); 719 printf(") "); 720 Sleep(300); 721 color(6); 722 printf("排序成功!按任意键继续... ... "); 723 color(15); 724 printf("_____________________________________________________ "); 725 printf("| 学号 | 姓名 | 年龄 | 性别 | 总分成绩 | "); 726 for (j = 0; j<count; j++) 727 { 728 printf(" %.2d %-6s %-3d %-3s %5.2lf ", add1[j].SID, add1[j].Name, add1[j].Age, add1[j].Gender, add1[j].EntranxeScore); 729 printf("|---------------------------------------------------| "); 730 } 731 rewind(fp); 732 //fread(add1,sizeof(struct add),count,fp);加了这句,无法储存,难道会改变内部指针位置? 733 fwrite(add1, sizeof(struct add), count, fp); 734 fclose(fp); 735 system("pause"); 736 }