笔记:
一、结构体
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;
}
}
运行结果: