C语言真好玩Day15 20240717

一、动态内存分配和回收与分文件联合编译相关练习

完成学生信息管理系统

要求:定义一个班级,包括多个学生,以及记录实际学生的个数

1> 完成班级的创建,创建时,需要传递班级实际人数

2> 完成班级学生的信息录入工作

3> 完成将班级学生按成绩进行降序排序工作

4> 输出班级中成绩最好和最差学生的信息

5> 完成信息的输出工作

6> 完成班级的销毁工作

要求:班级创建在堆区,尽量分文件编译完成

1.头文件

//homework.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

//定义学生类型
struct Stu
{
	char name[20];
	int age;
	double score;
};
//定义班级类型
struct Class
{
	struct Stu student[MAX];		//存放学生的容器
	int size;						//班级实际人数
};

//声明菜单函数
int menu();
//声明班级创建函数
struct Class *classCreate();
//声明学生信息录入函数函数
void studentInsert(struct Class *c);
//声明学生成绩降序排序函数函数
void scoreSort(struct Class *c);
//声明输出成绩最值学生信息函数
void scoreMaxMin(struct Class *c);
//声明学生信息输出函数
void printStudent(struct Class *c);
//声明班级销毁函数
void classDestroy(struct Class *c);

2.函数文件

//homemork_fun.c

#include "homework.h"

//菜单函数
int menu()
{
	int menu = 0;
	printf("\t\t\t\t========欢迎使用学生信息管理系统========\n");
	printf("\t\t\t\t========================================\n");
	printf("\t\t\t\t========1.班级创建              ========\n");
	printf("\t\t\t\t========2.学生信息录入          ========\n");
	printf("\t\t\t\t========3.学生信息排序          ========\n");
	printf("\t\t\t\t========4.学生成绩最值          ========\n");
	printf("\t\t\t\t========5.学生信息输出          ========\n");
	printf("\t\t\t\t========6.班级销毁              ========\n");
	printf("\t\t\t\t========0.退出                  ========\n");
	printf("\t\t\t\t========================================\n");
	printf("\t\t\t\t========请输入您要使用的功能>>>>");
	scanf("%d", &menu);
	getchar();
	printf("\n\n");
	return menu;
}
//班级创建函数
struct Class *classCreate()
{
	printf("\t\t\t\t================班级创建================\n");
	printf("\t\t\t\t========================================\n");
	//创建班级并通过malloc()给班级分配内存空间
	struct Class *c = (struct Class *)malloc(sizeof(struct Class));
	//班级初始化
	memset(c, 0, sizeof(struct Class));
	printf("\t\t\t\t请输入您所创建班级的人数:");
	//输入班级具体人数
	scanf("%d", &c->size);
	if(c == NULL)
	{
		printf("\t\t\t\t班级创建失败\n");
		return NULL;
	}
	printf("\t\t\t\t班级创建成功\n\n");
	return c;
}
//学生信息录入函数
void studentInsert(struct Class *c)
{	
	printf("\t\t\t\t==============学生信息录入==============\n");
	printf("\t\t\t\t========================================\n");
	//遍历输入学生信息
	for(int i=0; i<c->size; i++)
	{
		printf("\t\t\t\t请输入第%d个学生姓名:", i+1);
		scanf("%s", c->student[i].name);
		getchar();
		printf("\t\t\t\t请输入第%d个学生年龄:", i+1);
		scanf("%d", &c->student[i].age);
		getchar();
		printf("\t\t\t\t请输入第%d个学生成绩:", i+1);
		scanf("%lf", &c->student[i].score);
		getchar();
	}
	printf("\t\t\t\t学生信息录入成功\n\n");
}
//学生成绩排序函数
void scoreSort(struct Class *c)
{
	//定义学生信息交换中间变量
	struct Stu temp = c->student[0];
	//冒泡排序
	for(int i=0; i<c->size; i++)
	{
		for(int j=0; j<c->size-i; j++)
		{
			if(c->student[j].score < c->student[j+1].score)
			{
				temp = c->student[j];
				c->student[j] = c->student[j+1];
				c->student[j+1] = temp;
			}
		}
	}
	printf("\t\t\t\t学生成绩(降序)排序成功\n\n");
}
//学生成绩最值函数
void scoreMaxMin(struct Class *c)
{
	//定义成绩最值学生信息结构体变量
	struct Stu max = c->student[0];
	struct Stu min = c->student[0];
	//遍历学生成绩,寻找最大值和最小值
	for(int i=1; i<c->size; i++)
	{
		if(max.score < c->student[i].score)
		{
			max = c->student[i];
		}
		if(min.score > c->student[i].score)
		{
			min = c->student[i];
		}
	}
	//输出成绩最值学生信息
	printf("\t\t\t\t=========成绩最好和最差学生信息=========\n");
	printf("\t\t\t\t========================================\n");
	printf("\t\t\t\t姓名==========年龄==========成绩========\n");
	printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n", max.name, max.age, max.score);
	printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n\n", min.name, min.age, min.score);
	printf("\t\t\t\t成绩最好和最差学生信息输出完成\n\n");
}
//学生信息输出函数
void printStudent(struct Class *c)
{
	printf("\t\t\t\t================学生信息================\n");
	printf("\t\t\t\t========================================\n");
	printf("\t\t\t\t姓名==========年龄==========成绩========\n");
	//遍历输出学生信息
	for(int i=0; i<c->size; i++)
	{
		printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n", \
				c->student[i].name, c->student[i].age, c->student[i].score);
	}
	printf("\n\n");
}
//班级销毁函数
void classDestroy(struct Class *c)
{
	//释放内存空间
	if(c!=NULL)
	{
		free(c);
		printf("\t\t\t\t班级销毁成功\n\n");
		return ;
	}
	printf("\t\t\t\t班级销毁失败\n\n");
}

3.主函数

#include "homework.h"

int main(int argc, const char *argv[])
{	
	//定义并初始化菜单选项
	int m = 1;
    //定义并初始化班级结构体指针变量
	struct Class *Cla = NULL;
	while(m)
	{
		m = menu();
		switch(m)
		{
			case 1:
				{
					//创建班级
					Cla = classCreate();
					printf("\t\t\t\t当前班级人数为:%d\n\n", Cla->size);
					break;
				}
			case 2:
				{
					//学生信息录入
					studentInsert(Cla);
					break;
				}
			case 3:
				{
					//学生成绩降序排序
					scoreSort(Cla);
					break;
				}
			case 4:
				{
					//输出班级中最好和最差学生信息
					scoreMaxMin(Cla);
					break;
				}
			case 5:
				{
					//学生信息输出
					printStudent(Cla);
					break;
				}
			case 6:
				{
					classDestroy(Cla);
					Cla = NULL;
					break;
				}
			case 0:
				{	
					printf("\n\n\t\t\t\t欢迎下次使用\n\n");
					break;
				}
			default:
				{
					printf("\t\t\t\t选项输入错误,请重新输入\n\n");
					break;
				}
		}
	}
	return 0;
}

4.ubuntu终端环境下程序运行截图

二、共用体相关知识思维导图

三、类型重定义相关知识思维导图

四、内存划分相关知识思维导图

五、动态内存分配和回收相关知识思维导图

六、预指令处理相关知识思维导图

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值