Bootstrap

C++课程设计:学生管理系统设计

高级程序设计课程设计

一、教学目标和基本要求

    本课程全面系统的学习面向对象程序设计的基本概念,基本语法和编程方法。正确理解掌握C++面向对象程序设计的基本特性:类,对象,继承与派生,多态,虚函数,模板,流类库等。遵循软件过程的各个环节进行系统分析、设计、实现、集成、测试,了解当前常用的软件开发工具(Visual 2017),培养学生解决实际问题的能力。

二、考核方式及办法:

    完成包括从概要设计、详细设计、代码编写、程序调试、运行在内的一系列程序设计及文档撰写,要求系统调试成功、可正常运行,文档规范完整。

三、课程设计任务书

         题目:学生管理系统设计

功能:学生管理系统设计,每个学生是一条记录,包括姓名、学号、性别、出生年月、专业、班级、家庭地址、宿舍号码等。系统要求实现以下功能:

1、输入功能:录入学生信息(包括学生学号、姓名、性别、出生年月、专业等);

2、显示功能:完成学生记录的显示。

3、查找功能:完成按学号或姓名查找学生的相关记录,并显示。

分步实施:

1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数。

2、建立一个文件,学生的信息写入文件中(人数利用宏定义设定)并能显示于屏幕上。

3、完成上述显示、查找(姓名,性别等)、修改等功能。

4进一步要求,修改记录设置密码操作。

要求:1、用C++语言实现程序设计;

2、利用C++的对象数组实现学生信息的数据结构设计;

3、系统的各个功能模块要求用函数的形式实现;

4、界面友好(良好的人机交互),程序加必要的注释。

课程设计实验报告要求:

1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分 。

2、实验总结报告:流程图、主要源程序代码、测试情况及调试中问题与解决方案、

小结等。

目 录

摘  要 I

1. 系统需求分析 1

1.1 性能要求分析 1

1.2 功能分析 1

1.3 系统E-R图 1

2.系统总体设计 3

3.系统详细设计 3

3.1类模块设计 3

3.2主要算法设计 4

4.系统调试与运行 5

4.1  录入学生信息 5

4.2   显示学生信息 5

4.3    查询学生信息 6

4.4    修改学生信息 7

4.5  添加学生信息 7

4.6   排序学生信息 8

4.7   删除学生信息 9

4.8   保存学生信息 9

5. 系统分析(包含结果分析和改进措施) 10

1.1 结果分析 10

1.2 改进措施 10

6.总结 11

参考文献: 12

摘  要

学生成绩管理系统是典型的信息管理系统,是学校教务管理的重要组成部分,其处理信息量很大。它对教学管理和学校的决策者都非常重要,它给学校教学管理提供了极大的方便,提高了工作效率。但是一直以来人们用传统人工的方式管理文件文档,这种管理方式效率低,保密性差。

本课程设计是用C++实现对学生的成绩管理作一个简单的模拟,实质是建立学生类,由学号,姓名,班级,以及大学英语一,大学英语二,大学英语三,采用菜单选择操作方式完成7项功能分别写成7个函数,录入、显示、查询、修改、添加、排序、删除七大基本操作。

通过对学生成绩管理系统的制作,能够让使用者迅速地对学生的成绩做各项处理和显示,最终的到想要的信息,方便且易于操作。

关键词:学生成绩管理系统 C++ 类 

  1. 系统需求分析

1.1 性能要求分析

随着学校学生数量的不断增加,仅靠传统的学生管理方法,不仅效率低,而且还会浪费大量的人力物力,这已经远远不能满足学校对学生成绩管理的需要。学生成绩管理系统从学生成绩管理现状出发,以实现学生成绩管理为设计目标,加以强大的数据库管理功能,可以方便对学生信息进行管理。本系统在设计时应该满足以下几点:

  1. 对学生信息操作简单,可以方便地进行添加,修改和输出操作。
  2. 采用人机对话的操作方式,信息查询灵活、方便、快捷、准确,数据存储安全、可靠。
  3. 对用户输入的数据,系统进行严格地数据检测,信息查重等,尽可能排除人为错误。
  4. 可以根据需要灵活地调整信息。
  5. 系统最大限度地实现了易维护性和易操作性。
  6. 系统运行稳定、安全、可靠。

