前言
为了加深对自己所学到的C++相关知识的理解,熟悉C++程序设计语言编程以及调试的基本技能,锻炼自己利用C++语言程序设计进行简单软件设计的基本思路和方法,提高运用高级语言解决实际问题的能力。我用C++做了一个学生成绩信息管理系统,下面介绍它所实现的功能以及具体的代码。
一、系统设计介绍
主要实现功能:数据录入、数据删除、数据浏览、数据查询等。
1.界面
本次界面直接在控制台窗口中显示(即黑框框显示),主要涉及到三个操作:
- 显示信息
- 清屏
- 退出系统
2.角色及功能
成绩管理系统中涉及到两个角色:管理员 和 老师
- 管理员
登录
添加老师
删除老师
查询老师 - 教师
登录
学生成绩录入
浏览学生成绩
查询具体学生成绩
修改学生成绩
删除学生成绩
学生成绩持久化存储----采用文件保存
3.系统设计要求
- 学生人数事先无法确定(动态增长)。
- 功能:学生成绩录入,查询,修改,删除,保存文件(增、删、查、改)。
- 界面:系统使用文字菜单,用户通过选择菜单项的编号,实现系统对子模块的调用(switch语句)。
- 学号:学号是一个9位整数构成的字符串, 学号的编码规则:入学年份+在读年级+在读班级+班内编号;入学年份用4位整数构成字符串,如2015年入学则表示为:”2015”;在读年级用1位整数构成字符串,如正在1年级读书则表示为:”1”;在读班级用2位整数构成字符串,如正在1班读书则表示为:”01”;班内编号用2位整数构成字符串,如在班内编号为23号则表示为:”23”)。
- 课程:语文,英语,数学,物理,化学,生物。
- 成绩总表结构:学号—姓名—课程名—平时成绩—期末成绩—总评成绩
要求:总评成绩由程序自动计算,总评成绩=平时成绩×30%+期末成绩×70%。 - 文件的保存格式及内容:根据班级号以及课程名从学生的成绩总表中提取出子表并存储成一个文本文件。该文本文件名由班级号
和课程名拼音字符串构成。
要求:输入班级号和课程名字符串后自动生成文件名。如1班,语文,则文件名为:c1yuwen.txt。
4.集成开发环境
vs2013
二、声明
所包含的头文件以及定义的宏
#include<iostream> #include<string> #include<vector> #include<map> #include<cstdlib> #include<sstream> #include<fstream> using namespace std; #define PASSWARD "1"
1.学生类
创建一个学生类用于存放学生的相关信息
//学生的信息 class student { public: student( string name = "张三", string lesson = "1", const string id = "111111111") :_name(name) , _lesson(lesson) , _id(id) {} void stuscore(const string crouse, const vector<float>& score) { _stuscore[crouse] = score; } string _name; string _id;//学号 string _lesson;//班级号(方便用于文件存储) //map<课程名,成绩> _stuscore; map<string, vector<float>> _stuscore;//存储学生的课程以及它对应的成绩 };
2.老师类
用创建老师类对学生信息进行管理
class Teacher { public: Teacher(const string name = "张三", const string passward = "111") : _name(name) , _passward(passward) {} void AddGrade();//增 void LookGrade();//浏览学生成绩 void FindStudentGrade();//查 void ModifyStudentGrade();//改 void DeleteGrede();//删 void Save();//保存至文件 string _name;//姓名 string _passward ;//密码 //map<学生ID,学生信息> _stuinfo; map<string, student> _stuinfo;//学生信息 };
3.管理员类
创建管理员类,对老师信息进行管理。
class Admini { public: Admini(string name = "张三") :_name(name) { _passward = PASSWARD; } void AddTeacher();//添加老师 void DelTeacher();//删除老师 void LookTeacher();//浏览老师信息成绩 void FindTeacher();//查找老师信息 string _name; string _passward; Teacher _teach;//创建一个默认的老师对象方便对学生信息进行操作 //vector<pair<老师姓名,老师密码>> teachinfo; map<string, string> _teachinfo;//老师信息 };
4.界面菜单
void Menu();//主界面 void AdmMenu();//管理员的操作界面 void TeachMenu();//老师的操作界面
三、管理员类中声明的成员函数的实现
1.添加老师信息
void Admini::AddTeacher() { string name, passward; cout << "请输入老师姓名:>" << endl; cin >> name; cout << "请输入老师密码:>" << endl; cin >> passward; _teachinfo[name] = passward; cout << "添加成功" << endl; system("pause"); system("cls"); }
2.删除老师信息
void Admini::DelTeacher() { cout << "请输入要删除的老师姓名:>" << endl; string name; cin >> name; if (_teachinfo.find(name) == _teachinfo.end()) { cout << "查无此人" << endl; } else { _teachinfo.erase(name); cout << "删除成功" << endl; } system("pause"); system("cls"); }
3.浏览老师信息
void Admini::LookTeacher() { if (_teachinfo.size()) { cout << "------老师信息------" << endl; cout << "老师姓名 老师密码" << endl; for (auto e : _teachinfo) { cout << " " << e.first << " " << e.second << endl; cout << "--------------------" << endl; } } else { cout << "暂无人员信息" << endl; } system("pause"); system("cls"); }
4.查找老师信息
void Admini::FindTeacher() { cout << "请输入要查找的老师姓名" << endl; string name; cin >> name; if (_teachinfo.find(name) != _teachinfo.end()) { cout << "------老师信息------" << endl; cout << "老师姓名 老师密码" << endl; cout << " " << name << " " << _teachinfo[name] << endl; cout << "--------------------" << endl; } else { cout << "查无此人" << endl; } system("pause"); system("cls"); }
四、老师类中声明的成员函数的实现
1.添加学生成绩信息
//增 void Teacher::AddGrade() { //创建一个学生 string name; cout << "请输入学生姓名:>" << endl; cin >> name; int year, grade,lesson, id; cout << "请输入学生入学年份(4位数):>" << endl; cin >> year; while (year > 10000 || year < 1000) { cout << "年份输入错误,请重新输入:" << endl; cin >> year; break; } cout << "请输入学生年级(1位数):>" << endl; cin >> grade; while (grade > 10) { cout << "年级输入错误,请重新输入:" << endl; cin >> grade; break; } cout << "请输入学生班级(2位数):>" << endl; cin >> lesson; while (lesson > 100) { cout << "班级输入错误,请重新输入:" << endl; cin >> lesson; break; } cout << "请输入学生在班级的编号(2位):>" << endl; cin >> id; while (id > 100) { cout << "学生在班级的编号输入错误,请重新输入:" << endl; cin >> id; break; } string ID; ID += to_string(year); ID += to_string(grade); if (lesson < 10)//如果不足2位就给它补0 { ID += '0'; } ID += to_string(lesson); if (id < 10) { ID += '0'; } ID += to_string(id); student stu(name, to_string(lesson), ID); //每个学生学习的课程有语文,英语,数学,物理,化学,生物。 vector<string> crouse{"语文", "英语", "数学", "物理", "化学", "生物"}; cout << "请输入学生成绩信息" << endl; for (auto it : crouse) { cout << "请输入" << it << "的成绩"<<endl; vector<float> score(3); cout << "平时成绩:>"; cin >> score[0]; while (score[0] > 100) { cout << "成绩输入有误,请重新输入!" << endl; cout << "平时成绩:>"; cin >> score[0]; } cout << "期末成绩:>" ; cin >> score[1]; while (score[1] > 100) { cout << "成绩输入有误,请重新输入!" << endl; cout << "期末成绩:>"; cin >> score[1]; } score[2] = score[0] * 3 / 10 + score[1] * 7 / 10;//总成绩 stu.stuscore(it, score); } _stuinfo[ID] = stu; cout << "添加成功" << endl; system("pause"); system("cls"); }
2.浏览学生成绩信息
void Teacher::LookGrade() { if (_stuinfo.size()) { cout << "-------------------------成绩总表-------------------------" << endl; cout << " " << "学号" << " " << "姓名" << " " << "课程名" << " " << "平时成绩" << " " << "期末成绩" << " " << "总评成绩" << endl; //成绩总表结构约定为(学号,姓名,课程名,平时成绩,期末成绩,总评成绩) string pre; for (auto it : _stuinfo) { for (auto e : it.second._stuscore) { if (pre != it.first) { cout << it.first << " " << _stuinfo[it.first]._name << " "; pre = it.first; } else { cout << " "; } cout << e.first << " "; printf("%f %f %f\n", e.second[0], e.second[1], e.second[2]); cout << "----------------------------------------------------------" << endl; } } } else { cout << "暂无人员信息" << endl; } system("pause"); system("cls"); }