2024-2025-1 20241314 《计算机基础与程序设计》第十一周学习总结
2024-2025-1 20241314 《计算机基础与程序设计》第十一周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第十一周作业 |
这个作业的目标 | 计算机网络 网络拓扑 云计算 网络安全 Web HTML,CSS,Javascript XML |
作业正文 | 正文 |
教材学习内容总结
计算机科学概论(第七版)第15,16章
第15章:数据库与信息管理
- 数据库概述
定义:数据库是一个有组织的数据集合,通常以电子形式存储。
数据库管理系统(DBMS):用于创建、管理和操作数据库的软件,例如MySQL、Oracle、Microsoft SQL Server等。 - 数据模型
关系模型:数据以行和列的形式存储,每个表代表一个实体,表之间通过键值关联。
对象关系模型:结合了关系模型和对象导向方法,支持复杂数据类型。
层次模型与网络模型:较旧的模型,数据结构以树形和网状方式组织。 - SQL语言
基础操作:详细讲解SQL的四个基本操作:
选择(SELECT):从表中检索数据。
插入(INSERT):向表中添加新记录。
更新(UPDATE):修改已有记录。
删除(DELETE):删除记录。
条件查询:使用WHERE子句、ORDER BY、GROUP BY等进行数据过滤和排序。
多表联接:使用JOIN操作从多个表中提取相关数据。 - 数据库设计
规范化:通过将数据分解为多个表来消除冗余,保证数据一致性。
键的概念:主键的定义与作用,外键的使用以建立表之间的关系。 - 事务管理与并发控制
事务的ACID特性:
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
一致性(Consistency):事务执行后,数据必须处于一致性状态。
隔离性(Isolation):并发事务之间相互独立,运行结果不干扰。
持久性(Durability):成功的事务结果在系统失败后仍然保持。
并发控制技术:锁机制、时间戳等,防止数据冲突。 - 数据安全性与隐私
数据备份与恢复:保护数据不丢失的一系列措施。
用户授权与身份验证:确保只有授权用户才能访问或修改数据。
隐私保护:法律法规(如GDPR)的影响和实现数据最小化原则。
第16章:计算机网络
- 网络概述
定义与功能:计算机网络是通过通信链路连接的计算机系统,用于数据交换和资源共享。 - 网络类型
局域网(LAN):限制在较小地理范围内(如一个建筑内),速度快,成本较低。
广域网(WAN):覆盖广泛的地理区域,通常由多个局域网组成,速度较慢,使用公共或租用的路线。
互联网:全球最大的计算机网络,实现全球的信息共享。 - 网络协议
TCP/IP协议栈:
传输层(TCP/UDP):负责数据传输的可靠性和顺序。
网络层(IP):地址寻址与路由选择。
应用层:支持实际应用程序的协议,如HTTP、FTP、SMTP等。 - 网络安全
威胁种类:病毒、恶意软件、攻击(如DDoS)等。
安全措施:
加密:SSL/TLS协议用于数据传输安全。
防火墙:监控进出网络的流量规则。
入侵检测和预防系统(IDS/IPS):识别和响应网络攻击。 - 网络应用
电子邮件:实现点对点的消息传递,涉及SMTP、IMAP/POP3等协议。
网页和浏览:HTTP/HTTPS协议的作用和浏览器的功能。
文件传输:通过FTP和P2P技术实现文件的快速共享。
《C语言程序设计》第10章
- 指针的基本概念
指针定义:指针是一个变量,它存储另一个变量的内存地址。指针类型决定了它指向的数据类型,例如int*是指向整数类型数据的指针。
c
int a = 10; // 整数变量
int *p; // 声明一个指向整数的指针
p = &a; // p现在指向a的地址
取地址运算符(&):用于获取变量的内存地址。
解引用运算符():用于访问指针所指向的值。例如,p给出了指针p指向的整数的值。
- 指针的操作
指针赋值:指针可以通过赋值操作指向不同的内存地址。
c
int b = 20;
p = &b; // p现在指向变量b
指针的加减法:指针可以进行加减运算。例如,p++将指针向后移动一个数据类型的大小(如果p是int*,则指向下一个整型)。
指针的比较:可以比较两个指针是否指向相同的地址。
- 指针与数组
数组与指针关系:数组名可以视为指向数组第一个元素的指针。可以使用指针算术执行数组操作。
c
int arr[] = {1, 2, 3};
int *p = arr; // p指向数组的第一个元素
printf("%d", *(p + 2)); // 输出3
数组遍历:使用指针遍历数组元素。
c
for (int i = 0; i < 3; i++) {
printf("%d ", *(p + i)); // 通过指针访问数组元素
}
4. 动态内存分配
静态与动态内存:静态内存分配在程序编译时确定,动态内存分配在运行时确定。
malloc()函数:
功能:在堆上请求指定大小的内存。
用法:返回void指针,通常需要类型转换。
c
int *ptr = (int *)malloc(5 * sizeof(int)); // 分配5个整数的内存
free()函数:释放之前通过malloc()分配的内存,防止内存泄漏。
c
free(ptr); // 释放内存
calloc()函数:分配内存并初始化为0,通常用于创建数组。
c
int *arr = (int *)calloc(5, sizeof(int)); // 分配5个初始化为0的整数
realloc()函数:调整已分配内存的大小。
c
int *newArr = (int *)realloc(arr, 10 * sizeof(int)); // 扩展到10个整数
5. 指针与函数
指针作为函数参数:可以通过指针传递参数,使得函数可以修改传入的变量。
c
void modify(int *p) {
*p = 20; // 直接修改p所指向的值
}
int main() {
int a = 10;
modify(&a); // 传递a的地址
printf("%d", a); // 输出20
return 0;
}
返回指针:函数可以返回指向动态分配内存的指针。
c
int* allocateArray(int size) {
return (int *)malloc(size * sizeof(int)); // 返回指向整型数组的指针
}
6. 结构体与指针
结构体定义:允许定义包含多种数据类型的数据结构。
c
struct Point {
int x;
int y;
};
指向结构体的指针:可以使用指针访问结构体的成员。
c
struct Point p1 = {10, 20};
struct Point* pPtr = &p1; // pPtr指向结构体p1
printf("%d", pPtr->x); // 使用->访问结构体成员,输出10
7. 多级指针
多级指针:指向指针的指针,可用于实现更复杂的数据结构,如链表或二维数组。
c
int **pp; // pp是一个指向指针的指针
示例:动态分配一个二维数组。
c
int **matrix;
matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
}
总结
第10章深入探讨了指针的各种操作和使用场景,以及动态内存管理的重要性。掌握这些概念对于编写高效和灵活的C语言程序至关重要,特别是在处理数据结构(如链表、树等)时。
教材学习中的问题和解决过程
- 问:什么是静态内存和动态内存
答:
静态内存
定义:静态内存分配是在程序编译时确定的内存分配方式。在程序启动时,所需的内存量是固定的,分配的内存空间在程序运行期间不会改变。
特点:
分配时机:静态内存分配在编译时进行,编译器根据变量声明来确定每个变量的内存需求。
生命周期:静态内存分配的变量在程序的整个生命周期内有效,直到程序结束。
内存固定性:一旦分配,其大小不能改变,且通常存储在程序的栈区和全局区(例如全局变量、静态变量)。
速度:由于内存已经在编译时确定,静态内存分配的访问速度较快。
动态内存
定义:动态内存分配是在程序运行时请求和释放内存的方式。程序可以根据需要,在运行时动态分配所需的内存空间,并在不再需要时及时释放。
特点:
分配时机:动态内存分配在运行时进行,通常通过库函数(在C语言中,如malloc(), calloc(), realloc(), 和 free())来实现。
生命周期:动态分配的内存的生命周期由程序员控制,只有在调用free()或程序结束时,才会被释放。
内存灵活性:可以根据需要随时请求并释放内存,因此更适用于处理大小不固定的数据结构(例如链表、树等)。
内存管理复杂性:需要手动管理内存的分配和释放,容易导致内存泄漏或悬空指针等问题。
· 静态内存适合于在编译时可确定内存需求的情况,比如固定长度的数组和全局变量。
· 动态内存适合于内存需求在运行时不确定的场景,比如需要可变大小的数据结构。
-
问:为什么要进行动态内存分配?
答:动态内存分配在程序设计中扮演着重要的角色,尤其是在处理数据结构和内存管理时。进行动态内存分配的主要原因包括: -
灵活性
大小可变数据:在编写程序时,通常无法预先知道需要多少内存。例如,数组的大小可以根据用户输入、文件的大小或其他条件动态确定。
动态调整:动态内存可以根据程序的需要随时增加或减少大小,例如扩展数组或链表的容量。 -
高效使用内存
避免浪费:通过动态内存分配,程序只在需要的时候分配内存,未使用的内存不会被占用,避免了静态内存分配可能带来的浪费。
适应运行时需求:可以随时分配和释放内存,使得程序能够在运行过程中适应资源的变化。例如,分配内存来存储用户数据或临时数据。 -
处理复杂的数据结构
数据结构:许多复杂的数据结构(如链表、树、图等)需要动态内存分配来实现,因为这些结构的大小和形状在程序运行时是动态变化的。
节点创建:例如,在链表中,每个节点的创建和删除都需要动态内存分配。每当插入或删除节点时,程序需要在堆上分配或释放内存。 -
生命周期控制
控制内存生命周期:动态内存分配允许程序员控制内存的生命周期。这意味着在特定需求下,内存可以在创建时分配,并在不再需要时及时释放,避免造成内存泄漏。
延迟释放:程序可以分配内存并在稍后的时间释放,而不是在程序启动时分配一大块内存。 -
增强程序模块性和可重用性
模块化设计:动态内存分配可以使得程序的模块之间更具独立性,一个模块可以根据需要请求内存,而不必依赖于其它模块的内存布局。
简化重用:某些库和程序设计模式依赖于动态分配内存,以便能够更容易地重用代码和结构。 -
支持复杂的并发编程
并发操作:在多线程程序中,动态内存分配允许多个线程安全地创建和销毁对象,提高了程序的灵活性和响应能力。
总结
动态内存分配为程序设计提供了极大的灵活性和效率,使得程序能够根据实时需求调整内存使用。通过合理使用动态内存分配,程序可以更高效地处理数据、优化内存使用,并构建复杂而功能丰富的数据结构。 -
问:动态内存分配的具体实现
答:
基于AI的学习