C++实现 L1-043 阅览室 (20分)
一、描述
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
二、输入格式
输入在第一行给出一个正整数 N ( ≤ 10 ) N(≤10) N(≤10),随后给出 N N N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号([1, 1000]内的整数) 键值(S或E) 发生时间(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
六、思路
- 定义一个已借阅桶和一个书号时间桶,两者相对应;
- 录入时间时候cin>>hh>>c>>mm,其中c定义为字符串,用来录入冒号;
- 判断时先以书号为判断条件,书号为0,则表示结束一天,已借阅桶和书号桶都需要全部置0,借书次数和总时间也均要置0;
- 按键S表示借书,将借书时间点存入书号时间桶,且相应借阅桶置1;
- 按键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,保证上一个人还书后,下一个人能继续借阅这本书。
这题坑真多,人都秃了。
七、小知识点
- 录入时间:
int hh,mm;
char c;
cin>>hh>>c>>mm;
- 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;
}