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;
}
最后
蒟蒻只写了一个晚上,有疏漏之处在所难免,还请各位大佬指正。
本文仅供参考,只是提供一个思路,大伙看个乐就好。^ _ ^