第一课笔记

230 阅读10分钟

最佳实践是将网络课件同源代码结合使用,具体学习资料见此处

本课内容总览:

  • 课程介绍
  • 课程安排
  • Hello World

1. 概述

什么是61B?

  • 编写运行高效的代码
    • 好的算法
    • 好的数据结构
  • 高效编写代码
    • 设计、编译、测试并调式大型程序
    • 使用编程工具: git、Idea、JUnit以及各种命令行工具
    • Java(不是本课的重点)

假设具备编程基础知识

  • 面向对象编程,递归、列表和数

1.1 为什么学习算法或数据结构

  • 日常生活中很多地方都用到了它们,比如:搜索引擎的联想词
  • 我们文明目前进程的主要推动力,比如:电动汽车、chatGPT、AlphaGo
  • 称为更好的程序员,在工作中,运用正确的数据结构和算法
  • 为了理解宇宙,科学越来越依赖于模拟和复杂数据分析,而不是简单的观察和清晰的方程式
  • 为了常见美好的事务,比如: 3D渲染、3D动画等

1.2 学习方法

学习的一小部分:

  • 新材料介绍:讲座/阅读

学习的大部分:

  • 理论:讨论课、学习指南、理论作业。
  • 编程、工具使用、问题分解方面的学习:实验室、编程作业、项目。
  • 设计方面的学习:Projects2和3。

2. 课程安排

2.1 获取信息的地方

官方课程资源

  • 课程网站: 网址
  • 讲座、讨论、实验和答疑
  • 讨论平台: 网址
  • Mini讲义: 网址

非官方: Google、Stack Overflow、其他网络编程课程、各种在线文档等。

2.2 课程细节

  • 对于候补名单上的学生:如果你完成了项目0,我会尽力在第4周之前让你进入课程,但不能保证成功。
    • 我们应该能够容纳所有人,但我不能百分之百地保证。
  • 要注册讨论区域或实验的话,请看: 网址
  • 请在Ed讨论区发布管理问题或发送电子邮件至cs61b@berkeley.edu
    • 请不要直接通过电子邮件向我发送此类问题

2.3 课程结构

第一阶段:Java编程密集型入门

  • 第1周至第4周。
  • 一份基于浏览器的编程作业(此HW0为可选作业)
  • 四个实验室介绍不同的工具(从本周开始)
  • 两个项目(proj0和proj1)
  • 第二次期中考试时间待定

第二阶段: 数据结构

  • 第5周至第10周
  • 极为重要且基础性的材料:在课程中的这一部分,可以预期计算机科学的工作面试将非常侧重
  • 一份编程作业(HW1)和一份应对考试的理论作业(HW2)
    • 应用和更深入的数据结构洞见。
  • 一个非常大的个人项目(Proj 2),截止日期为4/2,检查点截止日期为3/12。
  • 实验室:
    • 实验室5:项目1的同行评审。
    • 两个实验室实现数据结构(哈希表和二叉搜索树)。
    • 剩余的实验室集中在项目2上。
  • 第三次期中考试时间为3/17,待定。

第三阶段: 算法和软件工程

  • 第10-14周
  • 项目:
    • Proj 3: 建立你自己的世界:一个开放式的项目,你和你的搭档可以按照自己的设计构建一个2D世界,具备物理性质。在课程的最后一周的实验室中完成。
  • 实验室致力于项目。
  • 一份理论作业,截止日期为5/3。

日程安排请见: 网址

2.3.1 实验和讨论

实验室/讨论课的出席不是必须的

  • 必须开启摄像头才能参加
  • 如果你不开摄像头,则会提供离线版本

实验室:

  • 实验室截止日期为每周五晚上11:59
  • 对“合理努力”的实验室可以获得全部学分
    • 只需通过一些自动评分测试即可获得全部学分

2.3.2 合作政策

合作:

  • 您需要自己提交所有作业和项目 0、1、2 的解决方案。
  • 对于实验,您可以选择与一个伙伴一起工作。
  • 对于项目 3,您必须有一个伙伴。

所有独立项目、作业和实验的代码必须是您自己完成的:

  • 可以与他人讨论并帮助调试。

有关课程网站上的更多详细信息,请自行了解!

2.3.3 每周调查和学习指南

每周日截止的周调查问卷

  • 检查您的进度并报告出勤情况。
  • 免费积分,但不允许迟交!
  • 最低分的四个将被删除。

每节课都有学习指南。

  • 提供讲座的简要概述。
  • 提供(通常为)C级,B级和A级的考试题目。
    • A级问题通常足够难,我预计助教们会遇到困难,所以请友善对待!
  • 学习指南包括一个检查练习。不计分,但很有用!

2.3.4 考试

  • 除了可以携带作弊笔记之外,考试是闭卷的。
  • 考试难度将会相当高(中位数为60-65%)。
  • 在期末考试上表现优异可以提高总体考试分数。
    • 如果您的期末成绩统计上更好,它可以替代您的两个中期考试。请查看课程网站上“clobbering”一节了解详细信息。

考试日期:

  • 第一次期中考试:2月10日,时间待定。将会适应不同时区。
  • 第二次期中考试:3月17日,时间待定。将会适应不同时区。
  • 期末考试时间:5月11日,太平洋时间上午8点。将会适应不同时区。
  • 不会有替补考试(请查看考试替代政策)。
    • 一种例外情况:与其他课程的期末考试直接冲突。

