用C语言编程,输入10个学生5门课的成绩,分别用函数计算每个学生的平均分,每门课的平均分,找出最高分对应的学生和课程,计算平均分方差。然后用函数重载的方法,让计算方差的函数支持不同的数据类型;然后用函数模板的方法,实现排序函数,并进行调用。在此基础上,增加以下功能:能够按任意一门课程的成绩,对学生信息进行排序;能够将排序的结果写入到文件(students.txt)中;程序启动时,能够自动从文件(students.txt)中读取学生信息)
时间: 2024-02-18 13:05:35 浏览: 64
好的,让我们一步一步来实现这些功能。
首先,我们需要定义一个结构体来存储学生信息,包括学生姓名,学生编号以及5门课的成绩。代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_STUDENTS 10 // 学生数量
#define NUM_COURSES 5 // 课程数量
// 学生信息结构体
typedef struct {
char name[20]; // 姓名
int id; // 学号
float scores[NUM_COURSES]; // 成绩
float avg_score; // 平均分
} student_t;
```
接下来,我们需要编写函数来计算每个学生的平均分和每门课的平均分。代码如下:
```c
// 计算每个学生的平均分
void calc_avg_score_student(student_t students[]) {
for (int i = 0; i < NUM_STUDENTS; ++i) {
float sum = 0.0;
for (int j = 0; j < NUM_COURSES; ++j) {
sum += students[i].scores[j];
}
students[i].avg_score = sum / NUM_COURSES;
}
}
// 计算每门课的平均分
void calc_avg_score_course(student_t students[]) {
float sum[NUM_COURSES] = {0}; // 每门课的成绩总和
for (int i = 0; i < NUM_STUDENTS; ++i) {
for (int j = 0; j < NUM_COURSES; ++j) {
sum[j] += students[i].scores[j];
}
}
for (int i = 0; i < NUM_COURSES; ++i) {
printf("Course %d average score: %.2f\n", i + 1, sum[i] / NUM_STUDENTS);
}
}
```
然后,我们需要编写函数来找出最高分对应的学生和课程。代码如下:
```c
// 找出最高分对应的学生和课程
void find_highest_score(student_t students[]) {
int max_student_index = 0;
int max_course_index = 0;
float max_score = students[0].scores[0];
for (int i = 0; i < NUM_STUDENTS; ++i) {
for (int j = 0; j < NUM_COURSES; ++j) {
if (students[i].scores[j] > max_score) {
max_score = students[i].scores[j];
max_student_index = i;
max_course_index = j;
}
}
}
printf("The highest score is %.2f, belongs to student %s (id: %d) in course %d.\n",
max_score, students[max_student_index].name, students[max_student_index].id, max_course_index + 1);
}
```
接着,我们需要编写函数来计算平均分方差。由于我们需要支持不同的数据类型,我们使用函数重载的方法来实现。代码如下:
```c
// 计算平均分方差(int类型)
float calc_variance(int arr[], int size) {
float avg = 0.0;
for (int i = 0; i < size; ++i) {
avg += arr[i];
}
avg /= size;
float variance = 0.0;
for (int i = 0; i < size; ++i) {
variance += (arr[i] - avg) * (arr[i] - avg);
}
variance /= size;
return variance;
}
// 计算平均分方差(float类型)
float calc_variance(float arr[], int size) {
float avg = 0.0;
for (int i = 0; i < size; ++i) {
avg += arr[i];
}
avg /= size;
float variance = 0.0;
for (int i = 0; i < size; ++i) {
variance += (arr[i] - avg) * (arr[i] - avg);
}
variance /= size;
return variance;
}
```
最后,我们使用函数模板的方法来实现排序函数。代码如下:
```c
// 使用函数模板实现排序函数
template <typename T>
void sort(T arr[], int size) {
for (int i = 0; i < size - 1; ++i) {
for (int j = i + 1; j < size; ++j) {
if (arr[i] > arr[j]) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
```
现在我们已经编写了所有需要的函数,接下来我们需要在主函数中调用这些函数,并增加能够按任意一门课程的成绩排序的功能,以及将排序结果写入到文件中的功能,以及自动从文件中读取学生信息的功能。代码如下:
```c
int main() {
student_t students[NUM_STUDENTS];
// 从文件中读取学生信息
FILE* fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("Cannot open file.\n");
return 0;
}
for (int i = 0; i < NUM_STUDENTS; ++i) {
fscanf(fp, "%s %d %f %f %f %f %f", students[i].name, &students[i].id,
&students[i].scores[0], &students[i].scores[1], &students[i].scores[2],
&students[i].scores[3], &students[i].scores[4]);
}
fclose(fp);
// 计算每个学生的平均分和每门课的平均分
calc_avg_score_student(students);
calc_avg_score_course(students);
// 找出最高分对应的学生和课程
find_highest_score(students);
// 计算平均分方差
int arr1[5] = {1, 2, 3, 4, 5};
float arr2[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
printf("Variance of arr1: %.2f\n", calc_variance(arr1, 5));
printf("Variance of arr2: %.2f\n", calc_variance(arr2, 5));
// 按任意一门课程的成绩排序
int course_index = 2; // 按第3门课程的成绩排序
float scores[NUM_STUDENTS];
for (int i = 0; i < NUM_STUDENTS; ++i) {
scores[i] = students[i].scores[course_index];
}
sort(scores, NUM_STUDENTS);
for (int i = 0; i < NUM_STUDENTS; ++i) {
for (int j = 0; j < NUM_STUDENTS; ++j) {
if (students[j].scores[course_index] == scores[i]) {
printf("%s %d %.2f\n", students[j].name, students[j].id, scores[i]);
}
}
}
// 将排序结果写入文件
fp = fopen("sorted_students.txt", "w");
if (fp == NULL) {
printf("Cannot open file.\n");
return 0;
}
for (int i = 0; i < NUM_STUDENTS; ++i) {
fprintf(fp, "%s %d %.2f %.2f %.2f %.2f %.2f\n", students[i].name, students[i].id,
students[i].scores[0], students[i].scores[1], students[i].scores[2],
students[i].scores[3], students[i].scores[4]);
}
fclose(fp);
return 0;
}
```
这样,我们就完成了所有的功能。需要注意的是,为了实现从文件中读取学生信息和写入排序结果到文件中的功能,我们需要按照一定的格式来存储学生信息。在本例中,我们假设学生信息存储在名为"students.txt"的文件中,每行包含一个学生的信息,依次为姓名、学号、5门课的成绩。在将排序结果写入到文件中时,我们将结果存储在名为"sorted_students.txt"的文件中,每行包含一个学生的信息,依次为姓名、学号、5门课的成绩。
阅读全文