简易学生成绩管理系统(Linux_C实现)

前言
Linux_C程序设计课程的最后部分。
感谢我C语言相关课程的老师们,
同时推荐一本Linux_C的书:《Linux C编程一站式学习》

项目分析及设计

本项目完成一个简易的学生成绩计算功能:

从键盘输入 N 个学生的姓名、年龄、数学成绩和语文成绩四项信息;

输入完 N 个学生的信息后,计算各个学生的总成绩和平均成绩;

计算后将每个学生的信息存入二进制文件 chengji 中;

最后,在显示屏上输出每个学生的信息。

要求输入、计算、输出三个过程分别使用独立函数实现,三个函数分别定义在三个不同的源文件中。

程序结构设计

项目要求输入、计算、输出过程分别使用独立函数实现,并保存在三个不同的源文件中,因此此程序至少应包括 main 在内共 4 个函数,并分别保存在 4 个不同的源文件中。

不论是输入、计算还是输出,都要针对 N 个学生进行相同的操作。所以必须使用循环结构,循环次数由 N 决定。

通过以上分析,定义以下四个源文件:stuscore.c , in.c , cal.c , out.c , 1个头文件 stuscore.h , 1个 makefile 文件。其中 stuscore.c 保存 main 函数,in.c 保存 input 函数,cal.c 保存 caculate 函数,out.c 保存 output 函数,stuscore.h 保存 student 结构体定义,makefile 是编译本项目的脚本文件。

由于项目要求对于 N 个学生信息的输入、计算、输出过程都是分别进行的,所以这 N 个学生信息最好使用数组形式进行保存以方便引用,数组元素个数为 N ,数组类型为结构体(因为数组的每个元素都是一个学生的多项信息)。

本项目中涉及的数据由姓名、年龄、数学成绩、语文成绩、总成绩、平均成绩。各个数据的类型可以考虑如下:姓名应是字符串,所以要定义成字符数组(因为 C 语言中使用使用字符数组保存字符串),年龄一般为整数,定义为 int ,各种成绩由于可能出现小数点形式的数据,因此都定义为 float 。

学生的个数为 N ,N 的值可以作宏去定义。
在这里插入图片描述

源代码

stuscore.h

#ifndef _STUSORE_H
#define _STUSCORE_H
struct student //学生信息结构体
{
	char name[32];
	int age;
	float math;
	float ch;
	float sum;
	float ave;
};
#endif

stuscore.c

#include "stuscore.h"
#define N 3
struct student data[N];
void input(struct student *d,int n);
void calculate(struct student *d,int n);
void output(struct student *d,int n);
int main()
{
	input(data,N);
	calculate(data,N);
	output(data,N);
}

out.c

#include<stdio.h>
#include "stuscore.h"
void output(struct student *d,int n)
{
	int i;
	FILE *fp;
	fp=fopen("chengji","rb");
	printf("name	age	ch	math	sum	ave\n");
	for(i=0;i<n;i++)
	{
		fread(&d[i],sizeof(struct student),1,fp);
		printf("%s	%d	%.2f	%.2f	%.2f	%.2f\n",d[i].name,d[i].age,d[i].ch,d[i].math,d[i].sum,d[i].ave);
	}
	fclose(fp);
}

in.c

#include<stdio.h>
#include "stusore.h"
void input(struct student *d,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("please input %d student-name:",i+1);
		scanf("%s",&(d[i].name));
		printf("please input %d student-age:",i+1);
		scanf("%d",&(d[i].age));
		printf("please input %d student-ch:",i+1);
		scanf("%f",&(d[i].ch));
		printf("please input %d student-math:",i+1);
		scanf("%f",&(d[i].math));
	}
}

cal.c

#include "stusore.h"
#include "stdio.h"
void calculate(struct student *d,int n)
{
	int i;
	FILE *fp;
	fp=fopen("chengji","wb");
	for(int i=0;i<n;i++)
	{
		d[i].sum=d[i].ch+d[i].math;
		d[i].ave=d[i].sum/2.0;
		fwrite(&d[i],sizeof(struct student),1,fp);
	}
	fclose(fp);
}

makefile

stuscore:stuscore.o in.o cal.o out.o
	gcc -o stuscore stuscore.o in.o cal.o out.o
.PHONY:clean
clean:
	rm -f stuscore stuscore.o in.o cal.o out.o

ends

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值