10. 考勤信息

题目描述

公司用一个字符串来表示员工的出勤信息

  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingw0114

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值