结果
2026年上半年软件设计师已出分,应该是过了。
题型
题目类型和体验
(一)数据流图题(第 1 题,必答)
要画图
“补充缺失的数据流”“识别外部实体”“完善数据存储 ”
(二)数据库设计题(第 2 题,必答)
要画图
该题型的考察路径非常固定:首先给出业务需求描述,要求考生绘制 E-R 图(或补充 E-R 图中缺失的实体、属性、联系);其次将 E-R 图转换为关系模式,并注明各关系模式的主键和外键;最后可能会考察数据完整性约束设计或 SQL 语句编写(难度较低)。
(三)UML 建模题(第 3 题,必答)
要画图
给出某系统的需求场景(如用户登录流程、订单提交流程),并提供不完整的 UML 图(类图、序列图、活动图三者之一,类图和序列图考察频率最高),要求考生补全缺失元素,并解释关键设计的含义。
(四)算法设计与代码实现题(第 4 题,必答)
这个就是常见的算法,dfs感觉多一些,主要就是思考递归的返回条件和递归函数。有难度
(五)面向对象程序设计题(第 5、6 题,选答)1
我选的java
23种设计模式,选其中一种考,有难度,但考点基本上就是对象的三大特性(继承封装和多态)、对象的方法和对象的实例化。
在软件设计师考试及实际开发中,23种设计模式分为创建型、结构型、行为型三大类,每类模式解决的核心问题不同,但都遵循高内聚、低耦合的设计原则。
创建型模式关注对象的创建过程,解耦构造与使用:
单例模式:全局唯一实例,常用于配置管理、日志等。工厂方法 / 抽象工厂:延迟到子类或工厂类决定实例化哪种产品,支持产品族扩展。建造者模式:分步骤构建复杂对象,支持不同表示。原型模式:通过克隆现有对象创建新实例,适合高成本对象复制。
结构型模式关注类与对象的组合方式:
适配器模式:接口转换,解决新旧系统兼容问题。桥接模式:抽象与实现分离,减少子类数量。组合模式:树形结构统一处理单个与组合对象。装饰器模式:动态增强对象功能,遵循开闭原则。外观模式:为复杂子系统提供统一入口。享元模式:共享内部状态,减少内存占用。代理模式:控制访问,可实现懒加载、远程访问等。
行为型模式关注对象间的职责分配与协作:
责任链模式:请求沿链传递,动态确定处理者。命令模式:将请求封装为对象,支持撤销/重做。解释器模式:定义语法并解释执行,常用于规则引擎。迭代器模式:统一遍历集合的方式,不暴露内部结构。中介者模式:集中管理对象交互,降低耦合。备忘录模式:保存对象状态以便恢复。观察者模式:一对多通知机制,常用于事件驱动。状态模式:对象行为随内部状态变化。策略模式:封装可互换算法,运行时选择。模板方法模式:定义算法骨架,延迟部分实现到子类。访问者模式:在不改变数据结构的前提下添加新操作。
知识点
RAID组
- RAID 0(条带化)
:至少2块磁盘,数据分块并行存储,读写速度高,容量为所有磁盘总和,但无冗余,单盘故障会导致数据丢失。 - RAID 1(镜像)
:至少2块磁盘,数据完全镜像,读速度可并行,写速度接近单盘,容量为单盘容量,单盘故障不丢失数据,成本较高。 - RAID 5(分布式奇偶校验)
:至少3块磁盘,数据和校验码分布在所有磁盘上,允许单盘故障,容量为(N-1)×单盘容量,读速度高,写速度略低。 - RAID 6
:类似RAID 5,但可容忍两块磁盘同时故障,适合高可靠性需求。 - RAID 10(1+0)
:镜像+条带化组合,兼顾性能和冗余,至少4块磁盘。 - RAID 50/60
:跨区RAID,将多个RAID 5或RAID 6子阵列条带化,适合大型存储系统,提供更高性能和容量。
地址范围的存储容量公式:
容量(字节)=末地址−首地址+1
寻址单位个数

