C++ 实现简单命令行学生管理系统

预览:

编译环境是macOS。system(“clear”) 在windows下请换成 system(“cls”)

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
using namespace std; class Student {
public:
static int ENGSUM;
static int CHISUM;
static int MATSUM;
explicit Student(string &Nname,string &NID,string &Neng,string &Nchi,string &Nmat)
:name(Nname),ID(NID),eng_score(Neng),chi_score(Nchi),math_score(Nmat)
{ sumup();}
const string& getID() const{ return ID; }
const string& getName() const{ return name; }
const string& getEng() const{ return eng_score; }
const string& getChi() const{ return chi_score; }
const string& getMat() const{ return math_score; }
const int getsum() const{ return scores_sum; }
void changeEng(string &newEng){ eng_score = newEng; }
void changeChi(string &newChi){ chi_score = newChi; }
void changeMat(string &newMat){ math_score = newMat; }
void changeSum(int value){ scores_sum += value; }
void sumup(){
int e = stoi(eng_score); int c = stoi(chi_score); int m = stoi(math_score); scores_sum = e+c+m;
}
private:
string name;
string ID;
string eng_score;
string chi_score;
string math_score;
int scores_sum;
};
int Student::ENGSUM = 0;
int Student::CHISUM = 0;
int Student::MATSUM = 0; Student* __lookup(vector<Student *>& stus,string &target);
void launcher();
void display(int currentSize);
void append(vector<Student *>& stus);
Student* displaySingleInfo(vector<Student *>& stus,string target);
void change(vector<Student *>& stus);
void del(vector<Student *>& stus);
void search(vector<Student *>& stus);
void quitSys(vector<Student *>& stus);
void displayAllInfos(vector<Student *>& stus);
void error(char choice);
bool comp(const Student* a,const Student* b){
return a->getsum()>b->getsum();
} int main(){
launcher();
cout<< "再见" << endl;
return 0;
} void launcher(){
vector<Student *> stus;
string _input;
display(static_cast<int>(stus.size()));
while(cin>>_input){
char choice = _input.at(0);
system("clear");
switch(choice){
case 'A':append(stus);
break;
case 'B':change(stus);
break;
case 'C':del(stus);
break;
case 'D':search(stus);
getchar();
break;
case 'E':displayAllInfos(stus);
getchar();
break;
case 'Q':quitSys(stus);
return;
default: error(choice);
getchar();
break;
}
system("clear");
display(static_cast<int>(stus.size()));
}
}
void display(int currentSize){
cout << "\n\n --------------------------------------------------------------------------------" << endl;
cout << "| ~~~ 输入Q退出系统 ~~~" << endl;
cout << " --------------------------------------------------------------------------------" << endl;
cout << "|\n";
cout << "| * 正在运行学生管理系统 *" << endl;
cout << "|\n";
cout << " --------------------------------------------------------------------------------" << endl;
cout << "|" << endl;
cout << "| * 已记录" << currentSize << "个学生的档案 * * 你还可以录入" << 100 - currentSize
<< "个学生 *" << endl;
cout << "|\n";
cout << " --------------------------------------------------------------------------------" << endl;
cout << "|\n";
cout << "| 接下来,你想进行什么操作? (输入对应序号)" << endl;
cout << "|\n";
cout << "| (A).添加 (B).修改 (C).删除 (D).查找 (E).查看所有学生档案" << endl;
cout << "|\n";
cout << " --------------------------------------------------------------------------------" << endl;
cout<< "--> ";
}
void append(vector<Student *>& stus){
cout << "\n\n好的,现在开始添加学生: \n\n";
cout << "请输入新学生的姓名、学号、英语成绩、语文成绩、数学成绩\n\n"
<< "例如: 小明 1704010625 129 120 134\n";
cout << " ------------------------------------------------------" << endl;
cout<< "--> ";
string n,i,e,c,m;
cin >> n >> i >> e >> c >> m;
Student *newStu = new Student(n,i,e,c,m);
stus.push_back(newStu);
Student::ENGSUM += stoi(e); Student::CHISUM += stoi(c); Student::MATSUM += stoi(m);
}
void change(vector<Student *>& stus){
cout << "\n\n好的,现在开始进行修改操作: \n\n";
cout << "请输入需要修改的学生的学号: \n"<<endl;
cout<< "--> ";
string target;
cin >> target;
Student *temp = displaySingleInfo(stus,target);
bool conti = true;
while(temp != nullptr && conti == true){
cout << "\n你想改动" << temp->getName() << "的哪个成绩?" << endl;
cout << "(A).English (B).Chinese (C).Math" << endl;
cout << "--> ";
string _input;
cin >> _input;
char ch = _input.at(0);
string tmp;
if(ch == 'A'){
cout << "请输入新的英语成绩: ";
cin >> tmp;
int sub = stoi(tmp) - stoi(temp->getEng());
temp->changeSum(sub);
Student::ENGSUM += sub;
temp->changeEng(tmp);
}else if(ch == 'B'){
cout << "请输入新的语文成绩: ";
cin >> tmp;
int sub = stoi(tmp) - stoi(temp->getChi());
temp->changeSum(sub);
Student::CHISUM += sub;
temp->changeChi(tmp);
}else{
cout << "请输入新的数学成绩: ";
cin >> tmp;
int sub = stoi(tmp) - stoi(temp->getMat());
temp->changeSum(sub);
Student::MATSUM += sub;
temp->changeMat(tmp);
}
cout << "\n\n------------------------------------------------------------\n搞定.输入y继续修改,输入n返回菜单\n";
cout << "--> ";
string t;
cin >> t;
if(t.at(0)=='y')
conti = true;
else conti = false;
cout << conti << endl;
if(conti)
temp = displaySingleInfo(stus,target);
}
if(temp == nullptr)
cout << "未查找到,按enter返回!";
}
void del(vector<Student *>& stus){
cout << "\n\n好的,现在开始进行删除操作: \n\n";
cout << "请输入需要删除的学生的学号: \n"<<endl;
cout<< "--> ";
string target;
cin >> target;
vector<Student *>::iterator it;
bool findIt = false;
for(it = stus.begin();it != stus.end();){
if((*it)->getID() == target){
findIt = true;
Student::ENGSUM -= stoi((*it)->getEng());
Student::CHISUM -= stoi((*it)->getChi());
Student::MATSUM -= stoi((*it)->getMat());
it = stus.erase(it);
break;
}else
++it;
}
if(!findIt)
cout << "未查找到,请重试!" << endl;
}
void search(vector<Student *>& stus){
cout << "\n\n好的,现在开始进行查找操作: \n\n";
cout << "请输入需要查找的学生的学号: \n"<<endl;
cout<< "--> ";
string target;
cin >> target;
displaySingleInfo(stus,target);
cout<< "按下enter键以继续" <<endl;
getchar();
}
void quitSys(vector<Student *>& stus){
vector<Student *>::iterator it;
for(it = stus.begin();it != stus.end();it ++){
delete (*it);
}
}
Student* displaySingleInfo(vector<Student *>& stus,string target)
{
Student *temp = __lookup(stus,target);
if(temp != nullptr){
cout << "\n学生姓名:" << temp->getName() << " 学号:" << temp->getID() << endl;
cout<< "--scores:"<<endl;
cout << "English: " << temp->getEng() << " Chinese: " << temp->getChi()
<< " Math: " << temp->getMat() << endl << endl;
}else{
cout << "未查找到,请重试!" << endl << endl; //TODO
return nullptr;
}
return temp;
}
void displayAllInfos(vector<Student *>& stus){
int rank = 1;
int len = static_cast<int>(stus.size());
sort(stus.begin(),stus.end(),comp);
cout<< "\n\n\n------------------------------------------------------------\n";
cout<< " scores\n";
cout<< "rank "<<"Name "<<"ID "<<"English "<<"Chinese "<< "Math "<<"Sum \n";
for(auto &stu : stus){
cout.setf(ios::left);
cout.width(6); cout<<rank++;
cout.width(14); cout<< stu->getName();
cout.width(13); cout<< stu->getID();
cout.width(9); cout<< stu->getEng();
cout.width(9); cout<< stu->getChi();
cout.width(6); cout<< stu->getMat();
cout<< stu->getsum()<<endl;
}
cout<< "\nsum ";
cout.width(9); cout<<Student::ENGSUM;
cout.width(9); cout<<Student::CHISUM;
cout.width(6); cout<<Student::MATSUM<<endl;
cout<< "average ";
cout.width(9); cout<<Student::ENGSUM/len;
cout.width(9); cout<<Student::CHISUM/len;
cout.width(6); cout<<Student::MATSUM/len;
cout<< "\n------------------------------------------------------------\n\n";
cout<< "按下enter键以继续" <<endl;
getchar();
}
Student* __lookup(vector<Student *>& stus,string &target){
vector<Student *>::iterator it;
Student *ptr = nullptr;
for(it = stus.begin();it != stus.end();it ++){
if((*it)->getID() == target){
ptr = (*it); break;
}
}
return ptr;
}
void error(char choice){
cout<< "\n------------------------------------------------------------\n\n";
cout << "抱歉,无选项 "<<choice<<" ,请重试。" << endl;
cout<< "\n按下enter键返回" <<endl;
cout<< "\n------------------------------------------------------------\n\n";
getchar();
}