1.2 功能分析

在学生成绩管理系统中,主要有以下功能:

  1. 系统以菜单方式工作。
  2. 能够注册学生的学号、姓名、大学英语一、大学英语二,大学英语三。
  3. 修改已知学号的学生信息。
  4. 能够添加学生信息。
  5. 删除已知学号的学生信息。
  6. 按平均成绩进行排序。
  7. 查询学生的信息。

1.3 系统E-R图

2.系统总体设计

2.1系统流程图

3.系统详细设计

3.1类模块设计

类模块class student。首先在student中定义几个私有型数据成员,学号ID,姓名name,班级class1,大学英语一,大学英语二,大学英语三。

       普通成员函数介绍:

 void set();//录入学生信息

 void show();//输出学生信息

double ad();//计算总成绩

double aver();//计算平均成绩

友元函数介绍:

friend void show();//输出学生信息

friend    void  search();//查询学生信息

friend    void  change();//修改学生信息

Friend void add();//添加学生信息

friend    void  paixu();//对学生信息排序

friend void del();//删除学生信息

friend    void   Save();//保存学生信息

             

3.2主要算法设计

  1. 本题要求做出学生成绩管理系统,系统以菜单方式工作,我们可以用一个类的成员函数来单独完成菜单功能,然后在主函数调用。
  2. 根据题目我们首先确定用两个类去实现,一个为类student,里面为学生的信息,例如学号,姓名等,主函数实现各个功能的操作,例如查询,删除等。
  3. 需要对学生成绩进行录入,那么我们就用input()输入函数去完成录入,在主函数中进行调用函数进行学生信息的录入。
  4. 主函数执行命令:
  1. 初始化对象
  2. 初始化菜单
  3. 操作执行,结果显示

4.系统调试与运行

4.1  录入学生信息

 

4.2   显示学生信息

 

4.3    查询学生信息

 4.4    修改学生信息

4.5  添加学生信息

4.6   排序学生信息

 

 4.7   删除学生信息

4.8   保存学生信息

5.系统分析(包含结果分析和改进措施)

5.1结果分析

该学生成绩管理系统能够完成一些基本的操作功能,例如查询,删除,修改等功能,运用了面向对象的程序设计,所以程序比较安全可靠,功能也比较齐全,操作方便,界面清晰,容易维护和扩充。但是该系统还是有一些不足。

  • 对于系统的查询这一模块设计的比较简单,仅仅只需要全部成绩的平均成绩进入系统还是想的有点不全面,应考虑各科成绩。
  • 对于修改的这块方面,因为是通过学号或者姓名进行修改的,姓名有可能会重复,导致删除的信息不是用户想要的效果。系统也没有进行提示,只有学号才是唯一的,且删除时姓名重复系统不会提醒。

5.2改进措施

对于删除这项操作如果用姓名进行查找,如果有姓名重复的,系统应该提醒下,并输出学号来进行准确删除,以免造成删除了用户本不想删除的信息。

对于排序这项操作应该设置不同科目的单项排序,最后来一个总成绩的排序。以此可以满足用户需要单项成绩的排名。

对于修改这项操作如果用姓名进行查找,如果有姓名重复的,系统应该提醒下,并输出学号来进行准确修改,以免造成修改了用户本不想修改的信息。

6.总结

两周的课程设计结束了,在这次课程设计中,不仅检验了我平时上机课所学的知识和敲代码的熟练度,也使我更加懂得并亲身体会到了理论与实践相结合的重要性。只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从实践中得出结论,才能提高自己的实际动手能力和独立思考能力,在设计过程中遇到很多问题,比如功能的实现,修改接连不断的Bug等等,我发现自己对之前学习的知识理解的并不深刻,在实际操作上还远远不够。

由于很多方面因,这次课程设计存在许多不足的地方。但此次课程设计确实让我学到许多知识,并且发现了自身的不足,在以后的学习生活中,我会更加努力学习,并将链表这一方面的知识重新梳理,找到问题的不足。

最后我要衷心的感谢所有给予我帮助和指导的老师和同学,谢谢你们让我有了很大的进步!成功完成该学生学籍管理系统。

