假设题目,让你创建一个结构体,里面包含学号,姓名,各科成绩,总分,然后让你按照总分排序,打开某个文件,然后存进去,修改一些值这种难度
时间: 2023-06-14 15:04:13 浏览: 95
数据结构:定义一个包含学生信息(学号、姓名、成绩)的顺序表_数据结构
5星 · 资源好评率100%
好的,这道题目需要用到C语言的结构体定义、排序算法、文件操作等知识点。下面是一个可能的解答:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
#define MAX_NAME 20
typedef struct {
int id; // 学号
char name[MAX_NAME];// 姓名
int scores[3]; // 三门科目成绩
int total_score; // 总分
} Student;
// 按照总分排序的比较函数
int cmp(const void* a, const void* b) {
return (*(Student*)b).total_score - (*(Student*)a).total_score;
}
int main() {
Student students[MAX_STUDENT]; // 定义学生结构体数组
int n = 0; // 学生数量
FILE* fp;
// 读取文件中的学生信息
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("Error: file not found\n");
return 1;
}
while (fscanf(fp, "%d%s%d%d%d", &students[n].id, students[n].name,
&students[n].scores[0], &students[n].scores[1], &students[n].scores[2]) == 5) {
students[n].total_score = students[n].scores[0] + students[n].scores[1] + students[n].scores[2];
n++;
}
fclose(fp);
// 按照总分排序
qsort(students, n, sizeof(Student), cmp);
// 修改某些学生的成绩
students[0].scores[0] = 95;
students[0].total_score = students[0].scores[0] + students[0].scores[1] + students[0].scores[2];
// 将修改后的学生信息写入文件
fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("Error: file not found\n");
return 1;
}
for (int i = 0; i < n; i++) {
fprintf(fp, "%d %s %d %d %d\n", students[i].id, students[i].name,
students[i].scores[0], students[i].scores[1], students[i].scores[2]);
}
fclose(fp);
return 0;
}
```
上面的代码中,我们首先定义了一个结构体 `Student`,包含学号、姓名、三门科目成绩和总分。然后定义了一个 `cmp` 函数,用于按照总分排序。接着在 `main` 函数中,我们定义了一个 `students` 数组,用于存放读取的学生信息,同时读取同目录下的 `students.txt` 文件,将学生信息存入数组中。然后调用 `qsort` 函数,按照总分排序。接着修改了一个学生的成绩,并将修改后的信息写回文件中。
需要注意的是,这个程序只能处理最多100个学生的信息,姓名最长为20个字符,每个成绩均为整数。如果需要处理更复杂的情况,需要对代码进行适当修改。
阅读全文