📚 学习笔记
课程学习、知识整理、技能提升
CS50 Week 9: Flask - 构建你的第一个 Web 应用
Week 9 概述 本周主题:使用 Flask 框架构建动态 Web 应用程序 在过去的几周里,我们学习了多种编程语言、技术和策略。事实上,这门课与其说是 C 语言课或 Python 课,不如说是一门编程思维课,让你能够继续追随未来的编程趋势。 今天我们将整合之前学过的所有技术:HTML、CSS、SQL、Python 和 JavaScript,创建属于自己的 Web 应用程序! 💡 提示:本周所学技能非常适合用来完成 CS50 的最终项目(Final Project)! 🌐 Web 开发基础知识(给初学者) 在深入 Flask 之前,让我们先理解一些 Web...
CS50 Week 8: HTML, CSS, JavaScript
之前课程,我们学习了高级编程语言 Python,它与 C 语言类似,也是通过把功能放到特定模块中构建。今天,我们将进一步扩展这些构建模块,深入探索HTML、CSS和JavaScript。 互联网 互联网将全球计算机相互连接,是一项我们都在使用的技术。 运用前几周掌握的技能,我们可以构建自己的网页和应用程序。 ARPANET首次将互联网上的节点相互连接起来。 两点之间的节点可视为路由器。 路由器 要将数据从一处路由到另一处,我们需要做出路由决策。也就是说,需要有人编程设定数据从点A传输到点B的途径。 可以想象数据从点A到点B可能存在多条路径,这样当某台路由器拥塞时,数据就能通过其他路径流动。数据包就这样从一台路由器传递到另一台,从一台计算机传递到另一台。 TCP/IP是两项协议,使计算机能够通过互联网相互传输数据。 IP(互联网协议)是计算机在互联网上相互识别的途径。每台计算机在全球范围内都有唯一的地址,其格式如下: #.#.#.# 数字范围为0至255。IP地址采用32位(IPv4),意味着可支持超过40亿个地址。新型IP地址(如IPv6)采用128位设计,能支持数量庞大的计算机! 现实世界中,服务器承担着大量工作。 数据包结构如下: 0 1 2 3 0 1 2 3 4 5 6 7...
CS50 Week 7: SQL - 结构化查询语言
Week 7: SQL 官方笔记:https://cs50.harvard.edu/x/notes/7/ 本周内容概览 主题 核心概念 重要程度 扁平文件数据库 CSV 文件、csv 模块 ⭐⭐ 关系型数据库 表、行、列、键 ⭐⭐⭐⭐ SQL 基础命令 SELECT, INSERT, DELETE, UPDATE ⭐⭐⭐⭐⭐ 表间关系 主键、外键、JOIN ⭐⭐⭐⭐ 索引优化 INDEX, B-Tree ⭐⭐⭐...
CS50 Week 6: Python - 从 C 到高级语言的跨越
欢迎来到 Python! 在前几周的学习中,你已经掌握了编程的基础构建块,并使用底层编程语言 C 进行了实践。今天,我们将使用一门高级编程语言 Python。 随着你学习这门新语言,你会发现自己越来越有能力自学新的编程语言——这正是 CS50 的核心目标之一。 课程官方笔记:https://cs50.harvard.edu/x/notes/6/ 本周内容概览 主题 C 语言 Python 关键区别 程序入口 int main(void) 直接执行 Python 无需 main 函数 变量声明 int x = 1; x...
CS50 Week 5: 数据结构(Data Structures)
复习 前几周我们学习如何在编程中构建基础的代码块 你在 C 语言中学到的所有知识将使你能够在 Python 等更高级的编程语言中实现这些构建模块 随着课程的进展,我们每周学习到的概念越来越有挑战,就像山越来越陡。本周,我们学习数据结构 目前为止,你已经学习了数组在内存中是如何组织数据的 今天继续讨论数据在内存中的组织方式以及随着学习知识的增长可能出现的设计可能性 课程官方笔记:https://cs50.harvard.edu/x/notes/5/ 本周数据结构概览 数据结构 特点 时间复杂度(搜索) 优点 缺点 数组 连续内存 O(1) 随机访问 / O(log n) 二分搜索 快速访问、支持二分搜索 大小固定、扩容昂贵 链表 非连续内存 O(n)...
CS50 Week 4: 内存(Memory)
在过去的几周里,我们讨论过图像是由更小的构建单元——像素——组成的。 本周,我们将: 深入探讨构成图像的二进制数据 研究文件在内存中的存储方式 学习如何直接访问和操作计算机内存中的数据 掌握C语言中的指针概念 重要提示:本周的内容可能是整个课程中最具挑战性的部分之一。涉及的概念(特别是指针)需要时间消化和理解,这是完全正常的。不要气馁,慢慢来! 像素(Pixels) 什么是像素? 像素(Pixel)是图像的最小单位,是排列在上下、左右网格上的方形色点。 简单理解: 像素 = Picture Element(图片元素) 每个像素都是一个独立的彩色点 成千上万的像素组成了我们看到的图像 黑白图像 最简单的图像是黑白图像,可以用位图(bitmap)表示: 0 代表黑色 1 代表白色 通过排列0和1,就能创建简单的图案和图像! 十六进制(Hexadecimal) RGB颜色模型 彩色图像使用RGB(Red, Green, Blue)颜色模型: 每种颜色由三个数值组成...
CS50 Week 3: 算法(Algorithms)
本周主题: 搜索算法:线性搜索(Linear Search)、二分查找(Binary Search) 排序算法:冒泡排序(Bubble Sort)、选择排序(Selection Sort)、归并排序(Merge Sort) 算法复杂度:大O表示法(𝑂)、Ω、Θ 递归(Recursion) 引言 在Week 0中,我们介绍了算法的概念:一个接收输入并产生输出的”黑箱”。 本周,我们将: 通过伪代码(pseudocode)深入理解算法 将伪代码转换为真正的C代码 探讨算法的效率问题 学习如何衡量和比较不同算法的性能 为什么算法效率很重要? 回顾之前介绍算法时展示的图表: 关键问题:算法处理问题的方式如何决定解决问题所需的时间? 对于小规模数据,算法效率差异可能不明显 但对于大规模数据(如百万级、亿级),效率差异可能是秒级 vs 天级! 算法的设计可以不断提升效率,但总有理论上的极限 今天,我们将聚焦于: 算法设计:如何设计高效的算法 效率衡量:如何用数学方法比较算法性能 线性搜索(Linear...
CS50 Week 2: 数组(Arrays)
编译过程详解 上节提到过,编译就是把源码翻译为机器码。让我们以上节的hello.c为例,深入了解编译的四个阶段: #include <cs50.h> #include <stdio.h> int main(void) { string name = get_string("What's your name? "); printf("hello, %s\n", name); } 编译命令 在终端输入以下命令对hello.c进行编译: clang -o hello hello.c -lcs50 参数说明: clang -...
CS50 Week 1: C语言入门
任何编程语言都包含函数、条件语句、循环语句、变量,这些也是构建程序的基础模块。 我们知道计算机只能理解二进制,我们写的是源码(source code),源码就是人类可以读懂的给计算机的指令列表,而计算机只能理解机器码(machine code),机器码是指一串只有0和1构成的代码。 因此我们需要将源码翻译为机器码,这个翻译工具称为编译器(compiler)。本节内容就是介绍如何将C源码翻译为机器码,另外,还将学习如何写出优秀的代码。 CS50 的VS Code 环境 课程提供了配置好的云环境 cs50.dev,这个环境已经配置好了该课程需要的库,可以直接使用。由于我们的目的是学习编程,不是配置环境,所以没必要自己折腾。比如该课程中使用的cs50.h等文件,如果你自己配置还需要把这些文件下载到本地。 在继续学习之前,可以先简单了解一些会用到的Linux命令: cd - 切换目录(change directory),也就是Windows系统下的打开文件夹 cp - 拷贝文件或目录(copy) ls - 列出目录下的所有文件(list) mkdir - 新建目录(make directory) mv - 移动或重命名文件或目录(move) rm...
CS50 Problem Set 1 英语教学脚本
CS50 Problem Set 1 - Teaching Script English Lecture Notes for Speaking Practice 🎓 Introduction [Start of Lecture] Good morning, everyone! Welcome to our Problem Set 1 review session. Today,...
CS50 Problem Set 9: Flask Web 应用实战
1. Birthdays 实现一个 Web 应用,用于记录朋友的生日。 项目文件结构 tree . ├── app.py ├── birthdays.db ├── static │ └── styles.css └── templates └── index.html 数据库结构 sqlite3 birthdays.db sqlite> .schema CREATE TABLE birthdays (...
CS50 Problem Set 7: SQL 数据库查询实战
Problem Set 7: SQL 作业页面:https://cs50.harvard.edu/x/psets/7/ 💡 本周任务:使用 SQL 查询语句解决三个递进难度的问题,从基础查询到复杂的侦探推理游戏。 题目概览 题目 难度 核心技能 数据库 Songs ⭐⭐ 基础查询、聚合函数、子查询 songs.db Movies ⭐⭐⭐ 多表连接、JOIN、嵌套查询 movies.db Fiftyville ⭐⭐⭐⭐⭐ 综合推理、多表交叉分析 fiftyville.db 1. Songs 🎵 题目链接:https://cs50.harvard.edu/x/psets/7/songs/...
CS50 Problem Set 6: Python 实战 - 用 Python 重写经典问题
Problem Set 6 概述 本周作业的核心目标是用 Python 重新实现之前用 C 写过的程序。这是一个绝佳的学习机会:通过对比两种语言的实现,你会深刻理解 Python 的简洁与强大。 题目 C 版本 Python 版本 难度 Hello Week 1 本周 ⭐ Mario (Less) Week 1 本周 ⭐⭐ Mario (More)...
CS50 Problem Set 5: 数据结构实战 - 遗传模拟与拼写检查器
Problem Set 5 概述 本周作业围绕数据结构主题展开,需要运用 Week 5 学习的链表、哈希表等知识解决实际问题。 题目 难度 核心知识点 Inheritance ⭐⭐ 递归、动态内存分配、树结构 Speller ⭐⭐⭐⭐ 哈希表、链表、文件操作、性能优化 作业页面: Problem Set 5 总览 Inheritance 题目 Speller 题目 1. Inheritance(遗传模拟) 题目背景 血型遗传问题...
CS50 Problem Set 4: Memory - 图像处理与文件恢复
Problem Set 4 概述 本周的作业围绕 内存 主题展开,包含音频处理、图像滤镜和文件恢复三类题目: 题目 难度 核心知识点 Volume ⭐ 文件 I/O、二进制数据处理 Filter-less ⭐⭐⭐ 图像处理、二维数组、结构体 Filter-more ⭐⭐⭐⭐ 卷积运算、Sobel 边缘检测 Recover ⭐⭐⭐ 文件签名、状态机、FAT 文件系统 作业页面:https://cs50.harvard.edu/x/psets/4/ 1. Volume - 音频音量调节...
CS50 Problem Set 3 原始笔记
1. Sort 按照教程中下载并解压,我们看下有哪些文件 cd sort/ sort/ $ ls -l total 1108 -rw-r--r-- 1 ubuntu ubuntu 125 Dec 31 2021 answers.txt -rw-r--r-- 1 ubuntu ubuntu 48894 Dec 31 2021 random10000.txt -rw-r--r--...
CS50 Problem Set 2 原始笔记
scrabble In the game of Scrabble, players create words to score points, and the number of points is the sum of the point values of each letter in the word....
CS50 Problem Set 1 原始笔记
Set 1 What To Do Log into submit.cs50.io using your GitHub account and click Authorize cs50, then close the tab. Log into cs50.dev using your GitHub account to access your...
CS50 Problem Set 1 角色扮演对话脚本
CS50 Problem Set 1 - Role Play Dialogue Script 教授与学生对话式讲解(优化用于 Text-to-Speech) 🎭 使用说明 适用于 Gemini TTS 或其他语音合成工具 设置建议: 教授声音: 男声(如 en-US-Neural2-D)- 较低沉、权威 学生声音: 女声(如 en-US-Neural2-F)- 较年轻、好奇 练习方法: 先听完整对话 模仿教授的讲解风格 模仿学生的提问方式...
CS50 编程术语发音指南
CS50 Programming Terms - Pronunciation Guide 完整发音指南(适用于 Text-to-Speech) 📢 使用说明 为 Gemini TTS 优化的发音文本: ✅ 每个术语后都有拼读版本(TTS 会读得更准确) ✅ 包含示例句子供 TTS 朗读 ✅ 符号和代码的口语化表达 1️⃣ 基础编程术语 Algorithm 拼读: AL-go-rith-um TTS文本: “algorithm”...
CS50 Problem Set 9: Flask Web 应用开发实战
Week 9 Problem Set 概述 本周的作业让我们将所学的 Flask 知识应用到实际项目中,包含两个项目: 项目 难度 核心技术 Birthdays ⭐⭐ Flask 基础、表单处理、SQL CRUD Finance ⭐⭐⭐⭐⭐ 完整 Web 应用、Session、API 调用、数据库设计 📚 前置知识回顾:Week 9 Flask 课程笔记 1. Birthdays(生日记录应用) 实现一个...
CS50 Problem Set 3: Algorithms - 选举算法实战
Problem Set 3 概述 本周的作业围绕算法主题展开,包含一道排序算法分析题和三道选举系统实现题。三道选举题难度循序渐进: 题目 难度 核心知识点 Sort ⭐ 算法时间复杂度分析 Plurality ⭐⭐ 结构体、线性搜索 Runoff ⭐⭐⭐ 二维数组、状态管理 Tideman ⭐⭐⭐⭐⭐ 图论、递归、DFS 作业页面:https://cs50.harvard.edu/x/psets/3/ 1. Sort - 排序算法识别 题目理解 按照教程下载并解压文件后,我们看看有哪些文件: cd sort/ sort/...
CS50 Week 2 Problem Set - Arrays and Strings
CS50 Problem Set 2: Arrays and Strings 本文记录 CS50x Week 2 Problem Set 的解题过程。这周的主题是数组(Arrays)和字符串(Strings),我们将通过四道题目深入理解这些核心概念。 📚 本周知识点回顾 在开始解题之前,让我们回顾 Week 2 的核心概念: 数组(Arrays) 相同类型数据的连续存储 零索引(从 0 开始) 固定大小 字符串(Strings) 字符串本质是 char 数组...
CS50 Problem Set 1: C语言编程实战
CS50 Problem Set 1 解题思路与实现 在完成 Week 1 的 C 语言基础学习后,是时候通过实际编程来巩固所学知识了。Problem Set 1 包含四个编程题,难度逐步递增,涵盖了循环、条件判断、算法设计等核心概念。 官方链接:CS50 Problem Set 1 问题1:Mario(简单版) 问题描述 还记得超级马里奥游戏中的阶梯吗?我们要用 # 字符在终端中画出一个右对齐的金字塔。 要求: 提示用户输入金字塔的高度(1-8之间) 使用 # 字符绘制右对齐的金字塔 示例(高度为4): #...
Gemini TTS 英语练习指南
Gemini Text-to-Speech 使用指南 如何使用 AI 语音工具练习英语 🎯 目标 使用 Gemini 和其他 TTS 工具,将 CS50 学习材料转换为音频,帮助你: ✅ 学习专业术语的正确发音 ✅ 提高英语听力理解能力 ✅ 练习口语表达和教学能力 ✅ 熟悉技术英语的节奏和语调 📱 方法 1: Google Cloud Text-to-Speech(在线测试) 免费在线...
CS50 进阶思考:从需求到代码框架
随着课程的深入,problem 的难度也在升级,如week 3,可以根据课程提供的代码框架完成指定函数功能的实现是一部分,如何训练自己能够设计出类似工程化的框架是程序员的基本功。 下面我们以 Tideman为例来说明如何训练自己从需求到代码框架的设计能力。 可以尝试遵循以下4个步骤的思维训练 第一步: 名词动词法(提取数据结构与函数) 拿到需求文档(如 Tideman 选举规则)后先不要想代码怎么写,而是在纸上圈出名词和动词。 1. 圈名词 -> 变成数据结构(Data Structure) 文档提到”候选人” -> 需要一个 string candidates[] 每两个候选人之间的胜负票数,有多少人认为候选人 i 比候选人 j 好 -> int preferences[i][j] 文档提到需要一个胜负关系对...
CS50 系列导读:回望初心,重拾编程的纯粹
为什么我要做这个系列? “如果你在对的时候遇到对的引路人,一切或许会截然不同。” 偶然在 B 站刷到 CS50,那些精良的课程制作和深入浅出的授课方式,让我不禁感叹:如果大一时的我也能邂逅这样的启蒙,或许编程之路会少许多迷茫。 回忆起那时,对着“绿皮书”和枯燥 PPT 照本宣科的课堂,让我一度对软件科学关上了心门。虽然后来兜兜转转回到了这个行业,并已在软件领域深耕六年,但如今回看,这份“迟到的启蒙”依然让我心生感怀。 如今,这些基础知识早已是坦途,但我决定按照 CS50 的节奏,将学习心得与实验解法系统地记录下来。 这一系列博客,是给曾经那个迷茫自己的迟到回响,也是写给正在路上的“小朋友”们的一份微薄指引。 愿你们在代码的世界里,不只有困惑,更有发现的喜悦。 📚 系列目录 核心课程笔记 (Notes) Week 1: C 语言基础 Week 2: 数组与内存 Week 3: 算法(Algorithms) Week 4:...
容器技术详解与Kubernetes的演进之路
容器技术详解与Kubernetes的演进之路 1. 从传统部署到容器化:技术演进的必然 在现代软件开发与部署实践中,效率、一致性、可伸缩性与高可用性是系统工程师持续追求的目标。回顾过去,从物理机直接部署,到虚拟机(VM)的引入,再到如今容器化技术的普及,每一次技术变革都旨在解决前一阶段的痛点,并带来了新的效率提升。 1.1 传统部署:架构演进与运维挑战 在容器技术广泛应用之前,应用部署主要围绕单体架构(Monolithic Architecture)和分层架构(Layered Architecture)展开。 1.1.1 单体架构 单体架构将所有业务功能(如用户界面、业务逻辑、数据访问等)集中打包成一个独立的、可执行的应用程序。 优点: 初期开发简单、部署直接。 挑战: 紧耦合: 任何模块的改动都可能波及整个应用,导致测试和发布周期长,风险高。 扩展性瓶颈: 只能对整个应用进行横向扩展,无法针对性地扩容某个高负载模块,易造成资源浪费。 技术栈锁定: 难以引入新语言或框架,限制了技术栈的灵活性。 维护复杂度: 随着代码库膨胀,维护和理解难度逐渐增大。 ** 1.1.2 分层架构 作为单体架构的优化,分层架构在逻辑上将应用划分为不同的层次(如表示层、业务逻辑层、数据访问层),以实现职责分离。 优点: 逻辑清晰,一定程度上降低了模块间的直接耦合。 挑战:...