本章简述
本章以一个庞杂的 if 判断程序段落提出主题,对于这种代码冗余量大,相似性高的程序结构应该考虑用合适的数据结构(比如数组)来达到相同的目的。
由此,引出本章标题的完整意义:恰当的数据视图实际上决定了程序的结构。
结构化数据
本章用了大量篇幅介绍复杂程序的庞杂代码量的不合理性,使得读者可以深入的理解并牢记,在以后写程序时能够避免再次写出类似代码。
作者在第四小节,提出结构化数据的概念。结构化数据就是指一组结构清晰的数据,早些时候,仅仅可以说选择恰当的变量名,但是后期,编程语言加入了记录或者结构以及指向它们的指针。我们就学会了使用名为insert和search的函数来代替处理数据的代码,这有助于在改变数据的表达方式时不损坏程序的其他部分。
总结,对系统待处理数据进行研究可以深入认识到优秀的模块化结构。
对于处理特殊数据的强大工具,有很多:
- 超文本
- 名字-值对
- 电子表格
- 数据库
- 特定领域的编程语言
原理
本章主要是给读者灌输一种结构化数据的思想,以小故事的形式,告诉读者:“能用小程序实现的,就不要编写大程序”。数据结构设计还有许多其他正面影响,包括节省时间和空间、提高可移植性和可维护性。
下面是关于特殊数据处理的几个原则:
- 使用数组重新编写重复代码,冗长的相似代码通常可以使用最简单的数据结构—数组来更好的描述;
- 封装复杂结构,当需要非常复杂的数据结构时,使用抽象术语定义,并将操作表示成类;
- 尽可能使用高级工具,超文本、名字—值对、电子表格、数据库、编程语言等;
- 从数据得出程序的结构,这也是本章的主题。
总的来说,本章就是告诉我们,通过使用恰当的数据结构代替复杂代码,从数据中得出程序结构。在动手编码之前,优秀的程序员会彻底理解输入、输出和中间数据结构。
习题分析解答
1 . 通过学习了以上的知识,面对此题,我们很容易的想到数组存储相应数据的方式;在该题目中需要三个存储数组,基本税收、等级下届以及税率,采用这种方式可以避免庞杂的条件判断,减少代码量。
2 . k阶常系数线性递归定义的级数,同样采用两个数组,一个存储参数c[1]至c[k+1],另一个存储结果a[1]至a[n],代码简洁,健壮性好。具体实现如下:
/************************************************************************/
/* 《编程珠玑》第三章 数据决定数据结构
* 3.7习题 2,计算k阶常系数线性递归定义的级数
* 舍弃庞杂的大量判断,采用数组存储数据,代码简介,健壮性高
*/
/************************************************************************/
#include <iostream>
#include <cstdlib>
using namespace std;
const int N = 100;
int main()
{
//输入k,m
int k, m;
int c[N + 1] = { 0 }, a[N] = {0};
cin >> k >> m;
//输入c[1]至c[k+1]一共k+1个数据,而且遵从方程组约束,下标从1开始计算
for (int i = 1; i <= k + 1; i++)
cin >> c[i];
for (int j = 1; j <= k; j++)
a[j] = c[j - 1] * a[j - 1] + c[j];
for (int j = 1; j <= k; j++)
cout << "a[" << j << "] = " << a[j] << " ";
cout << endl << "a[" << m << "] = " << a[m] << endl;
system("pause");
return 0;
}
3 . 印刷大写字母,提示见书本附录答案。
4 . 编写处理如下日期问题的函数:(1)给定两个日期,计算两者之间的天数;(2)给定一个日期,返回值为周几; (3)给定月和年,使用字符数组生成该月的日历。
这里写代码片
5 . 处理英语中一小部分连字符问题。
这里写代码片
6 . 此题要求给出格式化输出模板,使得数据库中的记录生成定制文档,与书中实例相似。在实际应用中,可用脚本语言实现。