计算机是怎样跑起来的-终极浓缩篇
🖥️ 计算机的三大原则
1.1 计算机的三个根本性基础
计算机的三大原则:
计算机是执行输入、运算、输出的机器。
程序是指令和数据的集合。
计算机的处理方式有时与人们的思维习惯不同。
计算机由硬件和软件组成。硬件可以看作是“硬的东西”,如计算机主机、显示器、键盘等;而软件则是计算机所执行的程序,即指令和数据。计算机的处理方式往往不符合人们的思维习惯,这一特性非常重要。
1.2 输入、运算、输出是硬件的基础
从硬件的角度来看,计算机主要执行三种操作:
输入:将数据输入到计算机中。
运算:对输入的数据进行计算。
输出:将计算结果输出。
计算机的硬件由大量集成电路(IC,Integrated Circuit)组成。每个IC都有输入和输出引脚,负责接收输入数据并输出运算结果。无论计算机执行多么复杂的任务,基本上都是通过这三种操作的组合来实现的。
操作 描述
输入 将数据输入到计算机中
运算 对输入的数据进行计算
输出 将计算结果输出
重要性
输入是必不可少的,计算机无法在没有输入信息的情况下工作。
运算是计算机的核心功能,没有运算就没有计算机的存在意义。
输出是获取结果的必要步骤,缺乏输出则无法实现计算机的功能。
1.3 软件是指令和数据的集合
程序的核心是指令和数据的集合:
指令:控制计算机进行输入、运算和输出的命令。
数据:程序所需处理的信息。
所有复杂的程序最终都可以简化为一系列的指令和数据。
💻 计算机基本原理
- 输入、运算与输出
“这里成套出现的输入、运算、输出,就是之前在硬件的基础一节中说明过的流程。”
输入:向计算机发出的指令。
运算:计算机硬件上的行为。
输出:指令执行后的结果。
2. 程序的基本构成
在程序设计中,指令可以被称为:
函数
语句
方法
子例程
子程序
“笔者推荐称之为函数,因为这个名字通俗易懂。”
- 数据与变量
程序中的数据分为两类:
数据类型 描述
输入数据 作为指令执行对象的数据
输出数据 从指令的执行结果得到的数据
变量:程序员为数据赋予的名字。
示例:
数学中函数的表示方法:
KaTeX can only parse string typed expression
y=f(x)
编程语言中的语法示例:output = operate(input)
4. 程序是指令和数据的集合
C语言程序示例
c
Copy
int a, b, c;
a = 10;
b = 20;
c = Average(a, b);
int:表示整数类型。
=:赋值操作符。
Average:返回两个参数的平均值的函数。
编译与执行
编译:将源文件转换为机器语言。
生成的可执行文件只包含指令和数据的数值罗列。
5. 对计算机来说,所有信息都是数字
“计算机只不过是为我们处理特定工作的机器。”
计算机处理方式
使用数字表示所有信息,如颜色和字符编码。
示例:
蓝色:0,0,255
红色:255,0,0
数字与计算机的关系
所有信息在计算机中表现为数字,包括文件句柄、公钥和私钥等。
- 计算机的进化
进化方向
使计算机的处理方式更加贴近人类的思维习惯。
示例:
从键盘到鼠标的输入设备演变。
2D游戏向3D游戏的转变。
编程方法的演化
编程方法 描述
面向组件编程 通过将组件(程序的零件)组装到一起完成程序。
面向对象编程 先对现实世界的业务建模,再把模型搬到程序中。
7. 计算机硬件的组成要素
计算机主要由以下元件组成:
元件 描述
CPU 计算机的大脑
内存 存储指令和数据
I/O 负责输入和输出
示例:
CPU(处理器): Pentium。
内存:32MB或256MB。
I/O:连接周边设备。
8. 时钟信号
时钟信号用于驱动CPU运转,频率衡量CPU的运转速度。
时钟信号示例:
电压 描述
+5V 高电压
0V 低电压
9. 预习第2章
初级问题
CPU是什么的缩写?
答:Central Processing Unit(中央处理器)。
中级问题
Hz是表示什么的单位?
答:频率的单位。
高级问题
Z80 CPU是多少比特的CPU?
答:8比特的CPU。
10. 制作微型计算机所需的元件
制作微型计算机的基础元件包括:
CPU:Z80 CPU。
内存:TC5517,存储2K的8比特数据。
I/O:Z80 PIO,负责并行输入输出。
辅助元件:
时钟发生器:产生时钟信号,以驱动CPU运转。
输入装置:如指拨开关。
输出装置:如LED(发光二极管)。
元件类型 描述
时钟发生器 产生时钟信号,频率为2.5MHz。
指拨开关 输入程序的装置。
LED 输出程序执行结果的装置。
🖥️ 制作微型计算机
- 微型计算机的电源需求
“要让微型计算机运转起来,5V(伏特)的直流电源是必不可少的。”
使用“开关式稳压电源”将220V的交流电变为5V的直流电。
2. 制作微型计算机的元件列表
元件名称 数量 电路图符号 说明
Z80 CPU 1 CPU 8比特CPU
TC5517 1 内存 8比特×2K
Z80 PIO 1 I/O 8比特×2个并口I/O
74367 4 三态总线缓冲器
7404 2 六反相器
时钟发生器 1 2.5MHz
指拨开关(DIP switch) 3 用于切换开/关状态(8比特)
按键开关(Push switch) 2 平时处于关的状态,按下后电路连通
快动开关(Snap switch) 2 用于切换开/关状态
集成电阻 3 4.7kΩ×8个(1/4W)
集成电阻 1 330Ω×8个(1/4W)
电阻 6 4.7kΩ(1/4W)
电阻 1 330Ω(1/4W)
电容 1 10μF(25V)
LED 8 颜色任意
3. 电路图的读法
电路连接方式
在电路图中,用连接着各种元件符号的直线表示如何布线。
若电路交叉处没有小黑点,则不构成通路。
电源的表示方法
电压 说明
+5V 连接到+5V的线
0V 连接到0V的线
4. 连接电源、数据和地址总线
连接电源:
将+5V电源连接到Z80 CPU、TC5517、Z80 PIO的Vcc引脚。
将0V电源连接到各个IC的GND引脚。
CPU与内存连接
Z80 CPU的地址总线引脚(A0~A15)可指定65536个数据存取单元。
5. 连接I/O
Z80 PIO结构
Z80 PIO有4个寄存器,用于设定功能和存储输入输出数据。
端口A和端口B最多可连接2个外部设备。
6. 连接时钟信号
将时钟发生器的8号引脚连接到Z80 CPU和Z80 PIO的CLK引脚。
7. 控制引脚的连接
内存与I/O的区分
引脚名称 说明
MREQ 内存请求引脚
IORQ I/O请求引脚
当需要向内存或I/O进行数据输入输出时,通过MREQ和IORQ引脚进行控制。
8. 连接剩余的控制引脚
将Z80 CPU的RD引脚与内存的RD引脚连接,WR引脚与内存的WE引脚连接,实现数据的读取和写入。
9. 连接外部设备,通过DMA输入程序
将两个指拨开关与TC5517的数据总线引脚和地址总线引脚连接。
使用按键开关控制内存的写入。
三态总线缓冲器(74367)
74367用于在程序执行时将开关与电路隔离。
10. 总结
“计算机的工作原理非常简单。CPU在时钟信号的控制下执行内存中存储的程序,并进行数据的输入输出。”
IC类型 引脚名称 方向 作用
Z80 CPU A0~A15 输出 指定地址
D0~D7 输入输出 输入输出数据
RD 输出 读取数据
WR 输出 写入数据
TC5517 A0~A10 输入 指定地址
D0~D7 输入输出 输入输出数据
CE 输入 激活IC
Z80 PIO PA0~PA7 输入输出 从外部设备读取或写入数据
🔌 连接外部设备
输入输出设备连接
“微型计算机运行起来后,指拨开关可用于从外部输入数据,LED 可用于向外部输出数据。”
指拨开关连接至 Z80 PIO 的 PA0~PA7 引脚。
LED 通过电阻连接到 +5V,输入 0V 点亮 LED,输入 +5V 关闭 LED。
连接示意图
设备 连接方式
指拨开关 连接到 Z80 PIO 的 PA0~PA7 引脚
LED 通过电阻连接到 +5V,并连接到 Z80 PIO 的 PB0~PB7 引脚
7404 反相器
“末端带有一个小圆圈的三角形符号表示反相器,作用是将左侧输入的电信号反转后输出。”
当 Z80 PIO 的 PB0~PB7 引脚值为 0 时,LED 熄灭;值为 1 时,LED 点亮。
输入测试程序与调试
“尽管硬件组装好了,但若没有输入软件,计算机还是不能工作的。”
编写测试程序
只能使用 机器语言(原生代码)进行编程。
代码示例(机器语言)如下:
text
Copy
地址 程序
00000000 00111110
00000001 11001111
00000010 11010011
00000011 00000010
00000100 00111110
00000101 11111111
00000110 11010011
00000111 00000010
00001000 00111110
00001001 11001111
00001010 11010011
00001011 00000011
00001100 00111110
00001101 00000000
00001110 11010011
00001111 00000011
00010000 11011011
00010001 00000000
00010010 11010011
00010011 00000001
00010100 11000011
00010101 00010000
00010110 00000000
输入程序步骤
按下 Z80 CPU 上的 DMA 请求开关。
使用指拨开关输入程序,逐行输入至内存。
重置 CPU 并开始执行程序。
运行微型计算机
“程序一旦运行起来,就可以用用于输入数据的指拨开关控制 LED 的亮与灭。”
LED 状态将随指拨开关的拨动而变化。
机器语言与汇编语言
机器语言
由二进制数字构成,CPU 可直接解释执行。
每条指令对应特定的操作。
汇编语言
使用助记符来表示机器语言指令。
示例代码:
text
Copy
标签 操作码 操作数
LD A, 207
OUT (2), A
LD A, 255
OUT (2), A
LD A, 207
OUT (3), A
LD A, 0
OUT (3), A
LOOP: IN A, (0)
OUT (1), A
JP LOOP
Z80 CPU 的寄存器结构
寄存器概述
A、B、C、D 等寄存器用于存储数据和运算。
PC(程序指针) 存储下一个要执行的指令地址。
寄存器功能
寄存器 功能
A 累加器,运算的核心
F 标志寄存器,存储运算结果的状态
PC 程序指针,指向下一条将要执行的指令的地址
SP 栈顶指针,管理栈的数据存储区域
重要概念
机器语言:处理器可以直接理解的编程语言。
汇编语言:使用助记符表示的机器语言,便于理解和编写。
手工汇编:将汇编语言转换为机器语言的过程。
🖥️ Z80 CPU 的 I/O 端口编程
“本节主要讲解 Z80 CPU 的 I/O 端口编程,包括如何设定端口模式、数据输入输出以及程序的运行过程。”
- 端口设定
1.1 端口 A 的输入输出模式设置
代码示例:
assembly
Copy
LD A, 207
OUT (2), A
LD A, 255
OUT (2), A
说明:
指令 LD A, 207 将数字 207 读入寄存器 A。
OUT (2), A 将寄存器 A 中的值输出到 I/O 地址为 2 的端口 A 控制寄存器。
LD A, 255 之后再输出,表示将端口 A 设定为输入模式。
1.2 端口 B 的输入输出模式设置
代码示例:
assembly
Copy
LD A, 207
OUT (3), A
LD A, 0
OUT (3), A
说明:
通过指令将 207 写入到端口 B 控制寄存器(I/O 地址为 3),接着写入 0,表示将端口 B 设定为输出模式。
2. 数据输入输出
2.1 循环读取数据
代码示例:
assembly
Copy
LOOP: IN A, (0)
OUT (1), A
JP LOOP
说明:
IN A, (0) 从端口 A 数据寄存器读取数据到寄存器 A。
OUT (1), A 将寄存器 A 的值输出到端口 B 数据寄存器。
JP LOOP 实现循环,程序将不断读取和输出数据。
3. 程序执行过程追踪
3.1 从汇编语言到机器语言
说明:
汇编语言程序需转换为机器语言才能运行,机器语言是 CPU 可直接理解的语言。
3.2 执行过程
示例流程:
CPU 从内存地址 0 开始读取指令。
解释并执行指令后,更新程序计数器 (PC)。
重复读取、解释、执行,直到程序结束。
3.3 机器语言与汇编语言对应关系
地址 汇编语言 机器语言
00000000 LD A, 207 00111110 11001111
00000010 OUT (2), A 11010011 00000010
00000100 LD A, 255 00111110 11111111
00000110 OUT (2), A 11010011 00000010
00001000 LD A, 207 00111110 11001111
00001010 OUT (3), A 11010011 00000011
00001100 LD A, 0 00111110 00000000
00001110 OUT (3), A 11010011 00000011
00010000 IN A, (0) 11011011 00000000
00010010 OUT (1), A 11010011 00000001
00010100 JP LOOP 11000011 00010000 00000000
4. 手工汇编
4.1 助记符与机器语言转换
助记符 机器语言 时钟周期数
LD A, num 00111110 num 7
OUT (num), A 11010011 num 11
IN A, (num) 11011011 num 11
JP num 11000011 num 10
说明:
手工汇编指的是将汇编语言逐行转换为机器语言。
需要参考助记符与其对应的机器语言以及执行时钟周期数。
5. 程序执行时间估算
估算方法:
统计每条指令的时钟周期数并累加。
使用频率计算总执行时间。
示例计算:
假设程序执行了 8 条指令,总时钟周期 = 72。
每个时钟周期 = (0.0000004) 秒。
程序总执行时间 = (72 \cdot 0.4) 微秒 = 28.8 微秒。
6. 总结
汇编语言操作简单但冗长,适合学习计算机底层工作原理。
本节涵盖了 Z80 CPU 的 I/O 编程、数据处理及执行过程的详细介绍。
🖥️ 手势游戏程序设计
📜 程序流程概述
变量初始化
手势变量:用于表示玩家和计算机的手势。
随机数种子:初始化随机数生成器,以确保每次运行程序时生成不同的随机数。
程序启动
显示程序启动信息。
玩家输入
让玩家输入其选择的手势。
计算机手势生成
使用随机数决定计算机的手势。
比赛提示
生成并显示双方出的手势的字符串。
比赛结果处理
玩家获胜:
显示“玩家获胜!”的信息。
增加玩家获胜次数的计数器。
显示玩家的获胜次数。
计算机获胜:
显示“计算机获胜!”的信息。
平局判断:
判断是否是平局。
判断玩家是否获胜。
比赛轮次
判断是否已经进行了5轮比试。
平局处理
如果是平局,显示“平局!”的信息。
📊 流程图的作用
“流程图是一种方便的工具,它并不依赖于特定的编程语言,可以将流程图转换为多种编程语言的程序。”
流程图提供图形化的方式来表示程序的逻辑流程。
通过流程图,程序员可以更清晰地思考程序的结构和逻辑。
基础流程图符号
符号 含义
开始/结束 表示流程的开始和结束
处理步骤 表示程序的处理步骤
条件分支 表示条件判断
🔄 循环结构的表示
“帽子和短裤”符号
用于表示循环的流程图符号。
帽子形状:表示重复执行的处理步骤。
短裤形状:表示具体的处理步骤。
💻 结构化程序设计
“结构化程序设计是一种编程风格,旨在用顺序执行、条件分支和循环来表示程序的流程,而不使用跳转指令。”
使用结构化程序设计可以使程序逻辑更加清晰,降低复杂性。
代码示例
vb
Copy
’ 进行5轮比试
For i = 1 To 5
’ 处理步骤
…
Next
📈 条件分支
在VBScript中,使用 If…ElseIf…Else 结构表示条件分支。
代码示例
vb
Copy
’ 判定胜负,显示结果
If use = computer Then
MsgBox s & “… 平局!”
ElseIf computer = (user + 1) Mod 3 Then
MsgBox s & “… 玩家获胜!”
wins = wins + 1
Else
MsgBox s & “… 计算机获胜!”
End If
🤖 中断处理与事件驱动
中断处理:计算机使程序的流程突然跳转到特定位置。
事件驱动:程序员用事件驱动的方式编写GUI应用程序,程序根据用户操作(如点击鼠标或按键)做出相应。
事件驱动示例
Windows 应用程序在用户操作时通过 WndProc() 函数响应事件。
📊 状态转化图
状态转化图用于表示应用程序中不同状态之间的转化过程。
方便表示状态转化和事件之间的关系。
状态转化表示例
状态/状态转化的原因 按下数字键 按下“=”键 按下运算符号键
显示计算结果 (2) (1) (3)
显示第一个输入的数 (2) (1) (3)
显示第二个输入的数 (3) (1) (3)
通过以上内容,学生应能理解手势游戏程序的设计逻辑及流程图、循环结构、条件分支、结构化程序设计和事件驱动的基本概念。
🤖 与算法成为好朋友的七个要点
📖 算法的基础知识
初级问题
算法(Algorithm)翻译成中文是“算法”。
中级问题
辗转相除法(Euclidean Algorithm)是用于计算最大公约数的算法。
高级问题
哨兵(Sentinel)指的是一种含有特殊值的数据,可用于标识数据的结尾等。
🧩 算法的定义
算法是解决问题的步骤,必须是明确且有限的。
算法被定义为“被明确定义的有限个规则的集合,用于根据有限的步骤解决问题。”
示例:求最大公约数
最大公约数是指两个整数的公共约数中最大的数。
🔍 计算机的特性与算法
要点1:步骤的明确性
算法中的每一步都必须是明确的,不可依赖直觉。比如,找最大公约数的方法需要明确的步骤和终止条件。
要点2:计算机的机械性
计算机通过机械的步骤解决问题,无法依赖直觉,算法必须是典型的、机械的。
辗转相除法示例
使用除法运算和减法运算求解最大公约数的步骤。
vbscript
Copy
a = 12
b = 42
While a <> b
If a > b Then
a = a - b
Else
b = b - a
End If
Wend
MsgBox “最大公约数为” & CStr(b) & “。”
📘 典型算法的应用
要点3:了解并应用典型算法
典型算法包括:
名称 用途
辗转相除法 求解最大公约数
埃拉托斯特尼筛法 判定素数
顺序查找 检索数据
二分查找 检索数据
冒泡排序 数据排序
快速排序 数据排序
⚡ 利用计算机的处理速度
要点4:计算速度的利用
在算法设计时应考虑计算机的处理速度。复杂计算可以通过简单的步骤迅速完成。
示例:鸡兔同笼问题
vbscript
Copy
For x = 0 To 10
For y = 0 To 10
a = x + y
b = 2 * x + 4 * y
If (a = 10) And (b = 32) Then
MsgBox "鸡 = " & CStr(x) & ",兔子 = " & CStr(y)
End If
Next
Next
🚀 编程技巧提升效率
要点5:使用编程技巧提升速度
通过优化算法可以提升程序的执行速度。例如,减少不必要的检查步骤。
哨兵的使用
哨兵技术可用于线性搜索中,通过在数据末尾添加特殊值来简化查找过程。
🔢 数字间的规律
要点6:找出数字规律
所有信息均可用数字表示,识别数字间的规律是构造算法的关键。
示例:石头剪刀布
vbscript
Copy
If A = B Then
MsgBox “平局”
ElseIf A = (B + 1) Mod 3 Then
MsgBox “玩家B 获胜”
Else
MsgBox “玩家A 获胜”
End If
✍️ 算法设计的准备
要点7:先在纸上考虑算法
在编写代码前,先用文字或图表描述解决问题的步骤,确保步骤明确且有限。
通过以上七个要点,我们可以更好地理解与算法的关系,提高编程能力和解决问题的效率。
🗃️ 数据结构基础
- 数据存储方式
变量与内存
“变量中所存储的数据是可以改变的。变量的实质是按照变量所存储数据的大小被分配到的一块内存空间。”
内存:计算机处理的数据存储在内存(IC,集成电路)中,内存被分割成多个数据存储单元,每个单元可存储8比特的数据(1字节)。
地址:每个内存单元分配一个编号,称为“地址”。
数组的概念
“使用了数组就可以高效地处理大量的数据。数组的实质是连续分配的一块特定大小的内存空间。”
数组(Array):用于存储多个数据,能够提高程序的编写效率。通过指定数组名和包含的元素个数来定义。
概念 描述
变量 存储单一数据,内存地址可变
数组 存储多个数据,内存连续分配
2. 栈与队列
栈(Stack)
“LIFO(Last In First Out,后进先出)表示优先读取后存入的数据。”
特点:数据的存取方式是后进先出,即最后存入的数据最先取出。
队列(Queue)
“FIFO(First In First Out,先进先出)表示优先读取先存入的数据。”
特点:数据的存取方式是先进先出,即最先存入的数据最先取出。
数据结构 存取方式 示例
栈 LIFO 像堆积的干草
队列 FIFO 排队购票的乘客
3. 典型数据结构
数组的应用
线性搜索:用于在数组中查找特定数据。
冒泡排序:用于对数组中的数据进行排序。
代码示例:线性搜索
c
Copy
for (i = 0; i < 1000; i++){
if (x[i] == 777){
printf(" 找到777 了!");
}
}
代码示例:冒泡排序
c
Copy
for (i = 0; i < 999; i++){
for (j = 999; j > i; j–){
if (xj−1j-1j−1 > x[j]){
tmp = xj−1j-1j−1;
xj−1j-1j−1 = x[j];
x[j] = tmp;
}
}
}
4. 数据结构的类型和概念
数据结构名称 特征
栈 像小山一样堆积数据
队列 数据排成一队
链表 可任意改变数据的排列顺序
二叉树 数据分为两路排列
结构体的组成
“结构体就是把若干个数据项汇集到一处并赋予其名字后所形成的一个整体。”
结构体示例:
c
Copy
struct TestResult{
char Chinese; /* 语文成绩 /
char Math; / 数学成绩 /
char English; / 英语成绩 /
};
5. 栈和队列的实现方法
栈的实现
数组:作为栈的基础,定义栈顶指针。
函数:入栈和出栈函数,用于数据的存取。
代码示例:栈的实现
c
Copy
char Stack[100]; / 作为栈本质的数组 /
char StackPointer = 0; / 栈顶指针 /
/ 入栈函数 /
void Push(char Data){
Stack[StackPointer] = Data;
StackPointer++;
}
/ 出栈函数 /
char Pop(){
StackPointer–;
return Stack[StackPointer];
}
队列的实现
数组:作为队列的基础,定义两个索引变量(存储位置和读取位置)。
函数:入队和出队函数。
代码示例:队列的实现
c
Copy
char Queue[100]; / 作为队列本质的数组 /
char SetIndex = 0; / 存储位置的索引 /
char GetIndex = 0; / 读取位置的索引 /
/ 存储数据的函数 /
void Set(char Data){
Queue[SetIndex] = Data;
SetIndex++;
if (SetIndex >= 100){
SetIndex = 0;
}
}
/ 读取数据的函数 */
char Get(){
char Data;
Data = Queue[GetIndex];
GetIndex++;
if (GetIndex >= 100){
GetIndex = 0;
}
return Data;
}
通过以上内容,学生能够理解数据结构的基本概念、类型及其实现方法,掌握编写相关程序的基础知识。
📚 链表与二叉树的实现方法
结构体与指针的定义
自我引用结构体
自我引用结构体是一种结构体,其中包含一个指向自身类型的指针成员。
在本节中,我们使用结构体数组来实现链表。链表是一种数据结构,其中每个元素通过指针相连。为了实现这一点,我们在结构体 TestResult 中添加了一个指针成员,代码如下:
c
Copy
struct TestResult{
char Chinese; /* 语文成绩 /
char Math; / 数学成绩 /
char English; / 英语成绩 /
struct TestResult Ptr; /* 指向其他元素的指针 */
};
指针的概念
在 C 语言中,存储地址的变量被称为指针。指针的符号是 *(星号)。
在结构体 TestResult 中,成员 Ptr 是 TestResult 类型的指针,表示指向数组中另一个元素的地址。
链表的初始状态
在链表的初始状态中,元素的排列顺序与其在内存中的物理排列顺序相同。每个元素包含一个学生的三门成绩和一个指针 Ptr,该指针存储下一个元素的地址。
地址 成员 指针
元素A的地址 Chinese, Math, English Ptr = 元素B的地址
元素B的地址 Chinese, Math, English Ptr = 元素C的地址
元素C的地址 Chinese, Math, English Ptr = 无
链表的动态排序
通过改变指针 Ptr 的值,可以改变元素的排序,而无需移动元素在内存中的物理位置。例如,如果将元素 A 的 Ptr 改为指向元素 C,而将元素 C 的 Ptr 改为指向元素 B,链表的顺序将变为 A → C → B。
地址 成员 指针
元素A的地址 Chinese, Math, English Ptr = 元素C的地址
元素B的地址 Chinese, Math, English Ptr = 无
元素C的地址 Chinese, Math, English Ptr = 元素B的地址
链表的优势
链表的优势在于:
高效的排序:只需更改指针的值,而无需在内存中移动大量数据。
快速的删除和插入:元素的删除和插入操作只需修改指针。
在实际应用中,链表被广泛使用来处理大量数据,不使用链表的情况相对较少。
二叉树的实现
在二叉树的实现中,使用自我引用的结构体,但需要包含两个指针成员,代码如下:
c
Copy
struct TestResult{
char Chinese; /* 语文成绩 /
char Math; / 数学成绩 /
char English; / 英语成绩 /
struct TestResult Ptr1; /* 指向其他元素的指针1 /
struct TestResult Ptr2; /* 指向其他元素的指针2 */
};
二叉树的搜索优势
二叉树多用于搜索算法,如二分查找法。与简单数组的线性搜索不同,二叉树通过分支结构可以更快速地找到目标数据。
地址 成员 指针
根元素 Chinese, Math, English Ptr1=A结点, Ptr2=B结点
A结点 Chinese, Math, English Ptr1=无, Ptr2=无
B结点 Chinese, Math, English Ptr1=无, Ptr2=无
C结点 Chinese, Math, English Ptr1=C结点, Ptr2=D结点
E结点 Chinese, Math, English Ptr1=无, Ptr2=无
通过这种结构,搜索复杂度显著降低,提升了效率。
总结
在 C 语言中,结构体、指针及自我引用结构体是学习数据结构的基础。理解链表和二叉树的实现方法将有助于更好地掌握数据结构的概念与应用。
📊 UML 图与面向对象编程
UML 图的种类
“UML(统一建模语言)被广泛应用于绘制面向对象编程的设计图。”
UML 图的九种类型
UML 包含九种图,每种图都有其特定的作用。尽管记忆起来可能困难,但通过理解这些图的功能,可以帮助你从宏观的角度把握面向对象编程的思想。这些图包括:
图的类型 描述
类图 显示类及其属性和方法
时序图 显示对象间的消息传递和时间顺序
协作图 展示对象间的协作关系
用例图 描述系统的功能及其与用户的交互
状态图 展示对象的状态变化
活动图 描述工作流或业务流程
组件图 显示系统的组件及其相互关系
部署图 描述系统的物理部署结构
包图 展示系统的包结构及其依赖关系
面向对象编程的设计原则
观点:通过消息传递驱动程序
在面向对象编程(Object Oriented Programming,OOP)中,程序的设计应该从识别所需的类开始,然后在每个类中列出该类应该具有的函数和变量。这种方法与传统开发方法相对,后者是先考虑功能和数据,再确定函数和变量。
设计方法 面向对象编程 传统开发方法
关注点 类和对象 函数和数据
设计顺序 确定类 → 列出属性和方法 确定功能和数据 → 设计函数和变量
示例:剪刀石头布游戏
在进行剪刀石头布游戏的程序设计中,使用 C 语言和 C++ 的代码展示了面向对象和非面向对象编程的区别。
C 语言示例(非面向对象):
c
Copy
/* 玩家A 确定手势 /
a = GetHand();
/ 玩家B 确定手势 /
b = GetHand();
/ 判定胜负 */
winner = GetWinner(a, b);
C++ 示例(面向对象):
cpp
Copy
// 玩家A 确定手势
a = PlayerA.GetHand();
// 玩家B 确定手势
b = PlayerB.GetHand();
// 由裁判判定胜负
winner = Judge.GetWinner(a, b);
从中可以看出,C++ 通过对象调用方法的方式,体现了面向对象编程的思想。
面向对象编程的基本特性
继承、封装和多态
面向对象编程有三个基本特性:
继承(Inheritance):通过继承已存在的类生成新类。
封装(Encapsulation):隐藏不必要展现给调用者的类成员。
多态(Polymorphism):同一消息可以被不同对象以不同方式处理。
这三种特性使得程序的维护和扩展变得更加高效。
特性 描述
继承 修改父类后,所有子类会自动获得更改
封装 隐藏不必要的实现细节,提供简易使用的接口
多态 相同的操作可以作用于不同的对象
类与对象的区别
类(Class)是对象的定义,而对象(Object)是类的实例。例如,类是做饼干的模具,而用这个模具做出来的饼干就是对象。创建对象后,才能使用类中定义的成员。
概念 描述
类 对象的定义
对象 类的实例,内存中的具体实现
类的使用方法
使用类有三种方法:
调用类的个别成员(函数和变量)。
在类的定义中包含其他类(组合)。
通过继承定义新的类。
这些方法的选择取决于目标类的性质和程序员的目的。
面向对象编程的实用性
面向对象编程是提升编程效率、写出易于维护的代码的有效方法。程序员需要理解并应用这些概念,以便在实际工作中更好地利用面向对象的特性。
Java 和 .NET 中的面向对象编程
Java 和 .NET 是未来开发环境中的主流技术,程序员需要掌握面向对象编程的相关知识以适应这些环境。这些技术通过隐藏操作系统的复杂性,提升了开发效率。
📊 设计数据库
- 数据库设计概述
在设计数据库之前,首先需要明确“你想要了解什么”的问题。设计者需要根据实际需求来确定所需的数据。
酒铺管理的示例数据
在酒铺管理的应用程序中,酒铺经营者需要了解以下数据:
数据项 描述
商品名称 商品的名称
单价 商品的价格(单位:日元)
销售量 商品的销售数量
顾客姓名 顾客的姓名
住址 顾客的住址
电话号码 顾客的电话号码
2. 数据属性和模式
在确定所需数据后,接下来要考虑各种数据的属性。属性也称作模式,具体包括以下内容:
数据类型:如数字或字符串
数字类型:整数或浮点小数
字符串长度:最多允许的字符数
NULL 值:是否允许未定义或不存在的值
几乎所有的数据库管理系统(DBMS)都提供可视化界面来设置数据属性。
- 创建表
在设置完数据属性后,可以创建表。表的名称可以任意命名。在本例中,暂命名为“酒铺表”。在关系型数据库中,表中的每行数据称为记录,每列数据项称为字段。
数据库术语
术语 描述
记录 表中的一行数据
字段 表中的一列数据
元组 记录的别称
属性 字段的别称
4. 数据库规范化
为了解决在使用单一表时可能出现的问题,如重复数据和不同名称指代同一商品,需要进行“规范化”。
规范化的步骤
将大表分割为多个小表
在小表之间建立关系
通过规范化,可以形成结构更加优良的数据库。DBMS 提供可视化工具来帮助用户进行规范化。
酒铺数据库的表分割
在酒铺数据库中,可以将数据分为以下三张表:
表名 描述
商品表 存储商品信息
顾客表 存储顾客信息
销售记录表 存储销售记录
5. 主键与外键
为了在表间建立关系,需要添加能够反映表与表之间关系的字段,这些字段称为键。
主键和外键的定义
主键(Primary Key):唯一标识表中记录的字段。
外键(Foreign Key):引用其他表主键的字段。
示例
在顾客表中添加“顾客ID”作为主键
在销售记录表中添加“顾客ID”和“商品ID”作为外键
表之间的关系使记录和记录之间关联起来。记录之间的关系类型包括一对一、一对多和多对多。
- 数据检索与索引
可以在表的字段上设置索引,以提升数据的检索速度。索引是提高检索速度的机制。
索引的作用
索引表:存储字段的值以及记录的位置。
查询时,DBMS 先在索引表中检索,然后根据位置信息获取完整记录。
设置索引的注意事项
并不是所有字段都需要设置索引。只有对频繁检索和排序的字段设置索引才是有效的。
- 用户界面设计
在完成数据库的设计后,可以进入编写数据库应用程序的阶段。设计系统时要优先设计数据库,然后再设计用户界面。
CRUD 操作
CRUD 操作指的是对记录的插入(CREATE)、获取(READ)、更新(UPDATE)和删除(DELETE)。
- SQL 语句与数据操作
向 DBMS 发送 CRUD 操作时使用 SQL 语言。SQL 语言的标准由国际标准化组织(ISO)制订,几乎所有 DBMS 都支持 SQL。
SQL 示例
以下是一个 SQL 查询的示例:
sql
Copy
SELECT 顾客姓名, 住址, 电话号码, 商品名称, 单价, 销售量
FROM 顾客表, 商品表, 销售记录表
WHERE 顾客表.顾客姓名 = “日经次郎”
AND 销售记录表.顾客ID = 顾客表.顾客ID
AND 销售记录表.商品ID = 商品表.商品ID;
9. 事务控制
事务由若干条 SQL 语句构成,表示对数据库一系列相关操作的集合。事务控制可以确保操作的原子性和一致性。
事务控制语句
BEGIN TRANSACTION:开启事务
COMMIT:提交事务
ROLLBACK:回滚事务
通过使用事务控制,可以有效防止数据不一致的问题。
🗃️ 事务控制与 DBMS
事务管理概述
“事务是数据库管理系统(DBMS)中用于管理数据操作的基本单元,确保数据一致性和完整性。”
事务的基本操作
事务控制可以通过 DBMS 处理,主要包括以下步骤:
开启事务:使用 BEGIN TRANSACTION 语句。
执行操作:如更新顾客账户的操作,使用 UPDATE 语句。
事务提交:使用 COMMIT 语句确认所有操作。
故障处理:如发生故障时,使用 ROLLBACK 语句撤销事务。
以下是事务处理的流程图示:
text
Copy
开启事务
↓
更新顾客A的账户
↓
更新顾客B的账户
↓
事务提交
↓
是否发生故障?
↓ ↓
是 否
↓ ↓
取消更新顾客A的账户 结束程序
↓
事务回滚
计算机与数据库的关系
“计算机是处理数据的工具,而数据库则是其核心组成部分。”
计算机的基本功能
计算机主要执行以下三种操作:
输入
计算
输出
因此,计算机在本质上是一个处理数据的装置,几乎所有应用程序中都在利用数据库。
数据库的重要性
了解数据库是学习计算机的基础,网络知识同样重要。接下来的章节将介绍与网络相关的内容。
编程语言推荐
在企业培训中,编程语言的选择至关重要。
新人编程语言的选择
Java:
近年来受欢迎,但不推荐作为第一门语言。
隐藏了算法和数据结构,适合有基础的程序员。
C 语言:
推荐的首选语言,能够帮助新人理解计算机构造和算法实现。
是 C++ 和 Java 的基础,学习 C 语言能更好地过渡到 Java。
Visual Basic:
用于快速让新人体会编程乐趣,适合短期培训。
可用于简单的业务程序,增加学习动机。
计算机基础知识的重要性
缺乏计算机基础知识的新人在学习编程时会遇到困难,了解计算机构造有助于他们更好地掌握编程。
TCP/IP 网络基础
“TCP/IP 是互联网中使用的标准协议,确保数据在网络中的传输。”
网络类型
LAN(局域网):小规模网络
WAN(广域网):大规模网络,如互联网
TCP/IP 协议族
TCP/IP 是传输控制协议(Transmission Control Protocol)和网际协议(Internet Protocol)的缩略语,是互联网的基础。
实验:查看 MAC 地址和 IP 地址
查看 MAC 地址:
使用命令:ipconfig /all,在输出中找到 Physical Address。
查看 IP 地址:
同样使用命令:ipconfig /all,在输出中找到 IP Address。
DHCP 服务器的作用
DHCP(动态主机配置协议)用于自动分配 IP 地址和子网掩码,简化网络管理。
路由器的功能
路由器作为数据传输的指路人,连接不同的 LAN,并根据路由表将数据发送到正确的目的地。
路由表
路由表记录了数据传输的路径信息,确保数据能够高效传递到目标地址。
列名 内容说明
Network Destination 数据发送的目的地
Netmask 网络掩码
Gateway 路由器的 IP 地址
Interface 本地网络接口
Metric 路径的权重
通过理解这些基本概念,学生将能够更好地掌握数据库管理和网络基础。
🌐 路由与域名解析
路由过程
“路由是指数据经过路由器转发的过程,通常通过命令提示符中的 tracert 命令来查看路由的过程。”
执行 tracert 命令
在命令提示符窗口中执行以下命令以查看到 GrapeCity 的 Web 服务器的路由过程:
text
Copy
tracert www.grapecity.com
实验结果:执行命令后,将显示数据前进道路上途经的 IP 地址列表。
示例输出:
路由顺序 IP 地址 说明
1 202.26.186.171 实验对象的 LAN 内的路由器
2 203.139.167.141 租用的互联网服务提供商的路由器
3-11 其他服务提供商的路由器 数据转发路径
12 210.160.205.254 GrapeCity 的路由器
13 210.160.205.80 GrapeCity 的 Web 服务器
DNS 服务器与主机名解析
“DNS(域名系统)服务器将域名解析为 IP 地址,使得我们可以使用易记的域名来访问网站。”
FQDN(完整限定域名)
定义:由主机名和域名组合而成的唯一标识。
示例:ma50j.yzw.co.jp,其中 ma50j 是主机名,yzw.co.jp 是域名。
域名解析过程
查询主机名:
在命令提示符窗口中执行 hostname 命令,查看主机名。
查看 FQDN:
使用 ipconfig /all 命令来获取主机名和域名。
使用 DNS 服务器:
在命令提示符窗口中执行 nslookup,输入域名如 www.grapecity.com,可获取对应的 IP 地址(如 210.160.205.80)。
ARP 协议与地址解析
“ARP(地址解析协议)用于实现 IP 地址与 MAC 地址之间的转换。”
ARP 工作原理
广播询问:ARP 会询问 LAN 中的所有计算机其 IP 地址对应的 MAC 地址。
ARP 缓存表:查询结果会被缓存以提高后续查询的效率。
查看 ARP 缓存表
在命令提示符窗口中执行 arp -a 命令,可以查看当前的 ARP 缓存表。
TCP/IP 协议与数据传输
“TCP/IP 是在网络上同时使用的两种协议,TCP 确保数据可靠传输,IP 负责数据的发送目的地。”
TCP 的作用
握手过程:TCP 协议通过发送确认信号确保数据的可靠传输。
数据分包:TCP 将大数据分割成以“包”为单位的数据单元进行传输。
数据传输流程
数据的封装:发送者通过 TCP 和 IP 协议将数据进行封装。
数据的发送:数据通过网卡及驱动程序发送,经过各层协议的处理。
数据的接收:接收者将收到的包拼装还原成原始数据。
TCP 端口号
定义:用于识别上层应用程序的数字。
示例:
Web 使用 80 端口
电子邮件发送使用 25 端口,接收使用 110 端口
实验与学习建议
“通过实验学习 TCP/IP 网络的基础知识,能够帮助我们更深入地理解网络工作原理。”
建议:在学习过程中进行实践操作,以加深对知识的理解和记忆。
📡 加密技术
- 密钥破解的复杂性
在加密过程中,密钥的位数直接影响破解的难度。以下是几种不同位数密钥的破解时间估算:
密钥位数 可能性数量 破解时间(秒) 破解时间(小时)
1 位数 10 10 0.00278
3 位数 1000 1000 0.278
10 位数 10亿 1000000000 278小时
16 位数 10的10次方 10000000000000 317年
随着密钥长度的增加,破解所需的时间呈指数级增长,这使得破解变得几乎不可能。
- 对称密钥加密技术
对称密钥加密技术(也称为秘密密钥加密技术)使用相同的密钥进行加密和解密。其特点包括:
发送者和接收者必须事先共享密钥。
发送密钥的方式可能导致安全隐患。
图示:对称密钥加密技术
text
Copy
| 发送者 | --------------> | 接收者 |
| 明文 | | 明文 |
| 密文 | | 密文 |
3. 公开密钥加密技术
为了克服对称密钥加密的缺陷,发展出了公开密钥加密技术。在这种技术中,使用两种不同的密钥:
公钥:可以公开,任何人都可以使用它来加密信息。
私钥:仅持有者知晓,用于解密信息。
示例
假设某人的公钥是3,私钥是5。任何人都可以用公钥加密信息,而只有该人使用私钥才能解密。
图示:公开密钥加密技术
text
Copy
| 发送者 | 公钥加密 | 接收者 |
| 明文 | ----------> | 密文 |
| | | 明文 |
| | | 明文 |
4. RSA算法
RSA算法是广泛应用于互联网中的公开密钥加密技术。生成公钥和私钥的步骤如下:
选择两个素数 ( a ) 和 ( b )。
计算 ( c = a \times b )。
计算 ( d = (a-1)(b-1) )。
选择与 ( d ) 互质的 ( e )。
公钥为 ( (c, e) ),私钥为 ( (c, f) ),其中 ( f ) 是满足 ( (f \times e) \mod d = 1 ) 的数。
示例
假设 ( a = 17 ),( b = 19 ):
( c = 17 \times 19 = 323 )
( d = (17-1)(19-1) = 288 )
选择 ( e = 11 )
计算私钥 ( f = 131 )
公钥为 ( (323, 11) ),私钥为 ( (323, 131) )。
- 数字签名
数字签名用于证明数据的发送者身份。生成数字签名的步骤如下:
选取明文。
计算信息摘要(如 MD5)。
用发送者的私钥对信息摘要加密。
将加密后的信息摘要附加到明文后发送给接收者。
接收者的验证步骤
用发送者的公钥解密信息摘要。
计算明文部分的信息摘要。
比较两者,如果相同则证明信息有效。
6. XML概述
XML(可扩展标记语言)是一种用于定义数据的标记语言,允许用户自定义标签,以便为信息赋予意义。XML 的主要特点包括:
可扩展性:用户可以自由创建标签。
元语言:XML 本身不是一种特定的标记语言,而是用于定义其他标记语言的语言。
XML的基本约束
约束描述 示例
文档开头需有XML声明 <?xml version="1.0" encoding="UTF-8"?>
开始标签和结束标签的匹配 小玉
标签名区分大小写 与不同
嵌套结构必须遵循层级关系 小玉
XML 文档必须符合这些约束,才能被称为“格式良好的 XML 文档”。
📜 XML的定义与应用
- XML的基本概念
“XML(可扩展标记语言)是一种用于在互联网及其他环境中交换信息的元语言。”
1.1 XML的目的
XML 的主要用途是为互联网和其他场景中的信息赋予意义。
相比于HTML,XML 具有更强的灵活性和可扩展性。
1.2 W3C标准
W3C(万维网联盟)制定了一系列标准,XML 于1996年成为W3C 的推荐标准。
XHTML(可扩展超文本标记语言)是在XML基础上定义的新网页标记语言,并于2000年成为W3C 推荐标准。
2. XML与CSV的比较
2.1 数据交换格式
格式 描述 优缺点
XML 通用的数据交换格式,赋予数据意义 文件尺寸大,便于分析但占用存储空间
CSV 通过逗号分隔值的纯文本文件 文件尺寸小,但未赋予数据意义
2.2 示例分析
CSV文件中数据用逗号分隔,记录信息本身。
XML文件中使用标签(如 、)为数据赋予意义,分析更为方便。
3. 命名空间的使用
“命名空间用于防止同形异义问题,确保标签名称的唯一性。”
3.1 XML命名空间
使用 xmlns 属性为标签设定命名空间。
例子:小玉 用于区分不同含义的 标签。
4. XML文档结构
4.1 有效的XML文档
有效的XML文档包含XML声明、XML实例和DTD(文档类型定义)。
DTD定义了XML实例的结构,确保文档的有效性。
4.2 XML Schema
XML Schema 是比DTD更严格的定义XML实例结构的技术,支持数据类型检查。
5. 解析XML的组件
5.1 组件规范
DOM(文档对象模型)和SAX(简单API for XML)是处理XML文档的标准组件。
通过现成的组件可简化XML文档处理过程。
6. XML的应用领域
“XML 在不同领域的标记语言中发挥重要作用。”
6.1 标记语言示例
名称 用途 相关组织
XSL 为XML信息提供显示格式 W3C
MathML 描述数学算式 W3C
SOAP 实现分布式计算 W3C
6.2 SOAP协议
SOAP(简单对象访问协议)用于通过XML进行分布式计算,允许程序在不同计算机之间协作。
7. XML的局限性
XML 的优势在于多种不同应用程序之间的互操作性。
在单一环境或同一厂商的系统中使用XML 可能不具优势,反而会增加存储和处理时间。
8. 总结
“XML是可交换的格式,但并非万能的。使用XML的场景应当具备跨厂商和跨平台的数据交换需求。”
🏞️ 瀑布模型的开发过程
“瀑布模型是一种系统开发方法,其特征是开发流程像瀑布一样,自上而下,一级一级地流动,永不后退。”
瀑布模型概述
瀑布模型的特点包括:
力求完美地完成每个阶段的工作
彻底执行审核过程
开发过程的比喻:开发团队如同乘着小船,克服一个又一个的瀑布(审核),从上游顺流而下。
瀑布模型示意图
各个阶段的工作内容及文档
阶段与文档
阶段 文档类型
需求分析 系统策划文档、系统功能需求规格文档
外部设计 外部设计文档
内部设计 内部设计文档
程序设计 程序设计文档
编码实现 模块设计文档、测试计划文档
测试 测试报告
部署与维护 部署手册、维护手册
需求分析阶段
在“需求分析”阶段,系统工程师(SE)要:
倾听客户需求
调查并分析现有手工作业的业务内容
成果为“系统策划文档”或“系统功能需求规格文档”。
设计阶段
设计计算机系统的过程分为三个阶段:
外部设计:关注用户可见的部分,包括系统处理的数据、用户界面及打印样式。
内部设计:具体化外部设计的内容,关注开发者的视角。
程序设计:详细设计以实现内部设计内容。
每个设计阶段的成果需书写相应的文档。
编码实现阶段
在“编码实现”阶段,程序员根据程序设计文档编写代码。文档包括:
模块设计文档
测试计划文档
测试阶段
测试人员根据测试计划文档确认程序功能,并在“测试报告”中定量标示测试结果,确保系统是否合格。
测试结果的定量标示方法
涂色检查:逐项确认“系统功能需求规格文档”中的功能,已实现的涂红。
覆盖测试:确保所有代码路径都经过测试。
示例:如果系统功能需求规格文档的95%功能实现,则记录为“确认系统95%功能”。
部署与维护阶段
一旦测试合格,进入“部署与维护”阶段:
部署:将系统安装到客户环境中。
维护:定期检查系统运行状况及必要的改造。
此阶段需编写“部署手册”和“维护手册”。
设计的本质
“设计就是拆解。”
从需求分析到程序设计,工作是将业务拆解为小要素。而从编码实现到部署、维护,则是将这些要素集成。
阶段 工作内容
拆解 将手工业务拆解为细小要素
集成 将小模块组合成完整系统
设计方法的比较
设计方法 关注点
通用功能分割法 整个系统中的通用功能
STS 法 数据流(输入、变换、输出)
TR 法 事务(数据的处理单位)
Jackson 法 输入数据和输出数据
Warnier 法 输入数据
面向对象法 组成系统的事物(对象)
面向对象法的优势
面向对象方法通过将指令和数据归拢到具有一定意义的组中,使得计算机系统更易于维护和改造。随着业务变化,仅需改造相关对象即可。
技术能力与沟通能力
SE需具备两种能力:
技术能力:运用硬件、软件、网络等技术的能力。
沟通能力:与他人进行有效的信息交换。
IT 的定义
IT(信息技术)是充分运用信息的技术,SE应理解信息化不仅仅是引进计算机,而是找到合适的解决方案。
计算机系统的成功与失败
成功的计算机系统应满足客户需求,并能够稳定工作。失败的系统即使技术再高深,若不能被客户使用,也是无用的。
实例分析
当客户在手工作业中遇到困难时,SE需提出合理的IT解决方案,并考虑客户的预算。例如,使用市场上的通信录软件而非定制系统,可以降低成本。
设备利用率的提升
在计算机系统中,故障是不可避免的。通过多机备份,可以显著提升设备利用率。
设备利用率计算公式
KaTeX can only parse string typed expression
设备利用率=
正常运转的时间+出现故障的时间
正常运转的时间
并联系统的优势
通过将设备设置为并联系统,即使其中一台设备发生故障,整体系统仍可正常运行,从而提高了设备的整体利用率。
设备类型 单台设备利用率 故障率 并联系统利用率
个人计算机 90% 10% 99%
打印机 80% 20% 96%
结束
SE在计算机行业中不仅要掌握技术,还要关注如何为社会提供价值,确保技术能有效服务于客户和社会。