c 语言基础:L1-043 阅览室

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

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

输入格式:

        输入在第一行给出一个正整数N(≤10),随后给出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

程序源码:

// 引入标准输入输出头文件,用于后续的输入和输出操作  
#include  
  
// 使用typedef和struct一起定义一个结构体类型,图书信息  
typedef struct {  
    // 图书的借阅开始时间,以分钟为单位  
    int startTime;  
    // 图书的状态,0表示未被借出,1表示被借出  
    int state;//0表示未被借出,1表示被借出。  
}Book;  
  
// 定义一个函数,将小时和分钟数转化为总分钟数  
int getTime(int hour, int minute) {  
    return hour * 60 + minute;  
}  
  
// 主函数开始  
int main() {  
    // 创建一个Book类型的数组,大小为1001,可以存储1001本书的信息  
    Book book[1001];  
    // 定义一些变量用于后续的输入和计算  
    int id, hour, minute, days;  
    char tag;  
    int i, j;  
    int totalTime, cnt, averTime;  
  
    // 从标准输入读取天数  
    scanf("%d", &days);  
  
    // 对每一天进行循环  
    for (i = 0; i < days; i++) {  
        // 初始化总时间计数器和借书次数计数器  
        totalTime = cnt = 0;  
        // 对每一个图书编号进行循环,初始化图书状态为未被借出  
        for (j = 1; j <= 1000; j++) {//初始化book[]  
            book[j].state = 0;  
        }  
  
        // 一个无限循环,用于读取和处理每一天的图书借阅记录  
        while (1) {  
            // 从标准输入读取图书编号,图书状态,借阅开始的小时数和分钟数  
            scanf("%d %c %d:%d", &id, &tag, &hour, &minute);  
            // 如果读取到的图书编号为0,则跳出循环,结束这一天的处理  
            if (id == 0) break;//标号为0结束该天记录  
            // 如果读取到的图书状态为'S',表示借书  
            if (tag == 'S') {//借书时  
                // 更新图书的借阅开始时间  
                book[id].startTime = getTime(hour, minute);//更新书籍借出时间  
                // 将图书状态更新为已被借出  
                book[id].state = 1;//状态更新为借出  
            }  
            // 如果读取到的图书状态为'E',表示还书  
            else if (tag == 'E') {//还书时记录不完整只有E没有S  
                // 如果图书状态为未被借出,则跳过此次循环,继续下一次循环  
                if (book[id].state == 0) continue;   
                // 否则,将还书时间与借书时间的差值加到总时间上,并增加借书次数计数器  
                totalTime += getTime(hour, minute) - book[id].startTime;  
                cnt++;  
                // 将图书状态更新为未被借出  
                book[id].state = 0;//书已被还,state置为0  
            }  
        }  
        // 如果这一天没有任何借阅记录,输出"0 0"  
        if (cnt == 0) printf("0 0\n");  
        // 否则,计算平均借阅时间并输出  
        else {  
            averTime = (int)(totalTime * 1.0 / cnt + 0.5);//四舍五入  
            printf("%d %d\n", cnt, averTime);  
        }  
    }  
  
    // 主函数结束,返回0表示程序正常退出  
    return 0;    
}

 

你可能感兴趣的:(c,c语言)