【数据结构实习】学生信息管理系统2.0 - Go语言中文社区

【数据结构实习】学生信息管理系统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_ra
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_30799995/article/details/95298192
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-31 11:53:21
  • 阅读 ( 1076 )
  • 分类:研发管理

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