用go语言实现首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。 每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示学生总数。然后输入n行,每行包括1个不含空格的字符串s(不超过8位)和1个正整数d,分别表示一个学生的学号和解题总数。 输出参考: fmt.Printf("%-5d%-8s%d\n") 输出格式: 对于每组测试数据,输出最终排名信息,每行一个学生的信息:排名、学号、解题总数。每行数据之间留一个空格。注意,解题总数相同的学生其排名也相同。 输入样例: 1 4 0010 200 1000 110 0001 200 0100 225 输出样例: 1 0100 225 2 0001 200 2 0010 200 4 1000 110
时间: 2024-03-26 20:34:47 浏览: 78
以下是用 Go 语言实现学生成绩排名的代码:
```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type student struct {
id string
sum int
}
type students []student
func (s students) Len() int {
return len(s)
}
func (s students) Less(i, j int) bool {
if s[i].sum == s[j].sum {
return s[i].id < s[j].id
}
return s[i].sum > s[j].sum
}
func (s students) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
var t int
scanner.Scan()
t = parseInt(scanner.Bytes())
for i := 0; i < t; i++ {
var n int
scanner.Scan()
n = parseInt(scanner.Bytes())
s := make(students, n)
for j := 0; j < n; j++ {
scanner.Scan()
id := scanner.Bytes()
scanner.Scan()
sum := parseInt(scanner.Bytes())
s[j] = student{id: string(id), sum: sum}
}
sort.Sort(s)
for j, student := range s {
fmt.Printf("%-5d%-8s%d\n", j+1, student.id, student.sum)
}
}
}
func parseInt(bytes []byte) int {
var x int
for _, b := range bytes {
x = x*10 + int(b-'0')
}
return x
}
```
思路:
1. 读入一个正整数 t,表示测试数据的组数。
2. 对于每组测试数据,先读入一个正整数 n,表示学生总数。
3. 再读入 n 行数据,每行包括一个字符串和一个正整数,分别表示一个学生的学号和解题总数。
4. 对于每组测试数据,按照总分从高到低排序,如果总分相同,按照学号从小到大排序,然后输出每个学生的排名、学号和总分。
代码解析:
1. `student` 结构体表示一个学生,包括学号和总分。
2. `students` 类型是一个学生数组,用于存储每个学生的信息。
3. `Less` 方法用于比较两个学生的大小。如果它们的总分相同,那么按照学号从小到大排序。否则,按照总分从高到低排序。
4. `main` 函数用于读入输入数据和输出排名信息。它先读入测试数据的组数 t。然后,对于每组测试数据,先读入学生总数 n,再读入每个学生的信息。将学生数组按照 `Less` 方法所定义的规则排序,然后输出每个学生的排名、学号和总分。
阅读全文