补充实验) 第七次实验作业 结构体 第十二次实验 多态 历史作业 第六次试验 指针的应用 第四次实验内容及练习(函数) 第五次实验内容及练习(数组) 第三次实验内容及练习(流程控制) 第二次实验内容及练习 第0次作业 返回编程题列表 « 1 2 3 4 5 6 7 8 9 10 11 12 » 第七次实验作业 结构体 编程题 2. 学生记录 【问题描述】 从键盘中读入最多不超过50个学生的学生信息(包括空格隔开的姓名、学号、年龄信息,以学号从低到高排序) 【输入形式】 每次键盘读入最多不超过50个学生的学生信息: 第一行为学生人数; 后面每一行为空格隔开的学生学号、姓名、年龄,其中学号和年龄都是整数。 【输出形式】 分别以姓名顺序(从低到高)和年龄顺序(从低到高)将学生信息输出,每行输出一位学生的信息,其中学号占3位,姓名(英文)占6位,年龄占3位,均为右对齐。年龄相同时按姓名从低到高排序。两种顺序的输出结果用一行空行相隔。。C语言
时间: 2024-02-13 07:06:17 浏览: 80
下面是一个 C 语言的示例代码,可以实现你所描述的功能:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_STUDENT_NUM 50 // 最大学生数
struct student {
int num; // 学号
char name[20]; // 姓名
int age; // 年龄
};
// 按学号从小到大排序
int cmp_by_num(const void* a, const void* b) {
return ((struct student*)a)->num - ((struct student*)b)->num;
}
// 按姓名从小到大排序
int cmp_by_name(const void* a, const void* b) {
return strcmp(((struct student*)a)->name, ((struct student*)b)->name);
}
// 按年龄从小到大排序
int cmp_by_age(const void* a, const void* b) {
if (((struct student*)a)->age != ((struct student*)b)->age) {
return ((struct student*)a)->age - ((struct student*)b)->age;
} else {
return strcmp(((struct student*)a)->name, ((struct student*)b)->name);
}
}
int main() {
int n;
scanf("%d", &n);
struct student stu[MAX_STUDENT_NUM];
// 输入学生信息
for (int i = 0; i < n; i++) {
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].age);
}
// 按学号从小到大排序
qsort(stu, n, sizeof(struct student), cmp_by_num);
// 按姓名从小到大排序输出
qsort(stu, n, sizeof(struct student), cmp_by_name);
for (int i = 0; i < n; i++) {
printf("%3d %-6s %3d\n", stu[i].num, stu[i].name, stu[i].age);
}
printf("\n");
// 按年龄从小到大排序输出
qsort(stu, n, sizeof(struct student), cmp_by_age);
for (int i = 0; i < n; i++) {
printf("%3d %-6s %3d\n", stu[i].num, stu[i].name, stu[i].age);
}
printf("\n");
return 0;
}
```
该代码定义了一个 `struct student` 结构体,包括学号、姓名和年龄。在主函数中,首先输入学生数 `n`,然后定义一个长度为 `MAX_STUDENT_NUM` 的学生数组,并通过循环输入每个学生的信息。接着,分别定义了三个比较函数 `cmp_by_num`、`cmp_by_name` 和 `cmp_by_age`,用于排序。最后,分别按姓名和年龄从小到大排序输出学生信息。其中,姓名和年龄相同时,按姓名从小到大排序输出。两种排序方式输出结果之间用一行空行相隔。
阅读全文