C++ 实现简单命令行学生管理系统的更多相关文章

  1. GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

    GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: ...

  2. git base 简单命令行

    记录几个简单的命令 1:克隆-把线上的文件复制到本地 git clone 线上地址 2:检查状态 git status 3:放入待仓储 git add.文件名 git add * (全部文件,简单粗暴 ...

  3. 《鸟哥的Linux私房菜》笔记——04. 简单命令行

    键入命令 [dmtsai@study ~]$ command [-options] parameter1 parameter2 ... 指令 選項 參數(1) 參數(2) 注意:有时也可以使用 + 放 ...

  4. GitHub简单命令行# 使用命令行传代码到GitHub

    第一次提交代码到Github 第一步: 建立本地仓库cd到你的本地项目根目录下,执行git命令 cd到本地项目 git init 第二步: 将本地项目工作区的所有文件添加到暂存区 git add . ...

  5. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

  6. Kubernetes集群部署及简单命令行操作

    三个阶段部署docker:https://www.cnblogs.com/rdchenxi/p/10381631.html 环境准备 [root@master ~]# hostnamectl set- ...

  7. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  8. 使用 getopt() 进行命令行处理

    引言 在早期的 UNIX® 中,其命令行环境(当时的唯一用户界面)包含着数十种小的文本处理工具.这些工具非常小,通常可很好地完成一项工作.这些工具通过较长的命令管道链接在一起,前面的程序将其输出传递给 ...

  9. Linux 编程学习笔记----命令行参数处理

    转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行參数及解析 在使用linux时,与windows最大的不同 ...

随机推荐

  1. telnet操作memcache

    1.使用方法 1. 连接到memcached telnet 192.168.1.100 11211 add name 0 60 5     [说明 add 是指令名  name 是key的名字 (是以 ...

  2. 周末班:Python基础之函数进阶

    迭代器和生成器 迭代和可迭代 什么是迭代(iteration)? 如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来,如果我们想要访问所有的元素,那我们可以用for循环来 ...

  3. JAVA—枚举(Enum)学习总结

    1.枚举(Enumeration) 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式.这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码 ...

  4. InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'

    在新建asp.net core 应用后, 添加了自定义的ApplicationDbContext 和ApplicationUser ,并添加了Identity认证后, 会出现 InvalidOpera ...

  5. yidiandian

    hzwer libreoj (需要拿新版的打开)

  6. C# — Windows服务安装后自动停止问题

    今天在使用VS创建一个Windows服务时,为了得到一些提示,引用了Windows.Forms程序集,然后使用MessageBox.Show()方法渴望得到一些弹窗提示: 但是最后在安装好服务后,在任 ...

  7. 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!

    想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!   很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...

  8. 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  9. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  10. Monkey参数介绍

    monkey 参数 参数分类 常规类参数 事件类参数 约束类参数 调试类参数 常规类参数 常规类参数包括帮助参数和日志信息参数.帮助参数用于输出Monkey命令使用指导:日志信息参数将日志分为三个级别 ...