KY2成绩排序

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
本题知识点: 排序

题目描述

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

示例:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩
peter     96
jack      70
Tom       70
smith     67

从低到高

smith     67

jack      70
Tom      70
peter     96

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开。

示例1
输入

3

0

fang 90
yang 50
ning 70

输出

fang 90

ning 70

yang 50


 1 #include<stdio.h>
 2 #include<string.h>
 3 typedef struct Student
 4 {
 5     char name[15];
 6     int score;
 7 }Student;
 8 
 9 int main()
10 {
11     int number;
12     int way;
13     int flag=0;
14     Student student[1000];
15     
16     while(scanf("%d%d",&number,&way)!=EOF)
17     {
18         for(int i=0;i<number;i++)
19         {
20             scanf("%s%d",student[i].name,&student[i].score);
21         }
22         if(way!=0)
23         {
24             int i,j;
25             Student temp;
26             for(i=0;i<number;i++)
27             {
28                 flag=0;
29                 for(j=0;j<number-i-1;j++)
30                 {
31                     if(student[j].score>student[j+1].score)
32                     {
33                         temp=student[j];
34                         student[j]=student[j+1];
35                         student[j+1]= temp;
36                         flag=1;
37                     }
38                 }
39                 if(flag==0)break;
40             }
41         }
42         else
43         {
44             int i,j;
45             Student temp;
46             for(i=0;i<number;i++)
47             {
48                 flag=0;
49                 for(j=0;j<number-i-1;j++)
50                 {
51                     if(student[j].score<student[j+1].score)
52                     {
53                         temp=student[j];
54                         student[j]=student[j+1];
55                         student[j+1]= temp;
56                         flag=1;
57                     }
58                 }
59                 if(flag==0)break;
60             }
61         }
62         for(int i=0;i<number;i++)
63         {
64             printf("%s %d\n",student[i].name,student[i].score);
65         }
66     }
67     return 0;
68 }

个人错误:

  1. 不知道要循环输入而不是一次输入;
  2. 记混了冒泡与选择排序;
  3. 不知道选择排序不稳定;
  4. 冒泡排序要判断是否进行交换以减少时间复杂度;
  5. 忘记了结构体变量赋值和交换数据;
  6. 结构体数组要大一些,50不够;
  7. scanf返回值是输入的个数;

scanf 函数是有返回值的,它的返回值可以分成三种情况
  1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
      如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
  2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
  3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

运行结果 运行时间 占用内存 使用语言
答案正确 4ms 384KB C++

 

用例输入
3
0
moolgouua 43
aebjag 87
b 67
28
1
qhsq 15
ozslg 79
ncttmtsphb 71
a 39
eeiuyzsj 34
nmlrokx 21
pjizylo 90
ec 45
f 12
sh 31
fm 25
ptprphubqk 29
wxdiwv 0
uhlcpjtxad 60
w 20
zwktbpun 70
efzfkf 69
v 31
rsnrgtl 73
lhdo 76
wt 56
mcdwd 14
ydrnoyd 37
gmlfds 76
zx 1
dqx 98
gz 90
kvbzrwrrjj 13
预期输出
aebjag 87
b 67
moolgouua 43
wxdiwv 0
zx 1
f 12
kvbzrwrrjj 13
mcdwd 14
qhsq 15
w 20
nmlrokx 21
fm 25
ptprphubqk 29
sh 31
v 31
eeiuyzsj 34
ydrnoyd 37
a 39
ec 45
wt 56
uhlcpjtxad 60
efzfkf 69
zwktbpun 70
ncttmtsphb 71
rsnrgtl 73
lhdo 76
gmlfds 76
ozslg 79
pjizylo 90
gz 90
dqx 98

 



posted @ 2021-02-03 11:20  裂缘冰释  阅读(219)  评论(0编辑  收藏  举报