C++之学生成绩系统

该代码实现了一个简单的C++学生成绩管理系统,包括教师登录添加学生成绩和学生查询成绩的功能。系统使用了Vector容器,并处理了重复学号和课程的情况。用户界面通过控制台输出进行美化,支持教师输入学生信息和课程成绩,以及学生查询个人成绩。
摘要由CSDN通过智能技术生成

C++之学生成绩系统

熬了一个晚上码完的qwq,写代码如果有强迫症(没错就是我!)真的很难受。

前言

分了四个部分,Course类,Student类,GradeSystem类,以及一个主程序。用了Vector喔,所以萌新看起来可能会有些不好理解,想深入了解的话就自己查查资料吧(说实话我自己也没有彻底整明白,蒟蒻本蒻qwq)。

功能: 如果是教师登录,则可以输入学生学号,名字,课程以及对应成绩,如果是学生登录可以查询自己的成绩。

如果出现重复学号,那么则视作更名处理,同时会有提示。
如果课程出现重复,那么则试错更改成绩处理,同时会有提示。

PS: 主函数为了设计稍微好看一点的界面,用了不少东西。
可能有几个没有用的函数,保留或者替换就看你的想法咯!什么偷懒博主
前面的函数功能如下:
getpos : 获取当前输出的最后一行的位置(这个是学术借鉴来的哈哈哈)
middle: 让输出的字符居中

主函数

#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
#include <iomanip>
#include <set>
//#include <ctype.h>
#include "student.h"
#include "Course.h"
#include "GradeSystem.h"
using namespace std;
typedef long long ll; 
char jiao[100]= "--------------------!教师登录!--------------------";
char xue[100] = "--------------------!学生登录!--------------------";
//set<pair<string, string>> s;
void gotoxy(HANDLE hOut, int x, int y)//移动光标 
{
    COORD pos;
    pos.X = x; //横坐标
    pos.Y = y; //纵坐标
    SetConsoleCursorPosition(hOut, pos);
}
void getpos(int* x, int* y)
{
    CONSOLE_SCREEN_BUFFER_INFO b;           // 包含控制台屏幕缓冲区的信息
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &b);    //  获取标准输出句柄
    *x = b.dwCursorPosition.X;
    *y = b.dwCursorPosition.Y;
}
void middle(char str[], int y)
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO bInfo;
    GetConsoleScreenBufferInfo(hOutput, &bInfo);
    int dwSizeX = bInfo.dwSize.X, dwSizey = bInfo.dwSize.Y;//获取控制台屏幕缓冲区大小
    int len = strlen(str);//获取要输出的字符串的长度
    int x = dwSizeX / 2 - len / 2;
    gotoxy(hOutput, x, y);//移动光标
    cout << str << endl;
}
int flagj = 0, flagx = 0;
vector<Student> S;
int main() {
        GradeSystem system;
        int x, y;
        string option;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN)
            ;
        char wel[100] = "欢迎来到学生成绩系统";
        middle(wel, 1);
        cout << endl;     
        char wel2[100] = "————————————————————————————————";
        middle(wel2, 2);
        char w1[100] = "|                         请选择您的身份:                       |";
        middle(w1, 3);
        char w2[100] = "|                            T: 教师                            |";
        middle(w2, 4);
        char w3[100] = "|                            S: 学生                            |";
        middle(w3, 5);
        char w4[100] = "|                            E: 退出                            |";
        middle(w4, 6);
        middle(wel2, 7);
        cout << endl;
        do {
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                FOREGROUND_GREEN);
            cout << "请输入您的操作选择:";
            cin >> option;
            if(option == "T"||option=="t") {
                if (flagj == 0)
                {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                    getpos(&x, &y);
                    middle(jiao, y + 1);
                    flagj = 1;
                    flagx = 0;
                }
                string id;
                string name, courseName;
                int grade;
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                    FOREGROUND_GREEN);
                bool found = false;
                while (!found)
                {
                    bool digit = false;
                    while (!digit)
                    {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                            FOREGROUND_GREEN);
                        cout << "请输入学生的学号: ";
                        cin >> id;
                        int len = id.size();
                        for (int i = 0; i < len; i++)
                        {
                            if (isdigit(id[i]))
                            {
                                digit = true;
                            }
                            else
                            {
                                digit = false;
                                break;
                            }
                        }
                        if (!digit)
                        {
                            cout << endl;
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                            cout << "非合法类型学号,您应该输入数字!" << endl;
                        }
                    }
                    
                    cout << "请输入学生的姓名: ";
                    cin >> name;
                    found = true;
                    for (auto& student : S)
                    {
                        if ((student.GetId() == id && student.GetName() != name) || (student.GetId() != id && student.GetName() == name))
                        {
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                            cout << "学生信息不匹配!请重新输入!" <<endl;
                            found = false;
                            break;
                        }
                    }
                    if(found) break;
                }
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                    FOREGROUND_GREEN);
                system.addStudent(Student(id, name),id,name);
                cout << "请输入课程名称: ";
                cin >> courseName;
                do {
                    cout << "请输入成绩: ";
                    cin >> grade;
                    if (grade < 0 || grade > 100) {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                        cout << "非法数据,请输入0~100之间的数." << endl;
                    }
                } while (grade < 0 || grade > 100);
                system.addCourse(id, courseName, grade);
            }
            else if (option == "S"||option=="s") {
                if (flagx == 0)
                {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                    getpos(&x, &y);
                    middle(xue, y + 1);
                    flagx = 1;
                    flagj = 0;
                }
                string id;
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                    FOREGROUND_GREEN);
                bool digit = false;
                while (!digit)
                {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                        FOREGROUND_GREEN);
                    cout << "请输入学生的学号: ";
                    cin >> id;
                    int len = id.size();
                    for (int i = 0; i < len; i++)
                    {
                        if (isdigit(id[i]))
                        {
                            digit = true;
                        }
                        else
                        {
                            digit = false;
                            break;
                        }
                    }
                    if (!digit)
                    {
                        cout << endl;
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                        cout << "非合法类型学号,您应该输入数字!" << endl;
                    }
                }
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                    FOREGROUND_GREEN);
                system.queryGrade(id);
            }
            else if (option == "E"||option=="e") {
                cout << endl;
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |
                    FOREGROUND_GREEN);
                char e1[100] = "感谢您的使用!";
                getpos(&x, &y);
                middle(e1, y+1);
                break;
            }
            else {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
                cout << "非法操作,请重新输入." << endl;
            }
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
                FOREGROUND_BLUE);
            char e[100] = "----------------请继续您的操作,选择教师身份请输入T,选择学生身份请输入S,退出请输出E----------------";
            cout << endl;
            getpos(&x, &y);
                middle(e,y+1);
        } while (true);
        return 0;
    }




