第七周作业
学期(如2024-2025-1) 学号(20241418) 《计算机基础与程序设计》第七周学习总结
教材学习内容总结
数组与链表:
数组是一种线性的数据结构,它是由相同类型的元素(如整数、浮点数、字符等)组成的有序集合。这些元素在内存中是连续存储的,通过索引(下标)来访问其中的元素。例如,在一个整数数组int[] arr = {1, 2, 3, 4, 5};中,arr[0]表示第一个元素 1,arr[1]表示第二个元素 2,以此类推。索引通常从 0 开始计数。优点随机访问效率高:由于数组中的元素在内存中是连续存储的,所以可以通过计算偏移量来快速访问任意元素。例如,如果数组元素类型是int(通常占 4 个字节),数组的起始地址为base_address,要访问索引为i的元素,其内存地址可以通过公式address = base_address + i * sizeof(int)来计算。所以访问数组元素的时间复杂度是。
简单易用:数组的概念比较直观,容易理解和实现。在很多编程语言中,数组的语法都很简洁。例如在 Python 中,定义一个数组(在 Python 中称为列表)可以使用my_list = [1, 2, 3, 4],访问元素可以直接使用my_list[2]来获取第三个元素。
无序表与有序表:
无序表是一种数据结构,其中的元素没有特定的顺序。元素可以以任意顺序插入和存储。例如,在一个简单的无序表中,可以包含整数元素[3, 7, 1, 9, 4],这些元素的排列顺序不遵循任何预定义的规则,如从小到大或从大到小。
从实现角度看,无序表可以用数组或链表来实现。如果用数组实现,元素在数组中的存储位置是按照插入顺序或者随机分配的;如果用链表实现,节点之间的连接也不体现元素的顺序关系。
有序表是元素按照特定顺序排列的表。这个顺序可以是数字的大小顺序(如从小到大或从大到小)、字母的字典序或者其他自定义的顺序关系。例如,一个从小到大排列的整数有序表可以是[1, 3, 4, 7, 9]。
同样,有序表也可以用数组或链表来实现。在数组实现中,元素的存储顺序符合定义的顺序;在链表实现中,节点之间的连接顺序也体现了元素的顺序。
子程序:
子程序(Subprogram)也称为过程(Procedure)、函数(Function)或方法(Method),是程序中可被其他部分调用的一段独立的代码。它有自己的名称、参数(可以没有)和返回值(函数有返回值,过程可以没有)。
教材学习中的问题和解决过程(先问 AI)
问题一:有序表与无序表的区别?
解决:元素排列顺序
有序表:元素是按照特定的规则进行排列的。这个规则可以是数值大小(如从小到大或从大到小)、字母顺序(字典序)、时间先后顺序等。例如,整数有序表[1, 3, 5, 7, 9]是按照从小到大的顺序排列的;字符串有序表["apple", "banana", "cherry"]是按照字典序排列的。
无序表:元素的排列没有固定的顺序。元素可以以任意的方式插入和存储,不存在预先定义的顺序关系。例如,一个无序表可能是[5, 2, 9, 1, 7],这些元素的存储顺序不遵循某种特定的逻辑。
插入操作
有序表:
插入新元素时需要考虑元素的顺序。如果是用数组实现的有序表,首先要找到合适的插入位置,这可能需要遍历部分或全部数组。找到位置后,还需要将插入位置之后的元素依次向后移动,为新元素腾出空间。例如,在一个从小到大排列的整数数组有序表中插入元素 4,需要先找到插入位置(在 3 和 5 之间),然后将 5 及后面的元素向后移动一位,再插入 4。这种插入操作在最坏情况下,需要移动数组中的所有元素,时间复杂度为,其中是表中元素的个数。
若是用链表实现的有序表,插入新元素同样要先找到合适的插入位置,这通常需要从表头开始遍历链表。找到位置后,修改节点之间的指针来插入新元素。例如,在一个按字典序排列的字符串链表有序表中插入新字符串,需要逐个比较节点中的字符串与要插入的字符串,找到合适位置后插入。在最坏情况下,需要遍历整个链表,时间复杂度为。
无序表:
对于用数组实现的无序表,插入操作相对简单。如果是在数组末尾插入元素,时间复杂度为,只要数组还有足够的空间。但如果数组已满,需要进行扩容操作,这可能会涉及创建新数组并复制元素等操作,时间复杂度会变高。例如,在一个有个元素的数组无序表末尾插入元素,通常很快,但如果数组容量为,插入新元素时就需要扩容。
用链表实现的无序表插入操作比较灵活。在表头插入元素很方便,只需将新元素节点的指针指向当前表头,然后更新表头指针,时间复杂度为。在链表中间或末尾插入元素,需要先找到插入位置(如果是在中间插入)。4
问题二:子程序的作用?
解决:代码复用
提高编程效率:在程序开发过程中,经常会遇到需要多次执行相同或相似操作的情况。例如,在一个图形绘制程序中,可能需要多次绘制圆形。如果没有子程序,每次绘制圆形都要重复编写相同的代码来计算圆周、绘制弧线等操作。而将绘制圆形的代码封装成一个子程序后,无论在程序的何处需要绘制圆形,只需调用这个子程序即可。这样可以避免代码的重复编写,大大节省了开发时间。
易于维护和更新:当需要对重复的代码进行修改或优化时,若没有使用子程序,就需要在每一个使用该代码的地方进行修改,这不仅容易出错,而且工作量巨大。例如,假设在一个大型项目中有多个地方都在使用一段复杂的数学计算代码,若这段代码存在错误或者需要更新算法,若代码是分散的,那么修改起来会非常困难。但如果将这段数学计算代码封装成一个子程序,只需要在子程序内部进行修改,所有调用该子程序的地方都会自动使用修改后的代码,降低了维护成本。
模块化编程
分工协作:对于大型软件项目,通常需要多个程序员协同工作。子程序可以将一个复杂的程序划分为多个相对独立的模块,每个程序员可以负责一个或多个模块的开发。例如,在开发一个电商网站时,可以将用户注册模块、商品展示模块、订单处理模块等分别封装成子程序。不同的程序员可以专注于自己负责的模块,这样可以提高开发效率,同时也便于团队管理和代码集成。
降低程序复杂度:一个复杂的程序如果不进行模块化处理,所有的代码都写在一个主程序中,会使程序的逻辑结构变得非常混乱,难以理解和调试。子程序将程序按照功能划分为多个小的部分,每个部分(子程序)只负责一个特定的功能。例如,在一个操作系统中,文件系统管理、进程调度、内存管理等功能都可以分别通过不同的子程序来实现。这样可以使程序的结构更加清晰,便于理解程序的整体逻辑。