ACM&排序问题,操作符重载

题目描述:

    Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。

对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

输入:

测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

输出:

    对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
样例输入:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
样例输出:
Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90

http://ac.jobdu.com/problem.php?pid=1023

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #define NUMSIZE 100010
 5
 6 using namespace std;
 7 int Mode;
 8 class Stu_index {
 9     public:
10         string num;
11         string name;
12         int score;
13         Stu_index(){
14         }
15         Stu_index(string num,string name, int score) {
16             this->num = num;
17             this->name = name;
18             this->score = score;
19         }
20         friend bool operator < (const Stu_index& a, const Stu_index& b) {
21             if(Mode == 1)
22                 return a.num<b.num;
23             if(Mode == 2)
24                 if(a.name!=b.name)  return a.name<b.name;
25                 else return a.num<b.num;
26             if(Mode == 3)
27                 if(a.score!=b.score)    return a.score<b.score;
28                 else return a.num<b.num;
29         }
30         friend bool operator > (const Stu_index& a, const Stu_index& b) {
31             if(Mode == 1)
32                 return a.num>b.num;
33             if(Mode == 2)
34                 if(a.name!=b.name)  return a.name>b.name;
35                 else return a.num>b.num;
36             if(Mode == 3)
37                 if(a.score!=b.score)    return a.score>b.score;
38                 else return a.num>b.num;
39         }
40         friend ostream &operator<< (ostream &os, const Stu_index &item) {
41             os<<item.num<<" "<<item.name<<" "<<item.score;
42             return os;
43         }
44 };
45 /*void quicksort(Stu_index v[], int left, int right) {
46     if(left<right) {
47         Stu_index key = v[left];
48         int low = left;
49         int high = right;
50         while(low<high) {
51             while(low<high && v[high]>key) high--;
52             v[low] = v[high];
53             while(low<high && v[low]<key) low++;
54             v[high] = v[low];
55         }
56         v[low] = key;
57         quicksort(v, left, low-1);
58         quicksort(v, low+1, right);
59     }
60 }*/
61 int main(void) {
62     int N, C;
63     C=0;
64     Stu_index s[NUMSIZE];
65     while(cin>>N && N!=0) {
66         C++;
67         cin>>Mode;
68         for(int i=0; i<N; i++) {
69             cin>>s[i].num>>s[i].name>>s[i].score;
70         }
71         //quicksort(s, 0, N-1);
72         sort(s, s+N);
73         cout<<"Case "<<C<<":"<<endl;
74         for(int i=0; i<N; i++)
75             cout<<s[i]<<endl;
76     }
77     return 0;
78 }


这里使用了重载操作符,但类中的静态变量在没有初始化的时候类中的方法是无法使用改变量的,于是我将Mode改成了全局变量。


时间: 2024-10-04 21:55:49

ACM&排序问题,操作符重载的相关文章

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我

c++ --&gt; 操作符重载

一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: #include <iostream> using namespace std; int main() { int a = 2 , b = 3; float c = 2.1f , d = 1.2f; cout<<"

Python中的操作符重载

类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这 种特殊的命名来拦截操作符,以实现重载. python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法.通过重载,用户定义的对 象就像内置的一样. 在类中重载操作符 1.操作符重载使得类能拦截标准的python操作. 2.类可以重载所有的python的表达式操作符. 3.类可以重载对象操作:prin

操作符重载

class Program { int count; public Program() { } public Program(int count) { this.count = count; } static void Main(string[] args) { Program p1 = new Program(16); Program p2 = new Program(16); /** 操作符调用 */ Console.WriteLine(p1 + p2); Console.WriteLine

第二十篇:类操作符重载的相关规定与具体实现示例

前言 有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观.就目前看来,要实现这一点,最核心的莫过于操作符的重载.科学的重载可以让类的使用最大程度地接近内置类型.本文将讨论类操作符重载涉及到的一些原则和具体做法. 实现类操作符重载的两种思路 1. 友元函数法: 将待重载操作符视作非成员函数( 它声明为操作数类型的友元函数 ) 应当采用这种机制重载的运算符有:IO操作符,算数操作符,关系操作符. 2. 成员函数法: 将待重载操作符视作特殊的成员函数

拷贝构造函数 和 赋值操作符重载

什么时候需要定义自己的拷贝构造函数: 当类中包含有,动态分配成员 或者 指针 的时候. 如果使用默认构造函数,则新构造出来的 新类 和 旧类 里面的指针成员 指向同一个空间, 而当其中一个类 清空掉那个空间 .另一个类的指针就会变成野指针(因为空间已经被清空) , 也就是说默认构造函数是复制值(地址也是值) ps.基本数据类型的数组可以直接使用默认复制构造函数.也就是说有涉及到 自行开辟额外空间 的数据类型 和 指针 的类就需要 什么时候调用拷贝构造函数: 1.一个对象以 值传递 的方式 传入

操作符重载方法

CLR规范要求重载操作符重载方法必须是public和static方法 C#要求操作符重载方法至少有一个参数的类型与当前定义的这个方法类型相同 为了减少运行时开销,编译器会直接针对基元类型执行运算,并直接生成操作这些类型的实例的中间代码(IL)指令,所以在Framework标准库中没有定义基元类型的操作符重载 代码示例 public sealed class Complexe { public static Complexe operator +(Complexe c1, Complexe c2)

再议Swift操作符重载

今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又臭又长.而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣. 谨 慎引入,按需使用.比如在连接两个字串的时候你就可以通过重载加法来实现.甚至于你仅在屏幕上输入一个加号,就能响应一个网络链接.播放一段音乐或者完成 你能实现的其他任何功能.然而过于复杂的功能对编码来说简直就

操作符重载.xml

pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;} .selfFuc{color:#800080;} .bool{color:#d2576f;} .condition{color:#000080;font-weight:bold;} .key{color:#000080;} .

【C/C++】操作符重载

常见问题 Q1. 下列运算符,在C++语言中不能重载的是( ). A. * B. ?: C. :: D. delete Q2. 编写类String的构造函数.析构函数和赋值函数. Q3. 复制构造函数与赋值运算符的区别是什么? Q4. 下述代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 X() { cout << "constructor" &l