【数据结构实习】学生信息管理系统2.0
Student.h
1 #include<iostream> 2 #include<string> 3 #include<fstream> 4 using namespace std; 5 const int MAXSIZE = 5;//最大班级数目 6 /* 7 学生结点,即每个学生的信息 8 */ 9 struct Stu_Node { 10 string name;//学生姓名 11 int sex;//性别 12 int age;//年龄 13 string stu_number;//学号 14 double *stu_grade;//科目成绩 15 double stu_average;//平均分 16 int stu_rank;//成绩排名 17 Stu_Node *next; 18 }; 19 /* 20 Class_Node结点即为班级,负责记录班级姓名以及每一个班级的链表的首地址 21 其中,科目为每一个班的通用信息 22 */ 23 struct Class_Node { 24 string *stu_lesson;//科目 25 int lesson_number;//科目数量 26 string class_name;//班级名称 27 Stu_Node *address;//首地址 28 int stu_total;//该班级学生人数 29 }; 30 31 class STUDENT { 32 private: 33 Class_Node *data; 34 int class_number;//班级个数 35 //初始化班级,形参列表为:班级名称,课程数,课程名称 36 void init_class(string class_name[]);//初始化班级 37 void init_grade(int location); 38 int search_className(string name);//返回班级地址下标,-1代表未找到 39 //添加学生信息,形参列表为:班级地址,学生数目 40 void add_stu(int location, int number, string name); 41 Stu_Node* search_stuName(string name, int location);//未找到返回空 42 void delete_stu(Stu_Node *&p, Stu_Node *&head); 43 void print(int loc);//打印学生信息 44 void average_grade(int loc); 45 void sort_select(int loc); 46 void exchange(Stu_Node *&p, Stu_Node *&q, int loc); 47 void print_grade(int loc); 48 bool grade_premisson(int loc); 49 void add_class(string name);//一次只能增加一个班级 50 void print_stu(Stu_Node *p); 51 void save_data(int mode); 52 bool save_premisson(); 53 public: 54 STUDENT(int class_number);//构造函数 55 STUDENT(bool flag,bool &result);//存档的构造函数 56 void deleteStu();//删除学生 57 void initSystem();//初始化系统 58 void addStu();//添加学生 59 void Print();//打印信息 60 void averageStu();//求平均成绩 61 void sortStu();//排序 62 void initGrade();//录入成绩 63 void printGrade();//打印学生成绩 64 void addClass();//添加班级 65 void searchStu();//查找学生 66 void saveData(int mode); 67 };
Student.cpp
1 #include "Student.h" 2 void STUDENT::print_stu(Stu_Node *p) 3 { 4 if (p == NULL) 5 { 6 cout << "未找到该学生!" << endl; 7 } 8 else 9 { 10 cout << "姓名: " << p->name << " 学号:" << p->stu_number; 11 cout << " 性别:"; 12 if (p->sex) 13 cout << "男"; 14 else 15 cout << "女"; 16 if (p->stu_average > 0) 17 { 18 cout << " 平均分:" << p->stu_average << " 排名:" << p->stu_rank << endl; 19 } 20 } 21 } 22 23 void STUDENT::save_data(int mode) 24 { 25 //存储操作,将用户录入的数据存入本地 26 fstream ofile; 27 if (mode == 1) 28 ofile.open("userDataBase.txt", ios::out); 29 else 30 ofile.open("EXdataBase.txt", ios::out); 31 if (ofile.fail()) 32 { 33 cout << "打开文件失败!" << endl; 34 return; 35 } 36 ofile << class_number << endl;//写入班级个数 37 for (int i = 0; i < class_number; i++) 38 { 39 ofile << data[i].class_name << " ";//写入班级名称 40 ofile << data[i].lesson_number << " "; 41 for (int j = 0; j < data[i].lesson_number; j++) 42 { 43 ofile << data[i].stu_lesson[j] << " ";//输出课程名称 44 } 45 ofile << endl; 46 } 47 for (int i = 0; i < class_number; i++)//写入学生信息 48 { 49 ofile << data[i].stu_total << endl;//学生个数 50 Stu_Node *p = data[i].address; 51 while (p != NULL) 52 { 53 ofile << p->name << " " << p->age << " " << p->sex << " " << p->stu_number << " "; 54 for (int j = 0; j < data[i].lesson_number; j++) 55 { 56 ofile << p->stu_grade[j] << " "; 57 } 58 ofile << endl; 59 p = p->next; 60 } 61 } 62 ofile.close(); 63 } 64 65 bool STUDENT::save_premisson() 66 { 67 for (int i = 0; i < class_number; i++) 68 { 69 if (data[i].stu_total == 0) 70 { 71 return false; 72 } 73 else 74 { 75 if (data[i].address->stu_rank == 0) 76 return false; 77 } 78 } 79 return true; 80 } 81 82 /* 83 函数名称:初始化班级 84 函数类型:私有函数 85 函数参数:班级名称的字符串 86 函数功能:初始化班级名称以及学科 87 函数原理: 88 1.分别给这class_number个班级进行赋值 89 2.为班级逐个指定课程和课程名称 90 */ 91 void STUDENT::init_class(string class_name[]) 92 { 93 for (int i = 0; i < class_number; i++) 94 { 95 data[i].class_name = class_name[i]; 96 cout << "请输入 " << class_name[i] << " 的课程数和课程名称:" << endl; 97 cin >> data[i].lesson_number; 98 data[i].stu_lesson = new string[data[i].lesson_number]; 99 for (int j = 0; j < data[i].lesson_number; j++) 100 { 101 cin >> data[i].stu_lesson[j]; 102 } 103 } 104 } 105 /* 106 函数名称:初始化学生成绩 107 函数类型:私有函数 108 函数参数:班级下标 109 函数功能:为班级学生的科目成绩赋值 110 函数原理: 111 1.判断对应班级的链表中学生的信息是否存在 112 2.通过遍历链表逐一赋值 113 */ 114 void STUDENT::init_grade(int location) 115 { 116 Stu_Node *p = data[location].address; 117 if (p == NULL) 118 { 119 cout << "错误!请检查该班级是否已录入学生信息!" << endl; 120 } 121 else 122 { 123 while (p != NULL) 124 { 125 cout << "请输入" << p->name << "的成绩:" << endl; 126 p->stu_grade = new double[data[location].lesson_number]; 127 for (int i = 0; i < data[location].lesson_number; i++) 128 { 129 cout << data[location].stu_lesson[i] << " "; 130 cin >> p->stu_grade[i]; 131 } 132 p = p->next; 133 } 134 } 135 } 136 /* 137 函数名称:查找班级 138 函数类型:私有函数 139 函数参数:班级名称,返回班级下标 140 函数功能:遍历数组查找指定班级名称,查找失败返回-1 141 函数原理: 142 1.简单查找,逐一比对 143 2.成功返回对应地址下标,否则返回-1 144 */ 145 int STUDENT::search_className(string name) 146 { 147 for (int i = 0; i < class_number; i++) 148 { 149 if (data[i].class_name == name) 150 { 151 return i; 152 } 153 } 154 return -1; 155 } 156 /* 157 函数名称:添加学生信息 158 函数类型:私有函数 159 函数参数:班级地址,添加学生数量,班级名称 160 函数功能:指定班级添加学生信息 161 函数原理: 162 1.判断是否存在该班级 163 2.若存在则增加班级人数并逐一赋值 164 3.若不存在则提示是否创建班级 165 否结束函数 166 是则判断是否可以添加 167 可以就添加班级信息 168 不可以提示已满 169 */ 170 void STUDENT::add_stu(int location, int number, string name) 171 { 172 if (location == -1)//未找到指定班级 173 { 174 cout << "未找到该班级,是否添加?(y/n)" << endl; 175 char option; 176 cin >> option; 177 if (option == 'y') 178 { 179 add_class(name); 180 location++; 181 } 182 else 183 return; 184 } 185 //下面开始赋值 186 data[location].stu_total = data[location].stu_total + number;//添加学生个数 187 cout << "请分别输入这" << number << "个学生的 姓名 年龄 性别(0/1) 学号 " << endl; 188 Stu_Node *end = data[location].address;//从首地址开始 189 if (end == NULL)//如果首地址为空则说明该班级人数为空,需要创建头节点 190 { 191 end = new Stu_Node(); 192 cin >> end->name; 193 cin >> end->age; 194 cin >> end->sex; 195 cin >> end->stu_number; 196 end->next = NULL; 197 number--;//头节点就是一个学生,故需要在总数里减少一个 198 data[location].address = end; 199 } 200 while (end->next != NULL)//移动到最后一个节点处 201 end = end->next; 202 for (int i = 0; i < number; i++) 203 { 204 //这里其实可以直接在结构体里定义一个构造函数可能会更简洁一点 205 Stu_Node *add = new Stu_Node; 206 cin >> add->name; 207 cin >> add->age; 208 cin >> add->sex; 209 cin >> add->stu_number; 210 add->next = NULL; 211 add->stu_average = 0; 212 add->stu_rank = 0; 213 add->stu_grade = NULL; 214 end->next = add; 215 end = add; 216 } 217 } 218 /* 219 函数名称:搜索学生 220 函数类型:私有函数 221 函数参数:学生姓名,班级地址 222 函数功能:查找指定班级的学生姓名 223 函数原理: 224 1.创建一个指针指向班级的首地址 225 2.若不为空进行遍历操作,相等则返回学生指针地址 226 3.未找到则返回空指针 227 */ 228 Stu_Node* STUDENT::search_stuName(string name, int location) 229 { 230 Stu_Node *p = data[location].address; 231 while (p != NULL) 232 { 233 if (p->name == name) 234 return p; 235 p = p->next; 236 } 237 return NULL; 238 } 239 /* 240 函数名称:删除学生 241 函数类型:私有函数 242 函数参数:班级的首地址,学生的地址 243 函数功能:删除学生信息 244 函数原理: 245 1.创建一个temp指针找到要删除的学生的前一个地址 246 2.进行删除操作 247 3.删除p指针 248 */ 249 void STUDENT::delete_stu(Stu_Node *& p, Stu_Node *&head) 250 { 251 Stu_Node *temp = head; 252 if (p == NULL) 253 { 254 cout << "未找到该学生或者该班级学生信息不存在!" << endl; 255 return; 256 } 257 258 if (temp == p && temp->next == NULL)//头结点 259 { 260 delete head; 261 head = NULL; 262 } 263 else if (temp == p && temp->next != NULL) 264 { 265 temp = temp->next; 266 head = temp; 267 delete p; 268 } 269 else 270 { 271 while (temp->next != p) 272 temp = temp->next; 273 temp->next = p->next; 274 delete p; 275 } 276 } 277 void STUDENT::print(int loc) 278 { 279 if (loc == -1) 280 { 281 cout << "未找到班级,请重试!" << endl; 282 return; 283 } 284 Stu_Node *p = data[loc].address; 285 while (p != NULL) 286 { 287 cout << "姓名: " << p->name << " 学号:" << p->stu_number; 288 cout << " 性别:"; 289 if (p->sex) 290 cout << "男"; 291 else 292 cout << "女"; 293 cout << endl; 294 p = p->next; 295 296 } 297 } 298 /* 299 函数名称:计算平均分 300 函数类型:私有函数 301 函数参数:班级地址 302 函数功能:计算指定班级的平均分 303 函数原理: 304 1.判断地址是否合法,不合法返回 305 2.地址合法 判断是否grade已经赋值,若没有赋值询问是否录入(调用函数) 306 3.获取该班级的科目总数并sum每个学生的成绩 307 */ 308 void STUDENT::average_grade(int loc) 309 { 310 if (loc == -1) 311 { 312 cout << "未找到班级,请重试" << endl; 313 return; 314 } 315 //判断是否为空 316 if (data[loc].address == NULL) 317 { 318 cout << "该班级的成绩还未录入,是否录入?(y/n)" << endl; 319 char option; 320 cin >> option; 321 if (option == 'y') 322 { 323 init_grade(loc); 324 } 325 else 326 { 327 return;//退出程序 328 } 329 } 330 //下面是计算 331 Stu_Node *p = data[loc].address; 332 while (p != NULL) 333 { 334 double sum = 0.0; 335 for (int i = 0; i < data[loc].lesson_number; i++) 336 { 337 sum = sum + p->stu_grade[i]; 338 } 339 p->stu_average = sum / data[loc].lesson_number; 340 p = p->next; 341 } 342 343 } 344 /* 345 函数名称:选择排序 346 函数类型:私有函数 347 函数参数:班级地址 348 函数功能:通过平均分来排序 349 函数原理: 350 1.判断地址是否合法,不合法返回 351 2.地址合法 进行排序 352 需要两个指针,一个指向当前比较,一个指向下一个交替进行 353 3.排序完以后由于学生信息已经是有序的了,故直接给rank赋值即可,按照1-n 354 355 */ 356 void STUDENT::sort_select(int loc) 357 { 358 if (loc == -1) 359 { 360 cout << "指定班级不存在OK?重试一次吧!" << endl; 361 return; 362 } 363 //需要两个指针 364 Stu_Node *p = data[loc].address; 365 Stu_Node *q; 366 while (p != NULL) 367 { 368 Stu_Node *tag = p; 369 q = tag->next; 370 while (q != NULL) 371 { 372 if (p->stu_average < q->stu_average) 373 { 374 exchange(p, q, loc); 375 } 376 q = q->next; 377 } 378 p = p->next; 379 } 380 //排序完成后对rank进行赋值 381 p = data[loc].address; 382 int rank_number = 1; 383 while (p != NULL) 384 { 385 p->stu_rank = rank_number; 386 rank_number++; 387 p = p->next; 388 } 389 } 390 /* 391 函数名称:交换函数 392 函数类型:私有函数 393 函数参数:两个结构指针,班级地址 394 函数功能:在排序中调用,负责交换两个结点的信息 395 函数原理: 396 1.为其中一个创建数据副本 397 2.两个数据进行赋值 398 3.副本对另一个数据进行赋值 399 */ 400 void STUDENT::exchange(Stu_Node *& p, Stu_Node *& q, int loc) 401 { 402 string temp_name = p->name; 403 int temp_sex = p->sex; 404 int temp_age = p->age; 405 string temp_stu_number = p->stu_number; 406 double *temp_grade = new double[data[loc].lesson_number]; 407 for (int i = 0; i < data[loc].lesson_number; i++) 408 { 409 temp_grade[i] = p->stu_grade[i]; 410 } 411 double temp_average = p->stu_average; 412 int temp_rank = p->stu_rank; 413 414 p->name = q->name; 415 p->sex = q->sex; 416 p->age = q->age; 417 p->stu_number = q->stu_number; 418 for (int i = 0; i < data[loc].lesson_number; i++) 419 { 420 p->stu_grade[i] = q->stu_grade[i]; 421 } 422 p->stu_average = q->stu_average; 423 p->stu_rank = q->stu_rank; 424 425 q->name = temp_name; 426 q->sex = temp_sex; 427 q->age = temp_age; 428 temp_stu_number = p->stu_number; 429 for (int i = 0; i < data[loc].lesson_number; i++) 430 { 431 q->stu_grade[i] = temp_grade[i]; 432 } 433 q->stu_average = temp_average; 434 q->stu_rank = temp_rank; 435 } 436 /* 437 函数名称:打印成绩 438 函数类型:私有函数 439 函数参数:班级地址 440 函数功能:打印班级对应学生的成绩信息 441 函数原理: 442 1.判断地址是否合法,不合法返回 443 2.地址合法 打印学生对应的成绩 444 */ 445 void STUDENT::print_grade(int loc) 446 { 447 if (loc == -1) 448 { 449 cout << "指定班级不存在,请重试!" << endl; 450 return; 451 } 452 Stu_Node *p = data[loc].address; 453 while (p != NULL) 454 { 455 cout << p->name << " "; 456 for (int i = 0; i < data[loc].lesson_number; i++) 457 { 458 cout << data[loc].stu_lesson[i] << ": " << p->stu_grade[i] << " ;"; 459 } 460 cout << "平均分:" << p->stu_average << " 排名:" << p->stu_rank << endl; 461 p = p->next; 462 } 463 } 464 /* 465 函数名称:打印许可 466 函数类型:私有函数 467 函数参数:班级地址 468 函数功能:判断是否可以打印学生成绩信息 469 函数原理: 470 1.判断地址是否合法,不合法返回 471 2.地址合法 判断 rank grade average 是否已被赋值 472 */ 473 bool STUDENT::grade_premisson(int loc) 474 { 475 if (loc == -1) 476 return false; 477 else if (data[loc].address != NULL) 478 { 479 if (data[loc].address->stu_rank != 0 && data[loc].address->stu_grade != NULL && data[loc].address->stu_average != 0) 480 return true; 481 else 482 return false; 483 } 484 else 485 return false; 486 } 487 488 /* 489 函数名称:构造函数 490 函数类型:共有函数 491 函数参数:班级数量 492 函数功能:创建类对象并为number数量个班级进行赋值操作 493 函数原理: 494 1.判断数目是否合法或者超出最大存储范围,不合法报错 495 2.地址合法 逐一初始化操作 496 */ 497 STUDENT::STUDENT(int class_number) 498 { 499 if (class_number < MAXSIZE&&class_number>0) 500 { 501 this->class_number = class_number; 502 data = new Class_Node[MAXSIZE]; 503 for (int i = 0; i < class_number; i++) 504 { 505 data[i].stu_lesson = NULL;//科目 506 data[i].lesson_number = 0;//科目数量 507 data[i].class_name = " ";//班级名称 508 data[i].address = NULL;//首地址 509 data[i].stu_total = 0;//该班级学生人数 510 } 511 } 512 else 513 { 514 cerr << "错误!超出最大范围或输入不合法!" << endl; 515 exit(1); 516 } 517 518 } 519 /* 520 函数名称:构造函数 521 函数类型:共有函数 522 函数参数:班级数量 523 函数功能:从本地读取进行赋值 524 函数原理: 525 读取根目录下的database.txt进行赋值操作 526 */ 527 STUDENT::STUDENT(bool flag,bool &result) 528 { 529 fstream ifile; 530 if (flag) 531 ifile.open("userDataBase.txt", ios::_Nocreate); 532 else 533 ifile.open("EXdataBase.txt", ios::in); 534 if (ifile.fail()) 535 { 536 result = false; 537 return; 538 } 539 ifile >> class_number;//从文件中读取班级个数 540 if (class_number < MAXSIZE&&class_number>0)//先对所有的进行一次初始化 541 { 542 data = new Class_Node[MAXSIZE]; 543 for (int i = 0; i < class_number; i++) 544 { 545 data[i].stu_lesson = NULL;//科目 546 data[i].lesson_number = 0;//科目数量 547 data[i].class_name = " ";//班级名称 548 data[i].address = NULL;//首地址 549 data[i].stu_total = 0;//该班级学生人数 550 } 551 } 552 else 553 { 554 result = false; 555 return; 556 } 557 for (int i = 0; i < class_number; i++)//初始化班级 558 { 559 ifile >> data[i].class_name; 560 ifile >> data[i].lesson_number; 561 data[i].stu_lesson = new string[data[i].lesson_number]; 562 for (int j = 0; j < data[i].lesson_number; j++) 563 { 564 ifile >> data[i].stu_lesson[j]; 565 } 566 } 567 int stu_number; 568 //录入学生信息 569 for (int i = 0; i < class_number; i++) 570 { 571 ifile >> stu_number; 572 data[i].stu_total = stu_number; 573 Stu_Node *end = data[i].address;//从首地址开始 574 if (end == NULL)//如果首地址为空则说明该班级人数为空,需要创建头节点 575 { 576 end = new Stu_Node(); 577 ifile >> end->name; 578 ifile >> end->age; 579 ifile >> end->sex; 580 ifile >> end->stu_number; 581 end->next = NULL; 582 end->stu_average = 0; 583 end->stu_rank = 0; 584 end->stu_grade = new double[data[i].lesson_number]; 585 stu_number--;//头节点就是一个学生,故需要在总数里减少一个 586 data[i].address = end; 587 for (int j = 0; j < data[i].lesson_number; j++) 588 { 589 ifile >> end->stu_grade[j]; 590 } 591 } 592 while (end->next != NULL)//移动到最后一个节点处 593 end = end->next; 594 for (int k= 0; k < stu_number; k++) 595 { 596 //这里其实可以直接在结构体里定义一个构造函数可能会更简洁一点 597 Stu_Node *add = new Stu_Node; 598 ifile>>add->name; 599 ifile >> add->age; 600 ifile >> add->sex; 601 ifile >> add->stu_number; 602 add->next = NULL; 603 add->stu_average = 0; 604 add->stu_rank = 0; 605 add->stu_grade = new double[data[i].lesson_number]; 606 for (int j = 0; j < data[i].lesson_number; j++) 607 { 608 ifile >> add->stu_grade[j]; 609 } 610 end->next = add; 611 end = add; 612 } 613 } 614 ifile.close(); 615 averageStu(); 616 sortStu(); 617 } 618 /* 619 函数名称:删除学生 620 函数类型:共有函数 621 函数参数:无 622 函数功能:调用对应私有函数进行删除操作 623 */ 624 void STUDENT::deleteStu() 625 { 626 cout << "请输入要删除的学生的班级:" << endl; 627 string class_name; 628 int loc; 629 cin >> class_name; 630 loc = search_className(class_name); 631 if (loc == -1) 632 { 633 cout << "错误!未找到该班级,请检查后重试!" << endl; 634 } 635 else 636 { 637 cout << "请输入学生姓名:"; 638 string stu_name; 639 cin >> stu_name; 640 Stu_Node *p = search_stuName(stu_name, loc); 641 if (p == NULL) 642 { 643 cout << "未找到该学生" << endl; 644 return; 645 } 646 else 647 { 648 delete_stu(p, data[loc].address); 649 cout << stu_name << "已经被删除!" << endl; 650 } 651 } 652 } 653 /* 654 函数名称:初始化系统 655 函数类型:共有函数 656 函数参数:无 657 函数功能:调用对应私有函数init_class进行班级初始化操作 658 */ 659 void STUDENT::initSystem() 660 { 661 cout << "请分别输入这" << class_number << "个班级名称:" << endl; 662 string *name_class; 663 name_class = new string[class_number]; 664 for (int i = 0; i < class_number; i++) 665 { 666 cin >> name_class[i]; 667 } 668 init_class(name_class);//初始化班级 669 670 } 671 /* 672 函数名称:添加学生信息 673 函数类型:共有函数 674 函数参数:无 675 函数功能:调用对应私有函数add_stu进行学生信息添加操作 676 */ 677 void STUDENT::addStu() 678 { 679 cout << "请输入要增添学生的班级和添加的人数" << endl; 680 string name_class; 681 int number; 682 cin >> name_class; 683 cin >> number; 684 add_stu(search_className(name_class), number, name_class); 685 } 686 /* 687 函数名称:打印学生信息 688 函数类型:共有函数 689 函数参数:无 690 函数功能:调用对应私有函数print进行学生信息打印操作 691 */ 692 void STUDENT::Print() 693 { 694 //打印,打印班级学生信息 695 cout << "请选择打印模式:1.打印指定班级学生信息 2.打印全部班级" << endl; 696 int option; 697 string name; 698 cin >> option; 699 switch (option) 700 { 701 case 1: 702 cout << "请输入要打印的班级:"; 703 cin >> name; 704 print(search_className(name)); 705 break; 706 case 2: 707 for (int i = 0; i < class_number; i++) 708 { 709 cout << data[i].class_name << "班: " << endl; 710 print(i); 711 } 712 break; 713 default: 714 cout << "您输入的选项有误,请重试!" << endl; 715 } 716 } 717 /* 718 函数名称:计算平均分 719 函数类型:共有函数 720 函数参数:无 721 函数功能:调用对应私有函数print进行学生信息打印操作 722 */ 723 void STUDENT::averageStu() 724 { 725 for (int i = 0; i < class_number; i++) 726 { 727 average_grade(i); 728 } 729 } 730 /* 731 函数名称:排序 732 函数类型:共有函数 733 函数参数:无 734 函数功能:调用对应私有函数sort_select进行学生成绩排序操作,必须执行成绩录入和求平均数 735 */ 736 void STUDENT::sortStu() 737 { 738 for (int i = 0; i < class_number; i++) 739 { 740 sort_select(i); 741 } 742 } 743 /* 744 函数名称:初始化成绩 745 函数类型:共有函数 746 函数参数:无 747 函数功能:调用私有函数init_grade 748 */ 749 void STUDENT::initGrade() 750 { 751 cout << "请选择录入模式 1.全部 2.输入指定班级" << endl; 752 int option; 753 cin >> option; 754 string name; 755 switch (option) 756 { 757 case 1: 758 for (int i = 0; i < class_number; i++) 759 { 760 cout << "请录入第" << i + 1 << " 个班级的学生成绩:" << endl; 761 init_grade(i); 762 } 763 break; 764 case 2: 765 cout << "请输入要录入成绩的班级:" << endl; 766 cin >> name; 767 init_grade(search_className(name)); 768 break; 769 default: 770 cout << "Oops!您输入的选项错误!" << endl; 771 } 772 } 773 /* 774 函数名称:打印班级学生成绩信息 775 函数类型:共有函数 776 函数参数:无 777 函数功能:打印成绩信息 778 函数原理: 779 调用私有函数print_grade 函数 780 支持指定班级打印和全部打印 781 */ 782 void STUDENT::printGrade() 783 { 784 cout << "请选择打印模式:1.打印指定班级学生成绩 2.打印全部班级" << endl; 785 int option; 786 string name; 787 cin >> option; 788 switch (option) 789 { 790 case 1: 791 cout << "请输入要打印的班级:"; 792 cin >> name; 793 if (grade_premisson(search_className(name))) 794 { 795 cout << "成绩未录入或者排序/平均分还未计算,请重试!" << endl; 796 return; 797 } 798 print_grade(search_className(name)); 799 case 2: 800 801 for (int i = 0; i < class_number; i++) 802 { 803 if (grade_premisson(i)) 804 { 805 cout << data[i].class_name << "班: " << endl; 806 print_grade(i); 807 } 808 } 809 break; 810 default: 811 cout << "您输入的选项有误,请重试!" << endl; 812 } 813 } 814 /* 815 函数名称:添加班级 816 函数类型:私有函数 817 函数参数:班级名称 818 函数功能:添加班级 819 函数原理: 820 1.逻辑判断系统空间是否足够即 class_number<MAXSIZE 821 2.若空间足够则赋值且class_number++ 822 */ 823 void STUDENT::add_class(string name) 824 { 825 if (class_number + 1 < MAXSIZE)//判断存储空间是否足够 826 { 827 data[class_number].class_name = name; 828 data[class_number].stu_total = 0; 829 data[class_number].address = NULL; 830 cout << "请输入 " << name << " 的课程数和课程名称:" << endl; 831 cin >> data[class_number].lesson_number; 832 data[class_number].stu_lesson = new string[data[class_number].lesson_number]; 833 for (int j = 0; j < data[class_number].lesson_number; j++) 834 { 835 cin >> data[class_number].stu_lesson[j]; 836 } 837 class_number++;//班级个数加1 838 } 839 else 840 { 841 cout << "已达到最大存储空间,添加失败" << endl; 842 } 843 } 844 /* 845 函数名称:添加班级 846 函数类型:共有函数 847 函数参数:无 848 函数功能:添加班级 849 函数原理: 850 调用私有函数add_class(string name)函数 851 */ 852 void STUDENT::addClass() 853 { 854 cout << "请输入要添加的班级的姓名:"; 855 string name; 856 cin >> name; 857 add_class(name); 858 cout << "添加班级功能执行完毕!" << endl; 859 } 860 void STUDENT::searchStu() 861 { 862 cout << "请输入要查询学生所属班级:" << endl; 863 string name_class, name_stu; 864 cin >> name_class; 865 int loc = search_className(name_class); 866 if (loc == -1) 867 { 868 cout << "您所输入的班级不存在,请重试!" << endl; 869 return; 870 } 871 cout << "请输入要查询的学生名称:" << endl; 872 cin >> name_stu; 873 Stu_Node *p = search_stuName(name_stu, loc); 874 print_stu(p); 875 } 876 877 void STUDENT::saveData(int mode) 878 { 879 if (save_premisson()) 880 { 881 cout << "保存数据会覆盖原来的数据,是否继续?(y/n)" << endl; 882 char option; 883 cin >> option; 884 if (option == 'y') 885 { 886 save_data(mode); 887 cout << "数据保存成功!" << endl; 888 } 889 else 890 { 891 return; 892 } 893 } 894 else 895 { 896 cout << "保存失败!请检查数据是否完整!" << endl; 897 } 898 }
源.cpp
1 #include"Student.h" 2 void mainMenu() 3 { 4 cout << "----------------Student Administration System-------------------" << endl; 5 cout << "| |" << endl; 6 cout << "| 1____________增加班级 |" << endl; 7 cout << "| 2____________添加学生信息 |" << endl; 8 cout << "| 3____________删除学生信息 |" << endl; 9 cout << "| 4____________录入学生成绩 |" << endl; 10 cout << "| 5____________更新成绩 |" << endl; 11 cout << "| 6____________输出学生信息 |" << endl; 12 cout << "| 7____________查询学生成绩 |" << endl; 13 cout << "| 8____________查找学生 |" << endl; 14 cout << "| 9____________保存数据 |" << endl; 15 cout << "| 0____________返回主界面 |" << endl; 16 cout << "| |" << endl; 17 cout << "----------------------------------------------------------------" << endl; 18 } 19 void welcomeMenu() 20 { 21 cout << "----------------------欢迎使用学生信息管理系统------------------" << endl; 22 cout << "| |" << endl; 23 cout << "| 1____________进入系统管理界面 |" << endl; 24 cout << "| 2____________读取本地存档 |" << endl; 25 cout << "| 0____________退出 |" << endl; 26 cout << "| |" << endl; 27 cout << "----------------------------------------------------------------" << endl; 28 } 29 void continueMenu() 30 { 31 cout << "----------------Student Administration System-------------------" << endl; 32 cout << "| |" << endl; 33 cout << "| 1____________输出学生信息 |" << endl; 34 cout << "| 2____________查询学生成绩 |" << endl; 35 cout << "| 3____________查找学生 |" << endl; 36 cout << "| 0____________返回主界面 |" << endl; 37 cout << "| |" << endl; 38 cout << "----------------------------------------------------------------" << endl; 39 } 40 int main() 41 { 42 welcomeMenu();//进入欢迎界面 43 int option; 44 45 while (1) 46 { 47 cin >> option; 48 if(option==1) 49 { 50 int number; 51 system("cls");//清一下屏 52 cout << "请输入要创建的班级个数:" << endl; 53 cin >> number; 54 STUDENT user(number); 55 user.initSystem();//初始化 56 int selection; 57 int end_misson = 0; 58 while (end_misson!=1) 59 { 60 mainMenu(); 61 cin >> selection; 62 switch (selection) 63 { 64 case 1: 65 user.addClass(); 66 break; 67 case 2: 68 user.addStu(); 69 break; 70 case 3: 71 user.deleteStu(); 72 break; 73 case 4: 74 user.initGrade(); 75 break; 76 case 5: 77 user.averageStu(); 78 user.sortStu(); 79 cout << "数据更新完毕!" << endl; 80 break; 81 case 6: 82 user.Print(); 83 break; 84 case 7: 85 user.printGrade(); 86 break; 87 case 8: 88 user.searchStu(); 89 break; 90 case 9: 91 user.saveData(1); 92 break; 93 case 0: 94 system("cls"); 95 welcomeMenu(); 96 end_misson = 1; 97 break; 98 default: 99 cout << "您的输入有误,请重试!" << endl;; 100 } 101 } 102 } 103 else if (option == 2) 104 { 105 int mode; 106 bool flag; 107 bool result = true;//读取存档结果,默认为true 108 cout << "请选择读取存档的模式:1.样例演示 2.用户存档(若不存在系统会自动退出!)" << endl; 109 while (1) 110 { 111 cin >> mode; 112 if (mode == 1) 113 { 114 flag = false; 115 break; 116 } 117 else if (mode == 2) 118 { 119 flag = true; 120 break; 121 } 122 else 123 { 124 cout << "您的输入有误!" << endl; 125 } 126 } 127 STUDENT loc(flag,result); 128 if (result) 129 { 130 int selection; 131 system("cls"); 132 int end_misson = 0; 133 while (end_misson != 1) 134 { 135 continueMenu(); 136 cin >> selection; 137 switch (selection) 138 { 139 case 1: 140 loc.Print(); 141 break; 142 case 2: 143 loc.printGrade(); 144 break; 145 case 3: 146 loc.searchStu(); 147 break; 148 case 0: 149 system("cls"); 150 welcomeMenu(); 151 end_misson = 1; 152 break; 153 default: 154 cout << "您输入的有误!" << endl; 155 } 156 } 157 } 158 else 159 { 160 cout << "文件损坏,读取失败!" << endl; 161 welcomeMenu(); 162 } 163 } 164 else if (option == 0) 165 { 166 return 0; 167 } 168 else 169 { 170 cout << "您输入的有误!" << endl; 171 } 172 } 173 174 } 175
EXdataBase.txt
2 计算机1171 6 大学英语 数字逻辑设计 毛概 图论与近世代数 数据结构 线性代数 计算机1172 7 大学英语 数字逻辑设计 毛概 图论与近世代数 数据结构 线性代数 创新创业基础 7 黄梓轩 19 1 117101 98.5 95 80 75 80 84 冯煜航 19 1 117102 85 92 85 62 70 58 姜贤彬 19 0 117103 85 77 88 99 80 98 朱歆婷 19 0 117104 89 85 84 87 85 81 李浩鹏 19 1 117105 85 84 82 70 62 59 唐紫涵 19 0 117106 90 85 92 91 84 88 田语晨 19 0 117107 92 85 88.5 94 70 81.5 5 洪丽芳 19 0 117201 91 87 88 88 95 75 85 冯鹏旭 18 1 117202 87 76 91 74 95 84 75 黄雨彤 19 0 117203 87 76 74 88 90 84 80 黄奕轩 19 1 117204 94 85 74 85 90 60.5 82 李彦龙 20 1 117205 94 83.5 75 84 78 89 100
userDataBase.txt
2 计算机1171 2 离散数学 线性代数 计算机1172 3 离散数学 数据结构 线性代数 2 小亮 19 1 117101 98 95 小明 19 1 117102 94 85 2 小芳 19 0 117201 91 87 88 小蔡 18 1 117202 87 76 91