题目描述
在汉语里,对汉语姓名可以按拼音排序,也可以按笔画顺序排序。在英语里,对英语姓名主要按字母顺序排序。本题要求给定的一组英文姓名按长短顺序排序。
输入
输入文件中包含多个测试数据。每个测试数据的第1行是一个正整数N(0 < N < 100),表示该测试数据中英文姓名的数目;接下来有N行,每行为一个英文姓名,姓名中允许出现的字符有大小写英文字母、空格和点号(.),每个英文姓名长度至少为2、但不超过50.N=0表示输入结束。
输出
对输入文件中的每个测试数据,输出排序后的姓名。排序方法为:先按姓名长度从长到短的顺序排序,对长度相同的姓名,则按字母顺序排序。每2个测试数据的输出之间输出一个空行。
样例输入
4
David A. Forsyth
Jean Ponce
Tom M. Mitchell
Thomas H. Cormen
0
样例输出
David A. Forsyth
Thomas H. Cormen
Tom M. Mitchell
Jean Ponce
代码实现
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct name{
char s[55];
int length(){
int len=strlen(this->s);
return len;
}
}name[105];
int compare(const void*a,const void*b)
{
struct name* m=(struct name*)a;
struct name* n=(struct name*)b;
if(m->length()!=n->length()) return n->length() - m->length();
else return strcmp(m->s,n->s);
}
int main()
{
int n,i;
int num=0;
while(cin>>n && n!=0){
getchar();
num++;
for(i=0;i<n;i++){
cin.getline(name[i].s,55);
if(name[i].length()<2){ //一定要排除长度小于2的情况
i--;
}
}
qsort(name,n,sizeof(name[0]),compare);
if(num>1){
cout<<endl;
}
for(i=0;i<n;i++){
cout<<name[i].s<<endl;
}
}
return 0;
}