C3.s:/^0eSZ#$ydLA^3.s:/^0eSZ#$ydLA^

```

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NUM_STUDENTS 4
#define NUM_COURSES 5

// 存储学生信息的结构体
struct student {
int id;
float grades[NUM_COURSES];
float average;
};

// 存储课程信息的结构体
struct course {
char name[20];
float average;
};

int main() {
// 定义变量
struct student students[NUM_STUDENTS];
struct course courses[NUM_COURSES];
int i, j;
float sum;

// 输入课程信息
for (i = 0; i < NUM_COURSES; i++) {
scanf("%s", courses[i].name);
}

// 输入学生信息并计算平均成绩
for (i = 0; i < NUM_STUDENTS; i++) {
scanf("%d", &students[i].id);
sum = 0;
for (j = 0; j < NUM_COURSES; j++) {
scanf("%f", &students[i].grades[j]);
sum += students[i].grades[j];
}
students[i].average = sum / NUM_COURSES;
}

// 计算每门课程的平均分
for (i = 0; i < NUM_COURSES; i++) {
sum = 0;
for (j = 0; j < NUM_STUDENTS; j++) {
sum += students[j].grades[i];
}
courses[i].average = sum / NUM_STUDENTS;
}

// 输出第一门课程的名称和平均分
printf("%s %.2f\n", courses[0].name, courses[0].average);
}
void findFailingStudents(struct student students[], int numStudents, int numCourses) {
int i, j;
int failingCount;

for (i = 0; i < numStudents; i++) {
failingCount = 0;
for (j = 0; j < numCourses; j++) {
if (students[i].grades[j] < 60) {
failingCount++;
}
}
if (failingCount >= 2) {
// 输出学生的学号和全部课程成绩
printf("%d ", students[i].id);
for (j = 0; j < numCourses; j++) {
printf("%.2f ", students[i].grades[j]);
}
printf("%.2f\n", students[i].average);
}
}
}

// 找出平均成绩在90分以上或全部课程成绩在85分以上的学生,并输出他们的学号和全部课程成绩及平均成绩
void findHighAchievingStudents(struct student students[], int numStudents, int numCourses) {
int i, j;
int highAchieving;

for (i = 0; i < numStudents; i++) {
highAchieving = 0;
if (students[i].average >= 90) {
highAchieving = 1;
}
else {
for (j = 0; j < numCourses; j++) {
if (students[i].grades[j] >= 85) {
highAchieving = 1;
break;
}
}
}
if (highAchieving) {
// 输出学生的学号和全部课程成绩
printf("%d ", students[i].id);
for (j = 0; j < numCourses; j++) {
printf("%.2f ", students[i].grades[j]);
}
// 输出学生的平均成绩
printf("%.2f\n", students[i].average);
}
}
}

```为什么只能输出第1个结果?

因为求平均分两门以上不及格的学生信息的函数findFailingStudents()和求平均分90分以上或全部成绩85分以上的函数findHighAchievingStudents()函数没有调用,然后findHighAchievingStudents()函数求全部成绩在85分以上那里的逻辑需要修改下,修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NUM_STUDENTS 4
#define NUM_COURSES 5

// 存储学生信息的结构体
struct student {
    int id;
    float grades[NUM_COURSES];
    float average;
};

// 存储课程信息的结构体
struct course {
    char name[20];
    float average;
};

void findFailingStudents(struct student students[], int numStudents, int numCourses);
void findHighAchievingStudents(struct student students[], int numStudents, int numCourses);


int main() {
    // 定义变量
    struct student students[NUM_STUDENTS];
    struct course courses[NUM_COURSES];
    int i, j;
    float sum;
    
    // 输入课程信息
    for (i = 0; i < NUM_COURSES; i++) {
        scanf("%s", courses[i].name);
    }
    
    // 输入学生信息并计算平均成绩
    for (i = 0; i < NUM_STUDENTS; i++) {
        scanf("%d", &students[i].id);
        sum = 0;
        for (j = 0; j < NUM_COURSES; j++) {
            scanf("%f", &students[i].grades[j]);
            sum += students[i].grades[j];
        }
        students[i].average = sum / NUM_COURSES;
    }
    
    // 计算每门课程的平均分
    for (i = 0; i < NUM_COURSES; i++) {
        sum = 0;
        for (j = 0; j < NUM_STUDENTS; j++) {
            sum += students[j].grades[i];
        }
        courses[i].average = sum / NUM_STUDENTS;
        }
    
    // 输出第一门课程的名称和平均分
    printf("%s %.2f\n", courses[0].name, courses[0].average);
    findFailingStudents(students,NUM_STUDENTS,NUM_COURSES) ;
    findHighAchievingStudents(students,NUM_STUDENTS,NUM_COURSES);
}
void findFailingStudents(struct student students[], int numStudents, int numCourses) {
    int i, j;
    int failingCount;
    
    printf("\n");
    for (i = 0; i < numStudents; i++) {
        failingCount = 0;
        for (j = 0; j < numCourses; j++) {
            if (students[i].grades[j] < 60) {
                failingCount++;
            }
        }
        if (failingCount >= 2) {
            
            // 输出学生的学号和全部课程成绩
            printf("%d ", students[i].id);
            for (j = 0; j < numCourses; j++) {
                printf("%.2f ", students[i].grades[j]);
            }
            printf("%.2f\n", students[i].average);
        }
    }
}

