编写程序实现如下功能
1、输出如下内容:
命令
0 增加设备
1 删除设备
2 修改设备
3 查询设备
4 监视设备状态
命令(输入相应数字):
2、分别对应5个功能定义5个实现函数,通过判断输入的数字,执行相应的操作;
3、使用函数指针数组实现。
程序设计思路:
- 实现函数显示输出菜单文字;
- 按照要求,需要输入0,1,2,3,4数字来执行相应的命令;
- 因为需要每个数字对应一个功能,而且是以列表的形态出现,所以考虑使用数组来建立一个表;
- 根据题目,使用数字作为功能索引,而且从数字0开始,所以可以直接创建函数指针数组,然后根据cmd对应的数字,以这个数字为下标,就能取出对应函数的指针。
- 原理也就是通过使用数组的下标,来跟对应的函数建立联系。
编码实现:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define DIM(x) (sizeof(x)/sizeof(x[0]))
5
6 void display_menu(void);//显示菜单
7 int get_cmd(void); //从终端获取数字指令的输入
8 void run_cmd(int cmd); //执行命令
9
10 /*每条指令对应的执行函数*/
11 void cmd_add(void);
12 void cmd_del(void);
13 void cmd_modify(void);
14 void cmd_list(void);
15 void cmd_view(void);
16
17 /*定义函数指针数组,每个元素指向一个函数*/
18 typedef void (*cmd_handle_t)(void);
19 const cmd_handle_t handles[ ]={
20 cmd_add, /*[0]*/
21 cmd_del, /*[1]*/
22 cmd_modify, /*[2]*/
23 cmd_list, /*[3]*/
24 cmd_view /*[4]*/
25 };
26
27 /*执行命令*/
28 void run_cmd(cmd)
29 {
30 if (cmd >= 0 && cmd < DIM(handles))
31 {
32 (handles[cmd])(); //从handles数组中的取出函数指针,并执行
33 }
34 else
35 {
36 printf ("非法指令\n");
37 }
38 }
39
40 int main(int argc, char *argv[])
41 {
42 int cmd;
43 display_menu (); //显示菜单
44 while(1)
45 {
46 cmd = get_cmd (); //获得指令输入
47 run_cmd (cmd); //执行命令
48 }
49 exit (EXIT_SUCCESS);
50 }
51
52 /*显示菜单*/
53 void display_menu(void)
54 {
55 printf ("命令\n");
56 printf (" 0 增加设备\n");
57 printf (" 1 删除设备\n");
58 printf (" 2 修改设备\n");
59 printf (" 3 查询设备\n");
60 printf (" 4 监视设备状态\n");
61 printf ("\n");
62 }
63
64 /*从终端获取数字指令的输入*/
65 int get_cmd(void)
66 {
67 int cmd;
68 int ret; //保存scanf的返回值
69 printf ("命令(输入相应数字,按<Ctrl-C>退出):");
70 ret = scanf ("%d", &cmd);
71 if (ret == 0) //没获取到符合%d的输入
72 {
73 /*用getchar函数释放输入缓冲区*/
74 while(getchar() != '\n')
75 ;
76 return -1;
77 }
78 return cmd;
79 }
80
81 /*定义5个函数,分别执行不同命令*/
82 void cmd_add(void) {printf("执行增加设备操作\n");}
83 void cmd_del(void) {printf("执行删除设备操作\n");}
84 void cmd_modify(void){printf("执行修改设备操作\n");}
85 void cmd_list(void) {printf("执行查询设备操作\n");}
86 void cmd_view(void) {printf("监视设备状态\n");}
87
使用数组的索引,就能执行对应的函数,这样的一个表,就可以称作跳转表。
修改程序功能如下:
命令
add 增加设备
del 删除设备
modify 修改设备
list 查询设备
view 监视设备状态
命令(输入相应命令):
数字改成字符串,同样执行5个函数,通过判断输入的单词,执行相应操作。
修改思路:
- 本题要使用字符串作为索引,用来跟对应的函数做匹配,因为不是数字,所以就不能使用数组来建立这种对应关系;
- 命令使用字符串,每条字符串命令对应一个功能实现,所以要把字符串和实现函数建立一个联系,可以使用结构体建立这种联系,结构体中放一个表示命令的字符串和一个函数指针。
- 一个结构体代表一条指令,存在多条指令,以列表的形式出现,所以建立一个结构体数组表示一个菜单。
完整实现代码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define DIM(x) (sizeof(x)/sizeof(x[0]))
6
7 void display_menu(void);//显示菜单
8
9 void run_cmd(const char *cmd); //执行命令
10
11 /*每条指令对应的执行函数*/
12 void cmd_add(void);
13 void cmd_del(void);
14 void cmd_modify(void);
15 void cmd_list(void);
16 void cmd_view(void);
17
18
19 /*定义新类型,把命令字符串和函数指针关联到一起*/
20 typedef struct __cmd_handle_s
21 {
22 const char *cmd; //命令名称
23 void (*handle)(void); //执行函数
24 }cmd_handle_t;
25
26
27 /*定义函数指针数组,每个元素指向一个函数*/
28 const cmd_handle_t handles[]={
29 {"add", cmd_add },
30 {"del", cmd_del },
31 {"mod", cmd_modify },
32 {"list", cmd_list },
33 {"view", cmd_view },
34 };
35
36 /*执行命令*/
37 void run_cmd(const char *cmd)
38 {
39 int i;
40 for (i = 0; i < DIM(handles); i ++)
41 {
42 if (strcmp(handles[i].cmd, cmd) == 0) //比较字符串相等
43 {
44 handles[i].handle();
45 return;
46 }
47 }
48 printf ("非法指令\n");
49 }
50
51 int main(int argc, char *argv[])
52 {
53 char cmd[32];
54 display_menu (); //显示菜单
55 while(1)
56 {
57 printf ("命令(输入相应数字,按<Ctrl-C>退出):");
58 scanf("%s", cmd); //清除字符串末尾的\n
59 run_cmd (cmd); //执行命令
60 }
61 exit (EXIT_SUCCESS);
62 }
63
64 /*显示菜单*/
65 void display_menu(void)
66 {
67 printf ("命令\n");
68 printf ("add 增加设备\n");
69 printf ("del 删除设备\n");
70 printf ("mod 修改设备\n");
71 printf ("list 查询设备\n");
72 printf ("view 监视设备状态\n");
73 printf ("\n");
74 }
75
76 /*定义5个函数,分别执行不同命令*/
77 void cmd_add(void) {printf("执行增加设备操作\n");}
78 void cmd_del(void) {printf("执行删除设备操作\n");}
79 void cmd_modify(void){printf("执行修改设备操作\n");}
80 void cmd_list(void) {printf("执行查询设备操作\n");}
81 void cmd_view(void) {printf("监视设备状态\n");}
82
使用结构体将索引和执行方法联系在一起,然后用这个结构体建立一个数组,使用的时候通过对结构体元素中的索引进行逐一匹配查找,然后执行相应方法,这样的一个表,就可以称作查询跳转表
来源:oschina
链接:https://my.oschina.net/u/2316382/blog/805535