前言
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