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
阅读剩余 77%

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

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

相关文章

  • C语言求字符串长度的四种方法实例代码

    下面是针对“C语言求字符串长度的四种方法实例代码”这个主题的完整攻略: 一、背景 在C语言中,获取字符串长度是一个比较基础的操作,它在很多情况下都非常有用。本文将介绍四种常见的C语言获取字符串长度的方法,逐一进行讲解和实例演示。 二、方法一:使用strlen()函数 strlen()函数是C语言中用于获取字符串长度的标准函数,它的使用非常简单,直接传入字符串…

    C 2023年5月24日
    00
  • Linux系统下如何使用C++解析json文件详解

    下面是在Linux操作系统下如何使用C++解析Json文件的详细攻略。 1. 概述 在Linux系统下,C++解析Json文件的主要方式是使用第三方库,而rapidjson是其中一个被广泛使用的库,它提供了高性能、易使用、轻量级的Json解析功能,同时支持DOM(文档对象模型)和SAX(事件驱动)两种解析方式。接下来将以rapidjson为例,介绍如何在Li…

    C 2023年5月23日
    00
  • C语言实现井字棋游戏(人机对弈)

    C语言实现井字棋游戏(人机对弈)攻略 概述 井字棋,是一种简单的二人游戏,游戏过程中使用一个 3×3 的格子,两个人轮流在格子中放置自己的符号(通常是“x”和“o”),直到其中一方连成三个相同的符号为止。 本攻略旨在介绍如何使用 C 语言编写一个井字棋游戏,并实现人机对弈的功能。 游戏规则 游戏开始时,玩家和电脑各占一个符号(通常是“x”或“o”)。 游戏持…

    C 2023年5月23日
    00
  • 神乐千鹤在拳皇97、98中的高级用法

    神乐千鹤在拳皇97、98中的高级用法攻略 什么是神乐千鹤? 神乐千鹤是拳皇系列游戏中的一位角色,拥有快速的移动速度和敏捷的攻击方式。她在拳皇97和98中的操作难度较高,但是如果掌握了她的高级用法,就可以轻松地击败对手。 神乐千鹤的高级用法 1. 投掷连击 神乐千鹤的投掷连击是一种非常强大的攻击方式。要进行投掷连击,首先需要进行一次投掷攻击(按下前+C),然后…

    C 2023年5月22日
    00
  • C#使用Clipboard类实现剪贴板功能

    C#使用Clipboard类实现剪贴板功能 导读 剪贴板是电脑生产过程中至关重要的一部分,通过使用剪贴板,我们可以在不同的应用程序和文本之间快速、方便地复制和粘贴数据。在C#中,我们可以使用Clipboard类来实现剪贴板的功能,本文将详细讲解如何在C#应用程序中使用Clipboard类来实现剪贴板功能。 使用Clipboard类 在C#中,Clipboar…

    C 2023年5月23日
    00
  • Android App调试内存泄露之Cursor篇

    Android App调试内存泄露之Cursor篇 什么是内存泄露 Android应用程序中常见的问题是内存泄漏问题。内存泄漏指的是程序中的对象在使用完之后仍然被占用并未得到垃圾回收,导致内存空间不断被占满,从而引发ANR和崩溃等问题。 Cursor泄露的原因 在Android开发中,我们使用Cursor对象进行数据的操作。Cursor对象是一种轻量级的数据…

    C 2023年5月23日
    00
  • 利用gson将map转为json示例

    将Map类型转为JSON字符串,可以使用Google开源的Gson库。下面是将Map类型转换为JSON字符串的攻略: 引入Gson依赖 首先需要引入Gson库,在项目的build.gradle中添加如下依赖: dependencies { implementation ‘com.google.code.gson:gson:2.8.6’ } 使用Gson将Ma…

    C 2023年5月23日
    00
  • C语言实现经典扫雷小游戏的示例代码

    下面我将为您提供C语言实现经典扫雷小游戏的示例代码的完整攻略。 准备工作 在开始编写代码之前,需要准备好以下工作: 确定游戏的规则和难度等级; 准确计算雷区的总大小、雷数等信息; 确定游戏界面的元素,例如雷区的格子、计时器、分数等; 使用C语言编写代码所需的IDE和编译器等工具。 编写代码 下面是基于C语言实现经典扫雷小游戏的示例代码: #include &…

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