// 找出平均成绩在90分以上或全部课程成绩在85分以上的学生,并输出他们的学号和全部课程成绩及平均成绩
void findHighAchievingStudents(struct student students[], int numStudents, int numCourses) {
    int i, j;
    int highAchieving;
    int num; //每个学生85以上课程的个数 
    
    printf("\n"); 
    for (i = 0; i < numStudents; i++) {
        highAchieving = 0;
        num=0;  
        if (students[i].average >= 90) {
            highAchieving = 1;
        }
        else {
            for (j = 0; j < numCourses; j++) {
                if (students[i].grades[j] >= 85) {
//                    highAchieving = 1;
//                    break;
                    num++; 
                }
            }
        }
        if (highAchieving||num==5) { //打印5门功课都是85分以上或平均分90分以上的学生信息 
            
            
            // 输出学生的学号和全部课程成绩
            printf("%d ", students[i].id);
            for (j = 0; j < numCourses; j++) {
                printf("%.2f ", students[i].grades[j]);
            }
            // 输出学生的平均成绩
            printf("%.2f\n", students[i].average);
        }
    }
}

img

详细过程如下,望采纳

  • 首先,我们需要定义一个学生结构体,包括学号、各种课程成绩和平均成绩,以及一个用于计算平均成绩的函数。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NUM_COURSES 5
#define NUM_STUDENTS 4

// 定义学生结构体
typedef struct {
  int id;
  int grades[NUM_COURSES];
  double average;
} student;

// 计算学生的平均成绩
double calculateAverage(student s) {
  int sum = 0;
  for (int i = 0; i < NUM_COURSES; i++) {
    sum += s.grades[i];
  }
  return (double)sum / NUM_COURSES;
}
  • 然后,我们可以使用 scanf 函数读取输入数据,并将其存储在一个学生数组中。
int main() {
  char courses[NUM_COURSES][20]; // 存储课程名称
  student students[NUM_STUDENTS]; // 存储学生信息

  // 读取课程名称
  for (int i = 0; i < NUM_COURSES; i++) {
    scanf("%s", courses[i]);
  }

  // 读取学生信息
  for (int i = 0; i < NUM_STUDENTS; i++) {
    scanf("%d", &students[i].id);
    for (int j = 0; j < NUM_COURSES; j++) {
      scanf("%d", &students[i].grades[j]);
    }
    students[i].average = calculateAverage(students[i]);
  }
  ...
}
  • 接着我们编写函数来解决上述问题。
  • 这是计算第一门课程的平均分的函数,它接受学生数组作为参数,并返回第一门课程的平均分。
double calculateCourseAverage(student students[]) {
  int sum = 0;
  for (int i = 0; i < NUM_STUDENTS; i++) {
    sum += students[i].grades[0];
  }
  return (double)sum / NUM_STUDENTS;
}
  • 我们可以在 main 函数中调用该函数并输出结果:
int main() {
  ...

  // 输出第一门课程的平均分
  printf("%s Average: %.2lf\n", courses[0], calculateCourseAverage(students));

  ...
}
  • 有两门以上课程不及格的学生:
  • 为了找出有两门以上课程不及格的学生,我们需要定义一个函数,用于遍历学生数组并计算每个学生不及格的课程数。如果不及格的课程数大于等于 2,则该学生符合条件,应输出学号、全部课程成绩和平均成绩。
void printFailingStudents(student students[]) {
  for (int i = 0; i < NUM_STUDENTS; i++) {
    int numFailing = 0;
    for (int j = 0; j < NUM_COURSES; j++) {
      if (students[i].grades[j] < 60) {
        numFailing++;
      }
    }
    if (numFailing >= 2) {
      printf("ID: %d\n", students[i].id);
      for (int j = 0; j < NUM_COURSES; j++) {
        printf("%d ", students[i].grades[j]);
      }
      printf("\nAverage: %.2lf\n", students[i].average);
    }
  }
}
  • 整个main函数如下
int main() {
  char courses[NUM_COURSES][20]; // 存储课程名称
  student students[NUM_STUDENTS]; // 存储学生信息

  // 读取课程名称
  for (int i = 0; i < NUM_COURSES; i++) {
    scanf("%s", courses[i]);
  }

  // 读取学生信息
  for (int i = 0; i < NUM_STUDENTS; i++) {
    scanf("%d", &students[i].id);
    for (int j = 0; j < NUM_COURSES; j++) {
      scanf("%d", &students[i].grades[j]);
    }
    students[i].average = calculateAverage(students[i]);
  }

  // 输出第一门课程的平均分
  printf("%s Average: %.2lf\n", courses[0], calculateCourseAverage(students));

  // 输出有两门以上课程不及格的学生
  printFailingStudents(students);

  // 输出平均成绩在 90 分以上或全部课程成绩在 85 分以上的学生
  printHighPerformingStudents(students);

  return 0;
}