学生成绩管理系统(完整版)

说明

一.设计报告的基本内容至少包括封面、 正文、 参考文献三部分。

1. 封面

封面按照模版填写,不得随意更改。

2. 正文

正文是设计报告的主体, 具体由以下几部分组成:

(1) 问题描述

描述要求编程解决的问题。

(2) 基本要求

给出程序要达到的具体的要求。

(3) 需求分析

以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:输入的形式和输入值的范围;输出的形式;程序所能达到的功能;测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

(4) 概要设计

说明本程序中主程序的流程以及各程序模块之间的层次(调用) 关系。

(5) 详细设计

实现概要设计中定义的所有数据类型,给出关键部分源程序的清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。

(6) 调试分析

内容包括:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析。

(7) 用户使用说明

说明如何使用你编写的程序, 详细列出每一步的操作步骤。

(8) 测试结果

设计测试数据,或具体给出测试数据。要求测试数据完整和严格,能全面地测试所设计程序的功能。

(9) 程序设计总结

(10) 参考文献

列出参考的相关资料和书籍。

一.问题描述

设计一个学生成绩管理程序,实现按班级完成对学生成绩信息的录入和修改,并用文件保 存。实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。

二.基本要求

(1)使用面向对象编程思想编写开发过程中需要用到的类,比如:Person 类,学生类继 承Person类,管理类实现对成绩信息的操作。

(2)输入和输出可以使用文本文件重定向输入(保存数据为磁盘文件);也可以使用标 准输入输出进行(提交时需要提交TXT格式输入数据)。比如 score.txt 的文件(包含 20 个 以上记录),包含数据信息有:学号(长度为10位,不允许重复)、姓名、班级(至少有 2 个) 、 课程成绩(至少 3 门);在运行程序时自动载入,若文件不存则创建一个空文件。平均成绩 不作为类成员,只是在程序运行时产生,也不须保存。

(3)程序运行时显示菜单功能,按班录入成绩,查询个人成绩,修改成绩,按班输出成绩 单,按平均分排序显示。

(4)基本功能要求具有增、删、改、查。 3

三.需求分析 

学生成绩管理在日常生活中运用十分广泛,因此需要用许多程序来对它们进行管理,此程序包含了学生成绩的录入,学生成绩的查询和排序,学生成绩添加及修改等。

按班级完成对学生成绩信息的录入和修改,并用文件保存。实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。

功能1

按班录入所有的学生成绩信息,管理员可以录入学生的班级,姓名,学号,各科成绩等信息。

功能2

查询个人成绩(拥有二级菜单:学号,姓名),可以通过输入学号或姓名查询学生成绩。

功能3

修改成绩(按学号,课程),管理员可以修改学生信息。

功能4

按班输出成绩单,管理员可以按照班级输出学生成绩单。

功能5

按平均分显示,可以直接按照平均分显示学生成绩。

功能6

退出系统

1.2用户界面的设计:

包含显示菜单,菜单包含:

  1. 选择功能,让用户输入数字进行选择
  2. 拥有二级菜单,方便用户进行查找功能
  3. 显示功能,用户在修改或插入信息后可以及时查看修改内容
  4. 输入提示功能,方便用户知道下一步如何进行操作
  5. 退出功能,用户保存完可以及时退出本系统

1.3环境需求分析

操作系统:Windows 7

开发软件:Dev-c++

1.4方法需求分析

设计一个学生成绩管理程序,实现按班级完成对学生成绩信息的录入和修改,并用文件保 存。实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。

四.概要设计

1.功能模块框图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Iqx5rW3MTAyNA==,size_20,color_FFFFFF,t_70,g_se,x_16

2.界面设计

(1)分别定义person类、student类和manager类。

(2)设计菜单menu实现所需的功能。

(3)编写main函数。

五.详细设计

1.类的处理

1.1定义person

