这题看上去不难的哦,但是其实考察的是如何利用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。