统计成绩:从键盘输入以下 5 个学生的学号、姓名,以及数学、语文和英语成绩,写到文本文件 f3.txt 中,再从文件中取出数据,计算每个学生的总成绩和平均分,并将结果显示在屏幕上。试编写相应程序。 题目代码:
时间: 2024-01-02 14:02:40 浏览: 61
好的,这道题目与之前的题目类似,不同之处在于需要按照成绩进行排序,并输出排名。下面是一个可能的解决方案:
```c
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_STUDENT_NUM 5 // 最大学生数
// 学生信息结构体
typedef struct {
int id;
char name[MAX_NAME_LEN];
int math;
int chinese;
int english;
int total_score;
float avg_score;
int rank;
} Student;
// 从键盘输入学生信息并写入文件
void input_students(FILE *fp) {
Student stu;
for (int i = 0; i < MAX_STUDENT_NUM; i++) {
printf("请输入第%d个学生的学号、姓名、数学、语文、英语成绩(用空格隔开):\n", i+1);
scanf("%d %s %d %d %d", &stu.id, stu.name, &stu.math, &stu.chinese, &stu.english);
stu.total_score = stu.math + stu.chinese + stu.english;
stu.avg_score = stu.total_score / 3.0;
fprintf(fp, "%d %s %d %d %d %d %.2f\n", stu.id, stu.name, stu.math, stu.chinese, stu.english, stu.total_score, stu.avg_score);
}
}
// 从文件中读取学生信息并计算总分和平均分
void read_students(FILE *fp, Student *students) {
Student stu;
int i = 0;
while (fscanf(fp, "%d %s %d %d %d %d %f", &stu.id, stu.name, &stu.math, &stu.chinese, &stu.english, &stu.total_score, &stu.avg_score) != EOF) {
stu.rank = 1;
students[i++] = stu;
}
}
// 根据总分排序
void sort_students(Student *students, int n) {
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (students[i].total_score < students[j].total_score) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
// 更新排名
for (int i = 0; i < n; i++) {
if (i > 0 && students[i].total_score == students[i-1].total_score) {
students[i].rank = students[i-1].rank; // 如果分数相同,排名相同
} else {
students[i].rank = i + 1; // 否则,排名为当前位置+1
}
}
}
// 输出学生信息
void print_students(Student *students, int n) {
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\t排名\n");
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%d\t%d\t%d\t%d\t%.2f\t%d\n", students[i].id, students[i].name, students[i].math, students[i].chinese, students[i].english, students[i].total_score, students[i].avg_score, students[i].rank);
}
}
int main() {
FILE *fp;
fp = fopen("f3.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
return 1;
}
input_students(fp);
fclose(fp);
fp = fopen("f3.txt", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
return 1;
}
Student students[MAX_STUDENT_NUM];
read_students(fp, students);
sort_students(students, MAX_STUDENT_NUM);
print_students(students, MAX_STUDENT_NUM);
fclose(fp);
return 0;
}
```
这个程序与之前的程序类似,不同之处在于需要对学生信息按照总分进行排序,并输出排名。在排序时,程序使用了简单的冒泡排序算法,对学生信息进行排序。在排序完成后,程序通过遍历数组,更新每个学生的排名。输出排名时,程序将排名输出在最后一列。
阅读全文