| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2276 人关注过本帖
标题:用qsort对学生信息排序
只看楼主 加入收藏
lx1997
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-3-5
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
用qsort对学生信息排序
描述
将输入的学生信息按名字排序后输出。

输入
每个学生信息是两行,第一行是名字,由英文字母和空格构成,最长18个字符;第二行格式为:

学号,性别 年龄

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


学生不会超过100个,不会出现两个学生的名字仅大小写有差别的情况
输出
格式和输入数据基本一样,唯一不同在于输出学号的时候,必须用前导0补足8位
样例输入
Tom Hanks
7863,M 18
Mary Lu
18343,F 21
Santa Fe
27863,M 17
样例输出
Mary Lu
00018343,F 21
Santa Fe
00027863,M 17
Tom Hanks
00007863,M 18
提示
1. 用一个结构存放单个学生信息,用一个结构数组存放全部学生信息,然后将该结构数组排序
2. 用 gets可以读入一行
3. 用 stricmp 函数作大小写无关的字符串比较。如果在POJ上交,名字要改成 _stricmp
4. 补前导0的方法:printf("%04d",34) 会输出 0034, printf("%05d",34) 会输出 00034
5. 如果用scanf读入一行的数据后,紧接着用gets读下一行,那么很可能gets读入的不是下一行的内容,而是一个空行(刚刚用sanf读的那一行的末尾的回车导致)
请大家看看我的程序错误,谢谢~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
    char name[18];
    int num;
    char sex;
    int age;
}stu[100];
int cmp(const void *a,const void *b);
int main()
{
    char str[18];
    int i=0,k;
    while((gets(str))!=NULL)
    {    if(strlen(str)!=0)
    {i++;
        strcpy(stu[i].name,str);
        scanf("%d,%s %d",&stu[i].num,&stu[i].sex,&stu[i].age);
    }
        }
    qsort(stu,i,sizeof(stu[0]),cmp);
    for(k=0;k<i;k++)
    {
        printf("%s\n%08d,%s %d\n",stu[k].name,stu[k].num,stu[k].sex,stu[k].age);
    }
    return 0;
}
int cmp(const void *a,const void *b)
{
    return _stricmp(((struct Student*)a)->name,((struct Student*)b)->name);
}
搜索更多相关主题的帖子: 英文字母 信息 
2016-03-05 20:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
題目沒要求你用qsort()啊,何況不超過100個學生,無需用qsort(),這個排序算法的效率在這麽少的數據量下不高。先把功能實現了再説效率。

授人以渔,不授人以鱼。
2016-03-05 20:53
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:7 
没看出什么,但gets,scanf先天性缺陷,可能会因为空格回车等东西有问题。

   唯实惟新 至诚致志
2016-03-05 23:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用qq1023569223在2016-3-5 23:00:02的发言:

没看出什么,但gets,scanf先天性缺陷,可能会因为空格回车等东西有问题。

他其實是沒搞清楚是在哪裏出問題,又不描述現象,人家回覆又不答,那就慢慢等唄。

授人以渔,不授人以鱼。
2016-03-05 23:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
現在的人學編程都不是一步一步來的,不是逐個功能實現,一下手就把全部代碼寫完,一氣調試,眉毛鬍子一把抓,結果是哪裏出問題都搞不清楚。輸入的數據都不知道對不對,就以為是排序問題。

授人以渔,不授人以鱼。
2016-03-05 23:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這個題目留了一個坑,你看看他給的數據示例,第二個人,性別是Fe,而且是沒有年齡的,但給出的輸出範例不報錯,是原樣輸出。換言之,他暗示了你不需要解析提取第二行的數據。

授人以渔,不授人以鱼。
2016-03-06 12:09
丰峰风疯
Rank: 2
等 级:论坛游民
威 望:1
帖 子:5
专家分:15
注 册:2016-3-6
收藏
得分:7 
回复 楼主 lx1997
这个程序有几个问题
1、scanf里面, %d后面最好不要有逗号
2、scanf里面,%s要改为%c
3、if()主体里面,i++;放到scanf后面
4、输出时,printf 里面,输出sex字段要用%c


[此贴子已经被作者于2016-3-6 14:17编辑过]

2016-03-06 13:58
快速回复:用qsort对学生信息排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.066668 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved