C++实现学生考勤信息管理系统

C++实现学生考勤信息管理系统

系统需求

首先,我们需要定义考勤信息管理系统的需求:

  • 能够添加新学生记录;
  • 能够删除指定学生记录;
  • 能够显示所有学生记录;
  • 能够修改指定学生记录;
  • 能够查询指定学生记录。

数据结构设计

为了实现学生考勤信息管理系统,我们需要定义数据结构来存储学生记录。这里我们选择使用结构体来表示一个学生记录,包括以下字段:

struct StudentRecord {
    string name;
    string id;
    bool attendance[MAX_DAYS];
    int absent_count;
};

其中,name 表示学生姓名,id 表示学生学号,attendance 用于记录多个日期的出勤情况,absent_count 表示缺勤次数。

为了方便操作,我们还需要定义一个学生信息管理类:

class StudentManager {
public:
    void addRecord(const string& name, const string& id);
    void deleteRecord(const string& id);
    void showRecords();
    void modifyRecord(const string& id);
    void queryRecord(const string& id);

private:
    vector<StudentRecord> records_;
    int findRecord(const string& id);
};

其中,addRecord 用于添加新的学生记录,deleteRecord 用于删除指定学生记录,showRecords 用于显示所有学生记录,modifyRecord 用于修改指定学生记录,queryRecord 用于查询指定学生记录。records_ 表示所有学生记录的容器。

我们还需要定义一个常量 MAX_DAYS 来表示记录的天数。

实现细节

添加学生记录

添加学生记录需要输入学生姓名和学号,并将相应的记录添加到容器中。具体实现如下:

void StudentManager::addRecord(const string& name, const string& id) {
    // 检查是否已经存在该学号的记录
    if (findRecord(id) != -1) {
        cout << "Error: 学号已存在!" << endl;
        return;   
    }
    // 创建新的学生记录
    StudentRecord record = { name, id };
    // 将新的学生记录添加到容器中
    records_.push_back(record);
    cout << "Success: 添加学生记录成功!" << endl;
}

删除学生记录

删除学生记录需要输入学生学号,首先需要查找该学号对应的学生记录,然后从容器中删除该记录。具体实现如下:

void StudentManager::deleteRecord(const string& id) {
    // 查找学号对应的学生记录在容器中的下标
    int index = findRecord(id);
    if (index == -1) {
        cout << "Error: 学号不存在!" << endl;
        return;
    }
    // 从容器中删除学生记录
    records_.erase(records_.begin() + index);
    cout << "Success: 删除学生记录成功!" << endl;
}

显示所有学生记录

显示所有学生记录需要将容器中的每个学生记录逐个输出。具体实现如下:

void StudentManager::showRecords() {
    if (records_.empty()) {
        cout << "暂无学生记录!" << endl;
        return;
    }
    cout << "学号\t姓名\t出勤次数" << endl;
    for (const auto& record : records_) {
        int attendance_count = MAX_DAYS - record.absent_count;
        cout << record.id << "\t" << record.name << "\t" << attendance_count << endl;
    }
}

修改学生记录

修改学生记录需要输入学生学号,然后查找该学号对应的学生记录,最后修改该学生记录的相应字段。具体实现如下:

void StudentManager::modifyRecord(const string& id) {
    // 查找学号对应的学生记录在容器中的下标
    int index = findRecord(id);
    if (index == -1) {
        cout << "Error: 学号不存在!" << endl;
        return;
    }
    // 修改学生记录
    auto& record = records_[index];
    cout << "姓名(原):" << record.name << endl;
    string name;
    cout << "请输入新的姓名:" << endl;
    cin >> name;
    record.name = name;
    cout << "Success: 修改学生记录成功!" << endl;
}

查询学生记录

查询学生记录需要输入学生学号,然后查找该学号对应的学生记录,最后输出该学生记录的详细信息。具体实现如下:

void StudentManager::queryRecord(const string& id) {
    // 查找学号对应的学生记录在容器中的下标
    int index = findRecord(id);
    if (index == -1) {
        cout << "Error: 学号不存在!" << endl;
        return;
    }
    // 输出学生记录的详细信息
    const auto& record = records_[index];
    cout << "姓名:" << record.name << endl;
    cout << "学号:" << record.id << endl;
    int attendance_count = MAX_DAYS - record.absent_count;
    cout << "出勤次数:" << attendance_count << endl;
    cout << "出勤情况:";
    for (int i = 0; i < MAX_DAYS; i++) {
        cout << (record.attendance[i] ? "√" : "X");
    }
    cout << endl;
}

查找学生记录

查找学生记录需要输入学生学号,并在容器中查找该学号对应的学生记录。具体实现如下:

int StudentManager::findRecord(const string& id) {
    for (int i = 0; i < records_.size(); i++) {
        if (records_[i].id == id) {
            return i;
        }
    }
    return -1;
}

示例说明

下面是使用示例:

