Lazy loaded imageCS50 课程学习记录
2024-12-16
| 2024-12-21
字数 2244阅读时长 6 分钟
type
status
date
slug
summary
tags
category
password
icon
AI 摘要
哈佛大学 CS50 课程链接为 https://cs50.harvard.edu/ ,本次学习该课程 2024 年的计划内容。
个人手写笔记:CS50
个人手写笔记:CS50

1. Introduction

CS50 是哈佛大学开设的计算机科学入门课程,它不仅介绍编程技术,更注重培养计算思维。这门课程面向所有学生开放,无需任何编程基础 —— 据统计,三分之二的学生此前都没有接触过计算机科学。
课程内容涵盖计算思维、抽象、算法和数据结构等核心概念,并融合了艺术、人文、社会科学等多学科的实践案例。与其他编程课程不同,CS50 不只是教授特定的编程语言,而是帮助学生建立扎实的编程思维,为今后自主学习新技术打下基础。
课程设计循序渐进:首先从 C 语言入手,这是许多现代编程语言的基石。通过学习 C,你不仅能掌握基本的编程概念(如函数、变量、条件语句和循环),还能深入理解计算机底层的工作原理。接着,课程会过渡到更现代的 Python 语言,有了 C 语言的基础,你会对 Python 有更深刻的理解。
在课程后期,你还将接触到数据库语言 SQL,以及网络开发三件套:HTML、CSS 和 JavaScript,这些都是构建现代网络应用不可或缺的工具。

2. Week 0: Scratch

前置课程从计算机科学的基础概念开始,帮助我们建立计算思维。我们将学习如何分析问题并找到解决方案,理解计算机如何处理输入和输出。
接着,我们深入探讨数据在计算机中的表示方式,包括一元制、二进制、十进制等数字系统,以及 ASCII、Unicode 这样的字符编码和 RGB 颜色模型。
课程还介绍了抽象化的概念,以及如何设计和评估算法,包括分析算法的运行时间和使用伪代码来描述解决方案。
最后,我们通过 Scratch 这个图形化编程工具来实践编程基础知识,包括:
  • 函数的定义和使用(包括参数传递和返回值)
  • 变量的概念和操作
  • 布尔逻辑和条件判断
  • 循环结构
  • 事件处理
  • 多线程编程的基础

2.1 Main Content 0

只需要观看学习完 Lecture 0 即可,内容较为简单基础,没有上手门槛。

2.2 Resources 0

  1. 官方授课 Note 0,参见链接🔗或下方文档
    1. Note-0 by CS50x 2024
      Note-0 by CS50x 2024
  1. 个人手写笔记,见文档

3. Week 1: C

本周学习 C 语言的基础知识,包括源代码和机器代码的概念、编译器的使用,以及代码的正确性、设计和风格规范。课程使用 Visual Studio Code 作为开发环境,学习转义序列、头文件和库函数等基本功能。内容涵盖了数据类型、条件语句、变量声明和循环结构等核心概念。此外,还将介绍 Linux 系统基础,包括图形用户界面(GUI)和命令行界面(CLI)的使用。其他重要主题包括常量定义、代码注释、伪代码编写、运算符使用,以及整数溢出和浮点数精度等实际编程中常见的问题。

3.1 Main Content 1

