多文件模块的学生信息库系统

写这个练习,应该都是学习 《 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;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为实现用户需求,从需求分析阶段的数据流图出发,根据小组讨论后确定的最佳方案。本系统主要包括两大功能模块学生信息和成绩信息两个系统。其中学生信息系统划分为七个模块,学生成绩划分为四个模块。然后在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据结构。在测试过程中,先对单个模块进行测试,然后把模块连接起来进行测试。测试完成后书写文档,最后小组成员和用户在一块审查和复审。 1、 课题陈述 一方面,在时下这个飞速发展的信息社会中,直到今天仍然没有一套完善可行的学生信息管理系统出现在学校里。每年,从大专生、本科生到硕士生、博士生,几千人的入学、升学、毕业,全要由教务处和各系老师人工管理。信息量之巨大,工作量之繁重,是难以想象的。因此,学校和各个系都要安排多名教师专门负责学生学籍管理,浪费了大量的人力资源。然而,即使这样,管理仍然谈不上井井有条。举一个最简单的真实例子,一个同学的姓名在花名册里印错了,就一错错了三年,一直没能改正。同学想去改,却不知道是应该找系里,还是去找教务处。还有,当学生的基本信息,比如家庭住址、电话等变更后,无法及时在档案中修改,使得老师与同学无法联系沟通。 另一方面,从社会这方面讲,随着计算机的普及,越来越多的学校利用计算机来处理日常事务。面对众多的数据资料,很多管理者常常感到无从下手。在数字化的今天,我们需要一个学生管理系统,使我们的整体管理水平上一个档次,与如今这个高科技的信息社会接轨。 因此,如何有效的管理学生信息,帮助学校和老师管理和掌握这些情况,这就是学生信息管理系统需要完成的任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值