写一个学籍管理系统,打印学号,姓名,性别,年龄,成绩,总成绩,平均成绩
分析:① 在写之前要明确,最后的显示信息都有什么,那就看题目都包含了哪些信息,这个题目中有学号,姓名,性别,年龄,成绩(语数外),总成绩,平均成绩这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 中的变量,写的时候就不用( )。