6-4 结构体数组按总分排序 (10 分)
时间: 2023-05-02 13:04:52 浏览: 288
对于数组b,可以按照总分进行排序。具体步骤如下:
1. 遍历数组b,计算每个元素的总分,即将该元素的语文、数学、英语成绩相加。
2. 通过比较每个元素的总分,将数组b中的元素按照总分从大到小排序。
3. 排序后的数组b即为按照总分排序的结果。
示例:
假设数组b如下:
b = [[80, 90, 70], [60, 70, 80], [90, 80, 85]]
则对数组b按照总分从大到小排序的结果为:
[[80, 90, 70], [90, 80, 85], [60, 70, 80]]
其中,第一个元素的总分为240,第二个元素的总分为235,第三个元素的总分为210,因此将第一个元素排在最前面,第三个元素排在最后面,得到上方结果。
相关问题
结构体数组按总分排序
结构体数组按总分排序通常是在编程中处理一些需要对数据进行复杂比较的情况。当你有一个包含学生信息的结构体数组,比如每个元素包括学生的姓名和分数,你可以创建一个函数或者算法来按照总分对学生进行排序。
首先,你需要定义一个结构体,例如:
```c++
typedef struct {
char name[50];
int score1;
int score2; // 如果有多个科目
} Student;
```
然后,为了按总分排序,你可以创建一个比较函数,它接收两个学生结构体作为参数,并计算它们的总分。如果第一个学生的总分大于第二个,那么返回正数;如果小于,则返回负数;等于则返回0,以便于标准库的`qsort`等排序函数进行升序排列。
这里是一个简单的例子(假设只有一个科目):
```c
int compareStudents(const void *a, const void *b) {
const Student *studentA = (const Student *) a;
const Student *studentB = (const Student *) b;
return studentA->score1 + studentA->score2 - (studentB->score1 + studentB->score2);
}
void sortStudentsByTotal(Student students[], int count) {
qsort(students, count, sizeof(Student), compareStudents);
}
```
最后,调用`sortStudentsByTotal`函数并传入你的结构体数组和数组长度即可。
C实现 学生成绩信息包括:学号,姓名,语文成绩、数学成绩、英语成绩。 主要功能: 1、 学生信息录入; 、 信息排序(a 按总分排序(从高到低)b 按姓名排序 ) 5、 信息删除(给定学号,删除该学生信息) 6、 信息修改(给定学号,修改该学生信息) 7、 保存信息(把当前的结构体数组内容保存 8、 读取信息(从文件student.txt中把结构体数组的内容读到结构体数组中) 0、 退出
好的,以下是一个简单的C语言实现学生成绩信息管理系统的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define MAX_NAME_LEN 20 // 姓名最大长度
// 学生信息结构体
typedef struct {
char id[10]; // 学号
char name[MAX_NAME_LEN]; // 姓名
int chinese; // 语文成绩
int math; // 数学成绩
int english; // 英语成绩
int total; // 总分
} Student;
// 学生信息数组
Student students[MAX_STUDENT_NUM];
int student_num = 0; // 学生数
// 函数声明
void add_student();
void sort_student_by_total();
void sort_student_by_name();
void delete_student();
void modify_student();
void save_students();
void load_students();
void print_students();
// 主函数
int main() {
int choice;
do {
printf("请输入数字选择功能:\n");
printf("1. 学生信息录入\n");
printf("2. 按总分排序\n");
printf("3. 按姓名排序\n");
printf("4. 学生信息删除\n");
printf("5. 学生信息修改\n");
printf("6. 保存学生信息到文件\n");
printf("7. 从文件读取学生信息\n");
printf("8. 显示学生信息\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
sort_student_by_total();
break;
case 3:
sort_student_by_name();
break;
case 4:
delete_student();
break;
case 5:
modify_student();
break;
case 6:
save_students();
break;
case 7:
load_students();
break;
case 8:
print_students();
break;
case 0:
printf("退出程序\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (choice != 0);
return 0;
}
// 添加学生信息
void add_student() {
if (student_num >= MAX_STUDENT_NUM) {
printf("学生数已满,不能再添加\n");
return;
}
Student s;
printf("请输入学生信息:\n");
printf("学号:");
scanf("%s", s.id);
printf("姓名:");
scanf("%s", s.name);
printf("语文成绩:");
scanf("%d", &(s.chinese));
printf("数学成绩:");
scanf("%d", &(s.math));
printf("英语成绩:");
scanf("%d", &(s.english));
s.total = s.chinese + s.math + s.english;
students[student_num] = s;
student_num++;
printf("添加成功!\n");
}
// 按总分排序
void sort_student_by_total() {
if (student_num <= 1) {
printf("学生数不足,无法排序\n");
return;
}
// 冒泡排序
for (int i = 0; i < student_num - 1; i++) {
for (int j = 0; j < student_num - i - 1; j++) {
if (students[j].total < students[j + 1].total) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按总分排序成功!\n");
}
// 按姓名排序
void sort_student_by_name() {
if (student_num <= 1) {
printf("学生数不足,无法排序\n");
return;
}
// 冒泡排序
for (int i = 0; i < student_num - 1; i++) {
for (int j = 0; j < student_num - i - 1; j++) {
if (strcmp(students[j].name, students[j + 1].name) > 0) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按姓名排序成功!\n");
}
// 删除学生信息
void delete_student() {
if (student_num <= 0) {
printf("学生数为0,无法删除\n");
return;
}
char id[10];
printf("请输入要删除的学生学号:");
scanf("%s", id);
int index = -1;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("找不到要删除的学生\n");
} else {
for (int i = index; i < student_num - 1; i++) {
students[i] = students[i + 1];
}
student_num--;
printf("删除成功!\n");
}
}
// 修改学生信息
void modify_student() {
if (student_num <= 0) {
printf("学生数为0,无法修改\n");
return;
}
char id[10];
printf("请输入要修改的学生学号:");
scanf("%s", id);
int index = -1;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("找不到要修改的学生\n");
} else {
printf("请输入修改后的学生信息:\n");
printf("学号:");
scanf("%s", students[index].id);
printf("姓名:");
scanf("%s", students[index].name);
printf("语文成绩:");
scanf("%d", &(students[index].chinese));
printf("数学成绩:");
scanf("%d", &(students[index].math));
printf("英语成绩:");
scanf("%d", &(students[index].english));
students[index].total = students[index].chinese + students[index].math + students[index].english;
printf("修改成功!\n");
}
}
// 保存学生信息到文件
void save_students() {
FILE *fp;
fp = fopen("student.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
fprintf(fp, "%d\n", student_num);
for (int i = 0; i < student_num; i++) {
fprintf(fp, "%s %s %d %d %d %d\n", students[i].id, students[i].name,
students[i].chinese, students[i].math, students[i].english, students[i].total);
}
fclose(fp);
printf("学生信息保存成功!\n");
}
// 从文件读取学生信息
void load_students() {
FILE *fp;
fp = fopen("student.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
fscanf(fp, "%d", &student_num);
for (int i = 0; i < student_num; i++) {
fscanf(fp, "%s %s %d %d %d %d", students[i].id, students[i].name,
&(students[i].chinese), &(students[i].math), &(students[i].english), &(students[i].total));
}
fclose(fp);
printf("学生信息读取成功!\n");
}
// 显示学生信息
void print_students() {
if (student_num <= 0) {
printf("学生数为0,无法显示\n");
} else {
printf("学号\t姓名\t语文\t数学\t英语\t总分\n");
for (int i = 0; i < student_num; i++) {
printf("%s\t%s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name,
students[i].chinese, students[i].math, students[i].english, students[i].total);
}
}
}
```
这是一个简单的学生成绩信息管理系统,实现了学生信息的录入、排序、删除、修改、保存到文件、从文件读取和显示等功能。需要注意的是,这只是一个示例代码,还有很多可以优化和改进的地方。
阅读全文
相关推荐












