《计算机是怎样跑起来的》学习笔记

  • 前言
  • 1 计算机的三大原则
  • 2 试着制造一台计算机吧
  • 3 体验一次手工编程
  • 4 程序像河水一样流动着
  • 5 与算法成为好朋友的七个要点
    • 5.1 算法中解决问题的步骤是明确且有限的
    • 5.2 计算机不靠直觉而是机械地解决问题
    • 5.3 了解并应用典型算法
    • 5.4. 利用计算机的处理速度
    • 5.5. 使用编程技巧提升程序执行速度
    • 5.6. 找出数字间的规律
    • 5.7. 先在纸上思考算法
    • 6 与数据结构成为好朋友的七个要点
  • 7 成为会面向对象编程的程序员吧
  • 8 一用就会的数据库
  • 9 通过七个简单的实验理解TCP/IP网络
  • 10 试着加密数据吧
  • 11 XML究竟是什么
  • 12 SE负责监管计算机系统的构建

前言

《计算机是怎样跑起来的》是日本作者矢泽久雄的著作。这本书我已经是第3遍看了,每次看都会有些不同的感受。这本书浅显易懂,涉及计算机的底层、内存、CPU、汇编、编程语言、网络、数据库等方面,是一本用于科普的好书。每次看,对某一些章节会有新的体会。故记录下来,以后有新的感受再补充进来。

1 计算机的三大原则

  1. 计算机是执行输入、运算、输出的机器
  2. 关注输入、计算和输出过程
  3. 程序是指令和数据的集合
  4. 对计算机而言,一切交流都是数值
  5. 计算机的处理方式有时与人们的思维方式不同
  6. 程序员要学会和计算机做朋友,学会交流

2 试着制造一台计算机吧

微型计算机的底层硬件:CPU、内存、IO

3 体验一次手工编程

汇编语言和机器语言、汇编语言和硬件的交互、了解汇编能帮助我们更好的知道计算机是如何运行代码的,从而写出更加高效的代码。

4 程序像河水一样流动着

  1. 流程图(Flow Chart)
  2. 三种流程分支:顺序执行、条件(选择)分支、循环
  3. 结构化程序设计
  4. 在高级编程语言代码中不使用跳转语句,但高级语言转为机器语言后,因为硬件的限制,机器语言还是会存在跳转语句。
  5. 通过画流程图来思考算法(输入、计算、输出):初始化处理、循环处理、收尾处理。
  6. 中断处理和事件驱动

5 与算法成为好朋友的七个要点

5.1 算法中解决问题的步骤是明确且有限的

5.2 计算机不靠直觉而是机械地解决问题

  1. 计算机只负责算,不会动任何脑筋;
  2. 要求步骤可以直接转化为代码。
  3. 实例:求最大公约数–>辗转相除法
    代码实现:
def GCD_1(a, b):"""辗转相除法求a, b的最大公约数思路:用两个数中较大的数减去较小的数(步骤),重复上述步骤,直到两个数的值相等(步骤终止)。如果最终这两个数相同,那么这个数就是最大公约数。"""while a != b:if a > b:a -= belse:b -= areturn bdef GCD_2(a, b):"""辗转相除法求a, b的最大公约数思路:以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数。⒈ 令r为a/b所得余数(0≤r<b)若 r= 0,算法结束;b 即为答案。⒉ 互换:置 a←b,b←r,并返回第一步。"""while a != 0:a, b = b % a, areturn bif __name__ == '__main__':print("欢迎体验求解最大公约数")while True:a = int(input('请输入第一个数:'))b = int(input('请输入第二个数:'))# ans = GCD_1(a, b)ans = GCD_2(a, b)print(f'{a}和{b}的最大公约数为:{ans}')flag = input('请问还需要继续体验吗?如果继续,请输入"Y",否则输入"N":')while True:if flag in ['Y', 'N']:breakelse:flag = input('输入有误,如果继续,请输入"Y",否则输入"N":')if flag == 'Y':continueelse:break

【待思考讨论】GCD_1和GCD_2哪个更快?计算机是如何计算除法和乘法的?(参考B站计算机科学速成课40讲)

5.3 了解并应用典型算法

【主要的典型算法】

名称 用途
辗转相除法 求解最大公约数
埃拉托斯特尼筛法 判定素数
顺序查找 检索数据
二分查找 检索数据
哈希查找 检索数据
冒泡查找 数据排序
快速排序 数据排序

【先思考算法,再去应用典型算法】
例如:如何求解最小公倍数?
方法:用两个数的乘积除以这两个整数的最大公约数。这给我们启示,一定要先思考,然后再去应用典型算法。不是所有的业务场景都可以通过典型算法解决,但是,很多情况下都可以把业务归类到某个典型算法上加以解决!

5.4. 利用计算机的处理速度

  1. 案例一:判定素数
