用C语言编程,输入10个学生5门课的成绩,分别用函数计算每个学生的平均分,每门课的平均分,找出最高分对应的学生和课程,计算平均分方差。然后用函数重载的方法,让计算方差的函数支持不同的数据类型;然后用函数模板的方法,实现排序函数,并进行调用。在此基础上,增加以下功能:能够按任意一门课程的成绩,对学生信息进行排序;能够将排序的结果写入到文件(students.txt)中;程序启动时,能够自动从文件(students.txt)中读取学生信息)
时间: 2024-02-18 12:05:53 浏览: 15
好的,这是一个比较复杂的问题,我会尝试为您提供一个大致的解决思路,希望能对您有所帮助。
首先,我们需要定义一个结构体用于存储学生成绩信息:
```c
typedef struct {
char name[20]; // 学生姓名
float score[5]; // 学生成绩数组
float avg; // 学生平均分
} Student;
```
接下来,我们可以定义一些函数来实现不同的功能:
1. 输入学生成绩信息的函数:
```c
void input(Student stu[], int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", stu[i].name);
printf("请输入第%d个学生的5门课的成绩:", i + 1);
for (int j = 0; j < 5; j++) {
scanf("%f", &stu[i].score[j]);
}
}
}
```
2. 计算每个学生的平均分和每门课的平均分的函数:
```c
void calcAvg(Student stu[], int n, float *courseAvg) {
for (int i = 0; i < 5; i++) {
float sum = 0;
for (int j = 0; j < n; j++) {
sum += stu[j].score[i];
stu[j].avg = sum / n;
}
courseAvg[i] = sum / n;
}
}
```
3. 找出最高分对应的学生和课程的函数:
```c
void findMax(Student stu[], int n, float *courseAvg) {
float maxScore = -1;
int maxStu = -1, maxCourse = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
if (stu[i].score[j] > maxScore) {
maxScore = stu[i].score[j];
maxStu = i;
maxCourse = j;
}
}
}
printf("最高分为%.2f,对应的学生为%s,对应的课程为第%d门课。\n", maxScore, stu[maxStu].name, maxCourse + 1);
}
```
4. 计算平均分方差的函数:
```c
float calcVariance(float data[], int n) {
float sum = 0, avg;
for (int i = 0; i < n; i++) {
sum += data[i];
}
avg = sum / n;
sum = 0;
for (int i = 0; i < n; i++) {
sum += (data[i] - avg) * (data[i] - avg);
}
return sum / n;
}
```
5. 函数重载的方式,实现计算方差的函数支持不同的数据类型:
```c
float calcVariance_float(float data[], int n) {
return calcVariance(data, n);
}
double calcVariance_double(double data[], int n) {
float temp[n];
for (int i = 0; i < n; i++) {
temp[i] = (float)data[i];
}
return calcVariance(temp, n);
}
```
6. 函数模板的方式,实现排序函数:
```c
template <typename T>
void sort(T data[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (data[i] > data[j]) {
T temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
```
7. 按任意一门课程的成绩,对学生信息进行排序的函数:
```c
void sortCourse(Student stu[], int n, int course) {
float data[n];
for (int i = 0; i < n; i++) {
data[i] = stu[i].score[course];
}
sort(data, n);
Student temp[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (stu[j].score[course] == data[i]) {
temp[i] = stu[j];
break;
}
}
}
for (int i = 0; i < n; i++) {
stu[i] = temp[i];
}
}
```
8. 将排序的结果写入到文件(students.txt)中的函数:
```c
void writeToFile(Student stu[], int n) {
FILE *fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
for (int i = 0; i < n; i++) {
fprintf(fp, "%s\n", stu[i].name);
for (int j = 0; j < 5; j++) {
fprintf(fp, "%.2f ", stu[i].score[j]);
}
fprintf(fp, "\n");
}
fclose(fp);
}
```
9. 程序启动时,能够自动从文件(students.txt)中读取学生信息的函数:
```c
void readFromFile(Student stu[], int *n) {
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
*n = 0;
while (!feof(fp)) {
fscanf(fp, "%s", stu[*n].name);
for (int i = 0; i < 5; i++) {
fscanf(fp, "%f", &stu[*n].score[i]);
}
(*n)++;
}
fclose(fp);
(*n)--;
}
```
最后,我们可以在主函数中调用这些函数来完成所有的功能:
```c
int main() {
int n = 10;
Student stu[n];
float courseAvg[5];
input(stu, n);
calcAvg(stu, n, courseAvg);
for (int i = 0; i < 5; i++) {
printf("第%d门课的平均分为%.2f。\n", i + 1, courseAvg[i]);
}
findMax(stu, n, courseAvg);
printf("平均分方差为%.2f。\n", calcVariance_float(courseAvg, 5));
sort(stu, n);
for (int i = 0; i < n; i++) {
printf("%s:", stu[i].name);
for (int j = 0; j < 5; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("平均分为%.2f。\n", stu[i].avg);
}
sortCourse(stu, n, 2);
for (int i = 0; i < n; i++) {
printf("%s:", stu[i].name);
for (int j = 0; j < 5; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("平均分为%.2f。\n", stu[i].avg);
}
writeToFile(stu, n);
readFromFile(stu, &n);
for (int i = 0; i < n; i++) {
printf("%s:", stu[i].name);
for (int j = 0; j < 5; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("平均分为%.2f。\n", stu[i].avg);
}
return 0;
}
```
希望这个解决思路能够对您有所帮助。