2024-2025-1 20241302 《计算机基础与程序设计》第九周学习总结

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章内容总结

  1. 向函数传递一维数组

    • 如何将一维数组作为参数传递给函数。
    • 数组元素的访问方式。
    • 函数调用时的一维数组参数传递规则。
  2. 排序和查找

    • 不同类型的排序算法(如冒泡排序、选择排序等)。
    • 查找算法(如线性查找、二分查找等)。
    • 实现这些算法的基本步骤和注意事项。
  3. 二维数组的定义和初始化

    • 二维数组的声明语法。
    • 初始化二维数组的不同方法。
    • 使用二维数组进行矩阵操作的基础知识。
  4. 向函数传递二维数组

    • 如何将二维数组作为参数传递给函数。
    • 在函数内部如何正确地引用和修改二维数组的数据。
  5. 本章知识点小结

    • 对上述所有知识点进行回顾和总结。
    • 强调重点概念和容易混淆的地方。
  6. 本章常见错误小结

    • 分析在编写相关代码时可能遇到的典型错误。
    • 提供避免这些错误的策略和技巧。
  7. 习题

    • 包含一系列针对本章内容的练习题。
    • 目的是帮助读者巩固所学的知识点,并提高实际编程能力。
  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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @   RUNNNNN  阅读(15)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示