天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入在第一行给出一个正整数N(≤10),随后给出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
把这题收录下来主要是多给自己以后留心一下怎么输入最方便,这题用scanf里面可以确定格式输入得到时间和分钟,假如用c++的cin输入的话还要字符串转数字来使用就会很麻烦。
其次今天在vs里面遇到了scanf_s里面报错的问题这里也记录一下

这里当时我用vs输入案例发现总是输入不完,后面搜了一下scanf_s才知道其实scanf_s是有三个参数的,在输入字符的时候要规定大小,其他的就不用,scanf不用,这里只是在vs使用的时候要在输入后面加上sizeof(1),然后就不会报错了

然后就是整体代码的思路问题了,这题不难就是要知道怎么去分配各种数据并且使用,这里给出代码
- #include
- using namespace std;
- const int N = 1010;
- int st[N];//用来排除无效记录
- int hour1[N], hour2[N];//记录两次分别出现的时间
- int min1[N], min2[N];
- int main()
- {
- int i = 1;//这里i的作用是用来记录第几天
- int n;
- cin >> n;
- int sum = 0,books=0;
- while (i<=n) {
- int a,hour,min;
- char c;
- scanf("%d %c %d:%d", &a, &c, &hour, &min);
-
- if (a == 0) { //判断是否是最后一次
- i++;
- if (books != 0) {
- printf("%d %.0f\n",books,1.0*sum/books);
-
- }
- else cout << 0 << " " << 0<
- sum = 0, books = 0;//记得到后一天要刷新sum和books的值
- continue;
- }
- if (c == 'S') {
- hour1[a] = hour, min1[a] = min;
- st[a] = 1;
- }
- if (c == 'E' && st[a] == 1) {
- hour2[a] = hour, min2[a] = min;
- books++;
- sum += (hour2[a] - hour1[a]) * 60 + min2[a] - min1[a];
- st[a] = 0;
- }
- }
- return 0;
- }
最后遇到的问题就是输出问题,对于为什么不由c++的cout来输出,这里要四舍五入的输出,因此用c++的cout来实现sum/books只会直接保留整数部分,因此这里使用c语言的%.0f来实现四舍五入后保留小数部分,后面也专门去查了一下这里附上截图

