学化学的应该都知道chemdraw,这是一款专门绘制化学结构的软件,什么苯环、双键各种word难以搞定的分子式,你可以轻松的用chemdraw完成,可以称得上化学工作者居家旅行必备的良药。其实早在1987年的时候,贝尔实验室的大牛Brian Kernighan(就是K&R教你写C语言中的K)和人一起设计了Chem语言,到现在还能用,似乎在书籍排版上比chemdraw的效果更好。说了这么多,咱不是给Chem做广告,而是为了引出它的另一位创作人Jon Bebtley,也是本文即将谈到的《编程珠玑II》——非常受程序员欢迎的系列书籍的作者。

《编程珠玑II》是一部短文集,涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例。

开头提到的Chem语言是Pic语言的预处理器,通过作者在书中第9章讨论的Pic语言一例,我们能够明白按照语言的特性对程序进行检查,可以帮我们更好地理解所使用的语言工具,并能教会我们为以后的程序设计更优雅的界面。

编程语言设计原则

  • 设计目标:设计语言之前,要认真研究你试图解决的问题。
  • 简单性:让你的语言尽可能地简单。规模小的语言便于实现者设计、创建、写文档和维护、也便于使用者学习和使用。
  • 基本的抽象:常见的程序设计语言是基于冯・诺伊曼计算机的视角进行创建的,其指令只对小块的数据进行操作。基本对象就是程序的抽象数据类型,而操作就是关键的字程序。
  • 语言的结构:表达式的自然性和实现的方便性需要做出权衡,缩进和注释都是必需的。
  • 正交性:问题中不相关的特性在语言中也不相关;
  • 设计语言的准绳:
    • 一般性:一种操作用于多种目的;
    • 简约性:去掉不需要的操作;
    • 完全性:所设计的语言能描述所有感兴趣的对象吗? 
    • 相似性:让语言尽可能有启发性;
    • 可扩展性:确定语言可以进一步发展;
    • 开放性:允许用户“溜走”以使用其它工具;
  • 设计过程:在实现语言之前,通过描述语言中大量的对象来测试你的设计,当语言完成并付诸实用后,还要反复进行新的设计已根据客户的需要加入新特性。
  • 对编译器生成的深刻见解:尽可能地从后端的处理过程中将前端的语言分析分离出来,这样处理器的创建更容易,也更容易兼容到系统或新的语言用途中。

文档设计和编程有诸多相似之处,书中第10章通过几副不断完善的表格、插图,穿插着介绍了文档设计的原则。

文档设计

文档生成和编程有很多共同之处,两者都要“创造对他人有用的东西”和“必须出色的完成论文”,两者最大的共同点是都能让人尽享“创造的乐趣”。

文档设计需要创意。如果所有人着装相同,所有车的车型和颜色也一样,那么这个世界是多么地乏味。一个所有风格看上去差不多相同的文档库也是一样。综合考虑文档的许多属性,才能得到最佳的计效果。

但是要当心创意过度,好的排版并不能弥补文章本质上的缺陷,如拼写错误、语法不当、结构性差以及内容空洞等。好的文档风格就像好的编程风格和好的写作风格一样,是无形的。内容是文档的首要目的,文档风格只是达到这一目的的辅助手段。

合适的方式表达思想,参考勾股定理:”直角三角形的斜边地平方等于两直角边的平方和“,可以用下图和等式a²+b²=c²来表达这一信息

也可以用欧几里得表示法

根据计算机摩尔定律,我们可以存储越来越多的数据,并对其进行越来越多的处理,可是在系统执行了大量计算后,我们又该如何从海量数据中得出大趋势呢?

图形化输出

你如何概述拿破仑1812年在俄罗斯战役中的挫败?很多程序猿会试着打印出几十厘米数据(每天的人员数量、军饷、驻军地点),法国工程师Charles Joseph Minard在1861年用一种不同的方式来描述这个问题:只用一张简单的图来总结该战役。有人评价这可能是有史以来最好的统计学绘图。

本图给出了与地图上的城市、河流等背景相关联的六个变量:驻军地点(经纬度)、军队规模(和带宽成比例)、行军方向、气温以及日期,从中可以看到一支军队的毁灭与一个帝国走向灭亡的起点。

