第七次实验作业 结构体 编程题 2. 学生记录 【问题描述】 从键盘中读入最多不超过50个学生的学生信息(包括空格隔开的姓名、学号、年龄信息,以学号从低到高排序) 【输入形式】 每次键盘读入最多不超过50个学生的学生信息: 第一行为学生人数; 后面每一行为空格隔开的学生学号、姓名、年龄,其中学号和年龄都是整数。 【输出形式】 分别以姓名顺序(从低到高)和年龄顺序(从低到高)将学生信息输出,每行输出一位学生的信息,其中学号占3位,姓名(英文)占6位,年龄占3位,均为右对齐。年龄相同时按姓名从低到高排序。两种顺序的输出结果用一行空行相隔。 【输入样例】 4 1 aaa 22 45 bbb 23 54 ddd 20 110 ccc 19 【输出样例】 1 aaa 22 45 bbb 23 110 ccc 19 54 ddd 20 110 ccc 19 54 ddd 20 1 aaa 22 45 bbb 23 【样例说明】 从键盘输入四个学生记录,分别按姓名和年龄排序并输出。
时间: 2024-02-10 10:03:33 浏览: 89
学生信息管理系统(C语言)实验报告共24页.pdf.zip
下面是使用结构体实现的代码:
```c
#include <stdio.h>
#include <string.h>
struct Student {
int id;
char name[10];
int age;
};
void sort_by_name(struct Student arr[], int n) {
int i, j;
struct Student tmp;
for (i = 0; i < n; i++) {
for (j = n-1; j > i; j--) {
if (strcmp(arr[j].name, arr[j-1].name) < 0) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
} else if (strcmp(arr[j].name, arr[j-1].name) == 0 && arr[j].age < arr[j-1].age) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
}
void sort_by_age(struct Student arr[], int n) {
int i, j;
struct Student tmp;
for (i = 0; i < n; i++) {
for (j = n-1; j > i; j--) {
if (arr[j].age < arr[j-1].age) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
} else if (arr[j].age == arr[j-1].age && strcmp(arr[j].name, arr[j-1].name) < 0) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
}
int main() {
int n, i;
struct Student arr[50];
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d %s %d", &arr[i].id, arr[i].name, &arr[i].age);
}
sort_by_name(arr, n);
for (i = 0; i < n; i++) {
printf("%3d %6s %3d\n", arr[i].id, arr[i].name, arr[i].age);
}
printf("\n");
sort_by_age(arr, n);
for (i = 0; i < n; i++) {
printf("%3d %6s %3d\n", arr[i].id, arr[i].name, arr[i].age);
}
return 0;
}
```
代码思路如下:
1. 定义一个结构体`Student`,包含三个字段:学号、姓名、年龄。
2. 定义两个排序函数`sort_by_name()`和`sort_by_age()`,分别按照姓名和年龄排序,如果出现年龄相同的情况,则按照姓名从低到高排序。
3. 从输入中读入学生信息,并将学生信息存储到结构体数组中。
4. 调用排序函数进行排序,并输出排序结果。
阅读全文