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

作业信息

这个作业属于哪个课程 2024-2025-1 计算机基础与程序设计
这个作业要求在哪里 2024-2025-1 计算机基础与程序设计第九周作业
这个作业的目标 操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统,文件保护,磁盘调度
作业正文 本博客

教材学习内容总结

《计算机科学概论》第七版第十章的学习内容总结如下:

  1. 操作系统(OS):操作系统是一类特殊的程序,它具有操作硬件的权限,并负责运行和管理其他程序。操作系统的两个主要责任是管理计算机资源(如内存、输入/输出设备等)和为人机交互提供界面。
  2. 操作系统的启动和管理:操作系统通常是开机第一个启动的程序,其他程序都由操作系统启动。它加强了程序加载方式,可以一次给多个程序运行,这种模式被称为批处理。
  3. 设备驱动程序:操作系统充当软件和硬件的媒介,提供API来抽象硬件,这些API被称为设备驱动程序,允许程序员以标准化的方式与硬件进行交互。
  4. 多任务处理:操作系统的能力之一是使多个程序可以同时运行,在单个CPU上共享时间,这种能力被称为多任务处理。每个程序会分配有专属的内存块,可能不连续,操作系统通过虚拟内存技术隐藏这种复杂性。
  5. 虚拟内存和动态内存分配:操作系统自动处理虚拟内存和物理内存之间的映射,这种机制使得程序的内存大小可以灵活增减,被称为动态内存分配。
  6. 内存保护:给程序分配专用的内存范围,并隔离起来以防止互相影响和病毒的侵害,这种机制被称为内存保护。
  7. 多用户支持:计算机还能让多用户在终端同时访问,这时操作系统还要处理多个用户,开发了分时操作系统,每个用户只能用一小部分处理器、内存等资源。
    这些内容涵盖了操作系统的基本概念、功能和一些关键特性,为我们提供了对操作系统如何在计算机系统中发挥作用的基本理解。
    《计算机科学概论》第七版第十一章的学习内容总结如下:
  8. 文件格式:介绍了不同类型的文件数据格式,包括文本文件(TXT)、波形文件(WAV)、位图文件(BMP)等。这些文件格式用于存储不同类型的数据,如文本、音频和图像。
  9. 元数据:讨论了关于数据的数据,即元数据的概念。元数据通常存储在文件的开头,也称为文件头,它包含了文件的相关信息,如码率、声道信息等。
  10. 目录文件:为了存储和管理多个文件,需要特殊的文件来记录其他文件的位置,这些文件被称为目录文件。
  11. 软件工程:探讨了大型软件项目中的错误和复杂度问题,强调了从项目一开始就关注软件质量的重要性,并介绍了软件工程的规则。
  12. 算法复杂度:介绍了大O分析,这是一种根据问题大小决定的增长速率来对比算法的方法。讨论了多项式时间算法、P类问题和NP类问题,以及图灵关于停机问题无解决方案的证明。
    这些内容涵盖了文件管理和软件工程的基本概念,为我们提供了对计算机科学中文件存储和软件构建过程的基本理解。
    《C语言程序设计》第五版第八章的主要内容是数组和算法基础,以下是这一章的主要学习内容:
  13. 数组的定义和声明
    • 介绍如何在C语言中定义和声明一维数组和二维数组。
    • 讨论数组的内存分配和存储方式。
  14. 数组的初始化
    • 说明如何在声明数组时进行初始化,包括使用指定的值和默认值。
  15. 访问和操作数组元素
    • 讲解如何通过索引访问数组中的元素。
    • 介绍如何遍历数组并对数组元素进行操作。
  16. 数组作为函数参数
    • 讨论如何将数组传递给函数,包括传递数组名和数组元素。
    • 介绍在函数中如何操作数组元素。
  17. 多维数组
    • 解释多维数组的概念,以及如何在C语言中声明和使用二维数组。
    • 讨论多维数组的内存布局和遍历方法。
  18. 数组与指针的关系
    • 探讨数组名与指针之间的关系,以及如何使用指针来操作数组。
  19. 基本算法概念
    • 介绍算法的基本概念,包括算法的定义、特性和表示方法。
  20. 算法的复杂度分析
    • 讨论如何评估算法的效率,包括时间复杂度和空间复杂度。
  21. 排序算法
    • 介绍一些基本的排序算法,如冒泡排序、选择排序和插入排序。
    • 分析这些排序算法的时间复杂度和适用场景。
  22. 搜索算法
    • 讲解基本的搜索算法,如线性搜索和二分搜索。
    • 讨论搜索算法的时间复杂度和实现方法。
  23. 递归
    • 介绍递归的概念和基本应用。
    • 讨论递归算法的时间复杂度和可能的优化。
  24. 编程练习
    • 提供一些与数组和算法相关的编程练习,以加深对数组操作和算法实现的理解。
      这些内容为我们提供了数组和算法基础的全面介绍,帮助我们在C语言编程中更有效地使用数组和实现算法。

教材学习中的问题和解决过程

问题一:如何实现磁盘的顺序访问和直接访问?
解决方式:AI答:在C语言中实现磁盘的顺序访问和直接访问,可以通过以下几种方式:

