小学生成绩管理系统C++
一 系统功能
采用菜单和文件实现学生信息管理
功能有:
- 信息维护:
学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息 - 信息查询:
查询时可按姓名查询或按学号查询 - 成绩统计:
输入任意的一个课程名(如数学)和一个分数段(如60–70),统计出在此分数段的学生人数及百分比。 - 排序:
对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果。
二 系统数据结构
使用一个结构体存放单个学生的信息, 其中:
name为姓名, id为学号, score数组中分别存储语文 数学 英语 成绩
// 存放信息的结构体
typedef struct Data {
string name;
string id;
float score[3];
} DATA;
使用vector容器存储所有学生的信息:
vector<Data> datas;
三 系统模块讲解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAlTJDKt-1674285668328)(C:\Users\He\AppData\Roaming\Typora\typora-user-images\image-20221230201328808.png)]
定义Manage类用于存储学生信息和对应的增删改查操作
class Manage {
private:
vector<Data> datas;
string file_name;
public:
Manage(string file_name);
vector<Data> get_data();
void read_file(string file_name); // 从文件读取内容
void write_file(string file_name, vector<Data> &datas); // 将datas写入文件
void print(vector<Data> &data); // 打印内容
int search(string content); // 查询返回查询值的下标或 -1
void sort_data(int a, int b); // 排序 a按: 语文0 数学1 英语2, b: 0 升序 1降序
Data add_data(); // 增添一个数据
void delete_data(string content); // 删除内容
void modify_data(string content); // 修改内容
void add_data_func(); // 添加内容
void statis_data(int a, double score1, double score2); //a按: 语文0 数学1 英语2
};
定义Menu函数用于菜单的打印和用户选择的获取:
int Menu() {
int n;
do {
system("cls");
cout << endl << "小学生成绩管理系统 " << endl;
cout << "1、添加学生成绩 " << endl;
cout << "2、显示学生成绩 " << endl;
cout << "3、修改学生信息 " << endl;
cout << "4、排序学生成绩" << endl;
cout << "5、删除学生成绩 " << endl;
cout << "6、查询学生成绩" << endl;
cout << "7、统计学生成绩" << endl;
cout << "8、保存并退出 " << endl;
cout << "请选择: ";
cin >> n;
} while (n < 1 || n > 8);
return n;
}
在主函数中分别调用相应的模块完成功能:
while (true) {
ch = Menu();
switch (ch) {
case 1:
cout << "1、添加学生成绩 " << endl;
m.add_data_func();
getch();
break;
case 2:
cout << "2、显示学生成绩 " << endl;
m.read_file(file_name);
aa = m.get_data();
m.print(aa);
getch();
break;
case 3:
cout << "3、修改学生信息 " << endl;
cout << "请输入要修改的学生的姓名或者学号: " << endl;
cin >> cont;
m.modify_data(cont);
getch();
break;
case 4:
cout << "4、排序学生成绩" << endl;
cout << "输入要按升序 0, 降序 1 排序:" << endl;
// 排序 a按 : 语文0 数学1 英语2, b : 0 升序 1降序
cin >> b;
cout << "输入要按语文 0, 数学 1, 英语 2 排序:" << endl;
cin >> a;
m.sort_data(a, b);
aa = m.get_data();
m.print(aa);
getch();
break;
case 5:
cout << "5、删除学生成绩 " << endl;
cout << "请输入要删除的学生的姓名或者学号: " << endl;
cin >> cont;
m.delete_data(cont);
getch();
break;
case 6:
cout << "6、查询学生成绩" << endl;
cout << "请输入要查询的学生的姓名或者学号: " << endl;
cin >> cont;
search_id = m.search(cont);
bl = m.get_data();
al.push_back(bl[search_id]);
m.print(al);
getch();
break;
case 7:
cout << "7、统计学生成绩" << endl;
cout << "输入要按语文 0, 数学 1, 英语 2 统计:" << endl;
cin >> b;
cout << "输入分数区间 score1 score2" << endl;
cin >> score1 >> score2;
m.statis_data(b, score1, score2);
getch();
break;
case 8:
exit(0);
break;
}
}
四 系统测试
- 添加学生成绩
- 显示学生成绩
- 修改学生信息
- 排序学生成绩
- 删除学生成绩
- 查询学生成绩
- 统计学生成绩
五 系统代码
// vector_demo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#pragma warning(disable:4996)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include<conio.h>//使用getch()函数
using namespace std;
// 存放信息的结构体
typedef struct Data {
string name;
string id;
float score[3];
} DATA;
int sort_id;
bool LessSort(DATA a, DATA b)
{
return (a.score[sort_id] > b.score[sort_id]);
}
bool GreaterSort(DATA a, DATA b) {
return (a.score[sort_id] < b.score[sort_id]);
}
class Manage {
private:
vector<Data> datas;
string file_name;
public:
Manage(string file_name);
vector<Data> get_data();
void read_file(string file_name); // 从文件读取内容
void write_file(string file_name, vector<Data> &datas); // 将datas写入文件
void print(vector<Data> &data); // 打印内容
int search(string content); // 查询返回查询值的下标或 -1
void sort_data(int a, int b); // 排序 a按: 语文0 数学1 英语2, b: 0 升序 1降序
Data add_data(); // 增添一个数据
void delete_data(string content); // 删除内容
void modify_data(string content); // 修改内容
void add_data_func(); // 添加内容
void statis_data(int a, double score1, double score2); //a按: 语文0 数学1 英语2
};
void Manage::statis_data(int a, double score1, double score2) {
read_file(file_name);
sort_data(a, 0); // 对数据按升序排列
int m = 0;
for (int i = 0; i < datas.size(); i++) {
if (datas[i].score[a] < score1 || datas[i].score[a] > score2) {
m++;
}
}
int k = datas.size() - m;
cout << "在此成绩区间的学生人数为: " << k << "占总人数的"<< k * 100.0 / datas.size() <<"%"<< endl;
}
void Manage::add_data_func() {
read_file(file_name);
datas.push_back(add_data());
write_file(file_name, datas);
}
Data Manage::add_data() {
DATA temp;
cout << "请依此输入 姓名 学号 语文成绩 数学成绩 英语成绩 按回车: " << endl;
cin >> temp.name >> temp.id >> temp.score[0] >> temp.score[1] >> temp.score[2];
return temp;
}
void Manage::modify_data(string content) {
int search_id = search(content);
if (search_id == -1) {
cout << "该内容不存在" << endl;
}
else {
cout << "要修改的内容为: " << endl;
vector<Data> a;
a.push_back(datas[search_id]);
print(a);
datas[search_id] = add_data();
cout << "修改完成" << endl;
print(datas);
write_file(file_name, datas);
}
}
void Manage::delete_data(string content) {
int search_id = search(content);
if (search_id == -1) {
cout << "该内容不存在" << endl;
}
else {
datas.erase(datas.begin() + search_id);
}
write_file(file_name, datas);
}
void Manage::sort_data(int a, int b) {
sort_id = a;
read_file(file_name);
if (b == 0) {
sort(datas.begin(), datas.end(), GreaterSort);
}
else {
sort(datas.begin(), datas.end(), LessSort);
}
}
Manage::Manage(string file_name) {
this->file_name = file_name;
}
vector<Data> Manage::get_data() {
return this->datas;
}
int Manage::search(string content) {
// 读文件
read_file(this->file_name);
for (int i = 0; i < datas.size(); i++) {
if (datas[i].id == content || datas[i].name == content) {
return i;
}
}
return -1;
}
void Manage::write_file(string file_name, vector<Data>& datas) {
ofstream ofs(file_name, ios::out);
for (int i = 0; i < datas.size(); i++)
{
ofs << datas[i].name << " " << datas[i].id << " ";
ofs << datas[i].score[0] << " " << datas[i].score[1] << " " << datas[i].score[2] << endl;
}
ofs.close();
}
void Manage::read_file(string file_name) {
ifstream ifs;
ifs.open(file_name, ios::in);
if (!ifs.is_open()) {
cout << "文件打开失败" << endl;
}
datas.clear();
DATA data;
while (ifs >> data.name >> data.id >> data.score[0] >> data.score[1] >> data.score[2]) {
datas.push_back(data);
}
ifs.close();
}
void Manage::print(vector<Data>& data) {
cout << "姓名\t学号\t语文\t数学\t英语" << endl;
for (int i = 0; i < data.size(); i++)
{
cout << data[i].name << "\t" << data[i].id << "\t";
cout << data[i].score[0] << "\t" << data[i].score[1] << "\t" << data[i].score[2] << endl;
}
}
void test01()
{
string file_name = "data.txt";
Manage m(file_name);
m.delete_data("张明明");
vector<Data> a = m.get_data();
m.print(a);
}
int Menu() {
int n;
do {
system("cls");
cout << endl << "小学生成绩管理系统 " << endl;
cout << "1、添加学生成绩 " << endl;
cout << "2、显示学生成绩 " << endl;
cout << "3、修改学生信息 " << endl;
cout << "4、排序学生成绩" << endl;
cout << "5、删除学生成绩 " << endl;
cout << "6、查询学生成绩" << endl;
cout << "7、统计学生成绩" << endl;
cout << "8、保存并退出 " << endl;
cout << "请选择: ";
cin >> n;
} while (n < 1 || n > 8);
return n;
}
int main()
{
string file_name = "data.txt";
Manage m(file_name);
vector<Data> aa;
int ch = 0;
int b, a;
int search_id;
string cont;
vector<Data> al, bl;
double score1, score2;
while (true) {
ch = Menu();
switch (ch) {
case 1:
cout << "1、添加学生成绩 " << endl;
m.add_data_func();
getch();
break;
case 2:
cout << "2、显示学生成绩 " << endl;
m.read_file(file_name);
aa = m.get_data();
m.print(aa);
getch();
break;
case 3:
cout << "3、修改学生信息 " << endl;
cout << "请输入要修改的学生的姓名或者学号: " << endl;
cin >> cont;
m.modify_data(cont);
getch();
break;
case 4:
cout << "4、排序学生成绩" << endl;
cout << "输入要按升序 0, 降序 1 排序:" << endl;
// 排序 a按 : 语文0 数学1 英语2, b : 0 升序 1降序
cin >> b;
cout << "输入要按语文 0, 数学 1, 英语 2 排序:" << endl;
cin >> a;
m.sort_data(a, b);
aa = m.get_data();
m.print(aa);
getch();
break;
case 5:
cout << "5、删除学生成绩 " << endl;
cout << "请输入要删除的学生的姓名或者学号: " << endl;
cin >> cont;
m.delete_data(cont);
getch();
break;
case 6:
cout << "6、查询学生成绩" << endl;
cout << "请输入要查询的学生的姓名或者学号: " << endl;
cin >> cont;
search_id = m.search(cont);
bl = m.get_data();
al.push_back(bl[search_id]);
m.print(al);
getch();
break;
case 7:
cout << "7、统计学生成绩" << endl;
cout << "输入要按语文 0, 数学 1, 英语 2 统计:" << endl;
cin >> b;
cout << "输入分数区间 score1 score2" << endl;
cin >> score1 >> score2;
m.statis_data(b, score1, score2);
getch();
break;
case 8:
exit(0);
break;
}
}
}
getch();
break;
case 7:
cout << "7、统计学生成绩" << endl;
cout << "输入要按语文 0, 数学 1, 英语 2 统计:" << endl;
cin >> b;
cout << "输入分数区间 score1 score2" << endl;
cin >> score1 >> score2;
m.statis_data(b, score1, score2);
getch();
break;
case 8:
exit(0);
break;
}
}
}