#include <string>#include <thread>#include <vector>#include <iomanip>#include <fstream>#include <iostream>#include <Windows.h>using namespace std;class person {                       public:       person() = default;       person(string ID, string gender):              ID(ID), gender(gender){       }       string getID() {              return ID;       }       string getGender() {              return gender;       }       void initialized(const string& ID, const string& gender) {              this->ID = ID;              this->gender = gender;       }       void display() {              cout << setw(20) << left << ID << " "                     << setw(3) << left << gender << endl;       }private:       string ID;       string gender;};

1.2定义student类(继承person类)

lass student : public person{public:       student() = default;       student(string studyNum, string name, string classAndGrade, int mathScore, int chineseScore, int englishScore, string ID, string gender) :              person(ID, gender),     studyNum(studyNum), name(name), classAndGrade(classAndGrade), mathScore(mathScore),              chineseScore(chineseScore), englishScore(englishScore) {       }

1.3定义manager

class manager {public:       void loid(vector<student*>& students, int *linesS) {              //从txt文件中载入家电类的数据及日用品类的数据              ifstream ifileStudentScoreInfo;              ifileStudentScoreInfo.open("studentScoreInfo.txt", ios::in | ios::binary);              *linesS = CountLines2CRLF(ifileStudentScoreInfo, 1);              ifileStudentScoreInfo.seekg(0, ios::beg);              students.resize(*linesS);              student::initializeLoop(students, ifileStudentScoreInfo, *linesS);              ifileStudentScoreInfo.close();              //进度条线程              thread th(loiding);  th.join();       }       //获取文件行数的函数       int CountLines2CRLF(ifstream& ReadFile, short state) {              int n = 0;              char line[512] = { 0 };              if (ReadFile.fail()) {                     n = 0;              }              else {                     while (!ReadFile.eof()) {                            if (!state || 1 == state) {  //CR/CRLF                                   ReadFile.getline(line, 512, '
');                            }                            else {                                   ReadFile.getline(line, 512, '
');  //LF                            }                            n++;                     }                     //CRLF文件末尾手动添加了'
'#ifdef eofHasLF                     if (line[0] == '
') n -= 1;#endif                     if (state != 1)                            return n - 1;  //LF - 1 CR - 1                     return n;              }       }

1.4设计菜单

   

void menu() {              cout << "--------------------------------------" << endl;              cout << "|************************************|" << endl;              cout << "|       1. 显示所有学生信息          |" << endl;              cout << "|       2. 按平均分排序显示          |" << endl;              cout << "|       3. 按班输出成绩单            |" << endl;              cout << "|       4. 查询个人成绩              |" << endl;              cout << "|       5. 按班录入成绩              |" << endl;              cout << "|       6. 修改成绩                  |" << endl;              cout << "|       7. 按班排序                  |" << endl;              cout << "|       0. 退出                      |" << endl;              cout << "|* 请输入要执行的操作所对应的数字:";       }

   

1.5录入成绩

void titleMenu() {              cout << "__________________________________"                     << "_______________________________"                     << "_________________________" << endl;              cout << setw(12) << left << "|学号            " << setw(4) << left << "|姓名   "                     << setw(7) << left << "|班级    " << setw(6) << left << "|数学成绩 "                     << setw(6) << left << "|语文成绩 " << setw(6) << left << "|英语成绩 "                     << setw(20) << left << "|ID  " << setw(3) << left << "|性别 " << endl;       }       void AveragetitleMenu() {              cout << "___________________________________"                     << "_________________________________"                     << "_______________________________" << endl;              cout << setw(12) << left << "|学号            " << setw(4) << left << "|姓名   "                     << setw(7) << left << "|班级    " << setw(6) << left << "|数学成绩 "                     << setw(6) << left << "|语文成绩 " << setw(6) << left << "|英语成绩 "                     << setw(7) << left << "|平均成绩" << setw(20) << left << "|ID  " << setw(3) << left << "|性别 " << endl;       }       template<typename _T>       void swap(_T* a, _T* b) {              _T tmp = *a;              *a = *b;              *b = tmp;       }

1.6对成绩进行排序

//按平均分排序(冒泡排序)       template<typename _T1, typename _T2>       void sortByAverageScore(_T1& s) {              for (int i = s.size()-1; i > 0 ; --i) {                     for (int j = 0; j < i; ++j) {                            if (s[j]->sumOfScore() > s[j + 1]->sumOfScore())                                   swap<_T2>(&s[j], &s[j+1]);                     }              }       }       //循环将数据写回txt文件       void backToTxtLoop(vector<student*>& s, ofstream& f, int n) {              for (int i = 0; i < n; ++i)                     s[i]->backToTxt(f);       }       //打印所有学生信息       void printAllStuInfo(vector<student*>& s) {              person* p = nullptr;              for (size_t i = 0; i < s.size(); ++i) {                     s[i]->display(); p = s[i];                     p->display();              }       }       //打印平均成绩       void printAverangeScore(vector<student*>& s) {              person* p = nullptr;              for (size_t i = 0; i < s.size(); ++i) {                     s[i]->displayAverangeScore(); p = s[i];                     p->display();              }       }       //按班排序       template<typename _T1, typename _T2>       bool sortByClassAndGrade(_T1& s) {              for (int i = s.size()-1; i > 0; --i) {                     for (int j = 0; j < i; ++j) {                            if (s[j]->getClassAndGrade().compare(s[j + 1]->getClassAndGrade()) > 0)                                   swap<_T2>(&s[j], &s[j + 1]);                     }              }              return true;       }

1.7查询成绩

/通过学号查询个人成绩       void searchByStudentNumAndPrint(vector<student*>& s, string& num) {              person* p = nullptr;              student* st = nullptr;              for (size_t i = 0; i < s.size(); ++i) {                     p = s[i];                     if (st = s[i]->searchScoreByStudyNum(num))                            break;              }              AveragetitleMenu();              st->displayAverangeScore();              p->display();       }       //通过学号查询到个人然后录入成绩       bool writeScore(vector<student*>& s, string& num, int& mathScore, int& chineseScore, int& englishScore) {              student* st = nullptr;              for (size_t i = 0; i < s.size(); ++i) {                     if (st = s[i]->searchScoreByStudyNum(num))                            break;              }              if (nullptr == st)              return false;              return st->writeScore(mathScore, chineseScore, englishScore);       }       void ending(vector<student*>& students, int& linesS) {              //程序关闭之前将数据写回txt文件              ofstream ofileStudentScoreInfo("eleticalAppliance.txt", ios::trunc | ios::out | ios::binary);              backToTxtLoop(students, ofileStudentScoreInfo, linesS);              ofileStudentScoreInfo.close();              students.clear();       }};

1.8 main函数

int main() {manager* manag = new manager;int linesS = 0;vector<student*> students;//从文件载入数据manag->loid(students , &linesS);manag->menu();int input = 0;string stuNum;int mathScore;int chineseScore;int englishScore;while (cin >> input && input != 0) {switch (input) {case 1:cout << "1.原始数据 2.求平均值 请输入选项:" << endl;cin >> input;switch (input) {case 1:manag->titleMenu();manag->printAllStuInfo(students);system("pause");break;case 2:manag->AveragetitleMenu();manag->printAverangeScore(students);break;}break;case 2:manag->sortByAverageScore<vector<student*>, student*>(students);manag->AveragetitleMenu();manag->printAverangeScore(students);break;case 3:manag->sortByClassAndGrade<vector<student*>, student*>(students);manag->AveragetitleMenu();manag->printAverangeScore(students);break;case 4:cout << "请输入要查询的学生的学号:" << endl;cin >> stuNum;manag->searchByStudentNumAndPrint(students, stuNum);break;case 5:cout << "请输入要录入成绩的学生的学号及数学语文英语的成绩:" << endl;cin >> stuNum >> mathScore >> chineseScore >> englishScore;if (mathScore < 0 && mathScore > 100 && chineseScore < 0 &&chineseScore > 100 && englishScore < 0 && englishScore > 100) {cout << "成绩输入不规范,请重新输入:" << endl;break;}if (manag->writeScore(students, stuNum, mathScore, chineseScore, englishScore)) {cout << "成绩录入成功" << endl;manag->searchByStudentNumAndPrint(students, stuNum);}elsecout << "录入失败, 找不到此学生信息" << endl;manag->sortByClassAndGrade<vector<student*>, student*>(students);break;case 6:cout << "请输入要修改的学生的学号及数学语文英语的成绩:" << endl;cin >> stuNum >> mathScore >> chineseScore >> englishScore;if (mathScore < 0 && mathScore > 100 && chineseScore < 0 &&chineseScore > 100 && englishScore < 0 && englishScore > 100) {cout << "成绩输入不规范,请重新输入:" << endl;break;}if (manag->writeScore(students, stuNum, mathScore, chineseScore, englishScore)) {cout << "成绩修改成功" << endl;manag->searchByStudentNumAndPrint(students, stuNum);}elsecout << "修改失败, 找不到此学生信息" << endl;break;case 7:if (manag->sortByClassAndGrade<vector<student*>, student*>(students))cout << "排序成功" << endl;break;default:cout << "输入错误,请重新输入:" << endl;}manag->menu();}//将数据写回文件manag->ending(students, linesS);delete manag;system("pause");return 0;}

六.调试分析

(1)化繁为简,先将代码分为几个小板块,一个板块一个板块的进行输入和输出。

(2)一开始时定义的变量太多,容易记混淆,编译时出错很多,并且对变量名掌握的不是很牢固,反复修改了好多次。

(3)对函数的调用掌握的不牢固,期间又翻看之前的笔记和老师的课件。

(4)在写代码的过程中总是习惯性的弄错中文和英文的输入法,也会标点符号标错,反复检查后才发现问题并修改。

七.用户使用说明

1. 检测

用户使用时首先检测编译环境是否正确,正确后方可进行编译运行。

2. 查看菜单

用户运行后会看到菜单页

根据菜单页给出的信息选择用户所要执行的操作,需从0-7这八个数字中选择对应的操作即可进行下一步。

3.选择功能

3.1 显示出学生所有学生信息

选择1,实现此功能。并且出现第二菜单继续进行选择,“1”显示原始数据,“2”显示平均成绩。操作结束后按enter即可返回菜单。

3.2按平均分排序显示

选择2,实现此功能。将采用冒泡排序法,学生成绩将按照平均分的高低来进行排序和显示。

3.3按班输出成绩单

选择3,实现此功能。学生的成绩单将以班级为单位输出,用户可直接查看。

3.4查询个人成绩

选择4,实现此功能。用户可通过输入学生学号来查询该生成绩。

3.5按班录入成绩

选择5,实现此功能。用户需输入要录入成绩的学生的学号及数学、语文、英语的成绩。若成绩大于100或小于0,则会显示成绩输入不规范,请重新输入。按要求正确录入则会显示成绩录入成功,其余情况下会显示出录入失败, 找不到此学生信息。

3.6修改成绩

选择6,实现此功能。用户需输入要修改的学生的学号及数学、语文、英语的成绩。若修改后的成绩大于100或小于0,则会显示成绩输入不规范,请重新输入。按要求正确输入后则会显示成绩修改成功,其余情况下则会显示修改失败, 找不到此学生信息。

3.7按班排序

选择7,实现此功能。选择此项后学生的成绩将按班排序。学生信息正确后则会显示排序成功,否则会显示输入错误,需重新输入。

3.8 退出学生成绩管理系统

八.测试结果

1 .显示出学生所有学生信息

     1.1显示原始数据

     1.2求平均值

2按平均分排序显示

3按班输出成绩单

4查询个人成绩

   4.1 按学号查询

   4.2显示学生成绩

5按班录入成绩

6修改成绩

    6.1 输入修改后的成绩

     6.2 显示修改后的成绩

7按班排序

8 退出学生成绩管理系统

  • 47
    点赞
  • 447
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值