这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276
这个作业的目标 Polya如何解决问题 简单类型与组合类型 复合数据结构 查找与排序算法 算法复杂度 递归 代码安全
作业正文
教材学习内容总结
学习了《计算机基础与程序设计》中第六章未看完的部分,加深了对于伪代码语句和使用方法的理解;了解了测试程序的原理。学习了该书第七章的内容,掌握了解决问题的流程和方法,能够学会并成功应用集中排序和检索元素的方法;了解了复杂变量的含义;掌握了递归算法的原理。
教材的学习
1.继承性
概念:一个类(子类或派生类)能够继承另一个类(父类或基类)的属性(如成员变量)、方法(如函数)等成员。子类会自动拥有父类的这些可继承特性,就好像子女继承了父母的某些特质一样。
优势:代码复用:避免重复编写相同代码。比如有个“图形”父类有计算面积的方法,“圆形”“矩形”等子类继承它后,无需重写该计算面积方法,直接可用,节省开发时间和精力。
层次化和模块化:方便构建类的层次结构,让代码组织更清晰、有条理,易于理解和维护。例如在一个游戏开发中,“角色”作为父类,“战士”“法师”等子类继承它,各自在继承基础上拓展特有属性和方法。
类型:(1)单继承:子类只能继承一个父类,如在某些编程语言(像Java在早期版本主要是单继承模式)中,一个类只能有一个直接的父类。
(2)多继承:子类可以继承多个父类,能综合多个父类的特性。不过多继承可能会带来一些如命名冲突等复杂问题,部分编程语言(如Python)支持多继承并通过特定机制解决可能出现的问题。
2.简单类型
简单类型通常指那些基本的、不可再分解的数据类型,常见的有以下几种:
数值类型:(1)整数类型:用来表示整数,比如在许多编程语言中常见的有 int (一般表示有符号整数,取值范围依具体语言和平台而定),还有 long (长整数类型,可表示更大范围的整数)等。
(2)浮点类型:用于表示带有小数部分的数值。例如 float (单精度浮点型,精度相对有限)和 double (双精度浮点型,精度更高)。在C语言中, float 一般占4个字节, double 占8个字节。
字符类型:主要用来表示单个字符,比如在C语言中常用的 char 类型。在ASCII编码下, char 类型可以表示0到127的字符值,而在扩展ASCII或Unicode编码下,能表示更多不同语言的字符。
3.组合类型
组合类型是相对于简单类型而言的,它是由多个简单类型或其他组合类型按照一定规则组合而成的数据类型,常见的有以下几种:
数组:(1)概念:是一种将多个相同类型的元素依次排列在一起的数据结构,这些元素可以是简单类型(如整数、字符等),也可以是其他组合类型。例如在C语言中, int arr[5]; 就定义了一个能存放5个整数的数组。
(2)特点:通过下标可以快速访问数组中的元素,下标通常从0开始。数组在内存中是连续存储的,便于进行批量数据处理。
结构体:(1)概念:可以把不同类型的成员(如整数、字符、数组等)组合在一起,形成一个新的逻辑整体。
(2)特点:它允许将相关的数据集中在一起,方便对一组相关属性进行统一管理和操作。不同结构体实例可以有不同的值分配给各个成员。
联合体: 概念:也叫共用体,它允许不同类型的成员共享同一块内存空间。也就是说,在某一时刻,联合体中只有一个成员的值是有效的。
4。递归与迭代
递归
概念:在程序设计中,递归是指在函数的定义中使用函数自身的方法。也就是说,一个函数直接或间接地调用自身来解决问题。
示例:计算阶乘的递归函数。比如求5的阶乘,数学上5! = 5×4×3×2×1。
特点:
- 思路简洁:对于一些具有重复子结构的问题,递归能以很自然的思路来表述解决方案,比如树结构的遍历等问题。
- 可能导致栈溢出:每次函数调用自身都会在栈上开辟新的空间来保存当前函数的状态等信息,如果递归层次过深(比如计算很大数的阶乘),可能会耗尽栈空间,导致栈溢出错误。
迭代
概念:迭代是通过重复执行一系列操作来逐步逼近目标结果的过程。通常使用循环结构(如 for 循环、 while 循环等)来实现。
示例:同样计算5的阶乘
- 特点:
- 效率优势:一般情况下,迭代的执行效率相对递归可能更高,尤其是在处理大规模数据或复杂问题时,因为它不需要像递归那样频繁开辟和管理栈空间。
- 代码逻辑清晰:通过循环结构实现迭代,代码的逻辑关系通常比较清晰,易于理解和维护,能直观看到数据是如何逐步变化得到最终结果的。
递归和迭代都是解决问题的重要手段,在不同的场景下各有优劣,具体选择哪种方法要根据问题的特点和需求来决定。
5.查找与排序
查找
概念:在一组数据中寻找特定元素的操作。比如在一个整数数组中找到值为5的元素所在位置。
常见方法:
- 顺序查找:从数据的第一个元素开始,逐个与要查找的目标元素进行比较,直到找到匹配元素或遍历完整个数据集。简单直接,但效率相对低,尤其数据量很大时。例如在长度为n的数组中,平均要查找n/2次。
- 二分查找:要求数据必须是有序的(如升序或降序排列)。每次查找都将数据集分成两部分,通过比较目标元素和中间元素的大小,确定下一步在哪个部分继续查找。效率高,时间复杂度为O(log₂n)。比如在有序数组中查找一个数,每次能排除一半的数据。
排序
概念:将一组无序的数据按照特定的规则(如升序、降序)重新排列成有序序列的操作。
常见方法:
- 冒泡排序:通过反复比较相邻的元素,如果顺序不对就交换它们的位置。经过多轮比较交换,最终使数据有序。时间复杂度为O(n²),是一种比较简单但效率不高的排序方法。例如对5个元素的数组排序,可能需要进行多轮,每轮多次比较交换。
- 插入排序:将待排序的数据逐个插入到已经有序的部分数据中合适的位置。时间复杂度也是O(n²),但在某些情况下(如数据接近有序)比冒泡排序效率略高。比如有一个有序数组,新插入一个元素时,通过比较找到合适插入位置。
- 快速排序:通过选择一个基准元素,将数据集分成两部分,小于基准的在左边,大于基准的在右边,然后对这两部分分别进行快速排序。时间复杂度平均为O(nlog₂n),是一种高效的排序方法,但最坏情况(如选择的基准元素总是极值)下时间复杂度会变为O(n²)。
- 归并排序:将数据集分成若干个子集,先对每个子集进行排序,然后再将排好序的子集合并成一个有序的整体。时间复杂度为O(nlog₂n),且性能比较稳定,不管在何种情况下时间复杂度基本不变。
查找与排序在数据处理、算法设计等诸多领域都有广泛应用,不同的方法适用于不同的场景和数据特点。
6.代码安全
在计算机领域,代码安全涉及多方面要点:
输入验证
- 严格检查用户输入数据,确保符合预期格式、类型与范围。如网页表单中,预期整数输入就不能接受非整数内容,防恶意输入破坏程序逻辑或发动攻击。
权限管理
- 清晰界定不同用户/角色对代码相关资源(文件、数据库等)的访问权限。普通用户、管理员等各有其能访问和操作的范围,避免越权访问致数据泄露等问题。
防止注入攻击
- SQL注入:与数据库交互代码里,杜绝用户输入恶意拼接成SQL语句。采用参数化查询等方式处理输入,而非直接拼接进SQL语句。
- XSS(跨站脚本攻击):对输出到网页内容,要防止含恶意脚本被浏览器执行。通过对输出内容转义等处理,不让恶意脚本原样展示在网页上。
加密处理
- 数据加密:对敏感数据(用户密码、重要业务数据等)加密存储与传输。可选用对称加密算法(如AES)、非对称加密算法(如RSA),即便数据遭窃取,攻击者也难获真实内容。
- 哈希处理:密码等敏感信息常用哈希函数(如SHA-256)处理,存为固定长度哈希值。登录验证时对比输入密码哈希值与存储值,数据库泄露时攻击者也难直接得原始密码。
代码审查
- 定期安排专业人员审查代码,查找安全漏洞、逻辑错误等。不同视角审查人员可发现易被忽略的潜在安全问题,以便及时修复提升安全性。
应急响应与更新
- 制定应急响应机制,遇安全事件能快速处理。同时关注编程语言、框架、库等更新,及时安装补丁,修复已知安全漏洞,维持代码安全状态。