作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第六周作业 |
这个作业的目标 | |
作业正文 | 2024-2025-1学号20241309《计算机基础与程序设计》第六周学习总结 |
教材学习内容总结
《计算机科学概论》第七章:
1. Polya 解决问题的方法:
- 理解问题:这是解决问题的第一步,必须彻底弄清楚问题的要求、已知条件和未知条件等,避免对问题的理解出现偏差或遗漏。只有清晰地理解了问题,才能为后续的解决步骤打下坚实的基础。
- 找到数据和未知量之间的联系(拟定计划/方案):分析问题中数据与未知数的关系,思考如何利用已知信息来推导或计算出未知量。这一步需要充分发挥创造力和逻辑思维能力,尝试找出解决问题的多种途径和方法,并选择最合适的方案。
- 执行方案:按照选定的方案逐步实施,将理论上的解决方案转化为实际的操作步骤。在执行过程中要保持严谨和细致,确保每一个操作都正确无误。
- 分析得到的解决方案:对执行方案后得到的结果进行检验和评估,看是否真正解决了问题。如果结果不理想,需要反思问题出在哪里,是方案本身存在缺陷,还是执行过程中出现了错误,以便对解决方案进行改进和完善。
2. 简单类型与组合类型:
- 简单类型:是基本的数据类型,如整数类型(用于表示整数)、浮点类型(用于表示小数)、字符类型(用于表示单个字符)、布尔类型(用于表示真或假两种逻辑值)等。这些类型是构建更复杂数据结构的基础。
- 组合类型:是由多个简单类型或其他组合类型组合而成的数据类型,能够表示多个数据的集合或具有多个属性的数据。常见的组合类型有:
- 序列类型:元素按顺序排列的集合,例如数组、列表、字符串等。数组是相同类型元素的有序集合,可以通过索引访问其中的元素;列表是可变长度的元素序列,可以包含不同类型的元素;字符串是字符的序列,在计算机应用中具有不可替代的作用。
- 集合类型:元素的无序集合,其中的元素具有唯一性,即集合中不会出现重复的元素。集合常用于表示一些需要去重或判断元素是否存在的情况。
- 映射类型:由键值对组成的数据结构,通过键来快速查找对应的值。例如字典(在一些编程语言中也称为哈希表或关联数组),可以根据键快速获取与之关联的值。
3. 复合数据结构:是在简单类型和组合类型的基础上构建的更复杂的数据结构,它将多种数据类型组合在一起,以满足特定的应用需求。例如:
- 结构体(记录):在一些编程语言中,结构体是一种将不同类型的变量组合在一起的复合数据类型。结构体中的每个成员都有自己的名称和数据类型,可以通过成员的名称来访问和操作结构体中的数据。这种数据结构常用于表示具有多个属性的实体,如学生信息(包含姓名、年龄、学号等属性)。
- 链表:链表是一种动态的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的优点是可以灵活地添加和删除节点,适用于数据量不确定或需要频繁修改的数据集合。
- 树:树是一种分层的数据结构,由节点和边组成。树中的每个节点都可以有多个子节点,但只有一个父节点(除了根节点,根节点没有父节点)。树结构常用于表示具有层次关系的数据,如文件系统、组织结构等。
- 图:图是一种更为复杂的非线性数据结构,由顶点和边组成。图中的顶点可以与任意其他顶点相连,边可以具有权重或方向等属性。图结构常用于表示复杂的关系网络,如社交网络、交通网络等。
4. 查找与排序算法:
- 查找算法:
- 顺序查找:也称为线性查找,是最基本的查找算法。它从数据集合的一端开始,逐个检查每个元素是否为要查找的对象,直到找到为止。顺序查找的优点是简单易懂,适用于数据量较小或数据未排序的情况,但查找效率较低。
- 二分检索(二分查找):适用于已排序的数据集合。它通过不断将数据集合分成两半,比较中间元素与要查找的元素的大小,确定要查找的元素在左半部分还是右半部分,然后在相应的部分继续进行查找。二分查找的效率较高,时间复杂度为 O(log n)。
- 排序算法:
- 选择排序:每次从待排序的数据集合中选择最小(或最大)的元素,将其与当前位置的元素交换,直到整个数据集合排序完成。选择排序的算法简单,但效率较低,时间复杂度为 O(n²)。
- 冒泡排序:通过不断比较相邻的两个元素,将较大(或较小)的元素交换到后面(或前面),经过多次循环,使数据集合逐渐有序。冒泡排序的优点是易于理解和实现,但效率也不高,时间复杂度为 O(n²)。
- 插入排序:将待排序的元素逐个插入到已排序的部分中,保持已排序部分的有序性。插入排序对于接近有序的数据集合效率较高,时间复杂度在最好情况下为 O(n),在最坏情况下为 O(n²)。
- 快速排序:一种基于交换的高效排序算法。它首先选择一个基准元素,将数据集合分成两部分,一部分的元素小于基准元素,另一部分的元素大于基准元素,然后对这两部分分别进行递归排序。快速排序的平均时间复杂度为 O(n log n),但在最坏情况下可能退化为 O(n²)。
5. 算法复杂度:
算法复杂度是衡量算法效率的重要指标,它反映了算法在运行时所需的资源(主要包括时间资源和内存资源)。
- 时间复杂度:表示算法执行所需的时间与问题规模之间的关系。常用的时间复杂度有 O(1)(常数时间,表示算法的执行时间不随问题规模的增加而变化)、O(n)(线性时间,表示算法的执行时间与问题规模成正比)、O(n²)(平方时间,表示算法的执行时间与问题规模的平方成正比)等。在分析算法的时间复杂度时,通常关注算法中最耗时的操作或循环的执行次数。
- 空间复杂度:表示算法执行所需的存储空间与问题规模之间的关系。空间复杂度的分析主要考虑算法中所使用的变量、数组、结构体等数据结构所占用的存储空间,以及递归调用时所需的栈空间等。
6. 递归:
递归是一种算法调用它本身的编程技巧。递归算法通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归一般需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。递归的优点是可以用简洁的代码实现复杂的功能,并且代码的逻辑清晰易懂,但递归调用会占用较多的系统资源,可能导致栈溢出等问题。
7. 代码安全:
在问题求解和算法设计过程中,代码安全是一个非常重要的考虑因素。代码安全涉及到防止代码被恶意攻击、保护用户数据的隐私和完整性等方面。例如,在编写代码时要注意对输入数据的合法性进行验证,防止用户输入恶意数据导致程序崩溃或执行非法操作;对敏感数据进行加密处理,防止数据泄露;对程序的访问权限进行严格控制,防止未经授权的访问等。
《C语言程序设计》第五章:
选择结构概述
选择结构用于根据条件判断来决定程序的执行路径,使得程序可以根据不同情况执行不同的代码块,增强程序的灵活性和逻辑性。
if语句
1. 单分支if语句
格式为: if(表达式) 语句; 。当表达式的值为真(在C语言中,非零值表示真,零值表示假)时,执行后面的语句;若表达式的值为假,则跳过该语句。例如, if(x > 5) printf("x大于5\n"); ,这里当 x 的值大于 5 时,就会输出相应内容。
2. 双分支if - else语句
格式为: if(表达式) 语句1; else 语句2; 。当表达式的值为真时,执行语句1;当表达式的值为假时,执行语句2。例如, if(a % 2 == 0) printf("偶数\n"); else printf("奇数\n"); 用于判断 a 是偶数还是奇数。
3. 多分支if - else if - … - else语句
用于处理多种可能的情况。格式为: if(表达式1) 语句1; else if(表达式2) 语句2; … else 语句n; 。程序会依次判断表达式的值,当某个表达式的值为真时,执行对应的语句,然后跳过后面的判断。若所有表达式的值都为假,则执行 else 后的语句(如果有 else 部分)。比如根据学生成绩划分等级: if(score >= 90) printf("A"); else if(score >= 80) printf("B"); else if(score >= 70) printf("C"); else if(score >= 60) printf("D"); else printf("E");
switch语句
- 基本形式: switch(表达式) { case 常量表达式1: 语句组1; break; case 常量表达式2: 语句组2; break; … default: 语句组n; } 。首先计算 switch 后面表达式的值,然后与各个 case 后面的常量表达式的值进行比较。若与某个 case 的值相等,则执行该 case 后面的语句组,直到遇到 break 语句或者 switch 语句结束。如果没有匹配的 case ,则执行 default 后面的语句组( default 部分可选)。例如, switch(day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; … default: printf("输入错误"); } 可根据 day 的值输出相应的星期。
- 注意事项: case 后的常量表达式的值必须互不相同,且只能是整型或字符型常量。 break 语句在 switch 语句中非常关键,若遗漏可能导致程序执行流程不符合预期,出现“穿透”现象。
条件运算符
- C语言提供了条件运算符( ?: ),这是一个三目运算符。其一般形式为: 表达式1? 表达式2 : 表达式3 。先计算表达式1的值,如果为真,则整个表达式的值为表达式2的值;如果为假,则整个表达式的值为表达式3的值。例如, max = (a > b)? a : b; 用于求 a 和 b 中的较大值,它可以看作是 if - else 语句的一种简洁表示形式。
选择结构的嵌套
在 if 语句或 switch 语句内部可以再包含其他的 if 语句或 switch 语句,形成嵌套结构。但要注意嵌套的层次不要过于复杂,以保证程序的可读性和可维护性。在嵌套使用时,要特别注意 else 与 if 的配对规则, else 总是与它上面最近的且未配对的 if 配对,可以通过添加花括号来明确配对关系。
教材学习中的问题和解决过程
问题1:进行实验二基本要求的代码编写时发现可以运行但是计算出出的结果与正确结果不同;;
问题1解决方案:通过询问助教。发现是误将&打成了%
基于AI的学习
其他(感悟、思考等,可选)
设计并实现一个位运算计算器。该计算器能够对整数执行下列基本的位运算:
(1)按位与(AND)
(2)按位或(OR)
(3)按位取反(NOT)
(4)按位异或(XOR)
(5)左移(LEFT SHIFT)
(6)右移(RIGHT SHIFT)