【sscanf用法】百练2998:日志排序

2998:日志排序

总时间限制: 
1000ms
内存限制: 
65536kB
描述
有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:“hs_10000_p”是计算任务的名称,“2007-01-17 19:22:53,315”是计算任务开始执行的时间“年-月-日 时:分:秒,毫秒”, “253.035(s)”是计算任务消耗的时间(以秒计)
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
请你写一个程序,对日志中记录计算任务进行排序。时间消耗少的计算任务排在前面,时间消耗多的计算任务排在后面。如果两个计算任务消耗的时间相同,则将开始执行时间早的计算任务排在前面。
输入
日志中每个记录是一个字符串,每个字符串占一行。最后一行为 空行,表示日志结束。日志中最多可能有10000条记录。
计算任务名称的长度不超过10,开始执行时间的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗时间小数点后有三位数字。
计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开,行首和行尾可能有多余的空格。
输出
排序好的日志记录。每个记录的字符串各占一行。

输入的格式与输入保持一致,输入包括几个空格,你的输出中也应该包含同样多的空格。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std; 
struct data{
	char name[10];
	char year[11];
	char start[13];
	double time;
	char chushi[401];
};
data jilu[10001];
int n=0;
bool cmp(data x,data y)
{
	if(x.time!=y.time) 
	{
		return x.time<y.time;
	}
	for(int i=0;i<strlen(x.year);i++)
	{
		if(x.year[i]!=y.year[i]) return x.year[i]<y.year[i];
	}
	for(int i=0;i<strlen(x.start);i++)
	{
		if(x.start[i]!=y.start[i]) return x.start[i]<y.start[i];
	}
}
int main()
{
	char str[401];
	char tmp;
	n=0;
	while((tmp=cin.get())!='\n')
	{
		cin.putback(tmp);
		gets(str);
		//cout<<11<<str<<endl;
		sscanf(str,"%s%s%s%lf",jilu[n].name,jilu[n].year,jilu[n].start,&jilu[n].time);
		//cout<<11<<str<<endl;
		strcpy(jilu[n].chushi,str);
		//cout<<2<<jilu[n].chushi<<endl;
		n++;
	}
	sort(jilu,jilu+n,cmp);
	for(int i=0;i<n;i++)		
	{
		printf("%s\n",jilu[i].chushi);
		
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80857208