参考文献:

[1]胡明.数据结构.清华大学出版社.2005年

[2]陈维兴 林小茶.C++面向对象程序设计教程.清华大学出版社.2000年

附录

附录1

#include<iostream>

#include<iomanip>

#include <fstream>

#include<string>

using namespace std;

// 学生类

class student {

int ID;//

char name[20];

char class1[20];

double English1;

double  English2;

double  English3;

double sum;//总成绩

double aver1;//平均成绩

public: //公有函数

void set() {

cout << "\t学生学号:";

cin >> ID;

cout << "\t学生姓名:";

cin >> name;

cout << "\t学生班级:";

cin >> class1;

cout << "\t大学英语一成绩:";

cin >> English1;

cout << "\t大学英语二成绩:";

cin >> English2;

cout << "\t大学英语三成绩:";

cin >> English3;

}

void show() {

cout << "该学生的学号:" << ID << endl;

cout << "该学生的姓名:" << name << endl;

cout << "该学生的班级:" << class1 << endl;

cout << "该学生的大学英语一成绩:" << English1 << endl;

cout << "该学生的大学英语二成绩:" << English2 << endl;

cout << "该学生的大学英语三成绩:" << English3 << endl;

}

double ad()

{

return sum = English1 + English2 + English3;

}//该学生的英语总成绩

double aver()

{

aver1 = (English1 + English2 + English3) / 3;

return aver1;

}//该学生英语的平均成绩

//友元函数

friend void show();

friend void search();

friend    void change();

friend void add();

friend void paixu();

friend void del();

friend  void  Save();

};

//函数

void input();

void show();

void search();

void change();

void add();

void paixu();

void del();

void    Save();

student s[1000];

int n = 0;

int main() {

int select;

while (1) {

system("cls");

cout << "\t ******************欢迎使用你使用************\n";

cout << "\t *****************学生成绩管理系统***********\n";

cout << "\t *------------------------------------------*\n";

cout << "\t *         1——录入学生信息----------------*\n";

cout << "\t *         2——显示学生信息----------------*\n";

cout << "\t *         3——查询学生信息----------------*\n";

cout << "\t *         4——修改学生信息----------------*\n";

cout << "\t *         5——添加学生信息----------------*\n";

cout << "\t *         6——排序学生信息----------------*\n";

cout << "\t *         7——删除学生信息----------------*\n";

cout << "\t *         8——保存学生信息----------------*\n";

cout << "\t *         0——退出------------------------*\n";

cout << "\t *------------------------------------------*\n";

cout << "\t 你的选择是(0--7):";

cin >> select;

if (select == 0 || select > 7) break;

switch (select) {

case 1:

input(); //调用input函数录入数据

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 2:

show(); //调用show函数显示学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 3:

search();  //调用search函数查询学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 4:

change();  //调用change函数修改学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 5:

add();     //调用add函数添加学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 6:

paixu();     //调用add函数添加学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

case 7:

del();    // 调用del函数删除学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

case 8:

Save();    //调用add函数添加学生信息

system("pause");//可以看清楚输出的结果,pause会输出"请按任意键继续

break;//break是直接结束循环,continue跳过循环,继续执行下一次的循环

default://除了case以外的

cout << "输入错误,请重新输入!" << endl;

}

}

return 0;

}

//录入学生信息的函数

void input()

{

char sel;

do

{

n++;

cout << "\t请你输入第" << n << "个学生信息:\t" << endl;

s[n].set();

cout << "是否要继续录入学生信息(Yes/No):";

cin >> sel;

} while (sel == 'Yes' || sel == 'yes');

}

//输出该学生的成绩

void show() {

cout << left; //设置输出左对齐

cout << setw(10) << "学生学号" << setw(10) << "学生姓名"

<< setw(13) << "学生班级" << setw(12) << "大学英语一成绩"

<< setw(12) << "大学英语二成绩" << setw(12) << "大学英语三成绩"

<< endl;

for (int i = 1; i <= n; i++)

{

cout << setw(10) << s[i].ID << setw(10) << s[i].name

<< setw(13) << s[i].class1 << setw(12) << s[i].English1

<< setw(12) << s[i].English2 << setw(12) << s[i].English3 << endl;

}

cout << endl;

}