int main() {
    StudentManager manager;
    manager.addRecord("张三", "1001");
    manager.addRecord("李四", "1002");
    manager.showRecords();

    manager.modifyRecord("1002");
    manager.showRecords();

    manager.deleteRecord("1001");
    manager.showRecords();

    manager.queryRecord("1002");

    return 0;
}

输出:

学号    姓名    出勤次数
1001    张三    0
1002    李四    0

姓名(原):李四
请输入新的姓名:
王五
Success: 修改学生记录成功!
学号    姓名    出勤次数
1001    张三    0
1002    王五    0

Success: 删除学生记录成功!
学号    姓名    出勤次数
1002    王五    0

姓名:王五
学号:1002
出勤次数:0
出勤情况:XXXXXXXX

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现学生考勤信息管理系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • RedHat linux 8.0下内核编译步骤和说明

    RedHat Linux 8.0下内核编译步骤和说明 前置条件 已安装RedHat Linux 8.0操作系统 具备基本的Linux命令行操作技巧 下载Linux内核源码包 步骤说明 步骤1:解压源码包 将下载的Linux内核源码包解压到任意位置,例如/home/username/kernel。 步骤2:配置内核 进入源码目录,使用以下命令进行配置: mak…

    C 2023年5月22日
    00
  • c++11 atomic的使用详解

    下面是关于”C++11 atomic的使用详解”的完整攻略。 什么是atomic atomic是一个C++11标准中的类模板,可用于实现原子操作。原子操作是一种不可分割的操作,要么成功执行,要么不执行,不会被其他线程中断。使用atomic可以确保并发访问下的线程安全。 基础用法 atomic支持内部类型如int、long等的原子操作。下面是一些基本的示例: …

    C 2023年5月22日
    00
  • C语言中的分支循环其嵌套语句

    C语言中的分支循环语句是控制程序流程的重要工具,它们可以根据条件来执行不同的代码块,或者循环执行某段代码块。与此同时,C语言还支持分支循环语句的嵌套,这种语句结构可以更精细地控制程序流程,提高代码的效率和可维护性。下面是完整的攻略。 分支语句 if语句 if语句是最基本的分支语句,用来测试一个条件,如果满足条件就执行指定的代码块。 语法: if (条件) {…

    C 2023年5月23日
    00
  • 初学C语言基本运算和表达式

    初学C语言基本运算和表达式攻略 C语言是一门计算机编程语言,基本运算和表达式是C语言编程中的基础知识点。在学习这一部分内容时,需要掌握以下知识点: 基本运算符 表达式的运算顺序 数据类型的转换 下面我们来一步步了解这些知识点。 基本运算符 在C语言中,基本运算符包括算术运算符、关系运算符、逻辑运算符和位运算符。 算术运算符 算术运算符包括加(+)、减(-)、…

    C 2023年5月23日
    00
  • C语言实现学生信息管理系统(多文件)

    C语言实现学生信息管理系统(多文件)攻略 1. 项目概述 该项目是一个基于C语言的学生信息管理系统,实现了学生的增删改查等功能,使用了多文件的方式组织代码,提高了代码的可维护性。 2. 实现步骤 2.1 文件结构 首先建立项目文件夹,并在文件夹中创建如下的文件: main.c:包含主函数和系统的核心功能代码; student.c:包含学生信息相关的实现代码;…

    C 2023年5月23日
    00
  • 结合Mybatis聊聊对SQL注入的见解

    结合MyBatis聊聊对SQL注入的见解 什么是SQL注入? SQL注入(SQL Injection),也称为SQL攻击,是一种代码注入攻击。攻击者利用Web应用程序通过将恶意的SQL代码注入到输入字段中来攻击后台数据库服务器,从而获得敏感信息或者完全控制后台数据库。这些注入代码可能在数据请求中或者输入URL参数中出现。SQL注入是当前Web应用程序的最大安…

    C 2023年5月22日
    00
  • 02-VS调试以及Qt基本使用

    VS调试以及Qt基本使用 1.汇编语言 1.1 VS中C语言嵌套汇编代码(了解) #include <stdio.h> int main() { //定义整型变量a, b, c int a; int b; int c; __asm { mov a, 3 //3的值放在a对应内存的位置 mov b, 4 //4的值放在b对应内存的位置 mov ea…

    C语言 2023年4月18日
    00
  • C语言实现五子棋游戏

    C语言实现五子棋游戏攻略 1. 五子棋游戏基本规则 五子棋是一种双人对弈的纯策略型棋类游戏,在棋盘上摆放黑白两色的棋子,先在横向、竖向或斜向连续形成五子棋者获胜。棋盘通常为15×15的方格,也有其他规格的棋盘。 2. 实现五子棋游戏的基本思路 实现五子棋游戏的基本思路是通过使用二维数组作为游戏棋盘,使用循环检查棋盘上落子的情况,判断游戏的胜负情况。 具体步骤…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部