Description
定义一个学生结构体,含学号(一维字符数组)、姓名、成绩(整型)。从键盘输入n(n<20),再输入n个学生的信息,按学生成绩从小到大顺序输出学生信息。
Input
输入一个n,接着输入n个学生的信息。
Output
按成绩从小到大顺序输出学生信息。
Sample Input
4
1001
Li
76
1002
Zhang
92
1003
Liu
85
1004
Wang
70
Sample Output
1004 Wang 70
1001 Li 76
1003 Liu 85
1002 Zhang 92
实现这个得先学会用指针和结构体,题目难度是入门,重点是学会使用qsort函数按照成绩从小到大排序学生信息,理解不了得后台私信我讲解:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char id[20];
char name[20];
int score;
};
int cmp(const void *a, const void *b) {
return ((struct student *)a)->score - ((struct student *)b)->score;
}
int main() {
int n;
scanf("%d", &n);
struct student *students = (struct student *)malloc(n * sizeof(struct student));
for (int i = 0; i < n; i++) {
scanf("%s%s%d", students[i].id, students[i].name, &students[i].score);
}
qsort(students, n, sizeof(struct student), cmp);
for (int i = 0; i < n; i++) {
printf("%s %s %d\n", students[i].id, students[i].name, students[i].score);
}
free(students);
return 0;
}
首先定义了一个 struct student 学生结构体,包括学号、姓名和成绩三个字段。
在主函数中,先输入学生个数 n,并动态分配一个含有 n 个 struct student 类型结构体的数组内存,接着通过循环输入每个学生的信息。然后,使用两层循环进行冒泡排序,将学生按成绩从小到大排序。最后,再循环输出每个学生的信息,并释放动态分配的数组内存。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct student {
char id[10];
char name[20];
int score;
};
int main() {
int n;
scanf("%d", &n);
struct student* students = (struct student*)malloc(n * sizeof(struct student)); // 动态分配数组内存
// 输入学生信息
for (int i = 0; i < n; i++) {
scanf("%s %s %d", students[i].id, students[i].name, &students[i].score);
}
// 按成绩从小到大排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (students[i].score > students[j].score) {
struct student temp;
temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
// 输出学生信息
for (int i = 0; i < n; i++) {
printf("%s %s %d\n", students[i].id, students[i].name, students[i].score);
}
free(students); // 释放动态分配的内存
return 0;
}
输入格式及取值范围: 输入格式:第一行为一个正整数n,表示学生的数量;接着n行,每一行为一个学生的信息,包括学号(一维字符数组)、姓名、成绩,中间用空格隔开。 取值范围:n<20,学号和姓名字符串长度小于等于100,成绩在0到100之间。
输出格式及实例: 每行输出一个学生的信息,包括学号、姓名、成绩,中间用空格隔开。按学生成绩从小到大顺序输出学生信息。 样例输出: 1004 Wang 70 1001 Li 76 1003 Liu 85 1002 Zhang 92
问题要求的重点,即按成绩从小到大排序: 要根据学生的成绩从小到大排序,可以使用堆排序算法。
程序解决问题的大体步骤: 第一步,定义一个学生结构体,包括学号(一维字符数组)、姓名、成绩。 第二步,从键盘输入学生的数量n,根据n动态分配存储学生信息的结构体数组。 第三步,输入n个学生的信息(学号、姓名、成绩),存储到之前动态分配的结构体数组当中。 第四步,利用堆排序算法,将学生结构体数组按成绩从小到大排序。 第五步,按照排序后的结果,依次输出每个学生的信息。