最后来几个书中提到的算法:

随机取样

许多随机取样要求随机样本中没有重复元素,以下伪代码为算法S,这个算法把结构保存在集合S中,如果S的实现正确,并且RandInt产生随机整数,那么这个算法生成随机样本,每个M元子集的概率都是

initialize set S to empty

Size := 

while Size < M do

     T := randInt(,N)

     if T is not in s then

         insert T in S

         Size := Size + 

算法S有很多优点:正确、相当高效、非常简洁,似乎好的不能再改进了。不幸的是Bob Floyd发现,当M=N=100时明显存在一个缺陷。当Size=99时,集合S缺一个整数。算法闭着眼睛乱猜整数,直到偶然碰上正确的那个为止,这平均需要猜100个随机数。这个分析假设随机数发生器是真正随机的。对于某些非随机排列,这个算法甚至不会停止。Floyd开始寻找一个算法,对于S中每个随机数只恰好调用一次RandInt。

initialize set S to empty
for J := N - M + to N do
T := randInt(,J)
if T is not in S then
insert T in S
else
insert J in s

牛顿迭代法计算K维空间两点距离

T := abs(A[] - B[])

Max := T: Sum := T*T

for J :=  to K do

       T  :=  to K do

       if T > Max then Max : = T

       Sum := Sum + T*T

if Sum = 0.0 then return 0.0

Eps = 1.0e-7

Z := Max

loop

      NewZ := 0.5 * (Z + Sum/Z)

      if abs(NewZ - Z) <= Eps*NewZ then break

      Z := NewZ

return NewZ

读书笔记--编程珠玑II的更多相关文章

  1. 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

    写在最前面的 手贱翻开了<珠玑>的最后几章,所以这一篇更多是关于13.14.15章的内容.这篇文章的主要内容是“AVL树”,即平衡树,比红黑树低一个等次.捣乱真惹不起红黑树,情况很复杂:而 ...

  2. 《Mastering Opencv ...读书笔记系列》车牌识别(II)

    http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(I ...

  3. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  4. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  5. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  6. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  7. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  8. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  9. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

随机推荐

  1. html5外包—长年承接html5外包业务:《Sencha Touch权威指南》下载

    <Sencha Touch权威指南>内容简介:如何才能全面而透彻地理解和掌握移动应用开发框架Sencha Touch并开发出令人心动的移动应用?<Sencha Touch权威指南&g ...

  2. js实现windows扫雷(jquery)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. Winform/WPF国际化处理

    1.Winfrom国际化处理方式 ==> Winform中国际化支持可将UI页面和.cs文件分开处理 处理窗体方式如下:1.选择Form窗体设置其--Language(默认中文--Default ...

  4. [工具开发] Perl 爬虫脚本--从美国国家漏洞数据库抓取实时信息

    一.简介 美国国家漏洞数据库收集了操作系统,应用软件的大量漏洞信息,当有新的漏洞出现时,它也会及时发布出来. 由于信息量巨大,用户每次都需要到它的网站进行搜索,比较麻烦.如果能有个工具,每天自动分析它 ...

  5. java工程师分享:我是如何自学成才的?

    原文:http://www.java800.com/peixun-79062115.html 我是10年河南工业大学的毕业生,当时我们专业许多学生都去报了java培训机构,去达内的都不少.我也想去培训 ...

  6. ssh整合随笔(注解方式,Spring 管理action)

    Web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  7. (WF)

    Caught: System.InvalidOperationException: The argument of type 'XXX' cannot be used. Make sure that ...

  8. MVC之Razor语法

    Razor是MVC3中才有的新的视图引擎.我们知道,在ASP.NET中,ASPX的视图引擎依靠<%和%>来调用C#指令.而MVC3以后有了一套新的使用@标记的Razor语法,使用起来更灵活 ...

  9. Java 新IO

       NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...

  10. objective-c中自己创建的对象为什么不能调用release

    dealloc方法,本就不应该手动调用. 你自己创建的对象,看你代码怎么写的了.例子:NSString *str1 = [NSString stringWithString:@"abc&qu ...