跳转至

1706762267

面向对象程序设计

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

课程学习内容

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

先修要求

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

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

任课教师

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

翁恺老师的 OOP 应该稳定是 8 个实验,20 级是七个简单的 OJ lab 还有一个组队的大作业,21 级是 8 Project ,其中需要手批并且提交报告的三个 project 需要投入的时间较多。

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

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

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

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

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

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

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

分数组成:期末考试 50%,平时 50%。平时分包括 Pintia 作业 30%,大作业 15%,点名 5%

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

课程教材

  • 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
  • 一些 C++ 书籍的电子版资源https://www.aliyundrive.com/s/z5hLRAELpPP

参考资料

分数构成

  • 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 分),很多同学的平时分都是满分。

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

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