C语言-3-枚举类型
摘要枚举类型(enumerated type),顾名思义,便是将有可能取到的值一一列举并放入一个集合之中,这个集合便可以视作枚举类型。
使用enum关键字,可以创建一个新“类型”并指定它可具有的值,这种类型就叫枚举类型。
例如将一个星期作为集合,它的取值只能是周一到周日,我们便可以使用枚举类型来进行定义,它的语法与结构体类型的语法类似。
代码实现代码1:创建枚举类型123456789enum Day{ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
分析
enum Day 这个声明创建了一个Day作为标记名,允许将enum Day作为一个类型名进行使用。
花括号内的7个标识符枚举了enum Day变量可以取到的所有值。因此,用enum Day创建的变量可以取Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday共7个值。这7个值被称为枚举符(enumerator),又称枚举常量,从技术层面上来讲,枚举常量是int类 ...
C语言-1-井字棋
Abstract本算法用于实现井字棋游戏电脑先手情况下的智能落子
Introduction关于井字棋的模块的搭建,分为棋盘的初始化、棋盘的展示、电脑落子、玩家落子、判断输/赢/平局/继续游戏这5个模块。
其中,我们着重介绍一下电脑落子的具体算法。本算法可以使得玩家永远赢不了棋局。(输/平局)
本算法的核心思想为 暴力枚举 和 迫使玩家进行指定位置的落子注:
本棋盘为3*3的大小
电脑先手
以下用形如(2,1)的形式表示落子的坐标
用“**#”表示电脑的棋子,用“***”表示玩家的棋子
代码部分使用C语言进行实现AlgorithmStep1电脑的第一步永远落于(1,1)
Step2接下来,玩家落子一共有8个点可供选择,根据对称性,我们可以将其分分成5组。它们分别是:
(1,2)或(2.1)
(1,3)或(3,1)
(2,3)或(3,2)
(2,2)
(3,3)
以下对于每一类情况进行分组讨论,每组以其中一种情况进行举例蓝色的数字表示落子的顺序
A.(1,2)
上图表示玩家第一手落于(1,2)的情况。此时,显然玩家必输。同理,玩家落子于(2,1),显然必输。
B. (1,3)
上图 ...
C语言-4-浅谈memcpy与memmove 的区别
两个函数都包含于<string.h>头文件中首先看memcpy函数的定义1void *memcpy( void *dest, const void *src, size_t count );
dest表示目的地地址,用指针变量加以维护;同理,src表示源地址;count是一个无符号整型,表示将从源地址往后拷贝多少个字节大小的数据
再看memmove函数的定义1void *memmove( void *dest, const void *src, size_t count );
两者区别我们发现两者传递的参数相同,而两者之不同,我们现在给出:如果将要拷贝到的目标缓存区与原缓存区有重叠(overlap),则我们需要使用memmove函数;其他情况下,则两者皆可。也就是说,memmove函数支持源缓冲区与目标缓冲区是同一块并且能够处理两者的重叠的情况。
请看库函数对于memmove函数的算法实现:
12345678910111213141516171819202122232425262728//Algorithm: void * memmove(void * dst ...
C语言-2-结构体类型
结构体的声明1struct Tag{member-list}variable-list;
结构体的自引用结构体能够自引用指向该结构体的指针而不能自引用该结构体本身,否则会出现死递归。
结构体变量的定义与初始化1struct Tag{member-list}variable1={ },variable2={ };
技巧:使用typedef在定义结构体时给结构体取别名123typedef struct {member-list}别名;
之后就“别名”就相当于一个类型名,可以用来定义该类型的变量。
结构体内存对齐性能原因:用空间来换取时间。平台原因:某些硬件平台只能在某些地址处取某些特定类型数据,否则抛出硬件异常。
在设计结构体的时候,既要满足内存对齐,又要节省空间,所以最好把内存小的成员集中在一起。
计算结构体的大小:
Visual C++编译器下,默认对齐值为8。
第一个成员在与结构体变量偏移量为0的地址处。
其他成员要对齐到其自身对齐数的整数倍的地址处。
对齐数=编译器默认对齐数 ...