周立功教授数年之心血之作《程序设计与数据结构》以及《面向ametal框架与接口的编程(上)》。书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对《程序设计与数据结构》一书内容进行连载,愿共勉之。
第二章为程序设计技术,本文为2.2.5 结构体数组。
>>>2.2.5 结构体数组
下面将以控制台菜单选项为例,介绍多分支选择结构程序设计的思想与实现方法。一般来说,菜单栏至少包括新建文件、打开文件、保存文件和退出4项基本功能。比如:
如果使用函数指针,这4个函数的调用形式如下:
而新建文件、打开文件、保存文件和退出都可以作为字符串新建文件、打开文件、保存文件和退出存储在char数组中。比如:
基于此,可以先声明一个结构体类型cmdentry,其声明如下:
接着定义一个结构体数组作为函数表,分别用于存储菜单函数的入口地址和菜单信息。其声明如下:
在这里,将cmdarray声明为一个内含10个元素的数组,数组的每个元素都是一个cmdentry类型的数组,因此cmdarray[0]是第一个cmdentry类型的结构体变量,cmdarray[1]是第2个cmdentry类型的结构体变量,以此类推。cmyarray是数组名,该数组中的每个元素都是cmdentry类型的结构体变量。
为了标识结构体数组中的成员,可以采用访问单独结构体的规则:在结构体名后面加一个点运算符,再在点运算符后面加上成员名。比如:
注意,数组下标紧跟在cmyarray后面,不是成员名后面。比如:
使用cmdarray[2].chelp的原因是:cmdarray[2]是结构体变量名,正如cmdarray[1]是一个结构体变量名。使用cmdarray[3].chelp的原因是cmdarray[3]是结构体变量名,如同cmdarray[0]是另一个变量名。由于数组变量名代表数组首元素的地址,因此下面两个语句是等价的:
那么*pcmdentry=cmdarray[0],因为&和*是一对逆运算符,所以可以做以下替换:
由于.运算符比*运算符的优先级高,因此必须使用圆括号。顺带提一下,下面的表达式代表什么?
这是cmdarray数组第1个结构体变量(cmdarray[0]部分)中的第2个字符(chelp[1]部分),这个字符为“建”。这个示例指出,点运算符右侧的下标作用于各个成员,点运算符左侧的下标作用于结构体数组。最后总结一下:
根据上面的定义,即可用以下方式获得相应函数的入口地址。比如:
即pfuncmd函数指针指向createfile()函数,其调用形式如下:
由此可见,采用回调函数动态绑定的方式,程序的可扩展性得到了很大的提升。只需在“1”处添加自定义的函数,无需多处修改代码,不仅可以很好地解决程序的可扩展性问题,而且还大大地降低程序的出错几率,详见程序清单2.26。
程序清单2.26 控制台菜单选项程序
请用bubblesort()算法完成这个练习,将employeearray结构体数组分别按下列要求排序并输出:(1)按id从小到大排序;(2)按weight、age、height从小到大排序,相同时按id从小到大排序;(3)bloodtype按a、b、o、ab顺序排序,相同时按id从小到大排序。
FPC行业的潜力有多大
基于LabVIEW的SIP系统仿真的设计与实现
神波05A型电动车电池电池修复仪
ST如何在300毫米晶圆上创建量子图像传感器技术
耐威科技将对外投资设立参股子公司 专门从事导航与DSP芯片
多分支选择结构程序设计的思想与实现方法
ADI推出新款业界领先的宽带RF增益模块
linux与centos的区别与联系
小米5C 一次创新也是一次妥协
GE和 AliveCor 宣布建立合作伙伴关系 金升阳连续斩获四大奖项
转换触点的继电器好坏判断
关于能源行业工业互联网发展的核心是工业智能化分析
传小米加大印度实体店投入,欲提高线下销售占比
欧美日国家车路协同产业布局加快,逐渐向C-V2X+5G技术路线转变
研究称ChatGPT压力大时会欺骗人类 首部AI监管法规还在走程序
前沿科技 “东数”如何“西算”?
关于行业首款双摄儿童手表的性能分析和应用
成都高新减灾研究所与百度签署战略合作协议
图像增强三大类别介绍
智能涡街流量计的错误安装方式有哪些