学期2024-2025-1 学号20241317 《计算机基础与程序设计》第八周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业) |
这个作业的目标 | <写上具体方面> |
作业正文 | https://www.cnblogs.com/manurios/p/18550897 |
教材学习内容总结
1. 问题求解:
- “如何解决它”理论的应用:乔治·波利亚提出的“如何解决它”理论原本用于数学问题求解,将其中的文字未知量换成问题、数据换成信息、定理换成解决方案后,可适用于计算机领域的问题求解,为其提供通用思考框架。
- 提出问题:对于接受的任务,会产生“何时、为什么、在哪里”等疑问;对于自己设置的任务,会下意识思考相关问题,如对问题的了解程度、解决方案的形态、是否存在特例以及如何判断找到了解决方案等。
- 寻找熟悉的情况:在计算机领域,识别相似情况非常重要,很多问题会不断以不同形式出现,好的程序员看到以前解决的任务或子任务,会直接选用已有的解决方案,提高问题解决效率。
- 计算机问题求解过程:首先理解问题,然后分析问题、确定主要任务、编写其余模块,最后根据需要进行重组和改写,这是一个不断迭代和完善的过程,且在编写代码前应先设计好算法。
- 测试算法:类似于数学问题中的检查结果,测试算法是为了确保其正确性和有效性,可通过等价测试等方法验证算法能否正确推出答案。
2. 有简单变量的算法: - 带有选择的算法:涉及根据不同条件执行不同操作,通常使用 if...else 等语句实现,增加了程序的灵活性。
- 带有循环的算法:包括计数控制循环(根据循环次数执行循环体)、时间控制循环(根据时间条件控制循环执行)等,还介绍了利用循环求平方根的算法。
3. 复杂变量: - 数组:是同构项目的有名集合,元素具有相同的类型。可通过单个项目在集合中的位置(索引)来访问数组中的元素,方便对大量数据进行存储和操作。
- 记录:与数组不同,记录是异构项目的有名集合,其中的元素可以具有不同的类型。可通过名字单独访问记录中的项目,类似于结构体在编程语言中的作用,能将不同类型的数据组合在一起进行管理。
4. 搜索算法: - 顺序搜索:按照顺序依次遍历数组或数据集合中的元素,查找目标元素,该算法简单直观,但对于大型数据集合效率较低。
- 有序数组中的顺序搜索:在有序数组中进行顺序搜索时,可利用数组的有序性,在查找过程中根据当前元素与目标元素的大小关系,提前判断是否需要继续搜索,从而提高搜索效率。
- 二分检索:假设要检索的数组是有序的,每次比较操作都可以将数组减少一半,快速找到目标元素,适用于大型有序数据集合的搜索。
5. 排序: - 选择排序:每次从待排序的数据集合中选择最小(或最大)的元素,将其放置在已排序的序列的末尾,直到所有元素都被排序。
- 冒泡排序:属于选择排序的一种变体,通过不断比较相邻的元素并交换它们的位置,将较大(或较小)的元素逐步“冒泡”到数组的末尾,实现排序。
- 插入排序:将待排序的元素逐个插入到已排序的序列中,在插入过程中找到合适的位置,使插入后的序列仍然保持有序。
6. 递归算法: - 子程序语句:子程序是可以被其他程序调用的程序段,递归算法中会频繁使用子程序。
- 递归阶乘:以阶乘为例讲解递归算法的实现,递归算法是直接或间接调用自身的算法,在阶乘计算中,通过不断调用自身计算较小数的阶乘,直到达到基础情况(如 0 的阶乘为 1),然后返回结果。
- 递归二分检索:将递归算法应用于二分检索,提高算法的灵活性和可读性。
- 快速排序:一种高效的排序算法,通过选择一个基准元素,将数组分为两部分,小于基准元素的部分和大于基准元素的部分,然后对这两部分分别进行递归排序,最终实现整个数组的排序。
教材学习中的问题和解决过程(先问 AI)
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
- 问题1:冒泡排序是什么?
- 问题1解决方案:测试算法主要可以通过以下几种常见方式来进行:
等价类划分测试
- 概念:把输入数据的可能取值范围划分成若干个“等价类”,在每个等价类中选取具有代表性的数据作为测试用例。这些等价类可以分为有效等价类(合理的、符合要求的输入数据集合)和无效等价类(不符合要求、不合理的输入数据集合)。
- 示例:比如对于一个计算两个整数相加的算法,如果规定输入的整数范围是 -100到100,那么有效等价类可以是正数相加、负数相加、一正一负相加等不同情况的取值范围;无效等价类则比如输入非整数(如小数、字符等)、超出规定范围的整数等情况,通过对这些不同等价类选取典型值来测试算法在各种合理与不合理输入下的表现。
边界值分析测试
- 概念:着重关注输入数据的边界情况,因为很多错误往往出现在边界处。选取正好处于边界上的值以及边界附近的值作为测试用例。
- 示例:还是上述整数相加算法,如果输入范围是 -100到100,那就会选取 -100、-99、100、101等边界值及边界附近值来测试,看算法在这些关键边界情况下能否正确处理,例如是否能正确处理最大最小值相加、略超出边界值时是否能给出合理的错误提示等。
决策表测试
- 概念:当算法中有多个条件组合来决定执行不同操作时,可使用决策表。它列出各种条件组合以及对应的动作结果,基于此来设计测试用例,确保每种条件组合对应的操作都被测试到。
- 示例:假设有一个根据学生成绩(优秀、良好、及格、不及格)以及是否缺勤(是、否)来判定学生是否需要补考的算法,那就可以构建一个决策表,将成绩和缺勤情况的不同组合罗列清楚,针对每一种组合去测试算法给出的补考判定结果是否正确。
路径覆盖测试(针对有控制流结构的算法,如包含分支、循环等情况)
- 概念:旨在覆盖算法中所有可能的执行路径,通过分析算法的控制流图等方式,找出不同的分支走向、循环执行次数等各种可能路径,然后设计用例来使每条路径都能被执行到。
- 示例:对于一个带有 if-else 分支以及 for 循环的算法,要保证通过不同的输入使得程序进入 if 分支和 else 分支,并且循环在不同的迭代次数情况下都能执行,以此来检查在各种执行路径下算法的正确性。
单元测试(常用于软件开发中,针对算法所在的代码单元进行测试)
- 概念:将算法所在的函数、类等小的代码单元隔离出来进行单独测试,使用专门的测试框架(如Python中的 unittest 框架等),编写测试代码,通过断言等方式来验证算法返回的结果是否符合预期。
- 示例:如果编写了一个计算圆面积的算法函数 calculate_area(radius) ,在单元测试中可以传入不同的半径值,然后使用断言语句来判断函数返回的面积值是否与按照数学公式计算出来的预期面积值相等,像 assert calculate_area(5) == 25 * 3.14 这样的语句(这里仅是示例,实际可能更精确地考虑精度等问题),若不相等则测试失败,提示算法可能存在问题。
比较测试(针对已有标准算法或者已知正确结果的情况)
- 概念:将待测试的算法结果与已知正确的结果(比如有公认的标准算法算出的结果,或者手工计算出的小范围数据的结果等)进行对比,如果一致则说明算法大概率是正确的,不一致则需要进一步排查问题。
- 示例:对于一个排序算法,可以先用一个简单的、已经被验证正确的排序算法(如Python内置的排序函数)对同样的数据进行排序,然后将自己编写的排序算法的结果与之对比,看顺序是否完全一样,以此来判断自己的排序算法是否正确实现。
- 问题2:测试算法如何进行?
- 问题2解决方案:测试算法主要可以通过以下几种常见方式来进行:
等价类划分测试
- 概念:把输入数据的可能取值范围划分成若干个“等价类”,在每个等价类中选取具有代表性的数据作为测试用例。这些等价类可以分为有效等价类(合理的、符合要求的输入数据集合)和无效等价类(不符合要求、不合理的输入数据集合)。
- 示例:比如对于一个计算两个整数相加的算法,如果规定输入的整数范围是 -100到100,那么有效等价类可以是正数相加、负数相加、一正一负相加等不同情况的取值范围;无效等价类则比如输入非整数(如小数、字符等)、超出规定范围的整数等情况,通过对这些不同等价类选取典型值来测试算法在各种合理与不合理输入下的表现。
边界值分析测试
- 概念:着重关注输入数据的边界情况,因为很多错误往往出现在边界处。选取正好处于边界上的值以及边界附近的值作为测试用例。
- 示例:还是上述整数相加算法,如果输入范围是 -100到100,那就会选取 -100、-99、100、101等边界值及边界附近值来测试,看算法在这些关键边界情况下能否正确处理,例如是否能正确处理最大最小值相加、略超出边界值时是否能给出合理的错误提示等。
决策表测试
- 概念:当算法中有多个条件组合来决定执行不同操作时,可使用决策表。它列出各种条件组合以及对应的动作结果,基于此来设计测试用例,确保每种条件组合对应的操作都被测试到。
- 示例:假设有一个根据学生成绩(优秀、良好、及格、不及格)以及是否缺勤(是、否)来判定学生是否需要补考的算法,那就可以构建一个决策表,将成绩和缺勤情况的不同组合罗列清楚,针对每一种组合去测试算法给出的补考判定结果是否正确。
路径覆盖测试(针对有控制流结构的算法,如包含分支、循环等情况)
- 概念:旨在覆盖算法中所有可能的执行路径,通过分析算法的控制流图等方式,找出不同的分支走向、循环执行次数等各种可能路径,然后设计用例来使每条路径都能被执行到。
- 示例:对于一个带有 if-else 分支以及 for 循环的算法,要保证通过不同的输入使得程序进入 if 分支和 else 分支,并且循环在不同的迭代次数情况下都能执行,以此来检查在各种执行路径下算法的正确性。
单元测试(常用于软件开发中,针对算法所在的代码单元进行测试)
- 概念:将算法所在的函数、类等小的代码单元隔离出来进行单独测试,使用专门的测试框架(如Python中的 unittest 框架等),编写测试代码,通过断言等方式来验证算法返回的结果是否符合预期。
- 示例:如果编写了一个计算圆面积的算法函数 calculate_area(radius) ,在单元测试中可以传入不同的半径值,然后使用断言语句来判断函数返回的面积值是否与按照数学公式计算出来的预期面积值相等,像 assert calculate_area(5) == 25 * 3.14 这样的语句(这里仅是示例,实际可能更精确地考虑精度等问题),若不相等则测试失败,提示算法可能存在问题。
比较测试(针对已有标准算法或者已知正确结果的情况)
- 概念:将待测试的算法结果与已知正确的结果(比如有公认的标准算法算出的结果,或者手工计算出的小范围数据的结果等)进行对比,如果一致则说明算法大概率是正确的,不一致则需要进一步排查问题。
- 示例:对于一个排序算法,可以先用一个简单的、已经被验证正确的排序算法(如Python内置的排序函数)对同样的数据进行排序,然后将自己编写的排序算法的结果与之对比,看顺序是否完全一样,以此来判断自己的排序算法是否正确实现。
基于AI的学习
-
问题1:冒泡排序的平均时间复杂度是多少?
-
问题1解决方案:冒泡排序的平均时间复杂度是 O(n^2),其中 n 是列表中的元素数量。这是因为在最坏和平均情况下,冒泡排序都需要比较和交换元素,其操作次数与列表长度的平方成正比。
-
问题1:复杂变量有哪些?
-
问题1解决方案:在计算机科学和编程中,"复杂变量"这个术语不是一个标准术语,因此可能有不同的解释。如果你指的是在编程中可能增加复杂度的变量类型或概念,那么可以考虑以下几种:
-
大型数据结构:如链表、树、图等,它们的操作(如搜索、插入、删除)可能涉及复杂的逻辑。
-
全局变量:在多个函数或模块中共享的变量,可能导致难以追踪的副作用和难以调试的问题。
-
过度复杂的逻辑:变量在代码中使用的方式过于复杂,使得理解和维护变得困难。
-
过度依赖外部状态:变量的值依赖于外部环境或状态,这可能导致代码的行为难以预测。
-
未定义或不确定的行为:某些变量可能在特定条件下表现出未定义或不确定的行为,增加了代码的复杂性。
-
并发和同步问题:在多线程或分布式系统中,共享变量可能导致竞态条件和死锁等复杂问题。
-
大量的依赖关系:变量如果依赖于系统中的许多其他组件,那么理解和修改这些变量的行为就会变得复杂。
-
复杂的类型系统:在某些编程语言中,复杂的类型系统(如泛型、模板等)可能会增加代码的复杂性。
-
动态类型:在动态类型语言中,变量的类型在运行时确定,这可能导致类型错误直到运行时才被发现。
-
隐式转换:某些语言允许隐式类型转换,这可能会导致不易察觉的错误和复杂性。
如果你指的是其他类型的“复杂变量”,请提供更多的上下文,以便我能给出更准确的答案。
三个原则:
- 切勿原封不动地接受生成式人工智能工具的输出;确保对其进行评估、完善和修改(或提示),以适应您的目标。
- 切勿将任何个人数据(自己、同学、老师等)或版权材料纳入到你的提示词中。这个可以说是保护个人隐私的最起码的举措。
- 所有人工智能生成工具都容易产生幻觉,因此会生成不准确或误导性的信息,要学会甄别信息真假
选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
代码调试中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《计算机科学概论(第七版)》
- ...