//查询信息

void search()

{

int a, b, i; char c[20];

cout << "请你选择查询方式:" << endl;

cout << "按学生姓名查询1" << endl;

cout << "按学生学号查询2" << endl;

cin >> a;

switch (a)

{

case 1:

{char sel;

do {

cout << "请输入你要查的学生的姓名:" << endl;

cin >> c;

for (i = 1; i <= n; i++)

if (strcmp(s[i].name, c) == 0)

{

cout << "你要查的学生信息为:" << endl;

cout << "学生学号:" << s[i].ID << endl << "学生姓名:"

<< s[i].name << endl << "学生班级:" << s[i].class1 << endl << "大学英语一成绩:"

<< s[i].English1 << endl << "大学英语二成绩:" << s[i].English2 << endl << "大学英语三成绩:"

<< s[i].English3 << endl; break;

}

else if (strcmp(s[i].name, c) != 0 && i == n)

{

cout << "没有这个学生!" << endl; break;

}

cout << "是否要继续查询学生信息(Y/N):";

cin >> sel;

} while (sel == 'Y' || sel == 'y');

break; }

case 2: { char sel;

do {

cout << "请输入你要查的学生的学号:" << endl;

cin >> b;

for (i = 1; i <= n; i++)

if (s[i].ID == b)

{

cout << "你要查的学生信息为:" << endl;

cout << "学生学号:" << s[i].ID << endl << "学生姓名:"

<< s[i].name << endl << "学生班级:" << s[i].class1 << endl << "大学英语一成绩:"

<< s[i].English1 << endl << "大学英语二成绩:" << s[i].English2 << endl << "大学英语三成绩:"

<< s[i].English3 << endl; break;

}

else if (s[i].ID != b && i == n)

{

cout << "没有这个学生!请核对后再输入!" << endl; break;

}

cout << "是否要继续查询学生信息(Y/N):";

cin >> sel;

} while (sel == 'Y' || sel == 'y');

break; }

default:

cout << "您的输入有误!" << endl;

}

}

void change() {

{ char sel;

int d, i, e, f, g = 0;

do {

cout << "请输入你要修改的学生的学号:" << endl;

cin >> d;

for (i = 1; i <= n; i++)

if (s[i].ID == d)

{

cout << "你要修改的学生信息为:" << endl;

cout << "学生学号:" << s[i].ID << endl << "学生姓名:"

<< s[i].name << endl << "学生班级:" << s[i].class1 << endl << "大学英语一成绩:"

<< s[i].English1 << endl << "大学英语二成绩:" << s[i].English2 << endl << "大学英语三成绩:"

<< s[i].English3 << endl;

e = 1;

break;

}

else if (s[i].ID != d && i == n)

{

cout << "没有这个学生!请核对后再输入!" << endl;

e = 0;

break;

}

while (e == 1)

{

{cout << "请输入该学生要修改的信息对应的数字:" << endl;

cout << "学生学号:1" << '\t' << "学生姓名:2"

<< '\t' << "学生班级:3" << '\t' << "大学英语一成绩:4"

<< '\t' << "大学英语二成绩:5" << '\t' << "大学英语三成绩:6" << endl;

}

cin >> f;

switch (f)

{

case 1:cout << "\t新的学生学号为:";

cin >> s[i].ID; break;

case 2:cout << "\t新的学生姓名为:";

cin >> s[i].name; break;

case 3:cout << "\t新的学生班级为:";

cin >> s[i].class1; break;

case 4:cout << "\t新的大学英语一成绩为:";

cin >> s[i].English1; break;

case 5:cout << "\t新的大学英语二成绩为:";

cin >> s[i].English2; break;

case 6:cout << "\t新的大学英语三成绩为:";

cin >> s[i].English3; break;

default:cout << "您的输入有误,请重新输入!";

cin >> f;

}

e = 0;

g = 1;

}

if (g == 1)

{

cout << "修改成功!";

}

cout << "是否要继续修改学生信息(Y/N):";

cin >> sel;

} while (sel == 'Yes' || sel == 'yes');

}

}

void add()

