C++实现 L1-043 阅览室 (20分)

C++实现 L1-043 阅览室 (20分)

一、描述

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

二、输入格式

输入在第一行给出一个正整数 N ( ≤ 10 ) N(≤10) N(10),随后给出 N N N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

三、输出格式

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

四、输入样例

3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00

五、输出样例

2 196
0 0
1 60

六、思路

  1. 定义一个已借阅桶和一个书号时间桶,两者相对应;
  2. 录入时间时候cin>>hh>>c>>mm,其中c定义为字符串,用来录入冒号;
  3. 判断时先以书号为判断条件,书号为0,则表示结束一天,已借阅桶和书号桶都需要全部置0,借书次数和总时间也均要置0;
  4. 按键S表示借书,将借书时间点存入书号时间桶,且相应借阅桶置1;
  5. 按键E,还书,借阅桶置0,以方便接下来有人继续借书,总时间用还书时间减去时间桶的时间,借书次数+1。

注意1:录入的数量一定要按照天数来,若录入3天的数据,则第三次书号为0后一定要结束程序,否则会不通过。
注意2:书号等于0时,计算平均时长,不能用ceil()向上取整函数,会报错(这里也不知道为什么),需要强制转换int,且计算后要+0.5才能通过。
注意3:注意考虑分母为0的情况(即一天没有借阅书)。
注意4:全部置0,不能用time[1002]={0},需要用到memset(time, 0, sizeof(time));否则也会报错。
注意5:借书时候,不用判断flag是否为0,因为该题会有错误录入,同一本书号,以最后一次借书信息为准。
注意6:还书时候要判断flag是否为1,且还书后要flag置0,保证上一个人还书后,下一个人能继续借阅这本书。

这题坑真多,人都秃了。

七、小知识点

  1. 录入时间:
int hh,mm;
char c;
cin>>hh>>c>>mm;
  1. memset()函数:将某一块内存中的内容全部设置为指定的值。memset(数组,指定值,数组的大小)。头文件:#include <memory.h>
#include <memory.h>
memset(flag,0,sizeof(flag));//全部置0

八、代码

#include <iostream>
#include <cmath>
#include <memory.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int k=0;//记录0的数量
    int flag[1010]={0};//为1表示已借阅
    int time[1010]={0};//书号时间桶
    int cs=0;//借书次数
    double totle=0;//总时长
    int sh;//书号
    char jz;//键值
    char c;//代替冒号
    int h,m;//小时,分钟
    while(k<n)
    {
        cin>>sh>>jz>>h>>c>>m;
        if(sh==0)//结束一天
        {
            int num;
            if(cs!=0)
            {
                num=(int)(totle/cs+0.5);
                cout<<cs<<' '<<num<<endl;
            }
            else//考虑分母为0的情况
                cout<<cs<<' '<<0<<endl;
            k++;
            memset(flag,0,sizeof(flag));//全部置0
            memset(time,0,sizeof(time));
            cs=0;
            totle=0;
        }
        else if(jz=='S')//注意这里不用flag[sh]==0,因为以最后一次借阅为准
        {
            time[sh]=h*60+m;
            flag[sh]=1;
        }
        else if(jz=='E'&&flag[sh]==1)
        {
            flag[sh]=0;//保证一天多次借同一本书,所以归还后置0
            totle=totle+h*60+m-time[sh];
            cs++;
        }
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值