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

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

贴吧ID: 这把问题不大

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

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdlib>
using namespace std;

class Student {                                                     // 学生base类
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          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);                  // 显示所有学生信息,被用作子函数
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");                                            // 操作后清理屏幕,windows下请换成system("cls")
        switch(choice){
            case ‘A‘:append(stus);
                break;
            case ‘B‘:change(stus);
                break;
            case ‘C‘:del(stus);
                break;
            case ‘D‘:search(stus);
                break;
            case ‘E‘:displayAllInfos(stus);
                getchar();
                break;
            case ‘Q‘:quitSys(stus);
                return;
            default: cout << "无选项"<<choice<<",请重试。" << endl;
                break;
        }
        system("clear");                                            // 操作后清理屏幕,windows下请换成system("cls")
        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);
    if(temp != nullptr){
        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;
            temp->changeEng(tmp);
        }else if(ch == ‘B‘){
            cout << "请输入新的语文成绩: ";
            cin >> tmp;
            temp->changeChi(tmp);
        }else{
            cout << "请输入新的数学成绩: ";
            cin >> tmp;
            temp->changeMat(tmp);
        }
    }
}
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);
        }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);
}
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;
    }else{
        cout << "未查找到,请重试!" << endl; //TODO
        return nullptr;
    }
    return temp;
}
void displayAllInfos(vector<Student *>& stus){                          // 显示总体信息
    int rank = 1;
    int len = static_cast<int>(stus.size());
    int sumEng = 0,sumChi = 0,sumMat = 0;
    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);
    }
    return ptr;
}

原文地址:https://www.cnblogs.com/1Kasshole/p/9372607.html

时间: 2024-10-12 08:03:58

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

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

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

GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: 1.远程连接linux执行sftp文件下载 2.window下文件解压缩(tar.gz.zip) 3.window下文件解压缩及带密码解压(zip) 4.window下调用阿里雲RDS api查询备份并下载 5.GO语言命令行工具技巧 首先,写这篇博文的一个出发点是:我无法在window的cmd命

shell命令的学生管理系统

shell命令的学生管理系统,有登录和注册功能,有增删查改输出全部学生信息的功能. #!/bin/bash #菜单目录 print_menu() { clear echo "1.输出学生信息" echo "2.录入学生信息" echo "3.查询学生信息" echo "4.删除学生信息" echo "5.修改学生信息" echo "0.退出系统" } #学生信息输出 do_output(

mysql简单命令行操作以及环境变量的配置

1.配置环境变量 - 找到mysql的bin目录,配置到环境变量path下. 2.简单的命令行操作 -1.登录: mysql -hlocalhost(-h后面跟数据库ip地址) -uroot(-u后面跟user名) -p(密码) -2.退出: exit -3.数据库操作: -1.建库:create database mydb; -2.删库:drop database mydb; -3.显示所有的数据库:show databases; -4.选择库(选择要使用的数据库):use mydb; -4.

命令控制台学生管理系统 c语言链表实现

短学期大作业 主要实现 1.文件读入 2.文件内容删除 3.查询 4.排序 很简单 重点是链表操作的熟练  文件操作 1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 typedef struct st1 5 { 6 char stdNum[10]; 7 char name[10]; 8 char sex[10]; 9 char dorNum[10]; 10 ch

MySQL在简单命令行操作

1.启动MySQL服务:net start mysql2.停止MySQL服务:net stop mysql3.进入MySQL数据库:mysql -h localhost -u root -p4.显示已存在所有的数据库:show databases;更多参考:https://www.cnblogs.com/wangwust/p/6431871.html 原文地址:https://www.cnblogs.com/xiyixin/p/10453693.html

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

端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一大坨出去了,这个时候立刻想到了切入IOS开发!!! 事实上,前端开发做到一定时间,要进步很难了,最近几个月扑到业务上便感觉突破不了目前的瓶颈,自身的前端瓶颈主要在两方面:技术深度.技术广度 其实不论深度或者广度来说都不是简单前端能说清楚的事情,不能说了解了angularJS.react等框架技术深度

Linux 程序设计学习笔记----命令行参数处理

转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行参数及解析 在使用linux时,与windows最大的不同应该就是经常使用命令行来解决大多数问题.比如下面这样的: 而显然我们知道C语言程序的入口是mian函数,即是从main函数开始执行,而main函数的原型是: int main( int argc, char *argv[] ); int main( int argc, char **argv );

【IOS开发笔记01】学生管理系统(上)

端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一大坨出去了,这个时候立刻想到了切入IOS开发!!! 事实上,前端开发做到一定时间,要进步很难了,最近几个月扑到业务上便感觉突破不了目前的瓶颈,自身的前端瓶颈主要在两方面:技术深度.技术广度 其实不论深度或者广度来说都不是简单前端能说清楚的事情,不能说了解了angularJS.react等框架技术深度