2024-2025-1 20241401 《计算机基础与程序设计》 第十一周学习总结
| 班级链接 | 2024计算机基础与程序设计 |
|---|---|
| 作业要求 | 第十一周作业 |
| 作业目标 | ①计算机网络 ②网络拓扑 ③云计算 ④网络安全 ⑤Web ⑥HTML,CSS,Javascript ⑦XML |
教材学习内容总结
《计算机科学概论》第15、16章
第15章
计算机网络基础
- 网络类型
- 局域网(LAN):通常覆盖范围较小。其特点是数据传输速率高、延迟低,适用于内部资源共享,如共享打印机、文件服务器等设备。
- 广域网(WAN):能覆盖较大的地理区域。它利用公共通信基础设施,像电话线、光纤等传输数据,常用于连接多个局域网。
- 互联网(Internet):是全球范围内相互连接的计算机网络的集合,它使不同网络中的计算机能够相互通信和共享资源。
- 网络连接
- 网络拓扑结构
- 星型拓扑:以中央节点(如集线器或交换机)为中心,其他节点(如计算机)都连接到中央节点。
- 环型拓扑:所有节点通过通信链路连接成一个闭合的环形。数据在环中单向传输,每个节点接收并转发数据。
- 总线型拓扑:所有节点都连接到一条共享的总线上。数据在总线上广播式传输,任何节点都可以接收。
- 树型拓扑:是一种层次化的拓扑结构,由根节点、分支节点和叶节点组成。
- 网状型拓扑:每个节点都与其他多个节点直接相连。
- 包交换与网络协议
- 包交换概念和原理:数据在网络中传输时被分割成一个个小的数据包,每个数据包包含源地址、目的地址、数据等信息。这些数据包在网络中独立传输,通过路由器等设备进行转发,最后在目的地重新组装成原始数据。这种方式提高了网络的效率和可靠性,因为不同的数据包可以通过不同的路径传输。
- 网络协议:网络协议规定了计算机在网络中通信的规则。
- 网络地址
- 主机名和 IP 地址:主机名是便于人们记忆的计算机名称;IP 地址是计算机在网络中的数字标识,用于在网络中定位和通信。
- 域名系统(DNS):是一个分布式数据库系统,用于将主机名解析为 IP 地址。
- 云计算与区块链
- 云计算:云计算是一种通过网络提供计算资源(包括服务器、存储、数据库、软件等)的模式。
- 区块链:是一种分布式账本技术,由一系列区块组成,每个区块包含一定时间内的交易信息。
第16章
- 万维网概述
- 搜索引擎:是万维网的重要工具,它通过爬虫程序遍历网页,收集网页内容并建立索引。
- 即时消息:允许用户实时发送和接收文本、语音、视频等消息。
- 博客:是一种个人或团体在网上发布文章、观点等内容的平台。
- Cookie:是网站存储在用户浏览器中的小文本文件,用于记录用户的偏好、登录状态等信息。
- Web 分析:通过收集和分析网站访问数据,帮助网站所有者了解网站的性能和用户的需求,以便优化网站内容和结构。
- HTML 与 CSS
- HTML(超文本标记语言):包括标题元素、段落元素、链接元素、图像元素等。
- CSS(层叠样式表):用于控制网页的外观和布局。它可以通过内联样式(在 HTML 元素内部定义样式)、内部样式表(在 HTML 文档的部分定义样式)和外部样式表(通过元素引用外部的.css 文件)来应用样式。
- 交互式网页
- Java 小程序:是一种基于 Java 语言编写的小型应用程序,可以嵌入在网页中,通过浏览器的 Java 虚拟机(JVM)运行。
- Java 服务器页(JSP):是一种服务器端技术,它允许在 HTML 页面中嵌入 Java 代码。
- XML
- 基本概念:XML(可扩展标记语言)是一种用于存储和交换数据的标记语言。
- 应用场景:保存配置文件、文档数据等;作为不同系统之间交换数据的格式。
- 社交网络演化
- 早期社交网络:早期的社交网络主要是以兴趣为导向的社区。这些早期形式的社交网络为后来的发展奠定了基础。
2, 现代社交网络:社交网络的发展改变了人们的社交方式、信息传播方式,也对商业、政治等多个领域产生了深远的影响。
《C语言程序设计》第10章
- 字符串的基本概念:是以字符数组形式存储,并且以 '\0' 作为字符串结束标志。
- 字符串的声明与初始化:
通过定义静态初始化(char str[] = "hello"),以及动态初始化(先定义数组,再逐个字符赋值或者用一些函数辅助赋值等方式)的不同做法。 - 字符串的输入输出
说明使用标准输入输出函数(比如 scanf 配合 %s 格式控制符来输入字符串,但要注意其可能存在的缓冲区溢出风险),还有 gets 函数以及 puts 函数输出字符串等。 - 字符串处理函数:
- strcpy 用于字符串的复制。
- strcat 用来实现字符串的拼接。
- strcmp 函数可以比较两个字符串的大小关系(按照字典序比较)。
- strlen 函数用于获取字符串长度。
- 字符串的遍历与操作
通过循环来逐个访问字符串中的字符,进而实现自定义的一些字符串处理逻辑。 - 二维字符数组与字符串数组
二维字符数组可以用来存放多个字符串。
教材学习中的问题与解决过程
问题1:在使用动态分配内存来存储字符串时,如何准确地分配足够的空间来容纳一个字符串?
AI:1. 已知字符串长度时的分配方法
- 基本原理:当你已经知道字符串的长度(假设为
n),那么为了正确存储这个字符串,需要为它分配n + 1个字节的空间。这是因为除了存储字符串中的n个字符外,还需要额外的1个字节来存储字符串结束标志'\0'。 - 示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int length = 5;
char *str = (char *)malloc((length + 1) * sizeof(char));
if (str == NULL) {
// 内存分配失败的处理
printf("内存分配失败!\n");
return 1;
}
// 可以在这里使用str来存储长度为5的字符串
// 例如,将字符串"hello"存储到str中
strcpy(str, "hello");
printf("%s\n", str);
free(str);
return 0;
}
- 在这个示例中,首先通过
malloc函数分配了length + 1(即6)个字节的空间来存储一个长度为5的字符串。然后使用strcpy函数将字符串"hello"复制到动态分配的内存空间中。最后,通过printf函数输出字符串,并使用free函数释放了动态分配的内存。
-
根据用户输入或其他动态确定的长度来分配空间
- 获取字符串长度的方式:如果字符串长度是由用户输入或者在程序运行过程中根据其他条件动态确定的,首先需要获取这个长度。例如,当从用户那里接收一个字符串时,可以使用
fgets函数来读取用户输入的字符串,并通过strlen函数来确定其长度(注意fgets函数读取的字符串已经包含'\0')。 - 分配空间并考虑边界情况:在获取长度后,按照上述方法分配足够的空间。同时,要考虑可能出现的边界情况,如用户输入为空字符串或者输入的长度超出预期范围等情况。
- 示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char input[100]; // 使用fgets读取用户输入的字符串 fgets(input, sizeof(input), stdin); // 去除换行符(如果有) if (input[strlen(input) - 1] == '\n') { input[strlen(input) - 1] = '\0'; } int length = strlen(input); char *str = (char *)malloc((length + 1) * sizeof(char)); if (str == NULL) { printf("内存分配失败!\n"); return 1; } strcpy(str, input); printf("%s\n", str); free(str); return 0; }- 在这个示例中,首先使用
fgets函数读取用户输入的字符串到input数组中。然后,检查并去除字符串末尾可能存在的换行符。接着,通过strlen函数确定字符串的实际长度,再为动态分配的字符串str分配length + 1个字节的空间。最后,将input中的字符串复制到str中,输出并释放内存。
- 获取字符串长度的方式:如果字符串长度是由用户输入或者在程序运行过程中根据其他条件动态确定的,首先需要获取这个长度。例如,当从用户那里接收一个字符串时,可以使用
-
动态拼接字符串时的空间分配策略
- 预估拼接后字符串的长度:当需要拼接多个字符串时,首先要预估拼接后字符串的总长度。例如,要拼接两个字符串
str1和str2,它们的长度分别为length1和length2,那么拼接后的字符串长度大致为length1 + length2 + 1(加上1是为了存储'\0')。 - 逐步分配和调整空间(使用realloc):可以先按照预估的长度分配一个初始空间,然后在拼接过程中,如果发现空间不够,使用
realloc函数来调整分配的空间大小。不过,要注意realloc函数可能会移动内存块的位置,所以在使用时需要谨慎处理指针。 - 示例代码(简单示意):
#include <stdio.h> #include <stdlib.h> #include <string.h> char *concat_strings(char *str1, char *str2) { int length1 = strlen(str1); int length2 = strlen(str2); char *result = (char *)malloc((length1 + length2 + 1) * sizeof(char)); if (result == NULL) { return NULL; } strcpy(result, str1); strcat(result, str2); return result; } int main() { char *str1 = "hello"; char *str2 = " world"; char *result = concat_strings(str1, str2); if (result!= NULL) { printf("%s\n", result); free(result); } return 0; }- 在这个示例中,
concat_strings函数用于拼接两个字符串。首先,计算出两个字符串的长度,然后分配足够的空间来存储拼接后的字符串。接着,使用strcpy和strcat函数将两个字符串拼接在一起,并返回拼接后的结果。在main函数中,调用concat_strings函数进行拼接,输出结果并释放动态分配的内存。
- 预估拼接后字符串的长度:当需要拼接多个字符串时,首先要预估拼接后字符串的总长度。例如,要拼接两个字符串
问题2:在字符串中插入新的字符时,除了将原本字符串中的数据一个个挪到相应位置再插入以外还有什么方法?
AI:1. 使用临时缓冲区
- 方法描述
- 首先创建一个足够大的临时字符数组作为缓冲区。这个缓冲区的大小应该至少是原字符串长度加上要插入的字符数再加1(用于存储
\0)。 - 将原字符串中插入点之前的字符复制到临时缓冲区中,接着把要插入的字符放入临时缓冲区,然后将原字符串中插入点之后的字符也复制到临时缓冲区。
- 最后,将临时缓冲区中的内容复制回原字符串(如果原字符串是动态分配的内存,可能需要先使用
realloc调整大小)。
- 首先创建一个足够大的临时字符数组作为缓冲区。这个缓冲区的大小应该至少是原字符串长度加上要插入的字符数再加1(用于存储
- 示例代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void insert_char(char *str, char ch, int index) {
int len = strlen(str);
char *temp = (char *)malloc((len + 2) * sizeof(char));
if (temp == NULL) {
printf("内存分配失败!\n");
return;
}
int i;
// 复制插入点之前的字符
for (i = 0; i < index; i++) {
temp[i] = str[i];
}
// 插入新字符
temp[i++] = ch;
// 复制插入点之后的字符
for (; i <= len; i++) {
temp[i] = str[i - 1];
}
// 将临时缓冲区内容复制回原字符串
strcpy(str, temp);
free(temp);
}
int main() {
char str[] = "hello";
insert_char(str, '!', 2);
printf("%s\n", str);
return 0;
}
- 在这个示例中,
insert_char函数用于在指定索引index处插入字符ch到字符串str中。首先创建了一个临时缓冲区temp,然后分三步将原字符串和要插入的字符复制到temp中,最后再将temp的内容复制回str,并释放temp。
- 利用动态内存分配和拼接(适用于动态分配的字符串)
- 方法描述
- 先确定插入后的字符串长度,通过动态分配内存创建一个新的字符串,其大小为插入后的长度。
- 将原字符串中插入点之前的部分复制到新字符串中,接着放入要插入的字符,然后将原字符串插入点之后的部分拼接(使用
strcpy和strcat等函数)到新字符串中。 - 最后释放原字符串占用的内存,将新字符串的指针赋值给原字符串指针(如果原字符串是通过指针引用的动态分配内存)。
- 示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> void insert_char_dynamic(char **str, char ch, int index) { int len = strlen(*str); char *new_str = (char *)malloc((len + 2) * sizeof(char)); if (new_str == NULL) { printf("内存分配失败!\n"); return; } int i; // 复制插入点之前的字符 for (i = 0; i < index; i++) { new_str[i] = (*str)[i]; } // 插入新字符 new_str[i++] = ch; // 复制插入点之后的字符 for (; i <= len; i++) { new_str[i] = (*str)[i - 1]; } // 释放原字符串内存并更新指针 free(*str); *str = new_str; } int main() { char *str = (char *)malloc((6) * sizeof(char)); strcpy(str, "hello"); insert_char_dynamic(&str, '!', 2); printf("%s\n", str); free(str); return 0; }- 这里的
insert_char_dynamic函数接受一个指向字符串指针的指针str、要插入的字符ch和插入索引index。它通过动态分配内存创建新字符串new_str,完成插入操作后释放原字符串内存并更新指针,使得str指向新的字符串。
- 方法描述
基于AI的学习
https://www.doubao.com/thread/wd2e3698ea4cfbcf6
https://www.doubao.com/thread/wb3e9eb0c7a568ba7
学习进度条
计划学习时间:25h
实际学习时间:25h

浙公网安备 33010602011771号