2024-2025-1 20241311 《计算机基础与程序设计》第九周学习总结
学期 2024-2025-1 学号 20241311 《计算机基础与程序设计》第九周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接> 2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(2024-2025-1计算机基础与程序设计第九周作业) |
这个作业的目标 | <写上具体方面> |
作业正文 | ... 本博客链接 |
教材学习内容总结
计算机科学概论第七版第八章学习总结
一、数据结构与算法
- 核心概念:本章详细介绍了各种基本数据结构(如数组、链表、栈、队列、树、图等)的定义、特点和应用场景。同时,也涵盖了常见算法(如排序、搜索、图算法等)的原理和实现。
- 算法分析:通过学习,我掌握了算法的时间复杂度和空间复杂度的分析方法,能够评估算法的性能和效率。
- 实践应用:通过案例分析和编程实践,我学会了如何根据问题需求选取最合适的数据结构和算法,并编写代码实现算法逻辑。
二、计算机网络
- 网络基础:本章介绍了计算机网络的基本概念、分类和组成,包括网络硬件、网络软件和网络协议等。
- 网络协议:详细阐述了网络分层模型、协议栈、数据传输过程等,帮助我理解了信息如何在不同设备间流动和交互。
- 网络安全:学习了网络安全的基本概念、威胁类型、防御措施和加密技术等,增强了我对网络安全的意识和防范能力。
四、数据库系统
- 数据库设计:掌握了数据库设计的基本原则、方法和步骤,能够根据实际需求设计合理的数据库结构。
- SQL语言:深入学习了SQL查询语言的基本语法和高级功能,能够熟练地进行数据查询、插入、更新和删除等操作。
- 数据库管理:了解了数据库的性能优化、事务处理、并发控制和安全性等方面的知识,为数据库系统的运维和管理提供了有力支持。
五、软件工程(
- 软件开发流程:学习了软件开发生命周期的各个阶段,包括需求分析、设计、编码、测试、部署和维护等,对软件开发过程有了全面的认识。
- 需求分析与设计:掌握了需求分析的基本方法和设计模式的原理,能够根据用户需求进行软件设计和开发。
- 测试与调试:学习了软件测试的基本原理和方法,包括单元测试、集成测试和系统测试等,以及调试技巧和错误处理策略。
《C语言程序设计》第五版第八章详细总结
-
指针与数组、字符串的深入关系
- 我深入理解了指针与数组之间的紧密联系,明白了数组名在大多数情况下是如何被当作指针来使用的。
- 我掌握了字符串的表示方法,包括字符数组和指向字符的指针,以及如何使用这些表示方法来进行字符串操作。
-
结构体与联合体的应用
- 我学会了如何定义和使用结构体和联合体,这些构造允许我创建包含多个不同类型成员的数据类型。
- 我理解了结构体和联合体在内存中的布局,以及如何通过指针来访问和操作这些构造中的成员。
-
枚举类型的定义与使用
- 我掌握了枚举类型的定义方法,以及如何使用枚举类型来表示一组相关的常量。
- 我了解了枚举类型在程序中的用途,包括提高代码的可读性和可维护性。
-
文件操作的基础与进阶
- 我学习了文件的基本概念,包括文本文件和二进制文件的区别。
- 我掌握了文件的打开、关闭、读写操作,以及如何使用文件指针来遍历文件。
- 我了解了文件操作中的错误处理机制,并学会了如何编写健壮的文件操作代码。
-
动态内存管理的原理与实践
- 我深入理解了动态内存分配与释放的原理,以及为什么在C语言中需要动态内存管理。
- 我掌握了malloc、calloc、realloc和free等函数的使用,这些函数允许我在程序运行时动态地分配和释放内存。
- 我学习了如何避免内存泄漏和野指针问题,以提高程序的稳定性和安全性。
-
预处理指令的掌握
- 我了解了预处理指令的基本概念和作用,包括宏定义、条件编译和文件包含等。
- 我掌握了如何使用预处理指令来提高代码的可读性、可维护性和可移植性。
教材学习中的问题和解决过程(先问 AI)
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
-
问题1:指针和数组名在什么时候可以互换使用?它们在内存中是如何表示的?
-
问题1解决方案:互换使用情况
数组名作为函数参数时:
当数组名作为函数参数传递时,它会自动转换为指向数组首元素的指针。这意味着在函数内部,可以通过指针来访问和修改数组的元素。
通过指针访问数组元素时:
在大多数情况下,数组名可以像指针一样使用,通过下标或指针算术来访问数组中的元素。例如,arr[i] 等价于 *(arr + i),其中 arr 是数组名,i 是索引。
sizeof 和 & 运算符的例外:
需要注意的是,当数组名作为 sizeof 或 & 运算符的操作数时,它不会转换为指针。sizeof(arr) 返回的是整个数组的大小(以字节为单位),而 &arr 返回的是指向整个数组的指针。
在内存中的表示
数组:
数组在内存中是连续分配的,每个数组元素占用相同大小的空间。数组名在大多数情况下表示数组首元素的地址,但它本身不是一个指针变量,而是一个地址常量,不能被赋值。数组的大小在编译时就已确定,并且在数组的生命周期内保持不变。
指针:
指针是一种变量,它存储的是一个地址,该地址指向某个数据或对象。指针的大小通常与程序编译运行的机器字长相关(例如,在32位机器上通常是4个字节,在64位机器上通常是8个字节)。指针可以被赋值,以指向不同的地址。通过指针,我们可以间接访问和操作它所指向的数据或对象。 -
问题2:结构体和联合体在内存中的布局有什么区别?如何计算它们的大小?
-
问题2解决方案:结构体和联合体在内存中的布局及大小计算
一、内存布局的区别
结构体(Struct):
- 独立内存空间:结构体中的每个成员都拥有自己独立的内存空间,这些空间在内存中连续排列,但每个成员之间互不影响。
- 内存对齐:结构体成员在内存中的排列还可能受到对齐规则的影响,编译器可能会在成员之间插入填充字节,以确保每个成员都按其自然边界对齐,从而提高访问速度。
- 总大小:结构体的总大小通常等于所有成员大小之和(包括填充字节),且为最大成员对齐数的整数倍。
联合体(Union):
- 共享内存空间:联合体中的所有成员共享同一块内存空间,这意味着在任何给定时间,联合体内只能存储一个成员的值。
- 内存覆盖:由于联合体成员共享内存,因此对联合体中一个成员的赋值会覆盖其他成员的值。
- 总大小:联合体的大小至少是其最大成员的大小,且这个大小通常是所有成员类型大小的最大对齐数的整数倍。但联合体本身不会因为对齐而增加额外的内存开销,因为其大小已经直接等于最大成员的大小(或对齐后的大小)。
二、大小计算
结构体大小计算:
- 计算每个成员的大小。
- 确定每个成员的对齐数,对齐数通常是成员大小与编译器默认对齐数中的较小值。
- 根据对齐数画出成员在内存中的相对位置,并计算成员之间的填充字节。
- 确定结构体的总大小,总大小必须是最大对齐数的整数倍,如果成员总大小不是最大对齐数的整数倍,则需要添加填充字节以满足对齐要求。
联合体大小计算:
- 找出联合体中所有成员的大小。
- 确定最大成员的大小。
- 考虑对齐要求,联合体的大小至少是其最大成员的大小,并且如果最大成员的大小不是其最大对齐数的整数倍,则联合体的大小需要增加到最大对齐数的下一个整数倍。但通常情况下,由于联合体大小直接等于最大成员的大小(或对齐后的大小),这一步可能不需要额外增加内存。
示例
假设有以下结构体和联合体的定义:
struct MyStruct {
char a; // 1字节
int b; // 4字节,假设对齐数为4
short c; // 2字节,假设对齐数为2
};
union MyUnion {
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
结构体MyStruct的大小计算:
- 成员a占用1字节。
- 成员b需要4字节对齐,因此在a之后可能有3字节的填充。
- 成员c占用2字节,其起始地址已经是2的倍数(考虑前面的填充),不需要额外对齐。
- 因此,MyStruct的总大小为1(a)+ 3(填充)+ 4(b)+ 2(c)= 10字节。但由于最大对齐数为4,且10不是4的倍数,因此需要额外添加2字节填充,使得总大小为12字节。
联合体MyUnion的大小计算:
- 最大成员是b,占用4字节。
- 由于联合体大小直接等于最大成员的大小(或对齐后的大小),且4字节已经是任何小于或等于4字节成员类型的对齐数的整数倍,因此MyUnion的大小就是4字节,不需要额外对齐或填充。
- ...
基于AI的学习
我正在学习一维数组的定义和初始化的知识点请你以苏格拉底的方式对我进行提问一次一个问题
文心一言(ERNIE-4.0-Turbo-8K)
好的,让我们以苏格拉底的方式进行对话。我会扮演苏格拉底,通过提问来帮助你深入理解一维数组的定义和初始化。
苏格拉底:首先,让我们从基础开始。你能告诉我,什么是一维数组吗?
一组具有相同类型的变量 的集合,他是一种顺序储存、随机访问的顺序表结构
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:非常好,你准确地描述了一维数组的基本概念。那么,接下来,请你解释一下一维数组在内存中是如何存储的呢?
储存在内存的一个连续区域中
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:完全正确!你理解得很透彻。现在,让我们进一步探讨数组的初始化。你能告诉我,什么是数组的初始化,以及它的重要性吗?
定义素组的长度
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:你的回答似乎有些偏离了问题。数组的初始化是指为数组分配内存并为数组的每个元素赋予初始值的过程。它的重要性在于,它确保了数组在使用之前已经被正确地设置,从而避免了潜在的错误和未定义行为。现在,你能重新回答一下,什么是数组的初始化,以及为什么它很重要吗?
数组的初始化是指为数组分配内存并为数组的每个元素赋予初始值的过程。它的重要性在于,它确保了数组在使用之前已经被正确地设置,从而避免了潜在的错误和未定义行为。
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:非常好,你回答得既准确又完整!你已经很好地掌握了一维数组的定义和初始化的知识点。那么,最后我想问你,你能举一个具体的例子来说明如何初始化一个一维数组吗?
请你举一个例子
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:当然,我是希望你能举一个具体的例子来说明如何初始化一个一维数组。比如,在C语言中,我们可以这样初始化一个整型数组:int arr[5] = {1, 2, 3, 4, 5};。这个例子中,我们定义了一个长度为5的整型数组,并为它的每个元素赋予了初始值。你能根据这个例子,自己举一个类似的例子吗?
int score[2]{1,2}
文心一言(ERNIE-4.0-Turbo-8K)
苏格拉底:很好,你给出的例子完全正确!int score[2]{1,2}; 在C++11及之后的版本中,这是一种有效的数组初始化方式,称为列表初始化。你定义了一个长度为2的整型数组,并为它的两个元素分别赋予了初始值1和2。你的学习进步很快,继续保持!
代码调试中的问题和解决过程
- 问题1:使用函数时无法对原函数的变量做出修改
- 问题1解决方案:使用指针变量
- 问题2:计算三次根式精度不够
- 问题2解决方案:将pow(n,1.0/3.0)换为herb函数
- ...
其他(感悟、思考等,可选)
菜就多练
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 800/1300 | 2/9 | 30/90 | |
第五周 | 1000/1200 | 2/2 | 40/90 | |
第二周 | 1100/1500 | 2/4 | 44/90 | |
第三周 | 1000/1000 | 3/7 | 50/90 | |
第四周 | 1200/1300 | 2/9 | 50/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《计算机科学概论(第七版)》
- ...