給出所有學生一天的考勤記錄,請統計每個學生在實驗室工作的時間,並按照工作時間從長到短給出一天的統計表,工作時間相同時按編號從小到大排序。

問題描述
實驗室使用考勤系統對學生進行考勤。考勤系統會記錄下每個學生一天內每次進出實驗室的時間。
每位學生有一個唯一編號,每條考勤記錄包括學生的編號,進入時間、離開時間。
給出所有學生一天的考勤記錄,請統計每個學生在實驗室工作的時間,並按照工作時間從長到短給出一天的統計表,工作時間相同時按編號從小到大排序。

輸入說明
輸入的第一行包含一個整數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);
    }
}

這道題目的難點就在於若輸入的學號在之前已經出現過,我們需要將時間累加給同一個人,反之我們要將時間賦給一個新的人。搞清楚這一點,這道題目自然迎刃而解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章