def is_prime_1(num):"""判断正整数num是否是素数思路:利用定义来判断。如果在2-num间,没有能被num整除的数,说明num素数"""for i in range(2, num):if num % i == 0:return Falsereturn Truedef is_prime_2(num):"""判断正整数num是否是素数思路:利用定义来判断。如果在2-sqrt(num)+1间,没有能被num整除的数,说明num素数"""n = int(num ** 0.5) + 1 # 保证能遍历到平方根,x^2 = num.for i in range(2, n):if num % i == 0:return Falsereturn Trueif __name__ == '__main__':print("欢迎体验判断一个正整数是否为素数")while True:num = int(input('请输入正整数:'))# ans = is_prime_1(num)ans = is_prime_2(num)print(f'{num}是一个素数:{ans}')flag = input('请问还需要继续体验吗?如果继续,请输入"Y",否则输入"N":')while True:if flag in ['Y', 'N']:breakelse:flag = input('输入有误,如果继续,请输入"Y",否则输入"N":')if flag == 'Y':continueelse:break
  1. 案例二:鸡兔同笼问题
def ji_tu(num, feet):"""求解鸡兔同笼问题"""flag = Falsefor x in range(1, num+1): # 鸡的数目for y in range(1, num+1): # 兔子的数目total_num = x + yfeet_num = 2*x + 4*yif total_num == num and feet_num == feet:print(f'符合要求的解是:鸡有:{x}只,兔子有:{y}只!')flag = Trueif not flag:print('没有找到符合要求的解!')if __name__ == '__main__':num = int(input('请输入鸡和兔子的总数:'))feet = int(input('请输入鸡和兔子的总计脚数:'))ji_tu(num, feet)

5.5. 使用编程技巧提升程序执行速度

编程中加入一些技巧,在处理大数据时,可以极大的缩短处理时间。比如判断素数,用待判定的数除以小于等于它的平方根的所有正整数,处理时间就会缩短。
【经典案例】
哨兵法:多用在线性搜索等算法中。通过哨兵,可以减少不必要的处理。见下图,哨兵法非常的巧妙!

5.6. 找出数字间的规律

所有的信息都可以用数字表示,因此为了构造算法,经常会利用到存在于数字间的规律。
经典例子:判定石头剪刀布游戏胜负的算法
如果把石头、剪刀、布分别用数字0、1、2表示,把玩家A做出的手势用变量A表示,玩家B做出的手势用变量B表示,那么变量A和B所存储的值就是这三个数中的某一个。请以此判断玩家A和B的输赢。
算法一:枚举法,那么需要枚举3X3 = 9种组合
代码实现

def game_1(A, B):"""判定石头剪刀布游戏获胜"""if (A == 0) and (B == 0):print('平局')elif (A == 0) and (B == 1):print('玩家A获胜')elif (A == 0) and (B == 2):print('玩家B获胜')elif (A == 1) and (B == 0):print('玩家B获胜')elif (A == 1) and (B == 1):print('平局')elif (A == 1) and (B == 2):print('玩家A获胜')elif (A == 2) and (B == 0):print('玩家A获胜')elif (A == 2) and (B == 1):print('玩家B获胜')elif (A == 2) and (B == 2):print('平局')else:print('输入有误')if __name__ == '__main__':print('欢迎来到猜拳游戏T_T')while True:A = int(input('请输入A玩家的手势,0、1、2分别代表石头、剪刀、布:'))B = int(input('请输入B玩家的手势,0、1、2分别代表石头、剪刀、布:'))game_1(A, B)flag = input('是否继续游戏?是请输入"Y",否请输入"N":')while True:if flag in ['Y', 'N']:breakelse:flag = input('输入有误,如果继续,请输入"Y",否则输入"N":')if flag == 'Y':continueelse:break

可以看到上面这种方法代码非常长而且枯燥,因此我们可以加入一些技巧,通过数字的规律来简单判断胜者。规律如下:

  1. 如果变量A和B相等就是平局。
  2. 如果B+1除以3得到的余数与变量A相等就是“玩家B获胜”。
  3. 其余情况都是“玩家A获胜”。
    代码实现:
def game_2(A, B):"""优化后猜拳游戏"""if A == B:print('平局')elif (B + 1) % 3 == A:print('玩家B获胜')else:print('玩家A获胜')if __name__ == '__main__':print('欢迎来到猜拳游戏T_T')while True:A = int(input('请输入A玩家的手势,0、1、2分别代表石头、剪刀、布:'))B = int(input('请输入B玩家的手势,0、1、2分别代表石头、剪刀、布:'))# game_1(A, B)game_2(A, B)flag = input('是否继续游戏?是请输入"Y",否请输入"N":')while True:if flag in ['Y', 'N']:breakelse:flag = input('输入有误,如果继续,请输入"Y",否则输入"N":')if flag == 'Y':continueelse:break

5.7. 先在纸上思考算法

拿到题目现在纸上用文字或者图来描述解决问题的步骤,而不要立刻开始编写代码。

