2024-2025-1 20241319 《计算机基础与程序设计》第六周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06 |
这个作业的目标 | Polya如何解决问题 简单类型与组合类型 复合数据结构 查找与排序算法 算法复杂度 递归 代码安全 |
作业正文 | https://www.cnblogs.com/wchxx/p/18523221 |
教材学习内容总结
Polya如何解决问题
Polya提出了一个著名的问题解决框架,通常被称为“Polya的四步”:
- 理解问题:彻底理解问题是什么,需要解决什么。
- 制定计划:设计一个解决问题的方案,可能包括分解问题、寻找模式或使用已知的算法。
- 执行计划:实施计划,可能涉及计算、编程或其他形式的实验。
- 回顾:检查解决方案,确保它是正确的,并从中学习以改进未来的解决方案。
简单类型与组合类型
- 简单类型(Primitive Types):包括整数、浮点数、字符、布尔值等,是不可再分的基本数据单元。
- 组合类型(Composite Types):由简单类型组合而成,例如数组、结构体、类等,可以包含多个简单类型的数据,并进行复杂操作。
复合数据结构
- 数组(Array):一组相同类型的元素集合。
- 链表(Linked List):由节点组成的线性数据结构,每个节点包含数据和指向下一个节点的指针。
- 栈(Stack):后进先出(LIFO)的数据结构。
- 队列(Queue):先进先出(FIFO)的数据结构。
- 树(Tree):由节点和边组成的层次结构,如二叉树、B树等。
- 图(Graph):由节点和边组成的非线性数据结构,用于表示复杂的关系。
查找与排序算法
- 查找算法:
- 线性查找(Linear Search):逐个检查每个元素,直到找到目标元素。
- 二分查找(Binary Search):在有序数组中通过不断缩小查找范围来查找目标元素。
- 排序算法:
- 冒泡排序(Bubble Sort):通过多次遍历数组,比较相邻元素并交换位置。
- 选择排序(Selection Sort):每次选择最小(或最大)的元素放到已排序部分的末尾。
- 插入排序(Insertion Sort):将未排序部分的元素逐个插入到已排序部分的正确位置。
- 快速排序(Quick Sort):一种分治算法,通过选择一个基准值将数组分为两部分。
算法复杂度
算法复杂度分析涉及评估算法执行时间和空间需求的增长速率。常见的复杂度表示包括O(n)、O(n^2)、O(log n)等,它们描述了算法性能随输入规模增加的变化趋势。
递归
递归是一种在问题解决中自我引用的方法,它将问题分解为更小的子问题来解决。递归的关键要素包括:
- 基本情况:递归的终止条件。
- 递归步骤:将问题分解为更小的子问题,并递归解决这些子问题。
代码安全
保护代码安全的方法包括:
- 访问控制:限制对代码的访问。
- 加密:使用加密技术保护代码不被未授权访问。
- 安全协议:使用SSH、TLS等安全协议传输源代码。
- 代码混淆:将源代码转换为难以理解的形式,防止逆向工程。
- 安全审计:定期进行安全审计,检测和防止安全漏洞。
- 员工培训:提高员工对源代码安全性的意识。
当然,让我们更详细地探讨C语言程序设计第五章中关于控制结构和函数的两个主要部分。
控制结构
控制结构是编程中用于控制程序执行流程的语句。在C语言中,控制结构包括条件语句和循环语句。
条件语句
if
语句:用于在满足特定条件时执行代码块。if (condition) { // 条件为真时执行的代码 }
else
语句:与if
配合使用,当if
条件不满足时执行。if (condition) { // 条件为真时执行的代码 } else { // 条件为假时执行的代码 }
else if
语句:允许你检查多个条件。if (condition1) { // 条件1为真时执行的代码 } else if (condition2) { // 条件2为真时执行的代码 } else { // 所有条件都不为真时执行的代码 }
switch
语句:用于根据一个变量的值执行不同的代码块。switch (variable) { case value1: // 当variable等于value1时执行的代码 break; case value2: // 当variable等于value2时执行的代码 break; default: // 没有匹配的case时执行的代码 }
循环语句
for
循环:用于在满足条件时重复执行代码块。for (initialization; condition; increment) { // 循环体 }
while
循环:在条件为真时重复执行代码块。while (condition) { // 循环体 }
do-while
循环:至少执行一次代码块,然后检查条件是否为真以决定是否继续循环。do { // 循环体 } while (condition);
break
和continue
语句:break
用于立即退出循环,而continue
用于跳过当前迭代的剩余部分,直接开始下一次迭代。
函数
函数是C语言中的基本构建块,允许你将代码封装成可重用的单元。
函数定义
- 函数定义包括返回类型、函数名、参数列表和函数体。
returnType functionName(parameterType parameterName, ...) { // 函数体 return value; // 如果返回类型不是void }
函数调用
- 函数调用涉及指定函数名和传递所需的参数。
result = functionName(arg1, arg2, ...);
参数传递
- 值传递:函数接收参数值的副本,对参数的修改不会影响原始变量。
- 地址传递:函数接收参数的内存地址,允许函数直接修改原始变量。
递归函数
- 递归函数是在其定义中调用自身的函数。
int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } }
教材学习中的问题和解决过程
问题:编写的C语言程序在Windows和openeuler中的运行结果有差异
结果:询问AI,得到以下回答:
在C语言程序中,Windows和OpenEuler(Linux发行版)之间的运行结果差异可能是由于以下几个原因造成的:
-
编译器差异:Windows常用MSVC,而Linux常用GCC,它们对C语言标准的支持和实现可能不同。
-
系统调用和库函数:Windows和Linux的系统调用和库函数实现不同,影响程序的I/O和文件操作。
-
文件路径分隔符:Windows使用反斜杠(\),而Linux使用正斜杠(/)。
-
动态链接库:Windows使用DLL,Linux使用SO文件,影响共享库的加载。
为了减少差异,可以采用条件编译和使用标准库函数,避免平台特定的代码。
换用其它代码后问题解决。
基于AI的学习
计划学习时间:
2小时
实际学习时间:
2小时
改进情况: