高级程序设计课程设计
一、教学目标和基本要求
本课程全面系统的学习面向对象程序设计的基本概念,基本语法和编程方法。正确理解掌握C++面向对象程序设计的基本特性:类,对象,继承与派生,多态,虚函数,模板,流类库等。遵循软件过程的各个环节进行系统分析、设计、实现、集成、测试,了解当前常用的软件开发工具(Visual 2017),培养学生解决实际问题的能力。
二、考核方式及办法:
完成包括从概要设计、详细设计、代码编写、程序调试、运行在内的一系列程序设计及文档撰写,要求系统调试成功、可正常运行,文档规范完整。
三、课程设计任务书
题目:学生管理系统设计
功能:学生管理系统设计,每个学生是一条记录,包括姓名、学号、性别、出生年月、专业、班级、家庭地址、宿舍号码等。系统要求实现以下功能:
1、输入功能:录入学生信息(包括学生学号、姓名、性别、出生年月、专业等);
2、显示功能:完成学生记录的显示。
3、查找功能:完成按学号或姓名查找学生的相关记录,并显示。
分步实施:
1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数。
2、建立一个文件,将每位学生的信息写入文件中(人数利用宏定义设定)并能显示于屏幕上。
3、完成上述显示、查找(姓名,性别等)、修改等功能。
4、进一步要求,修改记录设置密码操作。
要求:1、用C++语言实现程序设计;
2、利用C++的对象数组实现学生信息的数据结构设计;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序加必要的注释。
课程设计实验报告要求:
1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分 。
2、实验总结报告:流程图、主要源程序代码、测试情况及调试中问题与解决方案、
小结等。
目 录
摘 要
学生成绩管理系统是典型的信息管理系统,是学校教务管理的重要组成部分,其处理信息量很大。它对教学管理和学校的决策者都非常重要,它给学校教学管理提供了极大的方便,提高了工作效率。但是一直以来人们用传统人工的方式管理文件文档,这种管理方式效率低,保密性差。
本课程设计是用C++实现对学生的成绩管理作一个简单的模拟,实质是建立学生类,由学号,姓名,班级,以及大学英语一,大学英语二,大学英语三,采用菜单选择操作方式完成7项功能分别写成7个函数,录入、显示、查询、修改、添加、排序、删除七大基本操作。
通过对学生成绩管理系统的制作,能够让使用者迅速地对学生的成绩做各项处理和显示,最终的到想要的信息,方便且易于操作。
关键词:学生成绩管理系统 C++ 类
随着学校学生数量的不断增加,仅靠传统的学生管理方法,不仅效率低,而且还会浪费大量的人力物力,这已经远远不能满足学校对学生成绩管理的需要。学生成绩管理系统从学生成绩管理现状出发,以实现学生成绩管理为设计目标,加以强大的数据库管理功能,可以方便对学生信息进行管理。本系统在设计时应该满足以下几点:
- 对学生信息操作简单,可以方便地进行添加,修改和输出操作。
- 采用人机对话的操作方式,信息查询灵活、方便、快捷、准确,数据存储安全、可靠。
- 对用户输入的数据,系统进行严格地数据检测,信息查重等,尽可能排除人为错误。
- 可以根据需要灵活地调整信息。
- 系统最大限度地实现了易维护性和易操作性。
- 系统运行稳定、安全、可靠。
在学生成绩管理系统中,主要有以下功能:
- 系统以菜单方式工作。
- 能够注册学生的学号、姓名、大学英语一、大学英语二,大学英语三。
- 修改已知学号的学生信息。
- 能够添加学生信息。
- 删除已知学号的学生信息。
- 按平均成绩进行排序。
- 查询学生的信息。
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主要算法设计
- 本题要求做出学生成绩管理系统,系统以菜单方式工作,我们可以用一个类的成员函数来单独完成菜单功能,然后在主函数调用。
- 根据题目我们首先确定用两个类去实现,一个为类student,里面为学生的信息,例如学号,姓名等,主函数实现各个功能的操作,例如查询,删除等。
- 需要对学生成绩进行录入,那么我们就用input()输入函数去完成录入,在主函数中进行调用函数进行学生信息的录入。
- 主函数执行命令:
- 初始化对象
- 初始化菜单
- 操作执行,结果显示
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;
}