写这个练习,应该都是学习 《 C语言程序设计》(第4版),何钦铭,颜辉主编,所以话不多说。
写这个程序,所有代码都放在一个单文件里,没有错。但是拆分多个文件,就是大量报错。
请教许多人后,解决了问题。
感谢帮助的所有人,特别感谢昵称为“阿尼亚”的群友。
说明:对于 search_student() 函数,我没有按书上,使用void类型,而是根据自己的需要改成了int类型,以便于在 modify() 函数中可以调用。所有的函数功能,写法都是参照书中例9-1,例9-2和例9-3。
使用的编译器:小熊猫C++ 2.5
官网:https://royqh1979.gitee.io/redpandacpp/
student.h
//①②③添加防御性宏,避免头文件重复引用出错
#ifndef ALL_H //①
#define ALL_H //②
#include <stdio.h>
#include <string.h>
#define MaxSize 50
struct student { /*学生信息结构定义*/
int num; /*学号*/
char name[10]; /*姓名*/
int math, english, computer; /*3门课程成绩*/
double average; /*个人平均成绩*/
};
void new_student(struct student students[]); /*输入学生信息函数*/
void output_student(struct student students[]); /*输出学生信息函数*/
void average(struct student students[]); /*计算每个学生的平均成绩*/
void modify(struct student *p); /*修改指定的学生成绩*/
void sort(struct student students[]); /*按平均成绩由高到低排序*/
int search_student(struct student students[], int number); /*查找指定学生*/
int Count = 0; /*全局变量,记录当前学生总数*/
#endif //③
main.c
#include "student.h"
#include "input_output.c" /*用文件包含连接各程序文件模块*/
#include "computing.c"
#include "update.c"
#include "search.c"
int main(void) {
struct student students[MaxSize]; /*定义学生信息结构数组*/
new_student(students); /*输入学生信息结构数组*/
output_student(students); /*显示输入的学生信息结构数组*/
average(students); /*计算每一个学生的平均成绩*/
sort(students); /*按学生的平均成绩排序*/
output_student(students); /*显示排序后的结构数组*/
modify(students); /*修改指定输入的学生信息*/
output_student(students); /*显示修改后的结构数组*/
return 0;
}
input_output.c
#include "student.h"
extern int Count; /*全局变量,记录当前学生总数*/
void new_student(struct student students[]) { /*输入学生信息函数*/
int i, n;
printf("Input n:");
scanf("%d", &n);
Count = n;
printf("Input the student's number, name and math, english and computer scores\n");
for (i = 0; i < n; i++) {
printf("No.%d:", i + 1);
scanf("%d %s %d %d %d", &students[i].num, students[i].name, &students[i].math, \
&students[i].english, &students[i].computer);
}
}
void output_student(struct student students[]) { /*输出学生信息函数*/
int i;
for (i = 0; i < Count; i++) {
printf("num:%8d, name:%12s, math:%4d, english:%4d, computer:%4d, average:%6.2lf\n", \
students[i].num, students[i].name, students[i].math, students[i].english, \
students[i].computer, students[i].average);
}
}
computing.c
#include "student.h"
extern int Count; /*全局变量,记录当前学生总数*/
void average(struct student students[]) { /*计算每个学生的平均成绩*/
int i;
for (i = 0; i < Count; i++) {
students[i].average = (double)(students[i].computer + \
students[i].math + students[i].english) / 3.0;
}
}
update.c
#include "student.h"
extern int Count; /*全局变量,记录当前学生总数*/
void modify(struct student *p) { /*修改指定的学生成绩*/
int num, course, score, i, pos;
printf("Input the number of the students to be updated:");
scanf("%d", &num);
printf("Choice the course: 1.math 2.english 3.computer:");
scanf("%d", &course);
printf("Input the new score:");
scanf("%d", &score);
pos = search_student(p, num);
if (pos) {
for (i = 0; i < Count; i++, p++) {
if (p->num == num) {
break;
}
}
switch (course) {
case 1:
p->math = score;
break;
case 2:
p->english = score;
break;
case 3:
p->computer = score;
break;
}
}
}
void sort(struct student students[]) { /*选择排序法,按平均成绩由高到低排序*/
int i, j, index;
struct student temp;
for (i = 0; i < Count; i++) {
index = i;
for (j = i + 1; j < Count; j++) {
if (students[index].average < students[j].average) {
index = j;
}
}
temp = students[index];
students[index] = students[i];
students[i] = temp;
}
}
search.c
#include "student.h"
extern int Count; /*全局变量,记录当前学生总数*/
int search_student(struct student students[], int number) { /*查找指定学生*/
int i, pos = 0;
for (i = 0; i < Count; i++) {
if (students[i].num == number) {
pos = 1;
break;
}
}
if (!pos) {
printf("Not found!\n");
}
return pos;
}