为了完成这个任务,我们将创建三个文件:一个头文件(`student.h`)用于声明结构体和函数原型,一个源文件(`main.c`)用于定义结构体数组并调用函数,以及另外两个源文件(`sort_scores.c` 和 `display_failing.c`)分别用于实现成绩排序和显示不及格学生信息的函数。
首先是头文件 `student.h`:
```c
#ifndef STUDENT_H
#define STUDENT_H
#define STUDENT_COUNT 5
#define PASSING_SCORE 60
typedef struct {
int id;
char name[50];
int score;
} Student;
void sortScores(Student students[], int count);
void displayFailingStudents(const Student students[], int count);
#endif // STUDENT_H
```
接下来是 `main.c` 文件,它包含 `main` 函数,用于定义结构体数组并调用其他文件中的函数:
```c
#include
#include "student.h"
int main() {
Student s[STUDENT_COUNT] = {
{1, "Alice", 85},
{2, "Bob", 55},
{3, "Charlie", 95},
{4, "David", 45},
{5, "Eve", 75}
};
sortScores(s, STUDENT_COUNT);
printf("Sorted student scores:\n");
for (int i = 0; i < STUDENT_COUNT; ++i) {
printf("%d, %s, %d\n", s[i].id, s[i].name, s[i].score);
}
printf("\nFailing students:\n");
displayFailingStudents(s, STUDENT_COUNT);
return 0;
}
```
现在是 `sort_scores.c` 文件,它包含实现成绩排序的函数:
```c
#include "student.h"
void sortScores(Student students[], int count) {
for (int i = 0; i < count - 1; ++i) {
for (int j = 0; j < count - i - 1; ++j) {
if (students[j].score > students[j + 1].score) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
```
最后是 `display_failing.c` 文件,它包含实现显示不及格学生信息的函数:
```c
#include
#include "student.h"
void displayFailingStudents(const Student students[], int count) {
for (int i = 0; i < count; ++i) {
if (students[i].score < PASSING_SCORE) {
printf("%d, %s, %d\n", students[i].id, students[i].name, students[i].score);
}
}
}
```
在编译时,你需要同时编译 `main.c`, `sort_scores.c`, 和 `display_failing.c` 文件。以下是一个可能的编译命令:
```sh
gcc -o student_program main.c sort_scores.c display_failing.c
```
这将生成一个可执行文件 `student_program`,你可以运行它来看到排序后的学生信息和不及格的学生信息。