HDU1862 EXCEL排序 (sort排序)

这题看上去不难的哦,但是其实考察的是如何利用sort对结构体进行排序

各种需要注意的点:如果利用int读入学号

①如何读入学号?

每条学生纪录由学号(6位数字,同组测试中没有重复的学号)

当成int读的话,可以直接读入。

②strcmp的返回值

有的朋友用字符串比较函数进行sort排序

一般形式:strcmp(字符串1,字符串2)   

说明:   

当s1<s2时,返回值<0   

当s1==s2时,返回值=0   

当s1>s2时,返回值>0   

两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。

那么这里学号即使不用int类型,当成字符串,学号大小的顺序也正好是字典序呢?也可以使用strcmp判断叭。

③学号的输出

用int类型的学号输出,给自己复习一下printf输出格式:

详见https://www.cnblogs.com/windpiaoxue/p/9183506.html

#include <stdio.h>

int main() {
    const char * pString = "Hello World";
    const int    nNumber = 1024;
    const double dNumber = 3.141593;
    //  %d  示例
    printf("*%d*\n", nNumber);          //输出:*1024*
    printf("*%6d*\n", nNumber);         //输出:*  1024*
    printf("*%6.5d*\n", nNumber);       //输出:* 01024*
    printf("*%-6.5d*\n", nNumber);      //输出:*01024 *
    printf("*%06d*\n", nNumber);        //输出:*001024*
    printf("*%+6d*\n", nNumber);        //输出:* +1024*

    //  %f  示例
    printf("*%f*\n", dNumber);          //输出:*3.141593*
    printf("*%10f*\n", dNumber);        //输出:*  3.141593*
    printf("*%10.2f*\n", dNumber);      //输出:*      3.14*
    printf("*%-10.2f*\n", dNumber);     //输出:*3.14      *
    printf("*%+10.2f*\n", dNumber);     //输出:*     +3.14*
    printf("*%010.2f*\n", dNumber);     //输出:*0000003.14*

    //  %s  示例
    printf("*%s*\n", pString);          //输出:*Hello World*
    printf("*%20s*\n", pString);        //输出:*         Hello World*
    printf("*%-20s*\n", pString);       //输出:*Hello World         *
    printf("*%.10s*\n", pString);       //输出:*Hello Worl*
    return 0;
}

然后就是最主要的sort排序了

当 C=1 时,按学号递增排序

bool cmp1(Stu a,Stu b)
{
    return a.id<b.id;//学号递增
}

结构体Stu的两个对象 a 和 b,

递增 a<b

当 C=2时,按姓名的非递减字典序排序,这里的非递减应该是为了“当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序”

bool cmp2(Stu a,Stu b)
{
    if(a.name==b.name) return a.id<b.id;
    return a.name<b.name;
}

当 C=3时,按成绩的非递减排序

bool cmp3(Stu a,Stu b)
{
    if(a.score==b.score)
        return a.id<b.id;
    return a.score<b.score;
}

提醒自己的就是:

如果出现了相等的情况,先进行if判断,返回的视情况而定!

 

总的代码就是

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
using namespace std;
const int maxn=100000+5;

struct Stu
{
    int id;
    string name;
    int score;
}s[maxn];

bool cmp1(Stu a,Stu b)
{
    return a.id<b.id;//学号递增
}

bool cmp2(Stu a,Stu b)
{
    if(a.name==b.name) return a.id<b.id;
    return a.name<b.name;
}
bool cmp3(Stu a,Stu b)
{
    if(a.score==b.score)
        return a.id<b.id;
    return a.score<b.score;
}

int main()
{
    int n,c;
    int test=1;
    while(scanf("%d",&n)&&n)
    {
        scanf("%d",&c);
        printf("Case %d:\n",test);
        test++;
        for(int i=1;i<=n;i++)
        {
            cin>>s[i].id>>s[i].name>>s[i].score;
        }
        if(c==1)
            sort(s+1,s+1+n,cmp1);
        else if(c==2)
            sort(s+1,s+1+n,cmp2);
        else if(c==3)
            sort(s+1,s+1+n,cmp3);

        for(int i=1;i<=n;i++)
        {
            printf("%06d ",s[i].id);
            cout<<s[i].name<<" "<<s[i].score<<endl;
        }

    }

}

哎呀,第一次blog。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值