2.3.5 课程成绩

分数分配:总共12,800分,成绩将由您的总分确定。

  • 期中考试:共计3200分。
  • 期末考试:共计3200分。
  • 项目:共4480分。
  • 作业:共计960分(每个作业320分)。
  • 实验课:共计640分(每个实验课64分)。
  • 每周调查:共计320分(每个调查32分)。

2.3.6 延迟提交和导师GSI

任何作业/实验/项目的迟交将不被接受。没有任何作业/实验/项目会被抛弃。

  • 你应该认真对待截止日期!
  • 如果需要,可以使用自动扩展系统来申请延期。
    • 最多6个滑动天数。
    • 每个作业最多3个滑动天数。
    • 不要期望其他课程会有类似的延期。61B课程并不像EE16A或CS70等累积性课程那样强烈。 在第2周,你将选择一个指导助教。
  • 如果你没有选择一个,一个将被分配给你。
  • 指导助教将跟踪你的进度,并在他们感到有潜在问题时与你联系(或让其他人联系)。
  • 如果你进度落后,请联系指导助教。

2.3.7 课程进度

我们会非常快地开始。

  • 可选的 HW0 已经发布。
    • 介绍 Java 语法。
    • 需要1-4小时。
    • 建议和朋友一起完成!
    • 建议在您的实验课之前完成。
    • 强烈建议在周五的讲座之前完成。
  • 实验1和实验1设置都可用。
    • 实验1设置:如何设置您的家庭计算机(在实验1之前完成)。
    • 实验1:如何使用各种工具。
  • 项目0于周五发布。截止日期为1月29日星期五(学期开始后9天)。
    • 如果可能,请在周六开始,特别是如果您是 Java 的新手。
    • 练习基本的 Java 功能。
    • 要获得完全学分,需要解决一个非常具有挑战性的算法问题。

3. Hello World

3.1 Java和面向对象编程

Java是一种面向对象的语言,有严格的要求:

  • 每个Java文件必须包含一个类声明*。
  • 所有的代码都在一个类*中,包括辅助函数、全局常量等。
  • 要运行Java程序,通常需要使用public static void main(String[] args)定义一个主方法。

3.2 Java和静态类型

Java是静态类型的!

  • 所有变量、参数和方法必须声明类型。
  • 类型永远不会改变。
  • 表达式也有类型,例如,“larger(5, 10) + 3”的类型为int。
  • 编译器在程序运行之前检查程序中所有类型是否兼容!
    • 例如,String x = larger(5, 10) + 3将无法编译。
    • 这与Python等语言不同,后者在执行期间执行类型检查。

3.3 反思静态类型语言

优点:

  • 捕捉到某些类型的错误,使得程序员更容易调试代码。
  • 可以减少最终用户计算机上出现类型错误的可能性。
  • 使得代码更易于阅读和理解。
  • 代码可以更高效地运行,例如不需要进行昂贵的运行时类型检查。

缺点:

  • 代码更冗长。
  • 代码不够通用,例如之前必须有两个不同的 larger 函数。

3.4 接下来的安排

本周安排:

  • HW0:现在已发布。让你有机会自行探索Java基础知识。
  • Lab1:如何编译和运行代码。如何检查作业的起始文件并提交它们。如果可能的话,在实验室之前完成HW0!
  • Lab1设置(可选):如何在自己的计算机上编译和运行代码。
  • Project 0(周五发布)。必须单独完成。
  • 下一堂课:公共静态啥啥啥实际上是什么意思。

4. 课程导引

4.1 课程代码

本课代码都在这里: 网址

4.2 概述

我们第一个Java程序。打印Hello World:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

主要语法特征。我们的第一个程序展示了Java的几个重要语法特征:

  • 所有的代码都在类中。
  • 被执行的代码在一个被称为main的函数或方法中。
  • 花括号用于表示代码的开始和结束,例如类或方法声明。
  • 语句以分号结尾。
  • 变量有声明类型,也称为“静态类型”。
  • 变量必须在使用前声明。
  • 函数必须有返回类型。如果一个函数不返回任何值,我们使用void。
  • 编译器确保类型一致性。如果类型不一致,程序将无法编译。

静态类型检查是 Java 中最好的功能之一(在我看来)。它为我们提供了比没有静态类型检查的语言更多的优势:

  • 在程序运行之前就检查了类型,使开发人员可以轻松地捕获类型错误。
  • 如果您编写了一个程序并分发了编译版本,它(大部分)可以保证不会出现任何类型错误。这使得您的代码更可靠。
  • 每个变量、参数和函数都有一个声明的类型,使程序员更容易理解和推理代码。

静态类型检查也有一些缺点,稍后将讨论。

编码风格。编码风格在61B和现实世界中都非常重要。代码应该按照教科书和讲座中描述的适当的注释。

命令行编译和执行。使用javac编译程序,使用java执行程序。我们必须在执行之前进行编译。

4.3 练习

本次讲座无作业要求。但我们强烈建议您完成可选的HW0,其中涵盖了许多基本的Java语法知识。