顺序访问(Sequential Access)

顺序访问通常是指按照文件中数据的存储顺序来读取或写入数据。在C语言中,可以通过以下方式实现顺序访问:

  1. 使用文件指针
    • 通过fopen函数以读模式("r")打开文件,使用fgetsfread函数按顺序读取文件内容。
    • 示例代码:
      FILE *file = fopen("example.txt", "r");
      if (file != NULL) {
          char buffer[128];
          while (fgets(buffer, sizeof(buffer), file) != NULL) {
              printf("%s", buffer);
          }
          fclose(file);
      } else {
          perror("Error opening file");
      }
      
    • 这种方式适用于文本文件和二进制文件的顺序读取。

直接访问(Direct Access)

直接访问,也称为随机访问,是指可以直接访问文件中的任意位置的数据,而不需要从头开始顺序访问。在C语言中,可以通过以下方式实现直接访问:

  1. 使用fseekftell函数
    • fseek函数用于移动文件读写位置指针到指定位置,ftell用于获取当前文件读写位置指针。
    • 示例代码:
      FILE *file = fopen("example.txt", "r+");
      if (file != NULL) {
          fseek(file, 10, SEEK_SET); // 移动到文件开头后的第10个字节
          char buffer[128];
          fread(buffer, sizeof(char), sizeof(buffer), file);
          // 处理buffer中的数据
          fclose(file);
      } else {
          perror("Error opening file");
      }
      
    • 这种方式允许程序直接跳转到文件的任意位置进行读写操作。
  2. 使用系统调用
    • 在Unix和Linux系统中,可以使用openread系统调用来实现更底层的直接访问。
    • 示例代码:
      int file = open("example.txt", O_RDONLY);
      if (file != -1) {
          char buffer[100];
          ssize_t bytes_read;
          lseek(file, 10, SEEK_SET); // 移动到文件开头后的第10个字节
          bytes_read = read(file, buffer, sizeof(buffer) - 1);
          if (bytes_read > 0) {
              buffer[bytes_read] = '\0';
              printf("%s", buffer);
          }
          close(file);
      } else {
          perror("Error opening file");
      }
      
    • 这种方式提供了更接近操作系统层面的文件访问控制。
      通过上述方法,可以在C语言中实现对磁盘的顺序访问和直接访问,以满足不同的文件处理需求。
      问题二:如何向函数传递二维数组,为什么不能省略列?
      解决方式:AI答:在C语言中,向函数传递二维数组需要使用指针。具体来说,你需要传递一个指向数组第一行的指针,或者更常见的是,传递一个指向指向第一行的指针的指针。这是因为在C语言中,二维数组在内存中是连续存储的,但它们在语法上被表示为数组的数组。

向函数传递二维数组

  1. 传递指向第一行的指针
    • 这通常用于行主序的数组,其中数组的行是连续存储的。
    • 示例:
      void process_array(int arr[][COLS], int rows) {
          // 函数体
      }
      
      调用:
      int array[ROWS][COLS];
      process_array(array, ROWS);
      
  2. 传递指向指向第一行的指针的指针
    • 这提供了更多的灵活性,允许函数修改数组的行指针。
    • 示例:
      void process_array(int **arr, int rows, int cols) {
          // 函数体
      }
      
      调用:
      int array[ROWS][COLS];
      process_array(array, ROWS, COLS);
      

为什么不能省略列

在C语言中,二维数组的列数不能省略,因为它对于数组的内存布局至关重要。以下是原因:

  1. 内存分配
    • 二维数组在内存中是连续存储的,每一行的大小必须相同。如果省略列数,编译器就无法确定每一行的大小,从而无法正确地分配内存。
  2. 数组访问
    • 当你访问二维数组的元素时,例如array[i][j],编译器需要知道每一行的大小来计算元素的地址。如果省略列数,编译器就无法计算元素的地址。
  3. 函数参数
    • 当你将二维数组作为参数传递给函数时,你需要指定每一行的大小,以便函数可以正确地访问数组元素。如果省略列数,函数就无法确定每一行的大小,从而无法正确地访问数组元素。
      因此,为了确保内存的正确分配和数组的正确访问,C语言要求在定义和使用二维数组时必须指定列数。

基于AI的学习

代码调试中的问题和解决过程

问题:实验要求查找学号并输出他的排名和成绩,但我使用二分法查找学号时需要先按学号排名,而输出他的成绩需要先按成绩排名。
解决过程:尝试通过函数和返回数组来解决问题多次后都没有成功,最终灵机一动,把查找的程序改了,不用二分法,改为挨个查找,for循环里面套了个if语句判断,这种查找方法不需要事先按学号排名,只需要先按成绩排名然后查找,最终成功运行。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 200/400 1/3 18/38
第三周 300/700 1/4 20/58
第四周 400/1100 1/5 22/80
第五周 300/1400 1/6 22/102
第六周 400/1800 1/7 25/127
第七周 400/2200 1/8 30/157
第八周 500/2700 1/9 35/192
第九周 500/3200 1/10 28/220
posted @ 2024-11-23 17:25  王艺涵  阅读(25)  评论(0)    收藏  举报