C++实验——出勤情况统计(小红花)

本文介绍了一个使用C++实现的幼儿园学生出勤统计系统。系统通过读取文本文件中的出勤记录,利用bitset和vector容器对每个孩子的出勤情况进行统计,并能够按出勤次数排序,最终输出每个孩子的学号及出勤次数。此外,还实现了选出出勤率最高的三个孩子以给予奖励的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验要求:

  • 幼儿园中按班组织学生,每个班学生按学号排号,规模为25个孩子,学校每天出勤用一个bitset描述,1代表出勤,0代表缺勤。

  • 试着编写接口函数输出每个孩子序号与出勤数。

  • optional)找出出勤率最高的3个孩子给当月的小红花。

实验目标:

  • 熟悉stl库中<bitset>使用,复习vector与文件io

  • 从duty.txt中构建vector<bitset<N>>容器

  • 对于序号/出勤数,显示输出

  • (optional)按出勤数排序

实验文件:

将下面数据复制到D盘目录下建立duty.txt文件(学号一行不复制)

学号1-------------->学号25
1111111111111111111111111
1110111011101110111011100
1101101101101101101101101
1111011110111101111011110
0011101110111101111101111
0011101111011111110111111
1111101111110111111100111
1100111110001111111111110
1111111111111101111111111
1111011111011111111110111

实验代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <iterator>
#include <functional>

#define N 25      //学生总数

using namespace std;

class Student     //学生类
{
public:
    int ID;
    int AttendDay;
public:

    Student(int id,int attendday):ID(id),AttendDay(attendday){}

    int GetId()
    {
        return ID;
    }
    int GetAttendDay()
    {
        return AttendDay;
    }
};

ostream& operator << (ostream& os,const Student& s)
{
    os << s.ID << '\t' << s.AttendDay << endl;
    return os;
}

class StudIndex:public binary_function<Student,Student,bool>     //按出勤次数对学生进行排序
{
private:
    vector<Student>&vStud;
public:
    StudIndex(vector<Student>&vStud):vStud(vStud){}
    bool operator() (Student a, Student b)
    {
        return a.AttendDay < b.AttendDay;
    }
};

void test()
{
    vector<Student>vec_s;         //学生容器
    vector<bitset<N> >vec_b;      //bitset容器

    string str;

    ifstream in("D:\\duty.txt");
    if(!in)
    {
        cout << "读入文件错误!" << endl;
        return;
    }

    for (int i = 0;i < N; i++)
    {
        Student s(i,0);
        vec_s.push_back(s);
    }

    while (getline(in,str))
    {
        bitset<25>b(str);
        vec_b.push_back(b);
    }
    for (int i = 0;i < vec_b.size();i++)
    {
        for (int j = 0;j < vec_s.size();j++)
        {
            if (vec_b[i].test(j) == 1)
            {
                vec_s[j].AttendDay++;
            }

        }
    }
    cout << "\t学号" << '\t' << "出勤次数" << endl;
    sort(vec_s.begin(),vec_s.end(),StudIndex(vec_s));
    cout << '\t' ;
    copy(vec_s.begin(),vec_s.end(),ostream_iterator<Student>(cout,"\t"));

    cout << "选最后三位同学给与小红花!" << endl;
}
int main()
{
    test();
    return 0;
}

 

试题:该程序(Test.exe)用于统计、记录某单位全体员工一天的考勤情况。 输入:员工基本信息文件(文本文件)、全天出入记录的数据文件(文本文件) 1. 员工基本信息文件(参见employee.txt) 每行记录一位员工的基本信息,格式为:姓名,工号(例如:张三,34251),其中姓名(不超过20个字符)和工号(整型); 2. 全天出入记录的数据文件(参见log.txt) 该单位的门禁系统每天生成一个员工全天出入记录的数据文件,记录出入的工作人员工号、出入的时间以及出入类型(O:出,I:入), 记录按时间先后记录 文件中每行记录一次出或入的信息 每条记录的格式为:工号,时间,类型(例如:34251,08:30,I),其中时间格式为hh:mm。 程序要完成的功能 请通过程序读取员工基本信息文件和门禁系统全天出入记录的数据文件,计算各工作人员当天的总共在岗时间,并将结果保存至c:\result.txt文件中。要求结果中包含有姓名,工号,在岗时间等信息。 注:员工基本信息文件和数据文件的名称通过命令行参数的形式输入 (例如:Test.exe employee.txt log.txt)。 输出:员工在岗时间统计文件(文本文件) 员工在岗时间统计文件(参见result.txt) 文件中每行记录一位工作人员的在岗时间信息。 格式为:姓名,工号,在岗时间(例如:张三,34251,8小时10分钟)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值