《Programming: Principles and Practice Using C++》读书笔记(一)

c++之父Bjarne Stroustrup写给初学者的读本,语法和语言特性是次要,如他所言“思想和原理”才是重点


Bjarne Stroustrup这么说过:

“每一种程序设计语言代表了一种思想,将其中很多语言特性结合起来我们就能写出有用的程序,计算机不是一种只能完成固定任务的设备,他能完成我们能想想到的任何计算任务,将其与其他设备结合,理论上我们可以用它来完成任何任务”

c++语言构成:

面向过程的程序设计,传统的c程序设计
基于对象的程序设计
面向对象的程序设计
泛型编程

进阶方向:

从语言角度
算法角度
网络与操作系统角度
GUI方面
富有挑战性的应用——机器学习、游戏等

学习计算机科学的通用之法:

“先勇猛向前,偶尔摔一跤,获得编程的感觉,再慢下来,获得精确的控制和准确的理解必须在走之前就学会跑”
“略过一些细节,偶尔因缺少相关只是而被灼伤,是学习编程知识最快的途径”
“重点在思想、原理,不求甚解的学习大量语言规则和特性是错误之源”


从编译、链接说起

源程序+编译器=目标代码
目标代码+链接器=可执行程序
由此引出的三类程序错误:

编译错误
链接错误
运行时错误
使用IDE的用户往往忽略这个过程,但目标代码和可执行程序的是不具有移植性的


对象、类型、值

编译器会针对特定类型的对象在内存中开辟空间,存储其值,可以直接将对象理解为存储空间,对象通过变量来表示,变量只是一个名称,char* c的值是指针的地址,int a的值即是a的值

总是保证变量被初始化才安全,否则引用未初始化的变量将显示一个随机的垃圾值(因为int a;在定义变量时分配了存储空间,未初始化就引用必然输出内存中的垃圾值)

关于变量的命名:不允许使用关键字,但使用标准库中的名字,如string是可以的,当然不推荐这么做

注意隐式的类型转换,如sqrt(a),<math.h>中的操作数都是针对double型的,c/c++作为一种弱类型语言,其类型转换显得尤为重要

关于EOF(end of file):win中为Ctr+z,linux中为Ctr+d



计算

计算的目标:正确、简单、高效
封装、分治等在代码结构和质量方面作出的努力可以大大简化编程中最让人抓狂的部分:调试(尝试基于语法分析实现一下计算器程序真的对此体会颇深)


“如果一心想构建能长久留存的东西,那么一开始就要对代码组织和结构投入更多关注,而不是在发生错误之后再回过头来关注这方面”


表达式:左值=右值


关于程序可读性:好的代码是能够自我表述的,可读性的目的除了便于自己和他人理解外,更重要的目的是便于更好的发现和改正错误
例如:使用#define、const常量来避免“魔数”;尽量使用a*=b;不要在for语句的循环体中修改循环控制变量的值(遵循最常用的方式才是好的编程风格)


switch()对象只能是整型、字符型或枚举型,c#支持更多类型


为什么设计了函数:
      实现复用、简化代码、分离计算逻辑、减少调试工作量
函数设计原则:
      完成独立的逻辑单元,不宜过长


错误

“良好的代码应具备异常处理机制,理论上其应该可以应对任何异常输入”,边界问题太重要,谁做OJ谁知道

错误的来源:
缺少规划:没有事先规划好程序需要做什么,清理所有死角,必然会引起疏漏
不完备的程序:仍有一些边界问题未被考虑到
逻辑错误:程序实现上存在错误
意外:不存在永远正确的程序

避免错误:
精心组织软件结构,减少错误的发生
通过调试、测试消除大部分错误
确定余下的错误的不那么重要的

检查函数参数错误:
让函数调用者来处理异常参数
让被调用函数来处理异常参数(推荐,即前置参数检查)
如:area(int x) if(x<=0) throw runtime_error("none positive x")

异常处理的基本思想:将错误检查(被调用函数中)和错误处理(主函数中)分离

常见的错误:
范围错误(边界错误、偏一位错误):频率灰常高的一类
逻辑错误:很多时候是边界问题考虑不全面
慎重地定义每一个变量的初始值、慎重考虑一个变量的取值范围
低级错误:无厘头的代码书写错误,发现后常引发想砸电脑的冲动

善用估计:
“估计”是们优雅的艺术,通过快速的头脑风暴+常用的数学方法验证,找寻可能出现的错误和问题的死角
“很多科学家具备在一个信封的背面对十分复杂的问题作估计的能力和习惯“
从谷歌的面试题目看这项能力也确实重要

重视注释和前置条件:
”经验标明,编写注释和函数的前置条件可以显著提高程序质量:他强迫你思考函数的真正目的和需求时什么,从而避免程序设计上的许多错误”
除此之外,还可以适当地对函数加以后置条件的检查


(一)到此结束,(二)基于文法分析的简单计算器实现



无线定位是指通过无线通信技术实现对物体、人员或其他目标位置信息的准确获取和跟踪的过程。它是当前无线通信技术发展的重要应用之一。无线定位的原理和实践主要基于无线信号的传播和接收特性。 无线定位的原理可以分为两大类:基于信号时差测量的定位和基于信号强度测量的定位。基于信号时差测量的定位通过多个接收节点接收到同一个发送节点发出的信号,并根据信号传播的时差来计算目标位置。这种方法要求接收节点间具备时间同步性和高精度的时钟,但能够实现较高的定位精度。基于信号强度测量的定位通过接收到的信号强度来估计目标位置,这种方法比较简单实用,但定位精度相对较低。 无线定位的实践需要综合考虑无线信号的传播特性、多径效应、误差校正和算法设计等因素。在实际应用中,可以利用已有的基站、卫星导航系统等现有设备来实现无线定位。同时,还可以通过部署额外的接收节点来提高定位精度和覆盖范围。此外,为了应对多路径干扰和降低定位误差,可以采用信号处理、过滤和融合等技术手段。 无线定位广泛应用于室内定位、车辆定位、智能导航、物流管理等领域。它为我们提供了实时、准确的位置信息,为人们的生活和工作带来了便利。随着无线通信技术的不断发展和改进,无线定位的精度和可靠性将会进一步提升,为更多领域的应用提供支持和推动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值