当前位置: 代码迷 >> 综合 >> OpenJ_Bailian - 3719 学生信息用qsort排序
  详细解决方案

OpenJ_Bailian - 3719 学生信息用qsort排序

热度:18   发布时间:2023-11-25 09:39:03.0

OpenJ_Bailian - 3719 学生信息用qsort排序

将输入的学生信息按名字排序后输出。
Input
每个学生信息是两行,第一行是名字,由英文字母和空格构成,最长18个字符;第二行格式为:

学号,性别 年龄

学号是一个不超过100,000的整数; 性别是一个字符,为’M’ 或’F’; 年龄是一个不大于100的整数
输入数据最后有可能有若干个回车,也有可能没有

学生不会超过100个,不会出现两个学生的名字仅大小写有差别的情况
Output
格式和输入数据基本一样,唯一不同在于输出学号的时候,必须用前导0补足8位

Sample Input

Tom Hanks
7863,M 18
Mary Lu
18343,F 21
Santa Fe
27863,M 17

Sample Output

Mary Lu
00018343,F 21
Santa Fe
00027863,M 17
Tom Hanks
00007863,M 18
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student
{
    char n[25],c;int a,b;
}s[110],s1[110];
int main()
{
    int i=0,j=0,l;while(gets(s[i].n)){
    if(strlen(s[i].n)==0)break;scanf("%d,%c %d",&s[i].a,&s[i].c,&s[i].b);i++;getchar();}l=i;for(i=0;i<l;i++)for(j=0;j<20;j++){
    if(s[i].n[j]>='A'&&s[i].n[j]<='Z') s1[i].n[j]=(s[i].n[j])+32;else s1[i].n[j]=s[i].n[j];}for(i=0;i<l;i++)for(j=0;j<l-1;j++)if(strcmp(s1[j].n,s1[j+1].n)>0){
    swap(s[j],s[j+1]);swap(s1[j],s1[j+1]);}for(j=0;j<l;j++){
    printf("%s\n",s[j].n);printf("%08d,%c %d\n",s[j].a,s[j].c,s[j].b);}return 0;
}

strcasecmp可以忽略字母大小写,然后进行字典序比较

#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct student
{
    char n[25],c;int a,b;
}s[110];
bool cmp(student a,student b)
{
    if(strcasecmp(a.n,b.n)<0)return 1;else return 0;
}
int main()
{
    int i=0,j=0;while(gets(s[i].n)){
    if(strlen(s[i].n)==0) break;scanf("%d,%c %d",&s[i].a,&s[i].c,&s[i].b);i++;getchar();}sort(s,s+i,cmp);for(j=0;j<i;j++){
    printf("%s\n",s[j].n);printf("%08d,%c %d\n",s[j].a,s[j].c,s[j].b);}return 0;
}