《编程珠玑》笔记3 数据结构选择
这一章主要讨论良好的数据结构对程序的重要影响
1.调查程序:问题的关键是决定怎样用数组来存储哪些数据。
格式信函编程:(更像是脚本程序所使用的形式)
对于一段应用较多的程序,只有个别变量与外界输入有关,可以将这些变量以特定的参数来表示,建立一个模板,然后使用特定的发生器来解释这个模板。如:
一个模板(schema)类似如下:
Welcome back, $1! we hope you have fun in the holiday with $0 family.It will take $$120. your address: $2 $3 date: $4
一个发生器如下:(对于模板中的$符号,用$$来表示)
read fields from database for start to end in schema c=getchar in schema if(c != '$') printchar c else c = getchar in schema case c: '$': printchar '$'; '0'-'9': printstring field[c]; default: error("bad schema")
2.一组示例
菜单:考虑如下类型代码:
void button0_clicked() { item0.checked = 1; item1.checked = 0; item2.checked = 0; } void button1_clicked() { item0.checked = 0; item1.checked = 1; item2.checked = 0; } void button2_clicked() { item0.checked = 0; item1.checked = 0; item2.checked = 1; }
实际item可能会有更多,这些函数可以做如下简化(使用数组来代替这些item):
void button_clicked(int choice) { for(i = 0; i < numchoices; i++) item[i].checked = 0; item[choice].checked = 1; }
出错信息
日期函数
3.用于特殊数据的工具
超文本:(html格式文本)
名字-值对:(多用于数据库中)
数据库
特定领域编程语言:如GUI,curses,openGL……这些都为特定目的的程序提供了丰富的函数库支持
4.原理
使用数组编写重复代码;
封装复杂结构
尽可能使用高级工具
从数据结构建立程序结构
5.习题
5.1在每一税率区间都有三个值:该区间的下界S, 基本税收B,超过下界部分税收E,设计一个(S,B,E)的数据结构,并按照S排序,通过二分搜索找到相应的区间(或者直接顺序搜索也可以,这样就与if的效果相同),然后利用相应的三元组计算tax。
5.2输入为k,a1,……,ak,c1,……,ck+1,输出为a1,……am.
由于只给出了递归式,只能先算出ak+1, ak+2,.....,am.
最好的办法是使用一个长为k的数组,自底向上计算,(有点像动态规划中自底向上一样)这样在计算后一个值能够确保前面的值都已知。
如果使用一个递归程序,也就是说,在得到am时,计算am-1,am-2,...,am-k,同样递归计算am-1时,再计算am-2,am-3,...am-k-1,(这就是自顶向下的方法)这样会产生很多重复计算,效率很低。当然,也可以先申请一个数组,使用备忘录方法解决这一问题。
5.3大写字母的图形化表示
5.4
5.5
5.6
5.7
5.8