【数据结构实习】学生信息管理系统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
View Code

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 
View Code
原文地址:https://www.cnblogs.com/robotpaul/p/10230355.html