【牛客网计算机历年考研复试上机题】恶心题目篇3 -- 日志排序

在这里插入图片描述
在这里插入图片描述
这道题,当我第一眼看到它,真的是,恶心死人,还得控制格式,关键是,这个格式咱也不会控制啊,我一开始想到控制格式第一种类型,记录空格数,然后输出时输出一下,仔细一想,我靠,这个实在太复杂了,然后第二种控制格式的方法,预处理一下,我想在原格式的基础上只需要改一下内容就行了,空格的地方不改变,直接输出就行了,再一想,更恶心。

正确思路:

这道题让我学到了很多新的东西,比如gets()函数,sscanf()等。具体的scanf、gets 与getchar的联系,我会单开一个博客。
这里先说一下sscanf()函数,菜鸟教程上是这么说的。
在这里插入图片描述
菜鸟上给的实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int day, year;
   char weekday[20], month[20], dtm[100];

   strcpy( dtm, "Saturday March 25 1989" );
   sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );

   printf("%s %d, %d = %s\n", month, day, year, weekday );
    
   return(0);
}

其实意思就是,对于函数sscanf():

sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );

在当前字符串上进行格式化输入,就是数据源是指定的变量或常量,而不是scanf中的输入源是键盘(缓冲区),这种情况。

应用场景:

输入一个字符串str,然后以当前字符串为数据源,进行二次输入。
但是此字符串str不能有任何改变,后续有其他作用。
适用于原字符串不可改变,有其他输出作用,但是又需要在其中读出数据。

综上:
这道题就变得简单许多了,只需要用gets输入每行,然后以当前行为数据源,进行二次输入,最后排序,然后原封不动的再把排序后的原字符串输出。

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct N{
    char str[100];
    char name[11];
    char date[50];
    double cost;
    bool operator<(const N &A)const{
        if(cost!=A.cost)return cost<A.cost;
        else return strcmp(date,A.date)<0;
    }
}job[10001];
int main(){
    int size=0;
    while(gets(job[size].str)!=NULL){
       char str1[20];
       sscanf(job[size].str,"%s%s%s%lf",job[size].name,job[size].date,str1,&job[size].cost);
       strcat(job[size++].date,str1);
    }
    sort(job,job+size);
    for(int i=0;i<size;i++){
        printf("%s\n",job[i].str);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值