• 《编程珠玑》阅读小记(3) — 数据决定数据结构


    本章简述

    本章以一个庞杂的 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 . 此题要求给出格式化输出模板,使得数据库中的记录生成定制文档,与书中实例相似。在实际应用中,可用脚本语言实现。

  • 相关阅读:
    后台跨域(CORS)
    golang 处理TCP粘包问题
    使用axios 发送ajax 下载文件
    Golang:在Redigo的RedisPool上选择DB
    puppeteer添加代理
    mongodb 权限操作
    alpine下安装icu-dev
    golang 导出CSV文件中文乱码的问题
    shell笔记
    Convert rune to int
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214952.html
Copyright © 2020-2023  润新知