#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include<math.h> #include<io.h> #include <stdlib.h> using namespace std; //定义学生节点 typedef struct studentNode{ string number; string name; int math; int english; int chinese; struct studentNode *next; }*student; int countOfStudent; FILE * fp; void ShowAllStudentInfo(student& studentLink); //输入学生信息 void InputStudentInfo(student& studentLink){ cout << "************欢迎进入学生信息创建菜单*************" << endl; cout << "1.重新创建" << endl; cout << "2.引用已有数据" << endl; int choice = 0; int choice1 = 0; studentLink->next = nullptr; cin >> choice; switch (choice){ case 1:{ cout << "请依次输入学号,姓名,数学成绩,英语成绩,语文成绩:" << endl; countOfStudent = 0; while (1){ student stu = new studentNode; countOfStudent = countOfStudent + 1; cin >> stu->number >> stu->name >> stu->math >> stu->english >> stu->chinese; cout << stu->number << stu->name << stu->math << stu->english << stu->chinese; //头插法 stu->next = studentLink->next; studentLink->next = stu; cout << "1.继续输入 2.已完成" << endl; cin >> choice1; if (choice1 == 2) { //输入完成后将学生信息写入文件 fp = fopen("output\studentFile.txt", "w"); fprintf(fp, "%d ", countOfStudent); student p = studentLink->next; while (p){ fprintf(fp, "%s %s %d %d %d ", p->number.c_str(), p->name.c_str(), p->math, p->english, p->chinese); cout << p->number << p->name << p->math << p->english << p->chinese; p = p->next; } fclose(fp); break; } else{ cout << "请依次输入学号,姓名,数学成绩,英语成绩,语文成绩:" << endl; } } break; } case 2: //到指定文件夹读取数据 int exists = 0; if (!access("output\studentFile.txt", 0)) exists = 1; char a[20]; char b[30]; if (exists) { fp = fopen("output\studentFile.txt", "rt"); fscanf(fp, "%d", &countOfStudent); for (int i = 0; i<countOfStudent; i++) { student stu = new studentNode; fscanf(fp, "%s %s %d %d %d ", b, a, &stu->math, &stu->english, &stu->chinese); stu->number = b; stu->name = a; //头插法 stu->next = studentLink->next; studentLink->next = stu; } cout << "已加载完成!" << "已加载" << countOfStudent << "条数据!" << endl; //cout<<stu1.name<<stu1.number<<stu1.chinese<<stu1.math<<stu1.english<<endl; } else{ cout << "暂无本地数据,请手动创建!" << endl; } fclose(fp); break; } } //显示所有学生信息 void ShowAllStudentInfo(student& studentLink){ cout << "************欢迎进入学生信息浏览菜单*************" << endl; student p = studentLink->next; cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; while (p){ cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; p = p->next; } } //数据的排序,并显示 void SortAllStudentInfo(student& studentLink){ cout << "************欢迎进入学生信息顺序显示菜单*************" << endl; int choice = 0; cout << "1 按学号升序显示 2 按学号降序显示 " << endl; cout << "请输入您的选择:" << endl; cin >> choice; switch (choice){ case 1:{ student p;//循环指示变量,用于指向无序表的当前待插入元素 student q;//q和r用于对已有有序序列进行循环遍历 student r; student u;//临时变量,用于控制循环 p = studentLink->next; studentLink->next = nullptr; while (p){ //每次循环开始前将指针指向最开始的地方 r = studentLink; q = studentLink->next; while ((q != nullptr) && q->number < p->number){ r = q; q = q->next; } //保存下一个需插入的点 u = p->next; //保存好了之后进行插入 p->next = r->next; r->next = p; //插入完成之后,将p指回未排序序列 p = u; } { } { fp = fopen("output\studentAscend.txt", "w"); cout << "************学生信息升序浏览*************" << endl; student p = studentLink->next; cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; while (p){ cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; fprintf(fp, "%s %s %d %d %d ", p->number.c_str(), p->name.c_str(), p->math, p->english, p->chinese); p = p->next; } } fclose(fp); break; } case 2:{ student p, q, r, u; p = studentLink->next; studentLink->next = nullptr; while (p){ r = studentLink; q = studentLink->next; while ((q != nullptr) && q->number>p->number){ r = q; q = q->next; } u = p->next; p->next = r->next; r->next = p; p = u; } { fp = fopen("output\studentDescend.txt", "w"); cout << "************学生信息降序浏览*************" << endl; student p = studentLink->next; cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; while (p){ cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; fprintf(fp, "%s %s %d %d %d ", p->number.c_str(), p->name.c_str(), p->math, p->english, p->chinese); p = p->next; } } fclose(fp); break; } } } //学生信息查询 void SearchStudentInfo(student& studentLink){ cout << "************欢迎进入学生信息查询菜单*************" << endl; while (1) { cout << "1.按照学号查询。 2.按照姓名查询" << endl; int choice = 0; int choice1 = 0; cin >> choice; switch (choice){ case 1: { student p = studentLink->next; cout << "1.按照学号精确查询。 2.按照学号模糊查询" << endl; cin >> choice1; switch (choice1){ case 1: { cout << "请输入精确学号:" << endl; string num; cin >> num; bool flag = false; while (p){ if (p->number == num) { flag = true; cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; break; } p = p->next; } if (!flag) { cout << "当前学号不存在" << endl; } break; } case 2: { cout << "请输入前缀学号:" << endl; string num; bool flag = false; cin >> num; while (p){ if (p->number.find(num, 0) == 0) { if (!flag) { cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; }; cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; flag = true; } p = p->next; } if (!flag) { cout << "当前学号不存在" << endl; } break; } } break; } case 2: { student p = studentLink->next; cout << "1.按照姓名精确查询。 2.按照姓氏模糊查询" << endl; cin >> choice1; switch (choice1){ case 1: { cout << "请输入精确姓名:" << endl; string name; cin >> name; bool flag = false; while (p){ if (p->name == name) { cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; flag = true; break; } p = p->next; } if (!flag) { cout << "当前姓名不存在" << endl; } break; } case 2: { cout << "请输入前缀姓氏:" << endl; string name; bool flag = false; cin >> name; while (p){ if (p->name.find(name, 0) == 0) { if (!flag) { cout << "学号: " << "姓名: " << "数学: " << "英语: " << "语文: " << endl; }; cout << p->number << " " << p->name << " " << p->math << " " << p->english << " " << p->chinese << endl; flag = true; } p = p->next; } if (!flag) { cout << "当前姓氏不存在" << endl; } break; } } break; } } int choice3 = 0; cout << "1.继续查询。 2.查询完成" << endl; cin >> choice3; if (choice3 == 2) { break; } } } //对学生信息进行修改 void ModifyStudentInfo(student& studentLink){ cout << "************欢迎进入学生信息修改菜单*************" << endl; fp = fopen("output\studentFile.txt", "rt"); fscanf(fp, "%d", &countOfStudent); fclose(fp); while (1){ cout << "1.添加 2.删除 3.修改" << endl; int choice = 0; cout << "请输入您想要的操作:" << endl; cin >> choice; switch (choice){ case 1: { cout << "请依次输入学号,姓名,数学成绩,英语成绩,语文成绩:" << endl; while (1){ student stu = new studentNode; countOfStudent = countOfStudent + 1; cin >> stu->number >> stu->name >> stu->math >> stu->english >> stu->chinese; cout << stu->number << stu->name << stu->math << stu->english << stu->chinese; //头插法 stu->next = studentLink->next; studentLink->next = stu; cout << "1.继续输入 2.已完成" << endl; int choice1 = 0; cout << "请输入选择:" << endl; cin >> choice1; if (choice1 == 2) { break; } } break; } case 2: { cout << "请输入学生学号" << endl; string number1; cin >> number1; bool flag = false; student p = studentLink; student p1 = p->next; while (p){ if (p1) { if (p1->number == number1) { cout << "find" << endl; student p2 = p1; p->next = p2->next; free(p2); flag = true; countOfStudent--; } } p = p->next; if (p) { p1 = p->next; } } if (!flag) { cout << "无此学生!" << endl; } break; } case 3: { cout << "请输入需修改学生的学号:" << endl; string number; cin >> number; bool flag = false; student p = studentLink->next; while (p){ if (p->number == number) { flag = true; cout << "1 修改学号 2 修改姓名 3 修改数学成绩 4 修改英语成绩 5 修改英语成绩" << endl; int cho = 0; cin >> cho; switch (cho){ case 1:{ cout << "请输入新的学号:" << endl; string num; cin >> num; p->number = num; break; } case 2:{ cout << "请输入新的姓名:" << endl; string name; cin >> name; p->name = name; break; } case 3:{ cout << "请输入新的数学成绩:" << endl; int num; cin >> num; p->math = num; break; } case 4:{ cout << "请输入新的英语成绩:" << endl; int num; cin >> num; p->english = num; break; } case 5:{ cout << "请输入新的语文成绩:" << endl; int num; cin >> num; p->chinese = num; break; } } } p = p->next; } if (!flag) { cout << "该学号不存在" << endl; } break; } } cout << "1 继续修改 2 修改完成" << endl; int choice7 = 0; cin >> choice7; if (choice7 == 2) { student p = studentLink->next; cout << "sssssss" << endl; //输入完成后将学生信息写入文件 fp = fopen("output\studentFile.txt", "w"); fprintf(fp, "%d ", countOfStudent); while (p){ fprintf(fp, "%s %s %d %d %d ", p->number.c_str(), p->name.c_str(), p->math, p->english, p->chinese); p = p->next; } fclose(fp); break; } } } //数据统计功能 void StatisticStudentInfo(student& studentLink){ cout << "1 学生平均分及总分 2 每门课程平均分机最高分最低分" << endl; int choice = 0; cout << "请输入您的选择:" << endl; cin >> choice; switch (choice){ case 1: { //计算每个学生的平均分和总分 fp = fopen("output\studentAverageScoreAndTotal.txt", "wb"); student p = studentLink->next; int avg = 0; int total = 0; cout << "学号: " << "姓名: " << "平均分: " << "总分: " << endl; while (p){ avg = (p->math + p->english + p->chinese) / 3; total = p->math + p->english + p->chinese; fprintf(fp, "%s %s %ld %ld ", p->number.c_str(), p->name.c_str(), avg, total); cout << p->number << " " << p->name << " " << avg << " " << total << endl; p = p->next; } fclose(fp); break; } case 2: { int mathMax = 0; int mathMin = 65535; int mathAvg = 0; int englishMax = 0; int englishMin = 65535; int englishAvg = 0; int chineseMax = 0; int chinesMin = 65535; int chineseAvg = 0; int countOfM = 0; student p = studentLink->next; while (p){ //遍历数学成绩 if (p->math>mathMax){ mathMax = p->math; } if (p->math<mathMin){ mathMin = p->math; } mathAvg += p->math; if (p->english>englishMax) { englishMax = p->english; } if (p->english<englishMin) { englishMin = p->english; } englishAvg += p->english; if (p->chinese >chineseMax) { chineseMax = p->chinese; } if (p->chinese<chinesMin) { chinesMin = p->chinese; } chineseAvg += p->chinese; countOfM++; p = p->next; } fp = fopen("output\studentMath.txt", "wb"); fprintf(fp, "数学: 最高分:%d 最低分: %d 平均分: %d ", mathMax, mathMin, mathAvg / countOfM); cout << "数学: " << "最高分: " << mathMax << " 最低分: " << mathMin << " 平均分: " << mathAvg / countOfM << endl; fclose(fp); fp = fopen("output\studentEglish.txt", "wb"); fprintf(fp, "英语: 最高分:%d 最低分: %d 平均分: %d ", englishMax, englishMin, englishAvg / countOfM); cout << "英语: " << "最高分: " << englishMax << " 最低分: " << englishMax << " 平均分: " << englishAvg / countOfM << endl; fclose(fp); fp = fopen("output\studentChinese.txt", "wb"); fprintf(fp, "语文: 最高分:%d 最低分: %d 平均分: %d ", chineseMax, chinesMin, chineseAvg / countOfM); cout << "语文: " << "最高分: " << chineseMax << " 最低分: " << chinesMin << " 平均分: " << chineseAvg / countOfM << endl; fclose(fp); break; } } } int main(){ cout << "****************************欢迎来到学生信息管理系统***************************" << endl; cout << "1.输入学生信息" << endl; cout << "2.查询所有学生信息" << endl; cout << "3.排序显示学生信息" << endl; cout << "4.查询某一个学生具体信息" << endl; cout << "5.插入新信息,修改信息,删除信息" << endl; cout << "6.数据统计" << endl; cout << "7.退出" << endl; int choice = 0; student studentLink = new studentNode; //studentLink->next = nullptr; while (1){ cout << "主菜单---请输入您的选择:"; cin >> choice; switch (choice){ case 1: InputStudentInfo(studentLink); break; case 2: ShowAllStudentInfo(studentLink); break; case 3: SortAllStudentInfo(studentLink); break; case 4: SearchStudentInfo(studentLink); break; case 5: ModifyStudentInfo(studentLink); break; case 6: StatisticStudentInfo(studentLink); break; case 7: exit(0); break; } } getchar(); return 0; }