试题链接如下:点击打开链接
试题要求翻译如下:
程序输入:
第一行输入签到人数M,随后输入M行,每行格式如下:“人员ID 签到时间 签退时间”,时间格式统一“HH:MM:SS”。
程序输出:计算出最早签到和最晚签到的人员ID(可能是同一个或不同两人)
例子:
input:
3
CS1001 15:30:28 17:00:10
CS1002 08:00:00 11:25:25
CS1003 21:45:00 21:58:40
output:
CS1002 CS1003
代码设计如下:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
using namespace std;
vector<string> kSignInTimeMap;
vector<string> kSignOutTimeMap;
vector<string> kIdMap;
int iNumber = 0;
void ParseIdTime( char* buffer )
{
int iHour = 0, iMinute = 0, iSecond = 0;
string line = buffer;
string id = line.substr( 0, line.find(" ") );
char time[7] = {0};
line = line.substr( line.find(" ") + 1 );
string time1 = line.substr( 0, line.find(" ") );
string time2 = line.substr( line.find(" ") + 1 );
sscanf( time1.c_str(), "%d:%d:%d", &iHour, &iMinute, &iSecond );
sprintf( time, "%02d%02d%02d", iHour, iMinute, iSecond );
kSignInTimeMap.push_back( time );
sscanf( time2.c_str(), "%d:%d:%d", &iHour, &iMinute, &iSecond );
memset( time, 0, sizeof(time) );
sprintf( time, "%02d%02d%02d", iHour, iMinute, iSecond );
kSignOutTimeMap.push_back( time );
kIdMap.push_back(id);
}
void CalcMinMaxTime()
{
int minIndex = 0, maxIndex = 0;
int minTime = atoi(kSignInTimeMap[0].c_str());
int maxTime = atoi(kSignOutTimeMap[0].c_str());
int number = kIdMap.size();
for ( int i = 1; i < number; i++ )
{
if ( minTime > atoi(kSignInTimeMap[i].c_str()) )
{
minTime = atoi(kSignInTimeMap[i].c_str());
minIndex = i;
}
}
for ( int i = 1; i < number; i++ )
{
if ( maxTime < atoi(kSignOutTimeMap[i].c_str()) )
{
maxTime = atoi(kSignOutTimeMap[i].c_str());
maxIndex = i;
}
}
printf( "%s %s\n", kIdMap[minIndex].c_str(), kIdMap[maxIndex].c_str() );
}
int main()
{
printf("Please input the number of people:\n");
scanf("%d",&iNumber);
for ( int i = 0; i < iNumber; i++ )
{
char buffer[50] = {0};
printf("Please input the Time of him:\n");
getchar();
scanf( "%[^\n]",buffer );
ParseIdTime( buffer );
}
CalcMinMaxTime();
printf("\n");
return 0;
}