小学生成绩管理系统C++

小学生成绩管理系统C++

一 系统功能

采用菜单和文件实现学生信息管理
功能有:

  1. 信息维护:
    学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息
  2. 信息查询:
    查询时可按姓名查询或按学号查询
  3. 成绩统计:
    输入任意的一个课程名(如数学)和一个分数段(如60–70),统计出在此分数段的学生人数及百分比。
  4. 排序:
    对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果。

二 系统数据结构

使用一个结构体存放单个学生的信息, 其中:

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;
        }
    }

四 系统测试

  1. 添加学生成绩
  2. 显示学生成绩
  3. 修改学生信息
  4. 排序学生成绩
  5. 删除学生成绩
  6. 查询学生成绩
  7. 统计学生成绩

五 系统代码

// 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;
    }
}

}


※※※※一、特色 1、EXCEL平台 本作品采用EXCEL 公式+VBA制作,既可根据你平时使用EXCEL的习惯和方式操作充分发挥EXCEL的功能,又能利用本作品提高效率。 2、结构紧凑,界面简洁 本作品仅有三四个工作表,分别是总表、表册、设置。你可以先在总表输入、导入、复制粘贴或在记录单逐条录入原始成绩,经设置表简单设置后即可在“表册”中根据你的需要自动生成各种表册,包括分班成绩册等各种表册、成绩单、各种统计表等。 ※※※※二、与众不同 1、限制条件少,通用性强 只需把原始成绩输入、导入、复制粘贴或在记录单逐条录入总表即可,对总表要求极为宽松:不必整理试卷、非顺序录入;各列(包括科目)名称、位置任意;不受班级、每班人数、科目等数量限制,行列不受限制。简言之,只要您原始成绩表是什么样,把它搞过来就行,只需注意本总表第一行为表格项目且有班级一列和不合并单元格即可,其它不受任何限制。 2、具有容错能力 也许您对函数和公式比较熟悉,知道当公式引用的单元格被移动或删除时公式往往会出错。本作品避免了这个问题。本作品成绩册、统计表和成绩单采用公式生成,数据均来源于总表。可是对总表您尽可放心大胆编辑、修改,对数据进行各种处理,比如可以进行排序、筛选、删除等操作,哪怕移动和删除任何一行、一列,删除任何一个单元格也无妨。 3、具有恢复能力 本作品对成绩册和成绩单,虽然采用函数和公式实现,但您仍可自由编辑排版以便输出,如编辑、修改、删除公式,删除行列,哪怕删除或者清空整张表也可,如果你进行了以上或者其他误操作,您只需重新点击相应按钮即可。 ※※※※三、主要功能 1、查询:查询条件多样,可按姓名查询、按班级查询(分班);按某学科(含总分)某分数段查询;按班内名次(年级名次)段查询(如某班前XX名、年级前XX-XX名)等,各种查询条件还可自由组合。对查询结果,可按某关键字排序后显示,如按班级排名升序可组合出某班全部或班前XX名、年级前XX名排名等,按年级排名升序可组合出年级前XX名排名或全部排名等。 2、统计:根据班级和科目(含总体)按统计范围自动实时生成各项指标(参考人数、平均分、及格人数、及格率、优生人数、优生率、差生人数、差生率等)、各分数段人数统计、年级前XX名在各班分布等。 3、成绩册和成绩条:实时自动按班生成成绩册和成绩条。 ※※※※三、操作指南 在总表中输入、导入、复制粘贴或在记录单逐条录入原始成绩,经设置表简单设置后即可在“表册”中根据你的需要自动生成各种表册,包括分班成绩册等各种表册、成绩单、各种统计表等。 其中,分班成绩册和成绩单、统计分别以VBA和公式两种方式制作,这两种方式各有特点,供你选择:公式方式的优点是当条件变化(如所选班级、科目变化)时显示结果随之实时变化,除非公式被破坏或者刚从其它表册转入本功能你才需要重新点击按钮;VBA方式每次改变条件后必须点击相应按钮才能刷新结果,但对结果你可随意进行各种操作。如果你觉得窗体有可能遮住结果,窗体可移动,可关闭,也可随时按CTRL+Q(W)打开,以便在EXCEL中按你熟悉的方式操作。另总表中还提供了按班级排序、填入总分、平均分、计算班级排名、年级排名、分数超限检查等多种自动化功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值