浮点数加减法操作流程
对阶、求尾数和(差),结果规格化,判溢出舍入处理
寄存器
A. PC(Program Counter,程序计数器) ✅
它的核心功能就是存放下一条要执行的指令的内存地址,CPU 取指令时会根据 PC 的值去内存中取指,执行后 PC 会自动递增,指向下一条指令。这道题的正确答案就是 A。
B. MAC(Multiply-Accumulate,乘累加单元)
这不是一个寄存器,而是 CPU 里的运算单元,专门用于执行 “乘法 + 加法” 的运算,常见于 DSP、神经网络加速等场景,和指令地址跟踪无关。
C. MDR(Memory Data Register,存储器数据寄存器)
它的作用是暂存 CPU 和内存之间传输的数据 / 指令,比如从内存读取的数据会先放到 MDR 里,再送到其他地方,不负责记录指令地址。
D. IR(Instruction Register,指令寄存器)
它用来暂存当前正在执行的指令本身,CPU 从内存取出指令后,会把指令放到 IR 里解码执行,不存储指令的地址
CPU 寄存器
寄存器是 CPU 内部速度最快、容量最小的高速存储单元,直接和 CPU 运算部件(ALU)相连,用来暂存指令、数据和运算结果,是 CPU 执行运算的 “工作台”。
寻址方式说明
寻址方式是如何对指令中的地址字段进行解释,以获得操作数的方法或获得程序转移地址的方法。
| 立即寻址 | ADD AX, 3048H |
| 直接寻址 | ADD AX, [2000H] |
| 寄存器寻址 | MOV A, R0 |
直接寻址指令执行流程
取指令阶段:
程序计数器(PC)→ 地址总线 → 内存 → 指令寄存器(IR),把指令取到 CPU 里。
分析指令阶段:
控制器译码,识别出这是直接寻址指令。
取操作数阶段(核心步骤):
指令寄存器(IR)中的地址码部分(也就是内存单元所在地址)→ 地址总线 → 内存,根据地址取出操作数,送到 CPU。
冯・诺依曼计算机体系结构核心特点笔记
一、硬件组成:五大部件
冯・诺依曼计算机由 运算器、控制器、存储器、输入设备、输出设备 五大核心部件组成,各部件分工明确、协同工作:
- 运算器
:负责算术运算(加减乘除)与逻辑运算(与 / 或 / 非等) - 控制器
:统一指挥和协调计算机各部件的工作流程 - 存储器
:存储程序、数据及运算结果 - 输入设备
:向计算机输入信息(如键盘、鼠标) - 输出设备
:将处理结果输出(如显示器、打印机)
二、核心思想:存储程序原理
这是冯・诺依曼体系的灵魂,核心包含以下要点:
- 指令与数据同存
:指令和数据以同等地位存放在存储器中,二者都采用二进制编码表示,可按地址访问。 - 指令的结构
:一条指令由操作码(指明操作类型,如 “加法”“跳转”)和地址码(指明操作数在存储器中的位置)两部分组成。 - 顺序执行
:指令在存储器中按顺序存放,计算机通常自动按顺序读取并执行指令,仅在遇到跳转指令时改变执行顺序。 - 运算器为中心
:早期冯・诺依曼结构中,运算器是数据处理和传输的核心,数据在运算器、存储器、I/O 设备之间的交互都需要经过运算器。
三、冯・诺依曼结构的关键要点总结
| 存储程序 | |
| 二进制编码 | |
| 五大部件 | |
| 指令结构 | |
| 执行流程 | |
| 核心部件 |
面向对象
面向对象类之间的六种关系
| 泛化(继承) | is-a | extends 动物 | ||
| 关联 | ||||
| 聚合(Aggregation) | has-a | |||
| 组合(Composition) | contains-a | |||
| 实现 (Realization) | ||||
| 依赖 (Dependency) |
用例的三种关系
| 包含 (Include) | ||||
| 扩展 (Extend) | ||||
| 泛化 (Generalization) |
在面向对象方法种,对象是最根本的模块
识别关联
UML 多重度
1 | |
0..1 | |
0..** | |
1..* |
指令集
RISC采用硬布线罗技实现,CISC次啊用微码实现
补码 10001 转原码:补码除符号位外取反加 1 → 11111
中断与DMA
| 并行性 | ||
| CPU 干预 | ||
| 传输速度 | ||
| 现场保护 | ||
| 适用场景 |
存储
CPU 对应的存储类别:寄存器
Cache 对应的存储类别:缓存
主存对应的存储类别:DRAM
辅存对应的存储类别:硬盘、光盘等
虚拟存储器
总线
PCI 总线(Peripheral Component Interconnect)
性质:并行内总线(早期 PCI 为并行总线,用于计算机内部连接 CPU、内存、显卡等硬件) 作用:连接主板上的内部设备,属于系统内总线,采用并行传输方式。
SCSI 总线(Small Computer System Interface)
性质:并行外总线(传统 SCSI 为并行总线,用于连接硬盘、光驱等外部存储设备) 作用:主要用于连接外部存储设备,属于外设总线 / 外总线,早期标准为并行传输
MTTF 和 MTTR
MTTF/(1+MTTF) | |||
1/(1+MTTR) |
TCP 和 UDP
NFA 转正规式
a→b | ab | a,再输入b | |
X* | X,包括 0 次 | ||
0和1 | (01)* | 0或1,顺序不限 | |
X+ | X(X)*,不能走 0 次 |
编译原理
| A. 词法规则 | int a=1+2;拆成int、a、=、1、+、2、; | ||
| B. 语法规则 | 1+2是一个合法的表达式,1+是语法错误 | ||
| C. 语义规则 | a和1+2的类型是否匹配,再把a=1+2翻译成temp=1+2; a=temp这类中间代码 | ||
| D. 等价变换规则 | temp=1+2; a=temp直接优化成a=3,或把循环里不变的计算提到循环外 |
中缀表达式转逆波兰式(后缀式)核心规则
方法:栈转换法(通用步骤)
初始化:一个运算符栈
op_stack,一个输出列表output。遍历每个 token(数字 / 变量、运算符、括号)
:
遇到数字 / 变量:直接加入
output。遇到左括号
(:直接压入op_stack。遇到右括号
):不断弹出栈顶运算符,加入output,直到遇到左括号(;弹出左括号但不加入输出。遇到运算符(
+ - * /等):
弹出栈顶所有优先级 ≥ 当前运算符的运算符(栈顶是左括号时停止),加入 output。将当前运算符压入 op_stack。遍历结束:把栈中剩余所有运算符依次弹出,加入
output。
FAT 文件系统
簇状链式结构
FAT = File Allocation Table(文件分配表),是一种经典的文件系统(比如 FAT12、FAT16、FAT32),核心是用一张 “表” 来管理磁盘上的簇和文件的链式关系。磁盘被分成一个个簇(Cluster),每个簇在 FAT 表中都有一个 “下一个簇的地址”,文件的所有簇通过 FAT 表连成一条链。
读写权限
4读2写1执行
位示图大小计算
总物理块数/字长



计算总物理块数时,磁盘总容量和物理块大小单位必须统一(如都用 MB、KB 或字节)
1 个 bit 对应 1 个物理块,因此总 bit 数 = 总物理块数
⌈ ⌉ 表示向上取整,bit 数无法被字长整除时,多出来的部分也要占用 1 个字
互斥信号量
对于整型信号量S:
S > 0:表示可用资源数(能直接分配给进程的资源数量)。 S ≤ 0:表示已无可用资源, |S|是等待该资源的进程数。
P(S):S = S - 1(申请资源)
V(S):S = S + 1(释放资源)
S=3 | |
S=2 | |
S=0 | |
S=-1 | |
S=-2 |
规律:初始值为 N 时,S 的取值范围是 (-∞, N],|S| 表示等待进程数。
初始值为 0(典型:同步信号量)
这种信号量不用于互斥,而是用于进程间的同步(比如生产者 - 消费者模型中,消费者要等生产者生产后才能消费)。
软件测试
经典 V 模型
测试阶段
| 单元测试 | |||
白盒测试
1. 语句覆盖(Statement Coverage)
定义:设计足够的测试用例,使得程序中每一条可执行语句至少执行一次。
特点:是最弱的覆盖标准
它只要求 “所有语句都跑过一遍”,但不关心分支、条件是否都被覆盖。
if a > 0 and b < 0:print("条件成立")else:print("条件不成立")语句覆盖只需要一组输入让两个
print语句都执行即可,不需要测试
a>0和
b<0的真假组合,很多分支错误会被漏掉。
2. 判定覆盖(Decision Coverage / 分支覆盖)
- 定义
:设计测试用例,使得程序中每个判断的取真分支和取假分支至少执行一次。 特点:比语句覆盖强,但仍有漏洞。 它要求每个 if/else、while等判断的真假都被走到。但不关心判断里的每个条件(比如 and/or连接的多个条件)是否都被覆盖。
3. 条件覆盖(Condition Coverage)
- 定义
:设计测试用例,使得判断中 ** 每个条件的所有可能结果(真 / 假)** 至少出现一次。 特点:关注判断里的每个条件,但不保证整个判断的真假都被覆盖。 比如上面的例子,条件覆盖会要求 a>0为真 / 假、b<0为真 / 假都出现,但可能出现 “所有条件都为真” 和 “所有条件都为假” 的情况,导致判断的真假分支没有被全部覆盖。
4. 路径覆盖(Path Coverage)
- 定义
:设计足够的测试用例,覆盖程序中所有可能的执行路径。 特点:是理论上最强的覆盖标准,错误发现能力最强。 它会把程序中所有可能的分支组合都走一遍,几乎能覆盖所有逻辑错误。 缺点是:复杂程序的路径数量会爆炸式增长,实际中很难做到 100% 路径覆盖。
面向对象测试
| 方法层(Method Level) | |||
| 类层(Class Level) | |||
| 类簇层(Cluster Level) | |||
| 系统层(System Level) |
项目管理工具
| Gantt 图(甘特图) | ||||
| PERT 图 | ||||
环路复杂性计算
方法 1:公式法 V(G) = E - N + 2
E:流程图中边的数量 N:流程图中节点的数量
先数图中的节点和边:
节点(
N):开始节点、i>0判断、语句 1、i=0、n=0判断、语句 2、语句 3 → 共 7 个节点边(
E):开始 →
i>0i>0→ 语句 1(Y)i>0→i=0(N)语句 1 →
i=0i=0→n=0n=0→ 语句 2(Y)n=0→ 语句 3(N)语句 2 → 回到
i>0语句 3 → 回到
i>0→ 共 9条边
代入公式:
V(G)=E−N+2=9−7+2=4
结构化分析(SA)方法
| 数据流图(DFD/ Data Flow Diagram) | |||
| 数据字典(DD/ Data Dictionary) | |||
| 加工说明(Process Specification) |
候选码(Candidate Key):
能唯一标识关系中所有属性的最小属性集。 满足两个条件: 该属性集的闭包( X⁺)包含关系的所有属性(A,B,C,D,M,N)该属性集的任何真子集都不满足条件 1(“最小” 性)
解题步骤
步骤 1:划分属性类型(关键!)
根据函数依赖集,把属性分为三类:
- L 类(仅出现在函数依赖左边)
: A、C、M 这类属性一定是候选码的组成部分,因为它们不能被其他属性推出。 - R 类(仅出现在函数依赖右边)
: B、D、N 这类属性一定不是候选码的组成部分,因为它们可以被其他属性推出。 - LR 类(既出现在左边又出现在右边)
:无
步骤 2:先检查 L 类属性的闭包
我们先对 L 类属性进行闭包计算:
A⁺ = {A}(没有以 A 为左部的函数依赖,无法推出其他属性) C⁺ = {C}(同理,无法推出其他属性) M⁺ = {M, D, B}(由 M→D、D→B推出,但仍缺少 A、C、N)
可以看到,单个 L 类属性的闭包都不包含所有属性,所以候选码一定是多个 L 类属性的组合。
步骤 3:按选项依次计算闭包
选项 A:AM
AM⁺ = {A, M, D, B}缺少 C和N,不满足条件 → 排除 A
选项 B:AC
AC⁺ = {A, C}无法推出其他属性,不满足条件 → 排除 B
选项 C:CM
CM⁺ = {C, M, D, B, N}缺少 A,不满足条件 → 排除 C
选项 D:ACM(正确答案)
计算ACM的闭包((ACM)⁺):
初始集合: {A, C, M}由 M→D,加入D→{A, C, M, D}由 D→B,加入B→{A, C, M, D, B}由 DC→N(此时 D 和 C 都在集合中),加入N→{A, B, C, D, M, N}
闭包结果包含了所有属性,且 ACM的任何真子集(如AC、AM、CM)都不满足条件 → 是候选码
子网划分
| IP 地址结构 | 由「网络号 + 主机号」组成,子网划分后变为「网络号 + 子网号 + 主机号」 |
| 子网掩码 | 1代表网络 / 子网位,0代表主机位 |
| 定长子网划分 | |
| 网络地址 | 0的地址,代表子网本身,不可分配给设备 |
| 广播地址 | 1的地址,用于向子网内所有设备发送广播,不可分配给设备 |
SNMP(简单网络管理协议)
SNMP 的设计目标是轻量、高效,用于网络设备的监控和管理(比如获取设备状态、接收告警)。
SNMP 的传输层协议是 UDP,这是标准规定。
OSI 七层模型
| 第 7 层:应用层 | ||||
| 第 6 层:表示层 | ||||
| 第 5 层:会话层 | ||||
| 第 4 层:传输层 | ||||
| 第 3 层:网络层 | ||||
| 第 2 层:数据链路层 | ||||
| 第 1 层:物理层 |
著作权
《著作权法实施条例》第六条规定:“著作权自作品创作完成之日起产生。”
通用公式:叶子节点计算
直接给你最干、最直接的通用公式,再用这道题套一遍,保证你一眼看懂👇
🌳 核心公式(直接背这个就行)
设:
n₀:叶子结点个数(就是度为 0 的结点,这是题目要求的) n₁:度为 1 的结点个数 n₂:度为 2 的结点个数 n₃:度为 3 的结点个数 n₄:度为 4 的结点个数 以此类推, n_k就是度为k的结点个数
通用公式:
✅ 用这道题直接套一遍
题目数据:
n₄ = 5(度为 4 的结点有 5 个) n₃ = 7(度为 3 的结点有 7 个) n₂ = 3(度为 2 的结点有 3 个) n₁ = 9(度为 1 的结点有 9 个)
代入公式:
和题目答案完全一致,就是这么简单!
💡 一句话记公式
叶子数 = 1 + (每个结点的度减 1)× 对应结点数 的总和
要不要我再给你出一道一模一样的题,帮你练一遍这个公式?
夜雨聆风