从现在才算真正开启了 CS50 课程的内容,除了老师在 Lecture 上的知识点,为了完成课程 Problem Set,可能还需要观看 Shorts 和 Sections 的部分讲授以减少 Lecture 与 Problem 之间的衔接差距。
  • Lecture:从 Scratch 入手,将上周所教授的伪代码逐步实现,即通过撰写源代码利用编译器 Compiler 转变为机器二进制码(当然后面这一步我们不需要详细了解)。然后通过许多编程案例,向我们讲述了 Functions、Variables、Conditionals、Loops 等知识点。另外,还有关于 GUI 和 CLI 的简单介绍,关于 overflow 和 truncation 所引发的真实事件。
  • Shorts:Data Type、Operators、Conditional Statements、Loops、Command Line(cd, cp, ls, mkdir, mv, rm, rmdir, pwd)、Magic Numbers(#define NAME REPLACEMENT)
  • Sections:一个小时的短课程,从变量赋值讲起,到循环,再到定义函数。一步一步地讲授怎样输出左对齐的 Hash 金字塔图案,最后以引发关于“右对齐金字塔图案”输出思考结尾。

3.2 Problem Set 1

  • Hello:简单案例(printf 输出变量)
  • Mario:循环输出(Hash 金字塔图案)
  • Cash:假设您在一家商店工作,一位客户给您 1.00 美元(100 美分)的糖果,价格为 0.50 美元(50 美分)。您需要向他们支付他们的“零钱”,即支付糖果费用后剩余的金额。在找零时,尽量减少为每位客户分配的硬币数量,以免用完(或惹恼客户!用 C 语言实现一个程序,该程序打印进行给定兑换量所需的最少硬币数量)
    • 零钱面额:25 美分、10 、5 美分和 1 美分
  • Credit:使用 IBM 的 Hans Peter Luhn 发明的算法确定信用卡卡号是否(在语法上)有效
    • 从卡号的倒数第二位数字开始,将每隔一位的数字乘以 2,然后求和。再将总和与“未乘以 2”的位数之和相加。如果总数的最后一位数字是 0 则该信用卡卡号有效!

3.3 Resources 1

  1. 官方授课 Note 1,参见链接🔗或下方文档
    1. Note-1 by CS50x 2024
      Note-1 by CS50x 2024
  1. 个人手写笔记,见文档

4. Week 2: Array

本周的主要内容包括:预处理、编译、汇编、链接、调试,以及数组、字符串、命令行参数和密码学的基础知识。虽然授课的主题是数组(Array),但还涵盖了许多其他重要的知识点,内容较为广泛且多样化。

4.1 Main Content 2

Lecture:以“hello.c”开篇,阐述 make hello 是如何工作的 —— clang -o hello hello.c -lcs50 ,进而深入到预处理、编译、汇编和链接这四个步骤,即从源代码到可执行文件的完整过程解析。另外,课程上通过引入其他 Libraries 向我们讲授了字符串“数组”,再介绍如何 bug 的由来和如何通过 Debugger 来解决程序意料之外的错误,最后简单应用了一下密码学 cryptography 中的加解密 encryption 和 decryption。
Shorts:再一次讲到了 Functions 和 Variables 及其 Scope,本节重点强调自定义函数的声明,变量的声明范围。最后大致依次重复 Lecture的部分内容,包括 Step Through 和 Step Into 的使用方法、Array 中字符串“数组”的声明、Command-Line Arguments 主函数参数。
Sections:仅再次教学了 Array 的使用,并简单引入本期 Problem Set 的知识点。

4.2 Problem Set 2

  • Scrabble:对用户输入的字符串进行赋分,每个字母的分值不同,考虑依次遍历每个字符再映射到分值表,最后求和。
  • Readability:对用户输入的字符串进行难度评级,难点在于对字符串的解析。既需要记录单词数量,还需要记录字符串的字母数量以及字符串中的句子数量。可以考虑以特殊字符为单词末尾标志,以标点作为句子的末尾标志。
    • 可读性测试 Coleman-Liau 指数:index = 0.0588 * L - 0.296 * S - 15.8 ,其中 L 是文本中每 100 个单词的平均字母数,S 是文本中每 100 个单词的平均句子数。
  • Caesar:加解密结合 Counting Command-Line Arguments 的实际应用。
  • Substitution:自定义密码本,使明文消息的每个字母(在原字母表位次)一一顺序对应密码本的字母。

4.3 Resources 2

  1. 官方授课 Note 2,参见链接🔗或下方文档
    1. Note-2 by CS50x 2024
      Note-2 by CS50x 2024
  1. 个人手写笔记,见文档
 
  • 学习
  • 记录
  • Git 版本控制 —— Start and Git Basics如何入门学习 Python:从零开始的指南
    Loading...