PAT程序设计考题——甲级1006 签到问题(求所有签到人的最早时间和最晚时间)

试题链接如下:点击打开链接

试题要求翻译如下:
程序输入:
第一行输入签到人数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值