2024-2025-1 20241302 《计算机基础与程序设计》第九周学习总结
2024-2025-1 20241302 《计算机基础与程序设计》第九周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第九周作业 |
这个作业的目标 | ![]() |
作业正文 | 2024-2025-1 20241302 《计算机基础与程序设计》第九周学习总结 |
教材学习内容总结
计算机科学概论第10、11章内容总结
第十章:操作系统基础
10.1 操作系统概述
- 操作系统的定义与功能:操作系统是计算机系统的核心软件,它负责管理和协调计算机硬件与软件资源,提供用户与计算机硬件之间的接口。
- 操作系统的發展歷史:从早期的批处理系统到现在的多任务、多用户操作系统,操作系统经历了多个发展阶段,每个阶段都有其特点和代表性产品。
- 操作系统的分类:根据不同的标准,如支持的用户数、任务类型等,操作系统可以分为实时操作系统、嵌入式操作系统、个人电脑操作系统、服务器操作系统等。
10.2 进程管理
- 进程的概念:进程是操作系统进行资源分配和调度的基本单位,它包含了程序代码、数据和运行状态信息。
- 进程的状态及其转换:进程有多种状态,包括新建、就绪、运行、阻塞和终止。进程状态之间会因为各种事件的发生而相互转换。
- 进程的调度算法:为了提高系统效率,操作系统采用不同的调度算法来选择下一个执行的进程,常见的算法有先来先服务(FIFO)、最短作业优先(SJF)、优先级调度等。
10.3 内存管理
- 分区内存管理:将内存划分为固定大小或可变大小的分区,每个分区分配给一个进程使用。
- 页面式内存管理:将内存和磁盘空间都划分为相同大小的块,称为页和帧,进程的地址空间被划分为若干个页面,通过页表来管理内存中的页面。
- 段页式内存管理:结合了段式和页式的优点,既支持逻辑上的模块化,又减少了内存碎片。
10.4 文件系统
- 文件系统的概念:文件系统是操作系统中用于组织和存储文件的数据结构,它提供了文件创建、读写、删除等操作。
- 文件操作:包括文件的创建、打开、读取、写入、关闭和删除等。
- 目录结构:文件系统通常使用树状结构来组织文件,目录是文件的集合,可以包含子目录。
10.5 设备管理
- 设备驱动程序:驱动程序是操作系统的一部分,负责与硬件设备进行通信,提供设备的初始化、数据传输等功能。
- 设备分配策略:操作系统需要决定如何分配有限的设备资源给请求的进程,以保证高效和公平。
- 缓冲技术:通过设置缓冲区来暂时存放输入输出数据,可以减少CPU等待I/O完成的时间,提高系统性能。
10.6 安全性与保护
- 用户认证:确保只有合法的用户才能访问系统资源,通常通过用户名和密码等方式进行。
- 访问控制机制:定义了用户对文件或其他资源的访问权限,如读、写、执行等。
- 加密技术:利用加密算法保护数据的安全,防止未经授权的访问和泄露。
第十一章:文件系统和目录
11.1 文件系统概述
- 文件类型的分类:文件可以按照用途或格式分为文本文件、二进制文件、特殊文件等。
- 文件的操作:文件操作包括创建、打开、读取、写入、关闭和删除等。
- 文件访问权限:为了保护文件安全,操作系统为文件设置了访问权限,如只读、读写、执行等。
- 文件共享机制:允许多个用户或进程同时访问同一文件,可能需要同步机制来避免冲突。
11.2 目录结构
- 目录树的概念:文件系统中的所有文件都按层次结构组织,形成一个树状的目录结构。
- 路径名解析:通过路径名来定位文件的位置,路径名可以是绝对路径或相对路径。
- 目录操作:包括创建目录、删除目录、重命名目录等。
11.3 磁盘调度
- 先到先服务磁盘调度法(FIFO):按照请求到达的顺序进行磁盘操作。
- 最短寻道时间优先磁盘调度法(SSTF):优先选择距离磁头当前位置最近的请求。
- SCAN磁盘调度法:磁头从一端向另一端移动,依次处理请求,到达端点后改变方向继续处理。
- C-SCAN磁盘调度法:改进版的SCAN,磁头从一端移动到另一端后直接返回起始位置,形成一个循环。
这些内容构成了操作系统的基础知识体系,对于理解和设计现代计算机系统具有重要意义。
C语言程序设计第8章内容总结
-
向函数传递一维数组
- 如何将一维数组作为参数传递给函数。
- 数组元素的访问方式。
- 函数调用时的一维数组参数传递规则。
-
排序和查找
- 不同类型的排序算法(如冒泡排序、选择排序等)。
- 查找算法(如线性查找、二分查找等)。
- 实现这些算法的基本步骤和注意事项。
-
二维数组的定义和初始化
- 二维数组的声明语法。
- 初始化二维数组的不同方法。
- 使用二维数组进行矩阵操作的基础知识。
-
向函数传递二维数组
- 如何将二维数组作为参数传递给函数。
- 在函数内部如何正确地引用和修改二维数组的数据。
-
本章知识点小结
- 对上述所有知识点进行回顾和总结。
- 强调重点概念和容易混淆的地方。
-
本章常见错误小结
- 分析在编写相关代码时可能遇到的典型错误。
- 提供避免这些错误的策略和技巧。
-
习题
- 包含一系列针对本章内容的练习题。
- 目的是帮助读者巩固所学的知识点,并提高实际编程能力。
-
本章扩充内容——代码风格
- 讨论良好的编码习惯和实践。
- 强调代码可读性和维护性的重要性。
通过学习第八章的内容,你将能够更熟练地使用C语言处理各种类型的数据结构,特别是数组,并且学会如何有效地实现基本的搜索和排序功能。此外,了解常见的错误和最佳实践也有助于提升你的编程技能。
教材学习中的问题和解决过程(先问 AI)
问题:选择法排序和交换法排序各自的特点与二者的比较。
选择法排序(Selection Sort)和交换法排序(通常指的是冒泡排序,Bubble Sort)是两种基本的排序算法。它们都是通过多次遍历待排序的序列来实现排序,但是具体的实现方式和效率有所不同。
选择法排序(Selection Sort)
特点:
- 选择法排序的基本思想是在未排序的元素中找到最小(或最大)的元素,存放到排序序列的起始位置,然后从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
- 每次选择一个最小(或最大)值,需要进行n-1次选择,每次选择需要比较n-i次(i为当前选择的轮数),因此其时间复杂度为O(n^2)。
- 选择排序是原地排序算法,不需要额外的存储空间。
- 选择排序是不稳定的排序方法,因为相等的元素可能会因为交换而改变顺序。
交换法排序(Bubble Sort)
特点:
- 冒泡排序的基本思想是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
- 冒泡排序的时间复杂度同样为O(n^2),但是在最佳情况下(即数组已经是有序的),冒泡排序可以通过设置标志位来提前结束排序,从而达到O(n)的时间复杂度。
- 冒泡排序也是原地排序算法,不需要额外的存储空间。
- 冒泡排序是稳定的排序方法,因为在冒泡过程中,相等的元素不会发生交换。
二者的比较
- 稳定性:选择法排序是不稳定的,而冒泡排序是稳定的。
- 性能:在最坏的情况下,两者的时间复杂度相同,都是O(n2)。但是,在最好的情况下,冒泡排序可以达到O(n),而选择排序始终为O(n2)。
- 适应性:冒泡排序对于部分有序的数据表现更好,因为它可以在早期就检测到数据已经排序完成,并提前终止排序过程。选择排序则对输入数据的初始状态不敏感,无论数据是否部分有序,都需要进行相同的比较和交换操作。
- 空间复杂度:两者都是原地排序算法,空间复杂度均为O(1)。
综上所述,虽然选择法排序和交换法排序都属于简单且易于理解的排序算法,但在实际应用中,冒泡排序由于其在特定情况下的优化潜力,可能比选择排序更加实用。然而,对于大规模数据集,这两种算法都不是最优的选择,通常会考虑使用更高效的排序算法,如快速排序、归并排序等。
交换法排序(冒泡排序)
#include <stdio.h>
void bubbleSort(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
// 提前退出冒泡循环的标志位
int swapped = 0;
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换相邻元素
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
// 如果没有发生交换,说明数组已经有序,可以提前结束
if (!swapped)
break;
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
printf("Sorted array: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
选择法排序
#include <stdio.h>
void selectionSort(int arr[], int n) {
int i, j, min_idx, temp;
for (i = 0; i < n - 1; i++) {
// 找到最小元素的索引
min_idx = i;
for (j = i + 1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// 将最小元素交换到前面
temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, n);
printf("Sorted array: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
在这两个例子中,bubbleSort
函数实现了冒泡排序算法,而 selectionSort
函数实现了选择排序算法。每个函数都接受一个整型数组和数组的长度作为参数,并对数组进行排序。最后,main
函数创建了一个示例数组,调用排序函数,并打印出排序后的结果。
基于AI的学习
其他(感悟、思考等,可选)
学习了选择法排序(Selection Sort)和交换法排序(Bubble Sort)之后,可以从中获得一些关于算法设计和编程实践的深刻感悟。以下是对这些内容的一些思考和总结:
1. 算法的效率与选择
- 时间复杂度:选择法排序和交换法排序的时间复杂度都是 (O(n^2)),这意味着它们在处理大规模数据时效率较低。在实际应用中,如果数据量较大,应考虑使用更高效的排序算法,如快速排序、归并排序等。
- 空间复杂度:这两种算法都是原地排序算法,不需要额外的存储空间,这使得它们在内存资源有限的环境中非常有用。
- 最佳情况:冒泡排序在数据部分有序的情况下表现较好,可以通过设置标志位提前终止排序,而选择排序对输入数据的初始状态不敏感,始终需要进行相同的比较和交换操作。
2. 算法的稳定性和适用场景
- 稳定性:冒泡排序是稳定的排序方法,而选择排序是不稳定的。在某些应用场景中,保持元素的相对顺序是非常重要的,这时应选择稳定的排序算法。
- 适用场景:对于小规模数据或教学目的,选择法排序和交换法排序是很好的选择,因为它们易于理解和实现。但对于大规模数据,应考虑使用更高效的算法。
3. 编程实践中的注意事项
- 代码可读性:编写清晰、易读的代码非常重要。在实现排序算法时,应尽量使代码结构化,逻辑清晰,便于调试和维护。
- 优化技巧:即使在简单的算法中,也可以通过一些小技巧来提高性能。例如,冒泡排序中的“提前退出”机制就是一个很好的例子。
- 测试和调试:编写完算法后,应进行充分的测试,确保算法在各种输入情况下都能正确运行。可以使用边界条件、极端情况等进行测试。
4. 学习方法和态度
- 理论与实践结合:学习算法不仅需要理解其背后的原理,还需要通过编程实践来加深理解。理论知识和实际操作相结合,能够更好地掌握算法的本质。
- 持续学习:算法是一个不断发展的领域,新的算法和优化方法层出不穷。保持学习的热情和好奇心,不断探索和学习新的知识和技术,是提升自己能力的重要途径。
- 团队合作:在实际项目中,团队合作非常重要。与其他开发者交流和合作,可以互相学习,共同进步。
5. 总结
通过学习选择法排序和交换法排序,我们不仅掌握了两种基本的排序算法,还了解了如何评估和选择合适的算法。更重要的是,我们学会了如何通过编程实践来验证和优化算法,这为我们今后解决更复杂的问题打下了坚实的基础。算法学习是一个不断探索和实践的过程,只有通过不断的练习和思考,才能真正掌握其精髓。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 300/800 | 1/5 | 10/48 | |
第四周 | 300/1100 | 1/6 | 10/58 | |
第五周 | 300/1400 | 1/7 | 10/68 | |
第六周 | 300/1700 | 1/8 | 10/78 | |
第七周 | 300/2000 | 1/9 | 10/88 | |
第八周 | 300/2300 | 1/10 | 10/98 | |
第九周 | 300/2600 | 1/11 | 10/108 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:10小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《计算机科学概论(第七版)》
- ...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理