目录
- 前言
- 一、背景
- 1.1上次考试感受:
- 1.2这次考试感受:
- 1.3方法:
- 二、 过程
- 2.1计算机网络概论
- 计算机组成
- 数据表示相关知识
- 校验码相关知识
- 计算机体系结构
- 网络体系结构OSI/RM和TCP/IP
- 计算机安全性可靠性性能评价
- 2.2 程序设计语言基础知识
- 编译和解释的区别
- 编译过程图示
- 编译各个阶段常见的错误
- 常见语言分类
- 2.3数据结构
- 2.4 操作系统知识
- 2.5软件工程基础知识
- 2.6 结构化开发方法
- 2.7面向对象技术
- 2.8 算法分析设计
- 2.9 数据库技术基础
- 2.10网络与信息安全基础知识
- 2.11 标准化和软件只是产权基础知识
- 2.12软件系统分析与设计
- 三、总结
前言
本系列笔记根据官方教材《软件设计师教程第五版》的章节内容和节奏进行梳理,由于教材内容偏多,这里会精挑细选总结关键的考点,以及整理出各种令人头疼的英文缩写的中文全称和英文全称,希望能够对同在备考网络工程师的童鞋们有帮助~如有不当的地方,还望多多指教!(持续更新中…)
一、背景
2023年上半年五月份进行了软考,这是一场蛰伏了将近两年的考试。
1.1上次考试感受:
上次考试时2021年下半年,我依稀记得上次写代码题的时候还分不清abstract关键字放在void前边还是后边
1.2这次考试感受:
但是这次我写最后一个代码题的时候已经游刃有余了。感叹这一年半以来自己的努力,也感谢这两周的专项复习小伙伴的相互帮助。
1.3方法:
多交流,全局观,结构化让我们这次的学习变得很有意义。
尤其是我们之前看的五本基础书,给了我们这次软考很大的帮助,让我们很好的把握住了宏观,这也是这次考试不同于之前考试的一个点,现在给我一个题,我能比较清楚的说出它所在的大概章节,这也有助于我在最后冲刺阶段的较快准确的锁定题的范围,迅速找书,迅速理解。
二、 过程
2.1计算机网络概论
计算机组成
中央处理器(CPU):负责执行计算和控制计算机的操作。
主存储器(RAM):用于临时存储数据和程序。
输入设备:例如键盘、鼠标、触摸屏等,用于向计算机输入数据和指令。
输出设备:例如显示器、打印机、音频扬声器等,用于向用户显示计算机的输出结果。
存储设备:例如硬盘驱动器、固态硬盘等,用于永久性地存储数据和程序。
总线:用于不同组件之间的数据传输和通信。
数据表示相关知识
校验码相关知识
校验码是一种用于验证数据准确性和完整性的编码或数字。它通常用于检查传输过程中的错误或确保数据的一致性。
计算机体系结构
易考点:
数据传输方式
寻址方式对比
流水线技术
中断
Cache
网络体系结构OSI/RM和TCP/IP
1、OSI/RM(开放系统互联参考模型):该结构模型有七层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。(口诀:物 数 网 传 会 表 应)
附上OSI七层结构图:
OSI/RM七层模型图
TCP/IP协议簇四层模型图
常见协议功能
加密方式
计算机安全性可靠性性能评价
2.2 程序设计语言基础知识
编译和解释的区别
编译:将源代码一次性转换为机器代码,生成可执行文件,然后再执行可执行文件。
解释:逐行解释源代码并执行,不生成可执行文件。
主要区别:编译器一次性转换,解释器逐行执行。
编译过程图示
编译各个阶段常见的错误
词法错误(Lexical Errors):这种错误发生在编译器无法识别源代码中的字符序列时。它可能由于拼写错误、无效的标识符、非法的操作符、未关闭的引号等引起。
语法错误(Syntax Errors):语法错误是在编写代码时违反编程语言的语法规则所引起的错误。它通常是由于缺少或错误使用关键字、括号不匹配、语句结构错误等导致的。
语义错误(Semantic Errors):语义错误是在代码的意义和逻辑上出现问题的错误。这种错误通常在编译器无法检测到的情况下发生。例如,使用错误的变量、执行不符合预期的操作、逻辑错误等。
常见语言分类
2.3数据结构
+-----------------------+-----------------------+
| 数据结构分类 | 具体数据结构 |
+-----------------------+-----------------------+
| 线性数据结构 | 数组 |
| | 链表 |
| | 栈 |
| | 队列 |
+-----------------------+-----------------------+
| 非线性数据结构 | 树 |
| | 图 |
+-----------------------+-----------------------+
| 排序和搜索数据结构 | 二叉搜索树 |
| | 平衡二叉树 |
| | 哈希表 |
| | 二叉堆 |
+-----------------------+-----------------------+
2.4 操作系统知识
这道题考了,考了一个进程中的三个线程,三个线程之间的关系是什么?
pv操作
死锁
页式存储淘汰规则
I/o管理
候选键 ,选右边没有的
ER图转换规则
2.5软件工程基础知识
2.6 结构化开发方法
考大题
2.7面向对象技术
2.8 算法分析设计
2.9 数据库技术基础
2.10网络与信息安全基础知识
2.11 标准化和软件只是产权基础知识
2.12软件系统分析与设计
三、总结
/**
* @BelongsProject: JAVAtest
* @BelongsPackage: PACKAGE_NAME
* @Author: GuoYuan.Zhao
* @CreateTime: 2023-05-15 11:34
* @Description: TODO
* @Version: 1.0
*/
public class Test {
// public static void main(String[] args) {
// int i = fbnq(7);
// System.out.println(i);
//
// }
//
// public static int fbnq(int n){
//
// if (n == 1 || n == 2) { //特殊情况,分开讨论
// return 1;
// }
// if (n>2){
// return fbnq(n-1)+fbnq(n -2);
// }
// return -1;
// }
public static void main(String[] args) {
String[] nameArr = {"鞋子", "音响", "电脑"};
// 商品重量数组
int[] weightArr = {1/*鞋子*/, 4/*音响*/, 3/*电脑*/};
// 商品价格数组
int[] priceArr = {1500/*鞋子*/, 3000/*音响*/, 2000/*电脑*/};
// 背包容量
int packageCapacity = 4;
backpackWithoutRepeat(nameArr, weightArr, priceArr, packageCapacity);
}
private static void backpackWithoutRepeat(String[] nameArr, int[] weightArr, int[] priceArr, int packageCapacity) {
/**
* 声明一个能装入 0、1、2、3磅......的背包的二维价格表;举例:就好比 v数组是表2的数据
*/
int[][] nameBackpack = new int[nameArr.length + 1][packageCapacity + 1];
// 构建可能装入背包的二维数组
// 值为0时说明不会装进背包, 值为1说明可能装入背包
int[][] contentArr = new int[nameArr.length + 1][packageCapacity + 1];
/**
* 为什么i一开始是1不是0?看表2的数据,是不是第一行全是0啊
*/
for (int i = 1; i < nameBackpack.length; i++) {
/**
* 为什么j一开始是1不是0?看表2的数据,是不是第一列全是0啊
*/
System.out.println(nameBackpack[i]);
for (int j = 1; j < nameBackpack[i].length; j++) {
/**
* 文章中当 w[i] > j 时,就有 nameBackpack[i][j] = nameBackpack[i-1][j];
* 因为我们程序i是从1开始的,因此原来公式中的w[i]修改成w[i-1];
* 当前商品 > 背包容量, 取同列上一行数据
*/
if (weightArr[i - 1] > j) {
nameBackpack[i][j] = nameBackpack[i - 1][j];
} else {
/**
* 当前商品 <= 背包容量, 对两部分内容进行比较;
* 第一部分, 该列上一行数据
*/
int onePart = nameBackpack[i - 1][j];
/**
* 还记得文章中写的 当j >= w[i] 时,有 nameBackpack[i][j]=max{nameBackpack[i-1][j],nameBackpack[i-1][j-w[i]]+nameBackpack[i]} 这个公式成立吗?
* priceArr[i - 1]: 当前商品价格;
* w[i - 1]: 当前商品重量;
* j - w[i - 1]: 去掉当前商品, 背包剩余容量;
* 不可重复: nameBackpack[i - 1][j - w[i - 1]]: 在上一行, 取剩余重量下的价格最优解;
*/
int otherPart = priceArr[i - 1] + nameBackpack[i - 1][j - weightArr[i - 1]];
/**
* 取最大值为当前位置的最优解
*/
nameBackpack[i][j] = Math.max(onePart, otherPart);
/**
* 如果最优解包含当前商品, 则表示当前商品已经被使用, 进行记录
*/
if (otherPart == nameBackpack[i][j]) {
contentArr[i][j] = 1;
}
}
}
}
// 不能重复的场景中
// 如果该位置的标志位为1, 说明该商品参与了最终的背包添加
// 如果该位置的标志位为0, 即使该位置的价格为最大价格, 也是从其他位置引用的价格
// 因为不能重复, 所以每行只取一个数据参与最终计算, 并只判断在最大位置该商品是否参与
// 该最大位置会随着已经遍历出其他元素而对应不断减小, 直到为0
// 二维数组最后一个元素必然是最大值, 但是需要知道该最大值是自身计算的 还是比较后引用其他的
int totalPrice = 0;
// 最大行下标数, 即商品数
int maxLine = contentArr.length - 1;
// 最大列下标数, 即重量
int maxColumn = contentArr[0].length - 1;
for (;maxLine > 0 && maxColumn > 0;) {
// 等于1表示在该位置该商品参与了计算
if (contentArr[maxLine][maxColumn] == 1) {
// 遍历后, 对重量减少, 下一次从剩余重量中取参与商品
maxColumn -= weightArr[maxLine - 1];
totalPrice += priceArr[maxLine - 1];
System.out.println(nameArr[maxLine - 1] + "加入了背包");
}
// 因为不能重复
// 所以如果该商品参与了背包容量, 则肯定剩余的最大位置处参与,
// 否则跟该数据无关, 直接跳过
maxLine--;
}
System.out.println("背包可容纳的最大价值: " + totalPrice);
}
}