结构体与共用体 链表 编译预处理
结构图和共同体
• 单科成绩分析统计程序
题目要求:1.输入学生个数、成绩
2.计算平均分、最高分、最低分
3.计算各个分数段人数并计算平均分
4.排序从高到低
刚开始计算各分段人数时是这样写的
排序是这样写的
发现case2.case3根本不会运行,经过几天的焦头烂额发现错误很多
关键问题:
- cn[10]没有初始化,没有初始化的元素系统会赋予一个默认值,所以即便case2可运行,计算出来各个分数段的人数也不尽人意
- 一共有11个分数段:0-10,10-20……80-90,100。嗯。。还是不能自以为是
- 简化程序,case3写得过于繁琐
• struct <结构标记> atruct date
{ {
成员1; int year;
成员2; int month;
…… int day;
成员n; };
};
定义结构体成员与定义变量类型相同,但是不能赋值
结构体成员可以是变量、数组或另一个结构变量
结构体定义可在函数内部和外部,意义和外部函数、内部函数相同
定义结构类型只是规定了构成这种数据类型的模型,在编译的时候不会给他分配空间。所以不能对定义的结构体进行存取数据操作(赋值、运算),正如不能给int这些类型赋值。
在该定义之后的任意位置仍可用该结构体类型来定义其他变量,例:math.h
类型定义和变量定义结合在一起,可再次使用,但可用于该结构类型引用的情况不多。
结构体类型定义后无结构标记,只适用于一次变量定义。
每个结构体变量在内存中所占的内存之和是其所包含的所有成员的字节值之和。且按照结构体类型定义中成员定义的顺序为各个成员安排内存空间。
结构体变量的初始化
结构体类型名 结构体变量={初始值表}
struct student
{
char name[30];
int age;
};
int main(void)
{
struct student str1(“Mary “,11);
}
注:
初始值的顺序与结构体中成员的顺序必须相同 - 初始值的个数不能超过结构体中成员的个数
- 对于没有初始化的成员,按类型进行默认赋值;
整数和符点数 0 字符和字符串 ‘/0’ - 只能在定义结构体变量时使用该初始化结构
结构体变量成员的引用
结构体变量名 .成员名
注:C语言中只允许结构体成员进行算术运算、比较运算和输入输出运算。但是不允许逻辑运算。
对结构体变量整体的引用
引用限制: - 可作为行参、实参或函数的返回值等进行函数的数据传递
- 当两个结构体变量的类型相同时,可以互相整体赋值
- 不允许对结构体变量的任何逻辑运算
例:输入一个学生的基本信息,学号、姓名、性别、成绩、出生年月日
getchar();
- 与syatem (“pause”);意义相同,防止闪退;
- 用于两个连续读入的字符数组之间;
当从键盘上输入时,输入的内容会存在缓冲区中,当按下enter键时,输入的内容就会存入目标中,此时缓冲区只留下了”enter”,如果不加getchar();系统就会把”enter”读入下一个字符输入值中。所以需要getchar();把”enter”读入,”enter”就不会影响下一字符数组的输入了。
结构体数组
数组:构成数组的元素类型和个数相同
结构体数组:当数组元素类型全是结构体时,数组就叫结构体数组。如果把数组元素看成行,结构体看成列,结构体数组就是一个行列式。
结构体数组的定义:
一般形式:结构体类型名 结构体数组名[数组长度]; - struct <结构标记>
{
成员1;
成员 2;
};
struct<结构标记> 数组名[数组长度]; - struct <结构标记>
{
成员 1;
成员2;
};数组名 [数组长度]; - struct
{
成员1;
成员2;
};数组名[数组长度];
结构体数组的定义
结构体类型名 结构体数组名[数组长度]={初始值表};
注:
- 初始值的顺序和类型要与相对应的成员的顺序和类型相同。
- 一般将每个元素对应的成员用{}括起来
结构体数组元素的引用
结构体数组元素名[下标];
结构体数组元素名[下标].成员名
例:选票统计:设有三个班长”fu”、”lu”、”shou”,班中有m个人,每人只能选一个人的名字,再按票数从高到低的顺序输出个候选人的得票书。
getch()函数
不回显函数,当键盘按下某个字符,函数自动读取,不用按回车键。
包含在conio.h头文件中,非标准函数。
Sleep()函数
Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。当函数设定的计时器到期,或者接收到信号、程序发生中断都会导致程序继续执行。
包含在windows.h头文件中
kbhit()函数
检查控制台按键是否按下,如果按下返回非零值,否则返回0。
包含在conio.h头文件中
\r 回车
光标回到行首,如果继续输出的话会覆盖原有的数据,不会换到下一行
共用体
每个成员共用一段地址
与结构体类似,用union来声明
特点:
- 所有成员共用一段内存,一个共用体变量的内存长度等于其存储空间最长的成员长度。
- 共用体变量可以被赋予任意值,但每次只能给一个变量赋值,赋入的新值会覆盖旧值。
例:一个班的体育成绩,男生测1000米成绩为x分x秒,女生测柔韧性(A、B、C、D)和仰卧起坐x个,将数据输入一张表格中,表中包括学号、姓名、性别、成绩,最后输出。
枚举类型
enum <枚举标记> {枚举常量1,枚举常量2……,枚举常量n};
注: - 在c语言中规定枚举常量的默认值依次等于0,1,2,3……枚举常量所表示的整形常量是前一个的值+1。
- 枚举常量所表示地整形数值不能相同。
枚举常量的定义:与结构体定义相同,三种方式
注: - 枚举变量的值只能取枚举常量中的值,枚举变量可以给枚举变量赋值。
enum study{Chinese,muth,English};
enum study d1,d2;
d1=Chinese;
d2=(enum study)2;//d2=english - 枚举变量可以比大小
d1<d2; - 枚举值不能直接输入输出,输入一般通过枚举常量转换输出switch
例:已知红黄白蓝黑 5个不同颜色的小球,一次从袋中取出三个,求所有取 法
typedef语句
typedef <已定义的类型名> <自定义的类型名>
给已知的类型名起一个小名
指针与链表
在链表中,每个元素包含两个部分:数据部分、指针部分。数据部分用来存放这个元素包含的数据,指针部分指向下一个元素的地址。最后一个元素的指针指向NULL。
静态链表
数据单元存放链表结点,结点的链域指向下一个元素的位置,也就是下一个元素所在的数据单元的下标。
单链表
每个结点只有一个指针,每个结点之间都是单线联系,除了最后一个结点,每个结点的指针都指向下一个结点,称为单向线性链表,简称单链表。
注: - 单链表有一个head指针变量,存放第一个结点的地址,称为头指针。
- 每个结点包含一个数据域和指针域,数据域存放实际数据,指针域存放下一个结点的地址。所有结点都是单向联系环环相扣。
- 最后一个结点称为“表尾”结点,他的指针域存放NULL,指向表尾的指针称为尾指针。
- 链表个结点之间的关系由指针域决定,链表依靠指针相连不一定是一段连续的地址。链表可以无限延长,只需改变相关结点的链接关系。
例:创建一个简单的链表,输入学生信息:姓名、学号
链表的插入与删除:
循环链表
基于单链表,链表的最后一个结点指向头指针;链表创立是不需要创建一个头结点,只需让最后一个结点指向链表的头结点就好了。
双向链表
每一个结点中有一个数据域和两个指针域,指针域分为左指针和右指针,分别指向左结点和右结点。
例:建立两个带头结点的学生链表,每个结点的数据域包含姓名、学号、三门成绩,且链表按学号升序排列,将它们合为一个链表。
使用merge();函数
编译预处理
• 文件包含处理
文件包含命令是以#inclulde开头的编译预处理命令,文件包含是指一个源文件可以将另一个源文件中的全部命令包含进来。
一般格式:
#include “文件名”:系统首先到当前目录下查找被包含文件,若没找到,再到系统指定的“包含文件目录”中查找。一般用户自己写的文件都用“”。
#include <文件名>:直接到系统包含的文件目录中查找
宏定义
不带参数
格式:#define 标识符 字符串
字符串可以是常量、表达式、格式串
注:
- 宏定义不是C语句,行尾不加“;”
- 在输出语句中,“”中含有字符串中的字符,即使与宏同名,也不展开
- 宏定义允许嵌套
- 宏的作用域:从定义命令后到本文件结束。如要终止红定义的作用域,可以用#undef命令。
带参数
格式:#define(行参表) 字符串
引用:宏明(实参表)
注: - 字符串中含有各个行参
- 定义带参数的宏时,宏明和左括号之间不能有空格,否则,C语言会将宏名后面的内容代替字符串。
- 使用带参数的宏时,如果实参为表达式,在宏定义时,字符串中的行参用()括起来。
条件编译
三种形式: - #ifdef 标识符
程序段1;
#else
程序段2;
#endif
功能: 对于已经被#define定义过的标识符,编译程序段1;否则编译程序段2。#else 和程序段2可以省略,此时对于没有被#define定义过的标识符不编译。 - #ifndef 标识符
程序段1
#else
程序段2
#endif
功能:与#ifdef相反 - #if 常量表达式
程序段1
#else
程序段2
#endif
功能:当表达式非0,编译程序段1;否则编译程序段2
虚拟机
• BIOS (Basic Input/Output System)
加载在电脑硬件硬盘上最基本的软件代码
UEFI启动
优势:提高进入操作系统的启动速度
支持图形化操作
SATA(Serial Advanced Technology Attachment 串行高级技术附件)
负责主板和大容量存储设备(如硬盘及光盘驱动器)之间的数据传输,主要用于个人计算机。
优势:串行接口结构简单,支持热插拔,传输速度快,执行效率高
SCSI(Small Computer SystemInterface小型计算机系统接口)
一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统及接口的独立处理及标准,是一种智能的通用接口标准。