题目描述
公司用一个字符串来表示员工的出勤信息
- absent:缺勤
- late: 迟到
- leaveearly: 早退
- present: 正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
- 缺勤不超过一次,
- 没有连续的迟到/早退:
- 任意连续7次考勤,缺勤/迟到/早退不超过3次
输入描述
第一行输入一个整数
n,表示有多少个员工后面
n行,每一行输入若干个字符串,表示第i名员工的出勤信息输出描述
输出
n行,每一行表示这名员工能否获得出勤奖,如果可以,则输出“true",否则输出”false"示例1
输入: 2 present present present 输出: true true示例2
输入: 2 present present absent present present leaveearly present absent 输出: true false
作者:code5bug
链接:考勤信息 - 华为OD统一考试(C卷)_牛客网
来源:牛客网
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.对n个员工的出勤情况做一个评估,是否可以获得出勤奖励
2.absent表示缺勤,late表示迟到,leaveearly表示早退,present表示正常上班
3.如果想要获得出勤奖励需要满足:
(1)缺勤不超过一次
(2)没有连续的迟到/早退
(3)任意连续7次考勤,缺勤/迟到/早退不超过3次
4.输入描述:输入一个正整数n表示员工数量,后面n行表示第i名员工的出勤信息
5.输出描述:输出n行每行表述员工是否能获得出勤奖,如果可以输出true不可以输出false
二、解题思路
1.首先定义一个整数变量int n;用来存储员工数量
2.然后对于每一名员工,我们接收他的出勤信息并存储到一个字符串char info[1000];中
fgets(info, sizeof(info), stdin);
info[strcspn(info, '\n')] = '\0';
3.我们对出勤信息进行一个统计,首先定义一个变量统计缺勤次数int absent = 0;
4.还需要定义一个变量表示连续迟到或者早退int lateleavearly = 0;(每次遇到late和leaveearly的时候增加1,如果变成2我们认为不能获得出勤奖)
5.还需要一个记录连续7次缺勤/迟到/早退的次数不超过三次的方法,我们可以用一个数组表示
int idx = 0;
bool week[7] = {false};首先我们初始化为0,表示没有缺勤
6.然后在处理出勤信息的时候,做一个判断
if(idx == 6) idx = 0;
如果已经到了第七天我们将索引变回第一天
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
char info[1000];
fgets(info, sizeof(info), stdin);
info[strcspn(info, "\n")] = '\0';
bool absent = false;
bool attandance = true;
bool lateleaveearly = false;
bool week[7] = {false};
int idx = 0;
int threetime = 0;
char* temp = strtok(info, " ");
while(temp != NULL) {
if(strcmp(temp,"absent") == 0) {
if(absent == true) {
attandance = false;
} else {
absent = true;
lateleaveearly = false;
}
} else if(strcmp(temp, "late") == 0 || strcmp(temp,"leaveearly") == 0) {
if(lateleaveearly == true) attandance = false;
else lateleaveearly = true;
} else if(strcmp(temp, "present") == 0) {
lateleaveearly = false;
}
if(attandance == false) break;
else {
if(week[idx] == 1) threetime--;
if(strcmp(temp,"absent") == 0 || strcmp(temp,"late") == 0 || strcmp(temp,"leaveearly") == 0) {
week[idx++] = 1;
threetime++;
if(threetime >= 3) attandance = false;
} else { // 其他情况应该只有出席
week[idx++] = 0;
}
if(idx == 7) idx = 0;
}
if(attandance == false) break;
temp = strtok(NULL, " ");
}
if(attandance == false) printf("false\n");
else printf("true\n");
}
return 0;
}
511

被折叠的 条评论
为什么被折叠?



