C语言学生成绩单文件管理,
1.定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩
2.从键盘输入10个学生以上内容,存入文件stud.txt,关闭文件
3.打开stud.txt文件,将数据读出,查看是否正确写入,关闭文件
4.打开stud.txt文件,读出数据,将10个学生平均分由高到低排序,分别将结果输出到屏幕上和另一文件studsort.txt中
采用fwrite()和fread()函数来读取和写入数据,具体思路:用户输入信息后保存到一个二进制文件中。程序会读取这个文件并计算学生的平均成绩,然后按照平均成绩排序并将结果写入另一个文本文件中。最后释放动态分配的内存并退出程序
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LENGTH 20
#define NUM_GRADES 3
typedef struct {
int id;
char name[MAX_NAME_LENGTH];
float* grades;
float avg_grade;
} Student;
int compare_avg_grades(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
if (s1->avg_grade < s2->avg_grade) {
return 1;
} else if (s1->avg_grade > s2->avg_grade) {
return -1;
} else {
return 0;
}
}
void print_student(Student* student) {
printf("Student %d: %s ", student->id, student->name);
for (int i = 0; i < NUM_GRADES; i++) {
printf("%.2f ", student->grades[i]);
}
printf("Average: %.2f\\n", student->avg_grade);
}
void write_students_to_file(char* filename, Student* students, int num_students) {
FILE* file = fopen(filename, "wb");
if (file == NULL) {
printf("Error opening file %s for writing!\\n", filename);
exit(1);
}
for (int i = 0; i < num_students; i++) {
fwrite(&students[i], sizeof(Student), 1, file);
}
fclose(file);
}
void read_students_from_file(char* filename, Student* students, int num_students) {
FILE* file = fopen(filename, "rb");
if (file == NULL) {
printf("Error opening file %s for reading!\\n", filename);
exit(1);
}
for (int i = 0; i < num_students; i++) {
fread(&students[i], sizeof(Student), 1, file);
students[i].grades = malloc(NUM_GRADES * sizeof(float));
for (int j = 0; j < NUM_GRADES; j++) {
students[i].avg_grade += students[i].grades[j];
}
students[i].avg_grade /= NUM_GRADES;
print_student(&students[i]);
}
fclose(file);
}
void sort_students_by_avg_grade(Student* students, int num_students) {
qsort(students, num_students, sizeof(Student), compare_avg_grades);
}
void print_students_to_file(char* filename, Student* students, int num_students) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("Error opening file %s for writing!\\n", filename);
exit(1);
}
for (int i = 0; i < num_students; i++) {
fprintf(file, "Student %d: %s Average: %.2f\\n", students[i].id,
students[i].name, students[i].avg_grade);
print_student(&students[i]);
}
fclose(file);
}
int main() {
int num_students;
printf("Enter number of students: ");
scanf("%d", &num_students);
Student* students = malloc(num_students * sizeof(Student));
for (int i = 0; i < num_students; i++) {
printf("Enter details for student %d:\\n", i+1);
printf("ID: ");
scanf("%d", &students[i].id);
printf("Name: ");
scanf("%s", students[i].name);
students[i].grades = malloc(NUM_GRADES * sizeof(float));
for (int j = 0; j < NUM_GRADES; j++) {
printf("Grade %d: ", j+1);
scanf("%f", &students[i].grades[j]);
students[i].avg_grade += students[i].grades[j];
}
students[i].avg_grade /= NUM_GRADES;
printf("\\n");
}
write_students_to_file("students.bin", students, num_students);
read_students_from_file("students.bin", students, num_students);
sort_students_by_avg_grade(students, num_students);
print_students_to_file("students_sorted.txt", students, num_students);
for (int i = 0; i < num_students; i++) {
free(students[i].grades);
}
free(students);
return 0;
}
可以了,有问题欢迎交流!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 10
//定义学生结构体
struct Student {
int id;
char name[20];
float score1, score2, score3;
float average; //平均成绩
};
//按照平均分数从高到低进行排序
void sort_students(struct Student arr[]) {
int i, j;
struct Student temp;
for (i = 0; i < MAX_SIZE - 1; i++) {
for (j = 0; j < MAX_SIZE - i - 1; j++) {
if (arr[j].average < arr[j + 1].average) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int i;
struct Student students[MAX_SIZE];
FILE *fp;
//从键盘输入学生信息
for (i = 0; i < MAX_SIZE; i++) {
printf("请输入第%d个学生的学号、姓名、三门成绩:\n", i+1);
scanf("%d%s%f%f%f", &students[i].id, students[i].name,
&students[i].score1, &students[i].score2, &students[i].score3);
students[i].average = (students[i].score1 + students[i].score2 + students[i].score3) / 3.0;
}
//将学生信息存入文件
fp = fopen("stud.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
for (i = 0; i < MAX_SIZE; i++) {
fprintf(fp, "%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
students[i].score1, students[i].score2, students[i].score3);
}
fclose(fp);
//读取文件并输出
fp = fopen("stud.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
printf("从文件中读取的学生信息如下:\n");
for (i = 0; i < MAX_SIZE; i++) {
fscanf(fp, "%d%s%f%f%f", &students[i].id, students[i].name,
&students[i].score1, &students[i].score2, &students[i].score3);
students[i].average = (students[i].score1 + students[i].score2 + students[i].score3) / 3.0;
printf("%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
students[i].score1, students[i].score2, students[i].score3);
}
fclose(fp);
//按照平均分数排序并输出结果到屏幕和文件
sort_students(students);
fp = fopen("studsort.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
printf("按照平均分数从高到低排序的结果如下:\n");
for (i = 0; i < MAX_SIZE; i++) {
printf("%d %s %.2f %.2f %.2f %.2f\n", students[i].id, students[i].name,
students[i].score1, students[i].score2, students[i].score3, students[i].average);
fprintf(fp, "%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name,
students[i].score1, students[i].score2, students[i].score3, students[i].average);
}
fclose(fp);
return 0;
}
可以借鉴下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 10
#define MAX_NAME_LENGTH 50
#define FILE_NAME "stud.txt"
#define SORTED_FILE_NAME "studsort.txt"
struct Student {
int id;
char name[MAX_NAME_LENGTH];
float scores[3];
float average;
};
void saveStudentsToFile(struct Student students[], int count) {
FILE *file = fopen(FILE_NAME, "w");
if (file == NULL) {
printf("无法打开文件 %s\n", FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fprintf(file, "%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
students[i].scores[0], students[i].scores[1], students[i].scores[2]);
}
fclose(file);
}
void readStudentsFromFile(struct Student students[], int count) {
FILE *file = fopen(FILE_NAME, "r");
if (file == NULL) {
printf("无法打开文件 %s\n", FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fscanf(file, "%d %s %f %f %f", &students[i].id, students[i].name,
&students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);
}
fclose(file);
}
void calculateAverage(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
float sum = 0;
for (int j = 0; j < 3; j++) {
sum += students[i].scores[j];
}
students[i].average = sum / 3.0;
}
}
int compareStudents(const void *a, const void *b) {
const struct Student *studentA = (const struct Student *)a;
const struct Student *studentB = (const struct Student *)b;
if (studentA->average < studentB->average) {
return 1;
} else if (studentA->average > studentB->average) {
return -1;
} else {
return 0;
}
}
void sortStudents(struct Student students[], int count) {
qsort(students, count, sizeof(struct Student), compareStudents);
}
void printStudents(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
printf("学号:%d\t姓名:%s\t平均分:%.2f\n", students[i].id, students[i].name, students[i].average);
}
}
void saveSortedStudentsToFile(struct Student students[], int count) {
FILE *file = fopen(SORTED_FILE_NAME, "w");
if (file == NULL) {
printf("无法打开文件 %s\n", SORTED_FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fprintf(file, "学号:%d\t姓名:%s\t平均分:%.2f\n", students[i].id, students[i].name, students[i].average);
}
fclose(file);
}
int main() {
struct Student students[MAX_STUDENTS];
printf("请输入%d个学生的信息:\n", MAX_STUDENTS
);
for (int i = 0; i < MAX_STUDENTS; i++) {
printf("学号:");
scanf("%d", &students[i].id);
printf("姓名:");
scanf("%s", students[i].name);
printf("成绩1:");
scanf("%f", &students[i].scores[0]);
printf("成绩2:");
scanf("%f", &students[i].scores[1]);
printf("成绩3:");
scanf("%f", &students[i].scores[2]);
}
saveStudentsToFile(students, MAX_STUDENTS);
printf("学生信息已保存到文件 %s\n", FILE_NAME);
printf("从文件 %s 中读取学生信息:\n", FILE_NAME);
readStudentsFromFile(students, MAX_STUDENTS);
printStudents(students, MAX_STUDENTS);
calculateAverage(students, MAX_STUDENTS);
sortStudents(students, MAX_STUDENTS);
printf("\n学生平均分由高到低排序:\n");
printStudents(students, MAX_STUDENTS);
saveSortedStudentsToFile(students, MAX_STUDENTS);
printf("学生排序结果已保存到文件 %s\n", SORTED_FILE_NAME);
return 0;
}
以下是一个可能的 C 语言实现:
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STR_LEN 100
#define NUM_OF_STUDENTS 10
typedef struct {
int id;
char name[MAX_STR_LEN];
float score[3];
float avg_score;
} student_t;
// 文件名和文件指针全局变量
const char *FILE_NAME = "stud.txt";
const char *SORTED_FILE_NAME = "studsort.txt";
FILE *fp; // 普通文件指针
FILE *sort_fp; // 排序结果输出文件指针
// 学生数据读写函数
void read_student_data(student_t stu_array[NUM_OF_STUDENTS]);
void write_student_data(student_t stu_array[NUM_OF_STUDENTS]);
// 排序函数
int cmp_func(const void *a, const void *b);
// 文件操作函数
void open_file_read(const char *file_name, FILE **fp);
void open_file_write(const char *file_name, FILE **fp);
void close_file(FILE **fp);
int main() {
student_t stu_array[NUM_OF_STUDENTS];
printf("请输入学生信息(一行输入一个,格式为: 学号 姓名 三门课成绩(用空格隔开)):\n");
read_student_data(stu_array);
printf("写入文件成功\n");
// 打开原始文件,检查文件内容是否正确
open_file_read(FILE_NAME, &fp);
printf("从 %s 中读取到的学生数据如下:\n", FILE_NAME);
for (int i = 0; i < NUM_OF_STUDENTS; i++) {
fscanf(fp, "%d %s %f %f %f", &stu_array[i].id, stu_array[i].name,
&stu_array[i].score[0], &stu_array[i].score[1], &stu_array[i].score[2]);
stu_array[i].avg_score = (stu_array[i].score[0] + stu_array[i].score[1] +
stu_array[i].score[2]) / 3.0;
printf("%d %s %.2f %.2f %.2f %.2f\n", stu_array[i].id, stu_array[i].name,
stu_array[i].score[0], stu_array[i].score[1], stu_array[i].score[2],
stu_array[i].avg_score);
}
close_file(&fp);
// 对学生平均分进行排序
qsort(stu_array, NUM_OF_STUDENTS, sizeof(student_t), cmp_func);
// 输出排序结果到屏幕和文件中
open_file_write(SORTED_FILE_NAME, &sort_fp);
printf("学生平均分由高到低的排序如下(格式:学号 姓名 三门课平均分 平均分):\n");
for (int i = 0; i < NUM_OF_STUDENTS; i++) {
printf("%d %s %.2f\n", stu_array[i].id, stu_array[i].name, stu_array[i].avg_score);
fprintf(sort_fp, "%d %s %.2f\n", stu_array[i].id, stu_array[i].name, stu_array[i].avg_score);
}
printf("输出完毕,请查看 %s 文件\n", SORTED_FILE_NAME);
close_file(&sort_fp);
return 0;
}
// 定义cmp_func函数,用于qsort内部排序调用
int cmp_func(const void *a, const void *b) {
student_t *p1 = (student_t *)a;
student_t *p2 = (student_t *)b;
if (p1->avg_score < p2->avg_score) {
return 1;
} else if (p1->avg_score > p2->avg_score) {
return -1;
} else {
return 0;
}
}
void read_student_data(student_t stu_array[NUM_OF_STUDENTS]) {
open_file_write(FILE_NAME, &fp);
for (int i = 0; i < NUM_OF_STUDENTS; i++) {
scanf("%d %s %f %f %f", &stu_array[i].id, stu_array[i].name,
&stu_array[i].score[0], &stu_array[i].score[1], &stu_array[i].score[2]);
stu_array[i].avg_score = (stu_array[i].score[0] + stu_array[i].score[1] +
stu_array[i].score[2]) / 3.0;
fprintf(fp, "%d %s %.2f %.2f %.2f\n", stu_array[i].id, stu_array[i].name,
stu_array[i].score[0], stu_array[i].score[1], stu_array[i].score[2]);
}
close_file(&fp);
}
// 用于打开写入文件的通用函数
void open_file_write(const char *file_name, FILE **fp) {
if ((*fp = fopen(file_name, "w")) == NULL) {
perror("File Open Error!");
exit(EXIT_FAILURE);
}
}
void open_file_read(const char *file_name, FILE **fp) {
if ((*fp = fopen(file_name, "r")) == NULL) {
perror("File Open Error!");
exit(EXIT_FAILURE);
}
}
void close_file(FILE **fp) {
fclose(*fp);
}
注意,在写入文件时,要将学号、姓名和三门课的成绩按特定格式进行写入,以便后面读取文件时能够正确解析。在此代码中,“%.2f”表示保留两位小数。
为了实现从高到低排序,此代码中使用了 qsort 函数及其比较函数 cmp_func,相应地,我们需要对 student_t 结构体添加一个用于存储平均分的变量(即 avg_score),并且在写入数据时计算平均分;在读取文件时,除了读取 ID、名字和各科成绩外,还要计算总平均分,并将其存储在 avg_score 变量中。
来自NewBing和LP的编写:
以下是一个使用C语言实现学生成绩单文件管理的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 10
#define MAX_NAME_LENGTH 50
#define FILE_NAME "stud.txt"
#define SORTED_FILE_NAME "studsort.txt"
struct Student {
int id;
char name[MAX_NAME_LENGTH];
float scores[3];
float average;
};
void saveStudentsToFile(struct Student students[], int count) {
FILE *file = fopen(FILE_NAME, "w");
if (file == NULL) {
printf("无法打开文件 %s\n", FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fprintf(file, "%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
students[i].scores[0], students[i].scores[1], students[i].scores[2]);
}
fclose(file);
}
void readStudentsFromFile(struct Student students[], int count) {
FILE *file = fopen(FILE_NAME, "r");
if (file == NULL) {
printf("无法打开文件 %s\n", FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fscanf(file, "%d %s %f %f %f", &students[i].id, students[i].name,
&students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);
}
fclose(file);
}
void calculateAverage(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
float sum = 0;
for (int j = 0; j < 3; j++) {
sum += students[i].scores[j];
}
students[i].average = sum / 3.0;
}
}
int compareStudents(const void *a, const void *b) {
const struct Student *studentA = (const struct Student *)a;
const struct Student *studentB = (const struct Student *)b;
if (studentA->average < studentB->average) {
return 1;
} else if (studentA->average > studentB->average) {
return -1;
} else {
return 0;
}
}
void sortStudents(struct Student students[], int count) {
qsort(students, count, sizeof(struct Student), compareStudents);
}
void printStudents(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
printf("学号:%d\t姓名:%s\t平均分:%.2f\n", students[i].id, students[i].name, students[i].average);
}
}
void saveSortedStudentsToFile(struct Student students[], int count) {
FILE *file = fopen(SORTED_FILE_NAME, "w");
if (file == NULL) {
printf("无法打开文件 %s\n", SORTED_FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fprintf(file, "学号:%d\t姓名:%s\t平均分:%.2f\n", students[i].id, students[i].name, students[i].average);
}
fclose(file);
}
int main() {
struct Student students[MAX_STUDENTS];
printf("请输入%d个学生的信息:\n", MAX_STUDENTS
);
for (int i = 0; i < MAX_STUDENTS; i++) {
printf("学号:");
scanf("%d", &students[i].id);
printf("姓名:");
scanf("%s", students[i].name);
printf("成绩1:");
scanf("%f", &students[i].scores[0]);
printf("成绩2:");
scanf("%f", &students[i].scores[1]);
printf("成绩3:");
scanf("%f", &students[i].scores[2]);
}
saveStudentsToFile(students, MAX_STUDENTS);
printf("学生信息已保存到文件 %s\n", FILE_NAME);
printf("从文件 %s 中读取学生信息:\n", FILE_NAME);
readStudentsFromFile(students, MAX_STUDENTS);
printStudents(students, MAX_STUDENTS);
calculateAverage(students, MAX_STUDENTS);
sortStudents(students, MAX_STUDENTS);
printf("\n学生平均分由高到低排序:\n");
printStudents(students, MAX_STUDENTS);
saveSortedStudentsToFile(students, MAX_STUDENTS);
printf("学生排序结果已保存到文件 %s\n", SORTED_FILE_NAME);
return 0;
}
此示例代码中未包含错误处理和输入验证。在实际应用中,建议对用户输入进行适当的错误处理和验证,以确保程序的稳定性和正确性。
该回答引用GPT
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 20 // 姓名最大长度
#define MAX_STU 10 // 最大学生数
#define FILE_NAME "stud.txt" // 文件名
// 学生结构体
typedef struct student {
char id[10]; // 学号
char name[MAX_NAME]; // 姓名
float score[3]; // 成绩
float average; // 平均分
} Student;
// 从键盘输入学生信息
void input_students(Student *students, int n) {
int i, j;
for(i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i+1);
printf("学号:");
scanf("%s", students[i].id);
printf("姓名:");
scanf("%s", students[i].name);
for(j = 0; j < 3; j++) {
printf("第%d门课成绩:", j+1);
scanf("%f", &students[i].score[j]);
}
students[i].average = (students[i].score[0] + students[i].score[1] + students[i].score[2]) / 3;
}
}
// 将学生信息写入文件
void write_students(Student *students, int n) {
FILE *fp;
if((fp = fopen(FILE_NAME, "w")) == NULL) {
printf("无法打开文件:%s\n", FILE_NAME);
exit(1);
}
int i, j;
for(i = 0; i < n; i++) {
fprintf(fp, "%s %s ", students[i].id, students[i].name);
for(j = 0; j < 3; j++) {
fprintf(fp, "%.1f ", students[i].score[j]);
}
fprintf(fp, "%.1f\n", students[i].average);
}
fclose(fp);
}
// 从文件中读取学生信息
void read_students(Student *students, int n) {
FILE *fp;
if((fp = fopen(FILE_NAME, "r")) == NULL) {
printf("无法打开文件:%s\n", FILE_NAME);
exit(1);
}
int i, j;
for(i = 0; i < n; i++) {
fscanf(fp, "%s %s", students[i].id, students[i].name);
for(j = 0; j < 3; j++) {
fscanf(fp, "%f", &students[i].score[j]);
}
fscanf(fp, "%f", &students[i].average);
}
fclose(fp);
}
// 按平均分从高到低排序
void sort_students(Student *students, int n) {
int i, j;
Student tmp;
for(i = 0; i < n; i++) {
for(j = i+1; j < n; j++) {
if(students[i].average < students[j].average) {
tmp = students[i];
students[i] = students[j];
students[j] = tmp;
}
}
}
}
// 输出学生信息到屏幕和文件
void print_students(Student *students, int n) {
FILE *fp;
if((fp = fopen("studsort.txt", "w")) == NULL) {
printf("无法打开文件:studsort.txt\n");
exit(1);
}
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分\n");
fprintf(fp, "学号\t姓名\t成绩1\t成绩2\t成绩3\t平均分\n");
int i, j;
for(i = 0; i < n; i++) {
printf("%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].name, students[i].score[0], students[i].score[1], students[i].score[2], students[i].average);
fprintf(fp, "%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].id, students[i].name, students[i].score[0], students[i].score[1], students[i].score[2], students[i].average);
}
fclose(fp);
}
int main() {
Student students[MAX_STU];
input_students(students, MAX_STU);
write_students(students, MAX_STU);
read_students(students, MAX_STU);
sort_students(students, MAX_STU);
print_students(students, MAX_STU);
return 0;
}
注意事项:
代码中使用了结构体数组来存放学生信息,结构体中包括学号、姓名、三门课成绩和平均分;
在写入文件时,使用了fprintf函数,将学生信息写入文件;
在读取文件时,使用了fscanf函数,从文件中读取学生信息;
在排序时,使用了简单的冒泡排序方法;
最后,将学生信息输出到屏幕和文件中。
以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
这里是C语言实现学生成绩单文件管理的代码:
#include <stdio.h>
#include <string.h>
// 学生信息结构体
struct Student {
char num[10]; // 学号
char name[20]; // 姓名
int score1; // 课程1成绩
int score2; // 课程2成绩
int score3; // 课程3成绩
};
// 将学生信息写入文件
void write_file() {
FILE *fp = fopen("stud.txt", "w");
struct Student stu[10] = {0};
// 从键盘输入10个学生信息,存入数组
for (int i = 0; i < 10; i++) {
printf("请输入第%d个学生信息:\n", i + 1);
scanf("%s %s %d %d %d", stu[i].num, stu[i].name, &stu[i].score1, &stu[i].score2, &stu[i].score3);
}
// 将数组中的学生信息写入文件
for (int i = 0; i < 10; i++) {
fprintf(fp, "%s %s %d %d %d\n", stu[i].num, stu[i].name, stu[i].score1, stu[i].score2, stu[i].score3);
}
fclose(fp);
}
// 读取文件并显示学生信息
void read_file() {
FILE *fp = fopen("stud.txt", "r");
struct Student stu[10] = {0};
// 读取文件中的学生信息,存入数组
for (int i = 0; i < 10; i++) {
fscanf(fp, "%s %s %d %d %d", stu[i].num, stu[i].name, &stu[i].score1, &stu[i].score2, &stu[i].score3);
}
// 显示数组中的学生信息
for (int i = 0; i < 10; i++) {
printf("学号:%s 姓名:%s 成绩:%d %d %d\n", stu[i].num, stu[i].name, stu[i].score1, stu[i].score2, stu[i].score3);
}
fclose(fp);
}
// 对学生平均成绩排序,并输出到屏幕和文件
void sort_output() {
// 读取文件,获取学生信息并计算平均成绩
FILE *fp = fopen("stud.txt", "r");
struct Student stu[10] = {0};
float avg[10] = {0.0};
for (int i = 0; i < 10; i++) {
fscanf(fp, "%s %s %d %d %d", stu[i].num, stu[i].name, &stu[i].score1, &stu[i].score2, &stu[i].score3);
avg[i] = (stu[i].score1 + stu[i].score2 + stu[i].score3) / 3.0;
}
fclose(fp);
// 对平均成绩排序,从大到小
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9 - i; j++) {
if (avg[j] < avg[j + 1]) {
float t = avg[j];
avg[j] = avg[j + 1];
avg[j + 1] = t;
struct Student tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
// 输出结果到屏幕和文件
FILE *fpo = fopen("studsort.txt", "w");
for (int i = 0; i < 10; i++) {
printf("学号:%s 姓名:%s 平均成绩:%.2f\n", stu[i].num, stu[i].name, avg[i]);
fprintf(fpo, "学号:%s 姓名:%s 平均成绩:%.2