1,枚举
枚举经常用来定义意义相关的函数,比如星期、方位等,也经常用在状态机当中;就是宏定义常数的集合体,枚举中元素的本质也是一个个的数字
如下例:
#include <stdio.h>
typedef enum fangxiang // 标识符
{
EAST,
WEST = 99,
SAUTH,
NORTH = 100,
xq,
}E;
int main(void)
{
E e = EAST;
printf("e = %d.\n", e);
e = xq;
printf("e = %d.\n", e);
return 0;
}
输出是0和101,enum是定义枚举类型的关键字
枚举的应用,密码锁:
#include <stdio.h>
typedef enum fangxiang // 标识符
{
EAST,
WEST = 99,
SAUTH,
NORTH = 100,
xq,
}E;
//定义状态机的所有状态集
typedef enum STATE
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
}S;
int main(void)
{
int num = 0;
//1、密码锁初始状态
S current_state = STATE1;
// 输入密码,进行解锁
printf("输入一个密码数字:");
while (1)
{
scanf("%d", &num);
printf("num = %d.\n", num);
//解锁开始
switch (current_state)
{
case STATE1:
if (num == 9)
{
current_state = STATE2; // 用户每输对一次,进入下一状态
}
else
{
current_state = STATE1;
}
break;
case STATE2:
if (num == 5)
{
current_state = STATE3; // 用户每输对一次,进入下一状态
}
else
{
current_state = STATE1;
}
break;
case STATE3:
if (num == 2)
{
current_state = STATE4; // 用户每输对一次,进入下一状态
}
else
{
current_state = STATE1;
}
break;
case STATE4:
if (num == 7)
{
current_state = STATE5; // 用户每输对一次,进入下一状态
}
else
{
current_state = STATE1;
}
break;
default:
current_state = STATE1;
break;
}
if (current_state == STATE5)
{
printf("开了锁,请进!.\n");
//break
return 0;
}
if (current_state == STATE1)
{
printf("初始状态.\n");
}
}
return 0;
}
使用枚举设计了一个状态机的跳转,实现了密码锁的功能;可以看到,枚举的定义与使用与结构体十分类似
2,一个结构体+指针应用的经典例子
#include <stdio.h>
typedef int (*p_func)(int a, int b); //这句也可以写进结构体
int add(int a, int b)
{
return a + b;
}
//结构体各成员默认是public
//class在C++里,是一个类,所有成员和方法(函数)是si(private)有的,只能在类里进行访问
//struct里面不能包含函数,但是可以包含函数指针
struct data
{
int a;
int b;
p_func p;
//不能有函数
}s;
//填充结构体
void set_func(struct data *p)
{
p->a = 2;
p->b = 3;
p->p = add;
}
//业务函数
int cnt_func(struct data *p_str)
{
return p_str->p(p_str->a, p_str->b); //重点理解这句话,p是结构体里就定义类型的指针,赋值的时候已经指向了加法函数
}
int main(void)
{
set_func(&s);
int ret = cnt_func(&s);
printf("ret = %d.\n", ret);
return 0;
}