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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
原文链接:https://blog.csdn.net/weixin_30799995/article/details/95298192
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
- 发表于 2021-05-31 11:53:21
- 阅读 ( 1076 )
- 分类:研发管理