7-3 成绩排序 (10 分)

7-3 成绩排序 (10 分)

描述
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

输入
第一行为n (0 < n < 20),表示班里的学生数目; 接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。

输出
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。

样例输入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
结尾无空行
样例输出
Joey 92
Hanmeimei 90
Kitty 80
Tim 28
结尾无空行
题目来源
http://noi.openjudge.cn/ch0110/03/

提示
如果你使用结构体,注意: 1.结构体中有数组(指针)成员时的,结构体变量之间的拷贝问题(深拷贝)。 2.请注意本题排序原则。

import java.util.Scanner;
public class Main{
    public static void main(String[]args){
      Scanner sc=new Scanner(System.in);
      //输入有几个数据
      int n=sc.nextInt();
      //创建数组,使用数组来盛放数据
      String name[]=new String[n];
      int grade[]=new int [n];
	//输如数据
      for(int i=0;i<n;i++){
          name[i]=sc.next();
          grade[i]=sc.nextInt();
      }
      //将数据从大到小排列
      for(int i=0;i<n;i++){
          for(int j=0;j<n-i-1;j++){
              if(grade[j]==grade[j+1]){
                  //当两个人的分数一样时,按字母大小排序
                  if(name[j].charAt(0)>name[j+1].charAt(0)){
                      int grade1=grade[j];
                      grade[j]=grade[j+1];
                      grade[j+1]=grade1;
                      String name1=name[j];
                      name[j]=name[j+1];
                      name[j+1]=name1;
                  }
              }
              else if(grade[j]<grade[j+1]){
                  int grade1=grade[j];
                  grade[j]=grade[j+1];
                  grade[j+1]=grade1;
                  String name1=name[j];
                  name[j]=name[j+1];
                  name[j+1]=name1;
              }
          }
      }
      //将数据输入,最后一行没有空行
      for(int i=0;i<n;i++){
          if(i==(n-1)){
              System.out.print(name[n-1]+" "+grade[n-1]);
          }
          else
              System.out.println(name[i]+" "+grade[i]);
      }
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 题目描述: 给出班里某门课程的成绩单,你按成绩从高到低对成绩排序输出,如果有相同分数则名字字典序小的在前。 输入: 第一行为n (0 < n < 20),表示班里的学生数。接下来n行,每行包含一个字符串和一个整数,表示学生的姓名和成绩,字符串长度不超过20,成绩为不超过100的正整数。 输出: 按成绩从高到低排序后输出每个学生的姓名和成绩,每行一个,姓名和成绩之间用一个空格隔开。 样例: 输入: 3 Tom 80 Jerry 90 Bob 80 输出: Jerry 90 Tom 80 Bob 80 解题思路: 本题需要对学生的成绩进行排序,可以使用sort函数进行排序。由于需要按成绩从高到低排序,因此需要自定义一个比较函数,按照成绩从高到低排序,如果成绩相同则按照姓名字典序从小到大排序。 代码: ### 回答2: 接下来的n行,每行为一位学生的姓名以及这门课程的成绩,姓名和成绩之间用一个空格隔开。姓名和成绩均为不超过10个字符的字符串,成绩为0到100之间的整数。\n\n输出\n按照题目要求,将成绩单从高到低排序后输出。每行输出一个学生的姓名和成绩,中间用一个空格隔开。\n\n解题思路\n本题需要按照成绩从高到低排序,因此可以使用冒泡排序或选择排序等算法来进行排序。在排序的过程中,如果遇到成绩相同的情况,则按照名字的字典序进行排序,即名字靠前的先输出。对于字典序的比较,可以使用strcmp函数来进行比较。\n\n代码示例\n以下是使用冒泡排序进行排序的示例代码:\n\n#include <stdio.h>\n#include <string.h>\n\nstruct student {\n char name[11];\n int score;\n};\n\nvoid bubble_sort(struct student stu[], int n)\n{\n int i, j;\n for (i = 0; i < n - 1; i++) {\n for (j = 0; j < n - i - 1; j++) {\n if (stu[j].score == stu[j + 1].score) {\n if (strcmp(stu[j].name, stu[j + 1].name) > 0) {\n struct student temp = stu[j];\n stu[j] = stu[j + 1];\n stu[j + 1] = temp;\n }\n } else if (stu[j].score < stu[j + 1].score) {\n struct student temp = stu[j];\n stu[j] = stu[j + 1];\n stu[j + 1] = temp;\n }\n }\n }\n}\n\nint main()\n{\n int n, i;\n scanf("%d", &n);\n struct student stu[n];\n for (i = 0; i < n; i++) {\n scanf("%s %d", stu[i].name, &stu[i].score);\n }\n bubble_sort(stu, n);\n for (i = 0; i < n; i++) {\n printf("%s %d\n", stu[i].name, stu[i].score);\n }\n return 0;\n}\n\n参考资料\nC语言中的字符串比较函数strcmp\nC语言中的冒泡排序算法\nC语言中的选择排序算法 ### 回答3: 第二行到第n+1行每行包含一个字符串和一个整数,表示每个学生的名字和该门课的成绩。名字由不超过100个小写字母组成,成绩为0到100的整数。\n\n输出\n按成绩从高到低输出成绩单,格式为:名字 分数。名字与分数之间用一个空格隔开,每行一个学生的信息。如果有相同分数则名字字典序小的在前。\n\n样例\n输入样例:\n4\ntangjian 87\nlihong 99\nzhangsan 87\nsunyan 78\n输出样例:\nlihong 99\ntangjian 87\nzhangsan 87\nsunyan 78\n一个班里有n个人,每个人都有一门课程的成绩需要按照成绩从高到低排序。因为涉及到排名,所以需要讲解一下排名算法。\n就拿这道题里面的例子来说,我们需要按照分数作为关键字,进行降序排序分数相同的按照名字的字典序升序排序。\n因此,我们可以先打一个排序函数,按照分数降序排序,如果分数相同,按照名字升序排序:\nbool cmp ( const pair<string,int> &a, const pair<string,int> &b)\n{\n if ( a.second != b.second )\n return a.second > b.second;\n else\n return a.first < b.first;\n}\n然后main函数里,先读入每个人的名字和成绩后,将它们存到一个vector<pair<string,int>>里面。然后将这个vector排序,最后输出即可:\nvector<pair<string,int> > v;\n int n, g;\n string name;\n scanf("%d",&n);\n for ( int i = 0; i< n; i++)\n {\n cin >> name >> g;\n v.push_back(make_pair(name,g));\n }\n sort(v.begin(),v.end(),cmp);\n for ( int i = 0; i < n; i++)\n printf("%s %d\n",v[i].first.c_str(),v[i].second);\n需要注意的是,这道题要输出c-string类型的名字,可以使用.c_str()将string转换成c-string类型输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值