2021.12.11 学籍管理系统(小部分)

发布于:2023-07-04 ⋅ 阅读:(100) ⋅ 点赞:(0)

写一个学籍管理系统,打印学号,姓名,性别,年龄,成绩,总成绩,平均成绩

分析:① 在写之前要明确,最后的显示信息都有什么,那就看题目都包含了哪些信息,这个题目中有学号,姓名,性别,年龄,成绩(语数外),总成绩,平均成绩这7个变量,因此,首先,我们定义一个结构体struct Student里面包含这7个变量,分别为char id[15]; char name[20]; char sex[10]; int age; double score[3]; double sum; double avg;为了方面后面添加其他课的成绩,可以将double score[ ]中的[ ]里面用宏定义,即#define SIZE 3;

②  其次,定义一个结构体去存放上面这整个信息;

③  初始化,用 Init_Student_Head( )函数;

④  判满,判断给的格子是否够我们要打印的信息,以下用 IsFull( )函数;

⑤  扩容,如果刚开始申请的格子不够,就将其扩为原来的2倍,用Inc( )函数;

⑥  添加学生信息函数Add_Student( );

⑦  写一个打印函数Show( );

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define LINT 100
#define SIZE 3

//定义一个结构体,里面包含学号,姓名,性别,年龄,成绩,总成绩,平均成绩
typedef struct Student
{
	char id[15];
	char name[20];
	char sex[10];
	int age;
	double score[SIZE];
	double sum;
	double avg;
}Student,*PStudent;

//再重新构造一个结构体
typedef struct Student_Head
{
	struct Student* arr;//用来保存malloc保存的堆内内存块地址,用arr来保存struct Student中的所有变量,如id,name,sex等
	int length;    //保存当前有效的长度,也就是使用了多少
	int list_size;  //总共申请的格子数,可以不存满也可以存满
}Student_Head,*PStudent_Head;

//初始化模块
void Init_Student_Head(struct Student_Head* p)
{
	assert(p != NULL);
	if (p == NULL)
	{
		printf("指针为空\n");
		return;
	}
	p->arr = (struct Student*)malloc(LINT * sizeof(struct Student));//用动态内存malloc申请需要保存那些变量的总的格子
	assert(p->arr != NULL);
	p->length = 0;      //当前使用的格子
	p->list_size = LINT;//当前总共的格子
}
//判满
static bool IsFull(PStudent_Head p)
{
	return p->length == p->list_size;   //如果当前使用格子的等于最大的格子,就相当于是满了内存满了
}
//扩容
static void Inc(PStudent_Head p)
{
	p->arr = (struct Student*)realloc(p->arr, p->list_size * sizeof(struct Student) * 2);  //扩容至原来的内存的2倍
	assert(p->arr != NULL);
	//p->length;
	p->list_size *= 2;    
}
//添加学生信息
bool Add_Student(PStudent_Head p)
{
	assert(p != NULL);
	if (p == NULL)
	{
		printf("指针为空\n");
		return false;
	}
	if (IsFull(p))
	{
		Inc(p);            //如果内存已经满了,就扩容
	}
	printf("请输出学号:");
	scanf_s("%s", &p->arr[p->length].id,15);//length在不停的移动
	printf("请输出姓名:");
	scanf_s("%s", &p->arr[p->length].name,20);
	printf("请输出性别:");
	scanf_s("%s", &p->arr[p->length].sex,10);
	printf("请输出年龄:");
	scanf_s("%d", &p->arr[p->length].age);
	printf("请输出语文成绩:");
	scanf_s("%lf", &p->arr[p->length].score[0]);
	printf("请输出数学成绩:");
	scanf_s("%lf", &p->arr[p->length].score[1]);
	printf("请输出英语成绩:");
	scanf_s("%lf", &p->arr[p->length].score[2]);

	p->arr[p->length].sum = p->arr[p->length].score[0] + p->arr[p->length].score[1] + p->arr[p->length].score[2];
	p->arr[p->length].avg = p->arr[p->length].sum / SIZE;

	p->length++;
	return true;
}
//打印函数
void Show(PStudent_Head p)
{
	printf("学号   姓名   性别   年龄   语文成绩   数学成绩   英语成绩   总成绩   平均成绩\n");
	for (int i = 0; i < p->length; i++)
	{
		printf("%3s ", p->arr[i].id);  
		printf("%3s ", p->arr[i].name);
		printf("%3s ", p->arr[i].sex);
		printf("%3d ", p->arr[i].age);
		printf("%3f ", p->arr[i].score[0]);
		printf("%3f ", p->arr[i].score[1]);
		printf("%3f ", p->arr[i].score[2]);
		printf("%3f ", p->arr[i].sum);
		printf("%3f \n", p->arr[i].avg);
	}
}
int main()
{
	struct Student_Head tmp;
	Init_Student_Head(&tmp);
	int n;
	printf("请输入添加人数:");
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个人的成绩\n", i + 1);
		Add_Student(&tmp);
	}
	Show(&tmp);
	
	return 0;
}

结果:

 注意:

(1) 记得动态内存申请后用free( )函数进行释放;

(2) 程序中解引用通过->;

(3) 访问其中的元素通过 p->arr[p->length].() ,( )中是结构体struct Student 中的变量,写的时候就不用( )。