班级链接 | 2024计算机基础与程序设计 |
---|---|
作业要求 | 第十周作业 |
作业目标 | ①信息系统 ②数据库与SQL ③人工智能与专家系统 ④人工神经网络 ⑤模拟与离散事件 ⑥排队系统 ⑦天气与地震模型 ⑧图形图像 |
教材学习内容总结
《计算机科学概论》第12、13、14章
- 信息系统
- 信息系统:
帮助组织和分析数据的软件,主要包括电子制表软件和数据库管理系统。 - 电子制表软件:
使用单元格组织数据和计算新值的公式,如Excel。单元格可以通过行列标号引用,公式可以引用其他单元格的值和使用内置函数计算结果。 - 电子数据表:
具有多功能性和可扩展性,能够对变化动态地做出响应,自动重新计算相关公式以生成最新结果。 - 数据库管理系统:
包括存储数据的物理文件、支持数据访问和修改的软件以及指定数据库逻辑布局的数据库模式。 - 人工智能
- 人工智能:
处理人类思想的建模和应用,包括图灵测试作为衡量机器是否能像人一样思考的方法。 - 知识表示:
包括语义网和检索树,语义网是知识的图形化表示,捕捉对象间的关系;检索树是表示对抗性移动的知识的重要方法。 - 专家系统:
嵌入人类专家知识,采用规则定义条件以得出结论,适用于多种决策过程,如医疗诊断。 - 模拟、图形学、游戏和其他应用
- 模拟:
计算的一个主要领域,涉及为复杂系统构建计算机模型并用模型进行实验。模型是真实系统的抽象,系统被表示为一组对象或特征以及管理它们行为的规则。 - 模拟类型:
包括连续模拟和离散事件模拟。连续模拟中变化由偏微分方程表示,离散事件模拟中行为被表示为实体、属性和事件。 - 排队系统:
一种离散事件模拟,分析等待时间,使用随机数字模拟事件的到达和持续。 - 计算机图形学:
结合计算机、科学和绘画艺术的领域,依赖数学方程模拟图像中的自然现象,生成接近真实照片的图像。 - 计算机游戏:
玩家可以与系统及玩家之间交互的虚拟世界,开发者使用游戏引擎创建游戏虚拟世界。
《C语言程序设计》第9章
- 变量的内存地址
- 指针变量的定义和初始化:
通过*进行指针变量的声明和初始化过程。 - 间接寻址运算符:
使用间接寻址运算符来访问指针指向的值。 - 按值调用与模拟按引用调用:
解释了函数调用时的按值传递和如何模拟按引用传递。 - 函数指针及其应用
教材学习中的问题与解决过程
问题1:对于指针的增加和减少操作(如p++)如何影响指针的值?
AI:
在C语言中,指针的增加和减少操作(如 p++)会影响指针的值,具体影响取决于指针指向的数据类型。这些操作实际上是基于指针指向的数据类型的大小来进行的。以下是一些关键点:
- 指针的增量操作(p++):
- 当你对指针 p 执行 p++ 操作时,指针的值会增加。
- 增加的量是指针指向的数据类型的大小。例如,如果 p 是指向 int 的指针,而 int 通常是4个字节,那么 p++ 会使 p 的值增加4个字节(在32位系统中)或8个字节(在64位系统中)。
- 这意味着 p 将指向下一个 int 值。
- 指针的减量操作(p--):
- 类似地,p-- 会减少指针的值。
- 减少的量同样是指针指向的数据类型的大小。
- 这意味着 p 将指向前一个 int 值。
- 指针的算术:
- 你也可以直接对指针进行加法或减法操作,如 p += 1 或 p -= 1。
- 这些操作同样是基于指针指向的数据类型的大小来增加或减少指针的值。
- 指针类型和大小:
- 指针增加或减少的具体字节数取决于指针指向的数据类型的大小,这个大小可以通过 sizeof 运算符获得。
- 对于不同类型的指针(如 char、int、float 等),增加或减少的量会不同。
5.跨类型操作: - 如果你尝试对指向不同数据类型的指针进行增加或减少操作,可能会导致未定义行为,因为不同类型占用的内存大小不同。
6.指针越界: - 增加或减少指针的值时,需要小心不要越界,即不要让指针指向不属于数组或分配的内存区域的地址。
7.指针和数组: - 当指针用于数组时,p++ 会使指针移动到数组的下一个元素。
问题2:当未知存入数据大小时,如何操作才能避免缓冲区溢出问题?
AI:
- 使用安全的函数:替代不安全的函数,如使用 strncpy()、strncat()、snprintf() 等函数代替 strcpy()、strcat()、sprintf() 等,这些函数允许指定最大操作长度,从而有效防止缓冲区溢出
- 边界检查:在对数组进行访问时,务必确保索引值在数组的有效范围内。在编写代码时,加入明确的边界检查逻辑,防止数组下标越界导致缓冲区溢出
- 内存操作边界检查:对于动态分配内存的操作,如使用 malloc()、calloc() 等函数分配内存后,在使用该内存区域时要进行边界检查,确保不会超出所分配内存的范围
- 初始化变量:初始化所有变量,特别是用作数组索引的变量,以避免未定义行为
- 避免使用不安全的函数:避免使用像 gets() 这样已知不安全的函数,这个函数不检查目标缓冲区的大小,容易造成溢出
- 使用高级语言特性或库:考虑使用C++中的 std::string 和 std::vector 等容器,它们自动管理内存,减少了缓冲区溢出的风险
- 编译器和工具的使用:使用编译器的警告和错误检查功能,例如GCC的 -Wall -Wextra 选项,可以帮助发现潜在的缓冲区溢出问题。使用静态代码分析工具,如 Clang Static Analyzer,来检测代码中的缓冲区溢出漏洞
- 代码审查和测试:定期进行代码审查,特别关注那些处理外部输入或进行大量内存操作的代码段。编写和执行针对缓冲区溢出的单元测试,确保代码在边缘条件下也能正常工作
- 地址空间布局随机化:操作系统可以通过随机化内存分配来增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的
- 栈保护:开启栈保护机制,如使用 -fstack-protector-strong 编译器选项,可以帮助检测缓冲区溢出攻击,并在程序运行时进行防御
基于AI的学习
学习进度条
计划学习时间:25h
实际学习时间:25h