跳转至

1724259080

面向对象程序设计

CS 专业基础 AI 专业基础 IS 专业基础

课程学习内容

C++ 语言为例学习面向对象语言的特点。课程一部分学习 C++ 的语法,一部分学习 C++ 实现封装、继承和多态的方式。

先修要求

  • 数据结构基础
  • 掌握 C 语言

(个人认为 C++ 0 基础来上课是没问题的,想准备可以提前了解下相关语法和特性

任课教师

不出意外的话后续几年图灵班 OOP 的预置老师还会是翁恺老师。尽管翁恺老师在 21 级风评飞速下跌,大有晚节不保的情况,但作为永平奖获得者和在 OOP 课程组辛勤耕耘 20 余年的老师,翁恺老师授课毫无疑问还是最有水平的,也会做出很多课程外的知识拓展,因此不太推荐更换预置的翁恺老师。

翁恺老师的 OOP 应该稳定是 8 个实验,20 级是七个简单的 OJ lab 还有一个组队的大作业;21 级是 8 Project ,其中需要手批并且提交报告的三个 project 需要投入的时间较多;22 级是 6 lab 2 project,其中 lab 难度不高,考察基础知识点,project 则是由助教手改,需要对其要求与实现上点心。要注意的是 project 的实验要求并不一定完全在 pta 上给出,至少 22 project1 的一些更细致的评分与要求被上传到了学在浙大上。

与大二下诸多神仙课程比较,这门课难度不是特别大,但期末考试考纲不定,每个老师教的东西也不定,C++ 的相关规则本来就是很零散的知识点,复习起来也没有想象中那么容易。不过翁恺老师讲的很多比较难的都不在考察范围(上课基本只会讲到 C++98 标准,仅涉及少量 C++11 标准),极大减轻了负担。

翁恺老师给分还是值得信赖的,有补分集可以补满平时分(考虑到有补分集,因此存在期中考让大家巩固一遍春学期的内容其实算是件好事。老师会有少数查重,20 级有一次。类似于程算,翁恺老师的点名基本是随机抽一个人随机回答问题,21 级没有全班点名的情况。在 20 级有一次突击 paper work 的小测(时间和题目都与 19 级一致,因此可以参考往年录播);21 级的小测是在学在浙大进行的且 ddl 设置在了当天晚上;22 级则基本都是在 pta 上做课前小测,只有一次在学在浙大上的突击小测。

当然有一个小的雷点就是 oop 部分他的编程题描述不清或者有一些奇怪的测试点,经常会搞人心态(翁老师可能忙着自己的公司对作业的审核越来越不上心了)。

陈翔老师应该是 OOP 这门课体验最好的老师了。老师的 PPT 风格非常简洁且现代,讲课思路也非常清晰,对于 C++ 的语法和面向对象的思想讲解得非常到位,不拘泥于课程大纲,也会讲一些实际的编程技巧。会在学在浙大上放课件和扩展阅读资料,大多都是下面提到的 Effective C++ 中的章节。老师上课是会用 vim 实际写代码来展示的,看着也非常赏心悦目

没有任何形式的考勤。平时作业包括 7 assignment 7 次作业,每周交叉布置。Assignment 类似 lab,不过是主观题的形式由助教批改,无报告,要求比较宽松,自由发挥的空间比较大。作业一般是一或两道填空题或程序填空题,都比较简单。大作业是实现一个序列化和反序列化的库,要求支持二进制和 XML 两种格式(使用 tinyxml2 库)。从历两年来看助教在批改作业的给分上相当慷慨,平时分基本上都是满分(22 春夏大作业在 PTA 上标为 60 分,满分比例是 88/14255 分及以上比例是 109/142)。

考勤:纸质点名 / 做简单题目,听 21 级学长说是只有一次签到,一次占比 5 分;但是 22 级签到了三四次,第一次签到在第二周就有了,并且事后请假没有用,老师也不怎么看钉钉(有同学是亚运会志愿者,事后请假,还是找了别的老师之后才给算上的,可能是学校没有沟通好

平时作业:7 次左右,经常会出现几百道选择题的情况,感觉老师不是很挑题目。虽然因为这个被同学们诟病很久了,但是期末考试会考这类题目,而且很大概率是李际军出题,这些题目基本在网上都能搜到解答,其实就当题库做就好。

大作业:用 OpenGL 实现一个项目,21 级是几何画板,22 级是实现 libigl tutorial 里的三个基本功能(三维建模、读入读出文件等),工作量巨大,可以试一试找网上的代码。大作业在 PTA 上交并且互评,千万不要不交,李际军不支持补交,不能出现姓名但可以出现学号。一个雷点是互评基本无法申诉,且容易被反噬扣分:总是会有不完成 / 一看就是随便找来的代码上交的,这些很难打出一个统一的分数,大作业的最后得分应该是 project 得分 - 反噬扣分 /2

考试:全英文考试,非常八股文,包含选择题、程序填空题、函数题,不过他的 ppt 很全,考前过一遍就差不多了。很阴间的一个点是函数题的答题框不支持 tab 和自动补全等功能,甚至不如记事本,但是可以用 markdown 渲染显示高亮(我考试的时候甚至打不出英文标点,老师助教过来看半天没解决,最后我用了复制粘贴。

总结:虽然大作业确实阴间”百题斩“ 写起来也很头大,但是平时作业当题库写就行,最后期末考前还会有同学来找 ljj 的题目刷,最后给分也还不错。老师不好说话,所以尽量不要出现错过点到、作业超时等情况,在钉钉大群发言也要注意。另外老师上课有点大舌头听不清,但是可以看 ppt 学,ppt 很全,而且他在第一节课就会放上所有的 ppt,这一点还挺好的、、

许威威老师的 NA OOP 不能一概而论,虽然很多人选择,但上课的实际效果并不如 cx wk 老师,ppt 上的东西也常让人一头雾水。松散的平时容易让期末前往火葬场。

考勤:许威威似乎只会拿名单点名, 24 春夏上课时由于人数过多实际上没有进行点名。

大许老师的讲课真的很一般,感觉基本没有人在听,建议转向 wk cx 的智云课堂。相比于这两个班的好处是平时作业少,没有 wk 老师的期中考和繁杂的平时作业。对于平时分主要的雷点在于通知不到位,基本都是课堂上的口头通知以及最后才出来的 penalty 政策。单就给分而言,24 春夏助教对平时分还是比较慷慨的,大概有 1/4 的人可以拿到平时满分,只有在 project 代码不规范以及边界情况不正确时才会获得 (-1) 的扣分。

分数构成

  • quiz 5%
  • Homework 10%
  • 七个 Labs(一次上机期中考试) 15%
  • 一个大 Project 15% team work2 人一组)
    • MUD 游戏
    • 日记本
    • 也可以是自己的题目
    • 每个月都要上交进度报告,进度报告一般给 100,结题报告按实际情况给分,四次报告取平均
  • 期中 5%
  • 期末 50%
  • quiz 5%(on 学在浙大 or paper work
  • Homework 16%(一周一个习题集,前两周不算分,最后计算所有题目集总分)
  • 8 Lab/Project 24%(每个 project 3 分)
  • 期中 5%(90min,在实验课进行)
  • 期末 50%

除此之外还会有补分集(20 3 分,21 级由于期中考过难有 5 分),很多同学的平时分都是满分。

  • Attendance 1%
  • In-class quiz: 8%(从第三周起几乎每节课都有课前小测,在 pta 上有数道选择题,巩固上周知识)
  • Homework 16%
  • Labs: 12%(总共 6 次)
  • Project: 8%(总共 2 次)
  • 期中 5%(90min,在实验课进行)
  • 期末 50%

除此之外依然有补分集。需要注意的是期中考试的难度可能会比较高,或者说“超纲”,比如 22 级期中就已经考了之后几周才会学到的多态、运算符重载等等(还有大翁最喜欢的 static_cast。所以如果实在想要考好一点,可以把 OOP 这门课程的整体知识点过一遍,并掌握住最核心的部分,要相信期中考题目的知识点基本都是传统的,用于巩固或理解。

  • 平时作业 50%,具体比例不详,可能是按照 PTA 上的作业分数来计算
  • 期末考试 50%
  • 平时 project 50%

      • student 1 & 2: 主要考察文件读写输入输出等操作,注意一定要和要求的输出格式一模一样
      • adventure: 要求是 2 维的随机迷宫,注意要确保有到公主房间的可行路径
      • personal diary: 这个是彻底的依托,竟然强制要求重定向而不允许文件输入输出,导致传入参数很困难,老师的说明也含混不清,同学们问了很多次又改为允许重载输入函数让有限的操作可以读文件
      • fraction: 注意分数的初始化,0 分母检测(好像要求不能 throw 还是什么的,总之有特殊要求,注意负数)
      • vector: 中规中矩的 project
      • 大作业:allocator & memory pool,要求在给定内存大小的情况下尽量快的完成功能,但是具体给多大内存不知道,并且要执行的操作也不清楚,速度要求似乎与 oop 背道而驰。老师发出的测试程序也存在一定错误,需要自己阅读修改。 给分规则(100 分制):功能完成,测试程序通过,得到基础评分 88 分。剩下 12 分按速度排名给分:前1/3得到12分,后2/3按排名线性分配12~0分,四舍五入。

      平时作业:在 pta 上布置的题目,由人工批改,因此对题目中说的要求一定要认真阅读,写注释,写注释,写注释。 xww的平时作业并不友好,而且要求也很怪,诸如文件流关闭、写注释等细枝末节扣的很迷惑,助教也不甚给力,后半学期批作业毫无进度,有同学错过了ddl而导致了扣分。

      另外 xww 似乎不是很喜欢发书面的通知,24 春夏的几次作业 ddl 都是课上口头通知,通常来讲是 2 周一个作业,但是自从某次延期 1 周之后就含混不清了,直到期末考结束才说明迟交 penalty,扣的也比较狠,但是大作业的 ddl 还是放宽到了考试的前一晚。

  • 期末 50% 课程组统一的期末考试。

  • 平时 50%
    • 考勤 5%
    • PTA 作业 30%
    • 大作业 15%
  • 期末考试 50%

课程教材

  • C++ 程序设计》Intruduction to Programming with C++ (Third Edition) [ ] Y. Daniel Liang(梁勇)

    课程组指定教材,但没有什么用处比较基础、简单易懂

  • C++ 编程思想》Thinking in C++ [ ] Bruce Eckel

    一本比较经典的 C++ 教材,作者 Bruce Eckel 是著名的编程教育家。翁恺老师的大部分课件都是按照这本书内容编排。当然这本书有很多考试不考察的内容,如果时间不够可以只看老师 PPT 涉及内容对应的部分。

参考阅读

读万卷书,行万里路。

  • C++ Primer (5th edition), [ ] Stanley B. Lippman / [ ] Josée Lajoie / [ ] Barbara E. Moo

    经典 C++ 教材,有十分详尽的语法讲解。不过整本书看起来像是语法字典,可能并不容易读,建议用到某一特性再去找。第五版教材包括了 C++11 标准。

  • C++ Primer Plus (6th edition),[ ] Stephen Prata

    傻瓜式的、从 0 开始的 C++ 教材,有人觉得很面面俱到,个人觉得啰里啰嗦。

  • Essential C++, [ ] Stanley B·Lippman

    比较基础,分四个部分讲解 C++ 的本质,也可以用作入门读物。比较老了,只到 C++98 标准。

  • C++ 之父 Bjanre Stroustrup 的几本书:

  • 关于 C++ STL(标准模板库),想要了解其内部实现细节,可参考侯捷老师《STL 源码剖析》,但侯捷老师这本书不适合初学者,而且标准比较老,后面几章有些已经用不上了。另外也可以看 Scott Meyers, Effective STL

  • Effective C++, [ ] Scott Meyers

    讲解一些实际套路和原理,结合具体情况教你如何写程序,写了很多 C++ 各种容易踩坑的点。有些很有帮助,后面有些可能有点难。这本书还有后作 More Effective C++,更高深了(×。两本书都只涉及 C++98/03 标准,少量内容有些过时。

  • C++ Without Fear, Brian Overland

    比较老(指 C++98 标准)的入门书籍。

  • Functional Programming in C++, Ivan Cukic

    (给老司机们)了解 C++ 函数式编程

  • (给老司机们)进一步探索现代 C++

    • Modern Effective C++, [ ] Scott Meyers

      教你怎么用 C++11 C++14,既有语法也有实例讲解,带你走向现代 C++。后面有点难。

    • 《现代 C++ 快速上手 (Modern C++ Tutoral)》,Ou Changkun,字面意思,快速上手。

    • C++ Templates (2nd edition),[ ] David Vandevoorde / [ ] Nicolai M.Josuttis / [ ] Douglas Gregor

      深入了解模板的奇技淫巧

    • 其他,如《深入探索 C++14(Discovering Modern C++)》《现代 C++ 语言核心特性解析》《C++20 高级编程》等

  • 可参考 The Definitive C++ Book Guide and ListStack Overflow 上整理的书单。也可以逛逛 Quora

  • C++ 之父 Bjanre Stroustrup FAQ 很有意思,值得一看!此外他还有 C++ Style and Technique FAQ 。十分建议大大多逛逛 BS 的主页

参考资料

期末复习可以参考这个课程资料仓库。这门课期末考试不是很友好,除了之前说的大纲不确定外,部分老师命题水平实在有限,也有部分老师出题审核不严格出现漏洞。另外,C++ 语言本身就很复杂,而且考试可能会考到一些很细的语言特性,可能需要平时多注意。

并且自从 2019 级春夏出现大量编译错误后人工批阅的情况后,接下来的学期都采取主观题形式写代码(也是写在 PTA),然后由老师人工批阅。个人认为平常写代码是认真写的,然后特别注意部分地方的语法(例如 virtual 等)分数都不会差。当然不得不承认的一点是,数据库系统大作业 minisql 是一个复习 oop 的很好的练习。