問題描述
實驗室使用考勤系統對學生進行考勤。考勤系統會記錄下每個學生一天內每次進出實驗室的時間。
每位學生有一個唯一編號,每條考勤記錄包括學生的編號,進入時間、離開時間。
給出所有學生一天的考勤記錄,請統計每個學生在實驗室工作的時間,並按照工作時間從長到短給出一天的統計表,工作時間相同時按編號從小到大排序。
輸入說明
輸入的第一行包含一個整數n,表示考勤記錄條數。1≤n≤100,學生的編號爲不超過100的正整數。
接下來是n行,每行是一條考勤記錄,每條記錄包括學生編號k,進入時間t1和離開時間t2三項。
t1和t2格式爲“hh:mm”,即兩位數表示的小時和兩位數表示的分鐘。例如14:20表示下午兩點二十分,所有時間均爲24小時制,且均爲同一天內的時間。
輸出說明
輸出按工作時間和學生編號排序的統計表。統計表包含若干行,每行爲一個學生的出勤記錄,由學生編號和總工作時間構成,總工作時間以分鐘爲單位。
輸入樣例
5
3 08:00 11:50
1 09:00 12:00
3 13:50 17:30
1 14:00 18:00
2 17:00 24:00
輸出樣例
3 450
1 420
2 420
這道題目首先要求計算工作時間,需要注意的是當輸入的學號相同時應對時間進行累加,而不能理所當然的賦值給另一個人。而這也是該題的一個難點。
我們的代碼及詳細註釋如下。
#include<stdio.h>
typedef struct{ //建立結構體,儲存學生的學號及工作時間
int biaohao;
int time ;
}Student;
int main()
{
int flag = 0 ;
int m;
scanf("%d",&m);
int cnt = 0; //cnt爲當前已經出現的學生的個數
Student stu[m]; //建立結構體數組
int i, j;
for(i =0 ; i< m ;i++) //初始化結構體數組。
{
stu[i].time = 0;
stu[i].biaohao = -1;
}
for(i = 0; i< m ;i++)
{
int xuehao,h1,m1,m2,h2; //爲了使輸入的學號與結構體中的學號便於區分,我們分別用xuehao
//以及 stu[i].biaohao 來進行區別
scanf("%d %d:%d %d:%d",&xuehao,&h1,&m1,&h2,&m2); //輸入數據
for(j = 0 ; j< m; j++)
{
if(xuehao == stu[j].biaohao) //遍歷我們的結構體數組。如果該學號之前已經出現過,
//則進行時間的累加
{
int t = m2 -m1 ;
if(t<0) {t = 60 + t ; h2 = h2 - 1 ; }
stu[j].time +=((h2-h1)*60 + t); //進行時間的計算並累加
flag = 1; //flag 爲1 ,證明我們的數據已經被利用
}
}
if(flag == 0) //flag爲0,說明這個學號在之前並未出現過,
//我們需要將該時間賦給一個新的成員
{
stu[cnt].biaohao = xuehao; //將該學號賦給新的一個人
int t = m2 -m1 ;
if(t<0) {t = 60+t; h2-=1; }
stu[cnt++].time +=((h2-h1)*60 + t); //將時間賦給這個人
}
flag = 0 ; //初始化flag.爲進行下一個人的判斷做準備
}
//----------------------------------------開始進行排序------------------------------------
for(i = 0 ; i < m-1; i++)
{
for(j = i+1 ; j< m;j ++)
{
if(stu[i].time!=0&&stu[j].time!=0) //排除爲 0 數據
{
if(stu[i].time<stu[j].time) //進行時間的比較
{
Student t = stu[i]; stu[i] = stu[j] ; stu[j] = t ;
}
if(stu[i].time==stu[j].time) //時間相同,我們進行學號的比較
{
if(stu[i].biaohao>stu[j].biaohao)
{
Student t = stu[i]; stu[i] = stu[j] ; stu[j] = t ;
}
}
}
}
}
//------------------------------排序完成,接下來按照我們的順序輸出------------------------------------
for(i = 0 ; i< m ; i++)
{
if(stu[i].time!=0) //注意排除 爲0 項
printf("%d %d\n",stu[i].biaohao,stu[i].time);
}
}
這道題目的難點就在於若輸入的學號在之前已經出現過,我們需要將時間累加給同一個人,反之我們要將時間賦給一個新的人。搞清楚這一點,這道題目自然迎刃而解。