7月17号笔记

笔记:

一、结构体

        1、引入目的

                C语言中存在的数据类型已经不满足我们的需求了,随着业务需求的复杂化,我们需要更加灵活的数据结构来进行处理业务。结构体属于构造数据类型,他是由相同数据类型或者不同数据类型构成的集合。

        2、定义及初始化      

struct 结构体名称
{
      成员类型1  成员变量1;
      成员类型2  成员变量2;
      。。。
      成员类型n  成员变量n;  
};
注意事项:
1、struct是定义结构体类型的关键字,不能省略
2、结构体名称:标识符,符合命名规则,一般建议首字母大写
3、成员属性使用一对花括号包裹起来
4、成员类型可以是基本数据类型,也可以是构造数据类型、指针类型
5、定义结束后,必须加上 分号结尾
6、举个例子
    struct  Stu
    {
        char name[20];         //姓名
        int age;                //年龄
        double score;           //成绩
    };
初始化
//定义一个英雄类型
struct Hero
{
    char name[30];    // 英雄名称
    int blood;        //英雄血量
    char skill[4][20];    //技能
    int kill;            //击杀人头数
    int die;             //死亡数量
    int assiant;         //辅助数量
} h2 = {"德玛西亚之力", 800, {"q", "w", "e", "r"}, 0, 2, 10};           //定义类型时,顺便定义一个变量

//定义类型顺便定义变量
struct
{
    char name[20];      //学生姓名
    int age;              //年龄
    double score;        //成绩
}s1 = {"李华", 18, 65};        //该结构体称为无名结构体




int main(int argc, const char *argv[])
{
    //使用自定义类型,定义一个英雄变量
    struct Stu h1 = {"张三", 20, 99};
 
    struct   Stu s2 = {.age=32, .score=100};     //只给部分成员初始化

    

    return 0;
}

         3、结构体变量的输入输出

                如果是通过指针输出结构体的成员变量则使用  ->

                如果是通过结果体本身输出成员变量则使用 .

        4、结构体数组

                格式: struct 结构体名称  变量名称[常量];

        5、结构体的大小

                结构体变量所占内存空间的大小,是各个成员所占内存空间之和。

                但是要遵循字节对齐原则,分为两次对齐:

                第一次:结构体内对齐,以成员变量的数据类型对齐一次

                第二次:内部成员分配完之后,以这个最大字节的成员变量和计算机位数取最小值进行对齐

二、共用体

        1、引入目的

                多个变量需要共同使用一块内存时,使用共用体

        2、定义及初始化

                union 结构体名称{

                        type 变量1;

                        type 变量n;

                };

                共用体的初始化只需要赋一个值,默认给第一个成员变量。

                共用体的大小是最大的成员变量的大小

三、内存划分

        

作业:

#define _CRT_SECURE_NO_WARNINGS 1
#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;
};
struct Class* create();
void info(int* flag);
void insert(struct Class* class);
void display(struct Class* class);
void lookMaxAndMin(struct Class* class);
void sort(struct Class* class);
struct Class* destroy(struct Class* class);
int main(int argc, const char* argv[])
{
	struct Class* class = NULL;
	int flag = 0;//选择标志
	info(&flag);
	while (1) {
		switch (flag) {
		case 1: insert(class);
			break;
		case 2: display(class);
			break;
		case 3: lookMaxAndMin(class);
			break;
		case 4: sort(class);
			break;
		case 5: class = destroy(class);
			break;
		case 6: class = create();
			break;
		case 0:
			return 0;
		default: printf("输入错误,请重新输入");
		}
		info(&flag);
	}
	return 0;
}

struct Class* create() {
	struct Class* new_class = (struct Class*)malloc(sizeof(struct Class));
	if (new_class == NULL) {
		printf("申请失败");
		return NULL;
	}
	printf("班级创建成功");
	new_class->size = 0;
	return new_class;
}

void info(int* flag) {
	printf("\n**********欢迎光临学生管理系统***********\n");
	printf("学生录入请输入:1\n");
	printf("学生信息展示请输入;2\n");
	printf("查看成绩最高和最低的学生信息请输入:3\n");
	printf("对学生进行排序请输入:4\n");
	printf("销毁班级请输入:5\n");
	printf("创建班级请输入:6\n");
	printf("退出请输入:0\n");
	printf("*****************************************\n");
	scanf("%d", flag);
}

void insert(struct Class* class) {
	printf("请输入要录入的学生个数:\n");
	int n = 0;
	scanf("%d", &n);
	struct Stu temp;
	for (int i = class->size; i<class->size + n; i++) {
		printf("请输入第%d个学生的姓名:", i + 1);
		scanf("%s", temp.name);
		printf("请输入第%d个学生的年龄:", i + 1);
		scanf("%d", &temp.age);
		printf("请输入第%d个学生的成绩:", i + 1);
		scanf("%lf", &temp.score);
		class->student[i] = temp;
		printf("\n");
	}
	class->size += n;
}

void display(struct Class* class) {
	for (int i = 0; i<class->size; i++) {
		printf("姓名:%s,年龄:%d,成绩:%lf\n", class->student[i].name
			, class->student[i].age, class->student[i].score);
	}
}

void lookMaxAndMin(struct Class* class) {
	struct Stu max=class->student[0];
	struct Stu min= class->student[0];
	int maxScore = 0, minScore = 0;
	for (int i = 0; i<class->size; i++) {
		if (class->student[i].score > maxScore) {
			max = class->student[i];
			maxScore = class->student[i].score;
		}

		if (class->student[i].score < minScore) {
			min = class->student[i];
			minScore = class->student[i].score;
		}
	}
	printf("成绩最高的学生姓名:%s,年龄:%d,成绩:%lf\n"
		, max.name, max.age, max.score);
	printf("成绩最差的学生姓名:%s,年龄:%d,成绩:%lf\n"
		, min.name, min.age, min.score);
}

void sort(struct Class* class) {
	int length = class->size;
	struct Stu temp= class->student[0];
	for (int i = 0; i < length - 1; i++) {
		for (int j = 0; j < length - (i + 1); j++) {
			if (class->student[j].score<class->student[j + 1].score) {
				temp = class->student[j + 1];
				class->student[j + 1] = class->student[j];
				class->student[j] = temp;
			}
		}
	}
}

struct Class* destroy(struct Class* class) {
	free(class);
	if (class != NULL) {
		printf("销毁失败");
		return class;
	}
	else {
		printf("班级销毁失败");
		return NULL;
	}
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值