学习内容:
9、结构体和共用体
学习时间:
2020年12月07日17:30-18:30学习产出:
/*
结构体和共用体
结构体类型和结构体变量
结构体类型定义
struct 结构体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
.....
}
结构体变量的定义
先定义结构体类型,再定义结构体变量
struct 结构体类型名 结构体变量名
在定义结构体类型的同时定义结构体变量
struct 结构体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
....
}
直接定义结构体变量
struct
{
数据类型 成员名1;
数据类型 成员名2;
....
}结构变量名列表;
结构体变量的内存分配
结构体变量占据的内存大小是按照字节对齐的机制来分配的
对齐满足两个原则
结构体的每个成员变量相对于结构体首地址的偏移量,是该成员变量的基本数据类型(不包括结构体、数组等)大小的整数倍,如果不够,编译器会在成员之间加上填充字节
结构体变量的总大小为结构体最宽基本类型成员大小的整数倍,如果不够,编译器会在最末一个成员之后加上填充字节
结构体变量的初始化
在定义结构体类型和结构体变量的同时,对结构体变量初始化
定义好结构体类型后,对结构体变量初始化
结构体变量的引用
结构体变量名.成员名;
结构体数组
结构体数组的定义
先定义结构体类型,后定义结构体数组
在定义结构体类型的同时定义结构体数组
直接定义结构体数组
结构体数组的初始化
先定义结构体数组类型,然后初始化结构体数组
在定义结构体数组的同时,对结构体数组初始化
结构体数组的引用
数据元素名称.成员名;
结构体指针变量
结构体指针变量概述
结构体数组指针
结构体类型数据在函数间的传递
结构体变量作为函数参数
结构体数组作为函数参数
结构体指针作为函数参数
union共用体
共用体数据类型的定义
union 共用体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
....
}
共用体变量的定义
先定义共用体类型,再定义共同体变量
再定义共用体类型的同时定义共用体变量
直接定义共用体类型变量
共用体变量的初始化和引用
union 共用体类型名 共用体变量={其中一个成员的类型值}
typedef-给数据类型取名
typedef 数据类型 别名;
为基本类型取别名
为数组类型取别名
为结构体取别名
*/
/*
1、如果你在学校超市买了香皂、水笔、毛巾,请定义结构体,赋初值(物品、数量、单价),之后输出。
*/
#include<stdio.h>
struct goods{
char name[20];
int number;
float price;
};
int main()
{
struct goods a[3]={{"肥皂",2,5.2},{"水笔",6,1.2},{"毛巾",3,20}};
int i;
float sum=0;
printf("六亿超市欢迎你\n");
printf("物品\t数量\t单价\t金额\n");
for(i=0;i<=2;i++)
{
printf("%s\t%d\t%.2f\t%.2f\n",a[i].name,a[i].number,a[i].price,a[i].number*a[i].price);
sum+=a[i].number*a[i].price;
}
printf("总计\t\t\t%.2f\n",sum);
return 0;
}
/*
2、有三个学生,每个学生的数据包括学号、姓名、三门课程的成绩。从键盘输入3个学生的数据,要求印出这三个学生的总平均成绩,以及最高分的学生的数据(包括学号、姓名、总分)。
*/
#include<stdio.h>
struct student{
char id[20];
char name[20];
int score[3];
float avg;
};
int main()
{
int i,j;
float sum,avg=0;
struct student stu[3];
for(i=0;i<=2;i++)
{
printf("请输入第%d个学生的成绩\n",i+1);
printf("学号:");
scanf("%s",stu[i].id);
printf("姓名:");
scanf("%s",stu[i].name);
for(j=0;j<=2;j++)
{
printf("第%d门成绩",j+1);
scanf("%d",&stu[i].score[j]);
}
}
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均值\n");
for(i=0;i<=2;i++)
{
sum=0;
printf("%s\t%s\t",stu[i].id,stu[i].name);
for(j=0;j<=2;j++)
{
printf("%d\t",stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].avg=sum/3.0;
printf("%f\n",stu[i].avg);
}
printf("全班平均成绩是%f",(stu[1].avg+stu[2].avg+stu[0].avg)/3);
return 0;
}