{

char sel;

do

{

n++;   cout << "\n请输入第" << n << "个学生信息:\n";

cout << "\t学生学号:";

cin >> s[n].ID;

cout << "\t学生姓名:";

cin >> s[n].name;

cout << "\t学生班级:";

cin >> s[n].class1;

cout << "\t大学英语一成绩:";

cin >> s[n].English1;

cout << "\t大学英语二成绩:";

cin >> s[n].English2;

cout << "\t大学英语三成绩:";

cin >> s[n].English3;

cout << "是否要继续添加学生信息(Y/N):";

cin >> sel;

} while (sel == 'Y' || sel == 'y');

}

void paixu()

{

int a;

cout << "请选择排序方式:" << endl;

cout << "1.按学号排序;" << endl << "2.按平均成绩排序;" << endl;

cin >> a;

switch (a)

{

case 1:

{int t = 0;

for (int i = 0; i < n - 1; i++)

for (int j = 0; j < n - i; j++)

if (s[j].ID > s[j + 1].ID)

{

t = s[j].ID;

s[j].ID = s[j + 1].ID;

s[j + 1].ID = t;

}

cout << "按学号排序结果:" << endl; cout << left; //设置输出左对齐

cout << setw(10) << "学生学号" << setw(10) << "学生姓名" << setw(13) << "学生班级"

<< setw(12) << "大学英语一成绩"

<< setw(12) << "大学英语二成绩" << setw(12) << "大学英语三成绩" << endl;

for (int i = 1; i <= n; i++)

{

cout << setw(10) << s[i].ID

<< setw(10) << s[i].name

<< setw(13) << s[i].class1

<< setw(12) << s[i].English1

<< setw(12) << s[i].English2

<< setw(12) << s[i].English3 << endl;

}

}

break;

case 2:

{ student t;

for (int i = 0; i < n - 1; i++)

{

for (int j = 0; j > n - i - 1; j++)

{

if (s[j].sum > s[j + 1].sum)

t = s[j];

s[j] = s[j + 1];

s[j + 1] = t;

}

}

cout << "按平均成绩排序结果:" << endl;

for (int i = 1; i <= n; i++)

cout << "学号:" << s[i].ID << "\t" << "姓名:" << s[i].name << "\t" << "班级:" << s[i].class1 << "\t"

<< "大学英语一成绩:" << s[i].English1 << "\t" << "大学英语二成绩:"

<< s[i].English2 << "\t" << "大学英语三成绩" << s[i].English3  << endl;

default:

{cout << "" << endl;

cin >> a; }

}

}

}

void del() {

int j, i, k; char c[10], sel, y;

do {

cout << "请输入你要删除的学生的姓名:" << endl;

cin >> c;

for (i = 1; i <= n; i++)

if (strcmp(s[i].name, c) == 0)

{

cout << "你要删除的学生信息为:" << endl;

cout << "学生学号:" << s[i].ID << endl

<< "学生姓名:" << s[i].name << endl << "学生班级:" << s[i].class1 << endl

<< "大学英语一成绩:" << s[i].English1 << endl << "大学英语二成绩:" << s[i].English2 << endl

<< "大学英语三成绩:" << s[i].English3 << endl; cout << "确认删除?(y/n):";

cin >> y;

if (y == 'Y' || y == 'y')

{

for (j = i; j <= n + 1; j++)

{

s[j] = s[j + 1];

} k = 1;

}

else

cout << "删除失败!" << endl;

break;

}

else if (strcmp(s[i].name, c) != 0 && i == n)

{

cout << "没有这个学生!请核对后再输入!" << endl;

k = 0; break;

}

while (k == 1)

{

if (y == 'Y' || y == 'y')

cout << "删除成功!";

n--;

k = 0;

}

cout << "是否要继续删除学生信息(Y/N):";

cin >> sel;

} while (sel == 'Y' || sel == 'y');

}

void Save()

{

const int num = 10;

student s[num];

string path = "1.txt";

fstream fout(path, ios::out | ios::app);

if (fout.fail())

{

cout << "文件打开失败!" << endl;

exit(0);

}

for (int i = 0; i < num; i++)

{

s[i].set();

}

fout.close();

cout << "文件打开失败!" << endl;

}

 

 

 

 

 

 

;