6 与数据结构成为好朋友的七个要点

  1. 了解内存和变量的关系
  2. 了解作为数据结构基础的数组
  3. 了解数组的应用——作为典型算法的数据结构
  4. 了解并掌握典型数据结构的类型和概念
  5. 了解栈和队列的实现方法
  6. 了解结构体的组成
  7. 了解链表和二叉树的实现方法

7 成为会面向对象编程的程序员吧

  1. 面向对象编程
  2. 对OOP的多种理解方法
  3. 观点1:面向对象编程通过把组件拼接到一起构建程序
  4. 观点2:面向对象编程能够提升提升程序的开发效率和可维护性
  5. 观点3:面向对象编程是适用于大型程序的开发方法
  6. 观点4:面向对象编程就是在为现实世界建模
  7. 观点5:面向编程可以借助UML设计程序
  8. 观点6:面向对象编程通过在对象间传递消息驱动程序
  9. 观点7:在面向对象编程中使用继承、封装和多态
  10. 类和对象的区别
  11. 类的三种使用方法
  12. 在Java和.NET中有关OOP的知识不能少

8 一用就会的数据库

数据库是数据的基地
数据文件、DBMS和数据库应用程序
设计数据库
通过拆表和整理数据实现规范化
用主键和外键建立关系
索引能够提升数据检索速度
设计用户界面
向DBMS发送CRUD操作的SQL语句
事务控制也可以交给DBMS处理

9 通过七个简单的实验理解TCP/IP网络

实验1:查看网卡的MAC地址
通过win+R打开运行搜索框,然后输入cmd,在cmd中输入命令:ipconfig /all。
实验2:查看计算机的IP地址
cmd中输入:ipconfig /all。
实验3:了解DHCP服务器的作用
实验4:路由器是数据传输过程中的指路人
cmd中输入:route print。
实验5:查看路由器的路由过程
cmd中输入:tracert www.baidu.com
实验6:DNS服务器可以把主机解析成IP地址
cmd中输入:nslookup–>用于查看DNS服务器
实验7:查看IP地址和MAC地址的对应关系
cmd中输入:arp -a
TCP的作用及TCP/IP网络的层级模式

10 试着加密数据吧

错开字符编码的加密方式
秘钥越长,解密越困难
适用于互联网的公开秘钥加密技术
数字签名可以证明数据的发送者是谁

11 XML究竟是什么

XML是可扩展的标记语言
XML是元语言
XML可以为信息赋予意义
XML是通用的数据交换格式
可以为XML标签设定命名空间
可以严格定义XML的文档结构
用于解析XML的组件
XML可用于各种各样的领域

12 SE负责监管计算机系统的构建

SE是自始至终参与系统开发过程的工程师
SE未必担任过程序员
系统开发过程的规范
各个阶段的工作内容及文档
所谓设计,就是拆解
面向对象法简化了系统维护工作
技术能力和沟通能力
IT不等于引进计算机
计算机系统的成功与失败
大幅提升设备利用率的多机备份

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!

《计算机是怎样跑起来的》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务
  2. matlab if语句多个执行举例,初学Matlab,有两个语句,if语句和switch语句,有两个例子哪位大神能帮我讲讲...
  3. Java 序列化的一些简 单总结
  4. 【玩转cocos2d-x之三十七】粒子系统的加载优化
  5. 《Python编程从入门到实践》第9章类动手试一试答案(附代码)
  6. mysql查询包含字符串的记录,MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法...
  7. golang使用redis——redigo安装
  8. 【CV学习笔记】图像的计算
  9. 学习一种新编程语言要做的14个练习
  10. 卸载Notepad++
  11. 【正点原子MP157连载】第十三章 外部中断实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  12. 京东线报接口 全网一手线报全网(京东,淘宝,天猫)最全优惠信息
  13. KataGo线程/权重/显卡
  14. 梯形图请用c语言,简单使用C语言写梯形图精简V2.0.pdf
  15. 用c语言验证欧拉定理,欧拉定理_欧拉定理的意义
  16. 使用Qt学习C语言编程2(加入工具链)
  17. java窗体 个人信心_帮忙写下代码java swing,个人信息实例
  18. java有关物流管理的简历_谁能给我提供一份物流管理专业毕业生的个人模范简历...
  19. FEBE恢复Firefox配置方法[Z]
  20. DC中wire_load_model与wire_load_mode

热门文章

  1. java 注解传值_java注解 - Mr.yang.localhost - 博客园
  2. 甲骨文中间件与主数据管理平台
  3. web前端关于浏览器兼容性
  4. 引用 神奇的象数疗法
  5. 流行音乐网站 /音乐网站
  6. 基于OpenGL的雷达P显的系统设计与仿真 PPI_雷达仿真_雷达模拟器_雷达目标_雷达ppi_PPI显示器_源码
  7. c语言case2什么意思,switchCase2
  8. 电竞级还带主动降噪,莱仕达X2无线蓝牙耳机实测,品控值得安利
  9. 【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机
  10. mysqli mysql assoc_mysqli_fetch_assoc()期望参数1为mysqli_result或如何获取MySQLi