Course

下面是头文件

#pragma once
#include <string>
#include <vector>
#include <iostream>
using namespace std;

class Course {
public:
    Course(string name,int grade);
    string GetName();
    int GetGrade();
    void change(string name, int grade);
private:
    string name_;
    int grade_;
};

下面是Course源文件


#include "Course.h"
#include <string>
#include <vector>
#include <iostream>
using namespace std;
Course::Course(string name,int grade)
{
    name_ = name;
    grade_ = grade;
}
string Course::GetName()
{
    return name_;
}
int Course::GetGrade()
{
    return grade_;
}
void Course::change(string name,int grade)
{
    name_ = name;
    grade_ = grade;
}

Student

下面是头文件

#pragma once
#include <string>
#include <vector>
#include <iostream>
#include "Course.h"
using namespace std;
typedef long long ll;
class Student {
public:
    Student(string id,string name);
    string GetName();
    string GetId() ;
    void AddCourse(string name,int grade);
    vector<Course> getCourses() const;
    void change(string id, string name);
//vector<Course> getCoursesName() const;
private:
    string name_;
    string id_;
    vector<Course> courses;
};



下面是源文件


#include "Student.h"
//#include "Course.h"
#include <string>
#include <vector>
#include <iostream>
using namespace std;
Student::Student(string id, string name)
{
    name_ = name;
    id_ = id;
}
string Student::GetName()
{
    return name_;
}
string Student::GetId()
{
    return id_;
}
void Student::AddCourse(string name,int score)
{
    bool isFound = false;
    for (auto& c : courses)
    {
        if (c.GetName() == name)
        {
            int t = c.GetGrade();
            c.change(name, score);
            isFound = true;
            cout << "学生" << GetName() << "的" << name << "已经存在,现在更改其成绩为" << score << "!" << "(原成绩为" << t << ")" << endl;
            break;
        }
    }
    if (!isFound)
    {
        courses.push_back(Course(name, score));
    }
}
vector<Course> Student::getCourses()const {
    return courses;
}
void Student::change(string id, string name)
{
    id_ = id;
    name_ = name;
}


GradeSystem

下面是头文件

#include <string>
#include <vector>
#include <iostream>
#include "Student.h"
#include "Course.h"
typedef long long ll;
class GradeSystem
{
public:
    void addStudent(Student student,string id,string name);
    void addCourse(string id, string name, int grade);
    void queryGrade(string id); 
private:
    vector<Student> students;
};


下面是源文件

#include <string>
#include <vector>
#include <iostream>
#include <iomanip>
#include <set>
#include "Student.h"
#include "GradeSystem.h"
#include "Course.h"
using namespace std;
typedef long long ll;
/*set<pair<string, string>> s;
struct Pair
{
    string first;
    string second;
};*/
void GradeSystem::addStudent(Student student,string id,string name)
    {
        //Pair input = { id,name };
    bool isFound = false;
    for (auto& p : students)
    {
        if (p.GetId() == id&&p.GetName()!=name)
        {
            string t = p.GetName();
            p.change(id, name); 
            isFound = true;
            cout << "学号为" << id << "的学生已存在,现已更改其姓名为" <<name<<"!"<<"(原姓名为"<<t<<")"<< endl;
            break;
        }
    }
    if (!isFound)
    {
        students.push_back(student);
    }
    }
    void GradeSystem::addCourse(string id, string name, int grade) {
        for (auto& student : students) {
            if (student.GetId() == id) {
                student.AddCourse(name, grade);
                cout << endl;
                cout << "成功添加" << name << "课程成绩至" << student.GetName() << "!" << endl;
                return;
            }
        }
        cout << "查无此学号为" << id << "的学生." << endl;
    }
    void GradeSystem::queryGrade(string id) {
        for (auto& student : students) {
            if (student.GetId() == id) {
                cout << "学生" << student.GetName() <<"的成绩如下"<< ":\n";
                for (auto& course : student.getCourses()) {
                    cout << "-------------------------" << course.GetName() << ": " << setw(10) << course.GetGrade() << endl;
                }
                return;
            }
        }
        cout << "查无此学号为" << id << "的学生." << endl;
    }


最后

蒟蒻只写了一个晚上,有疏漏之处在所难免,还请各位大佬指正。
本文仅供参考,只是提供一个思路,大伙看个乐就好。^ _ ^

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值