猪脚说第十六期
2023.06.23
前言
首先感谢大家一个学期来的陪伴、努力、支持和配合!作为一门信息类专业通识性质的课程,本学期的数据结构和程序设计课程可以说是画上一个圆满的句号了。
当然,这个句号画得并不容易:你可能因为平时作业和练习的 bug 而 de 得焦头烂额,你可能绞尽脑汁也不能理解某个算法,你可能因为考试的难度而心灰意冷。说起来,这次期末考试的难度确实比较大,考察的内容也是应用性的题目,超出了基本编程的范畴,所以不理想也正常,大可不必放在心上。老师的原话是,“考试有关的,分数有关的事情,都特别微妙”,所以大家不必为此焦虑担心。
不论如何,课程本身算是结束啦。现在,大家还是好好想想专业选择的问题和暑假去哪玩吧!
猪脚说是怎么写的呢
猪脚说使用了轻量级标记语言 markdown 编写,每个文件是 .md 后缀,是一个纯文本文件,即,用记事簿也可以打开。
如果我们想想一篇课程报告、学习材料等的构成,无非包括以下几个方面
- 各级标题
- 正文
- 公式
- 图表
- 代码块
- 引用性、标注性内容
markdown 支持上述形式的编辑。假设你已经把所有文字写好,你只需要在其中加入 markdown 语言的一些语法标记,就可以成功导出你想要的格式的文本,这实际上避免了 word 等软件内容过于繁杂的问题,使得编辑这件事情更加简单。
例如
各级标题:我们看到,在标题内容前加上若干个井号和一个空格,后面的内容就会被渲染成不同大小的标题。当然,不支持无限级的标题,六级标题已经足够。
序号:各级序号实际上是一系列的减号和对齐构成的。
代码:代码块对应三对反引号,其中前三个反引号后写上语言类型。markdown 支持很多语言,并且写法比较随意 —— 你可以写 C 或 c,可以写 c++ 或 cpp,可以写 py 或 python,可以写 sh 或 shell 等。行内代码对应一对反引号。
引用内容:通过一个右尖括号打头,直到空行结束,中间的都是引用内容。这实际只是把正文换了一种形式展现,在引用内容中同样可以插入各级标题、代码、公式、图片等内容。
更多内容可以参考这篇文章 ,这里就不再赘述啦。
公式:markdown 支持 latex 公式。其中,latex 是一种排版系统,比较复杂。latex 用于书写数学公式非常方便。我们首先明确,上标是
^
,下标是_
,每一个公式单元都用一对{}
括起来。
$$
\Alpha\beta\sum_{i=0}^{k}\frac{a_{i+1}^2}{2i}\int_{a_i}^{a_{i+1}}f(x_i)\text{d}x
$$
上面这一坨公式,对应的 latex 是
1 | \Alpha\beta |
- 公式开头的两个希腊字母 $\Alpha$ 和 $\beta$ 对应
\Alpha\beta
,因为很显然它们并不在我们的键盘上,所以需要通过转义字符实现。特别地,如果第一个字母是大写,对应大写的希腊字母,小写对应小写的希腊字母。 - 求和号对应
\sum_{}^{}
,第一对花括号是下标,第二对花括号是上标。 - 分式对应
\frac{}{}
,第一对花括号是分子,第二对花括号是分母,这里我们看到分子同时有上下标,分别对应了_{i+1}
和^2
,其中下标是一个复杂的表达式而非单个字符,所以还需要一对花括号括起来。 - 积分(integral)对应
\int_{}^{}
,第一对花括号是积分下限,第二对花括号是积分上限。 - 在规范的公式中,积分式的那个 d 是普通文本而非斜体的,所以用了
\text{}
将其包括,呈现出非斜体的样式。
所以我们看到,latex 数学公式无非一堆转义字符套来套去,只要记住常用的转义字符,即可方便书写。更多的符号请看这篇文章 。
如果要在 markdown 中插入行间或行内公式,用到的是美元符号,例如上面一段文字对应的源代码为
当然,编辑 markdown 是不需要手敲源代码的,很多软件提供了便捷的编辑方式,你需要做的只有
找一个好用的 markdown 编辑软件
typora 是一个很好的例子,当然正版需要充一点钱购买,支持在多个设备上使用。vscode 也有很多类似的插件,支持快捷键、实时预览效果、导出 pdf 等。
熟悉快捷键
例如,在助教的 typora 中,一级标题对应
command + 1
,引用对应command + option + Q
,粗体对应command + B
,代码块对应command + option + C
,行内代码对应control + `
,分点只需要输入一个-
再敲一下空格。Windows 系统也有一套快捷键,可以很方便地编辑各类内容。一般情况下,通过常规模式编辑内容即可,也可以切换到源代码模式查看。熟悉 latex 常用公式符号
如果你需要书写很多公式的话,有必要记一些常用的 latex 语法。但是,markdown 的语法基本不用记忆。
markdown 的语法只是规定了文本应该以什么形式呈现,但是没有规定具体的样式,如字体、字号、颜色等属性。这些东西需要通过 css 设置,关于 css 后文会介绍。一般来说,软件自带并且网上也有很多 css 样式模板,直接套用即可。
我们还应做什么
一学期的 ds 学习,我们学到了一些数据结构的知识,并通过 C 语言实现了它们。作为基础性的重要知识,通过 C 语言编写数据结构能帮助我们直观理解它们的基本原理,并进一步强化 C 语言编程能力;作为不可或缺的代码组成部分,更高级的语言则为我们封装了大量高效的数据结构,供编程者便捷使用。
- C++ 的标准模板库(Standard Template Library,STL)提供了常见的数据结构,只需要通过
#include <stack>
#include <queue>
等头文件包含即可使用。常见的有向量容器(可变长数组)vector
、集合容器(内部自动排序且不含重复元素)set
、关联容器(内部自动排序的“键-值对”集合)map
、队列queue
、栈stack
、优先队列priority_queue
等。 - Java 提供了更加丰富的集合框架和接口,常见的有可变长数组
ArrayList
、链表LinkedList
、自动排序集合SortedSet
、散列表Hashtable
、红黑树TreeMap
、哈希桶HashMap
等。
以 C++ 和 Java 为代表的面向对象语言,会在数据结构的基础上封装函数,我们可以理解成,函数也是结构体的成员。所以,假设我们有一个数据结构对象
a
,我们会看到类似a.pop()
a.push(10)
a.find("hello")
a.remove(-1)
a.get(12)
a.getFirst()
等语句。很显然,我们不需要自己编写各类函数了。此外,面向对象语言为遍历数据结构提供了一种叫做迭代器(iterator)的东西。迭代器封装了“是否还有下一个元素”“获取当前元素”“往后挪一个位置”等函数,通过很简便的代码就可以实现遍历功能。
了解各类数据结构的概念、特性、实现思路,在编写代码时选择合适而高效的数据结构,是永恒的命题。以上一些介绍虽不包含具体知识,但足以说明,在未来,我们需要更加注重数据结构的理论,而编程语言也会提供更加简便高效的操作数据结构的手段。
当然,同学们不要见到这些东西就开始犯难,心想“我连作业和考试的 bug 都搞不清楚,C 语言也没学多深,为什么要讲这些东西呢?”事实上,未来你很难遇到一门课,教你一门编程语言的语法、教你怎么下载一个编程软件、怎么配置编程环境等知识了。所以,我们必须在这发生之前就告诉你,你在未来可能遇到一门课,
- 要求你使用 C++ 的 STL 编写算法。C++ 的输入输出方式和 C 有什么不同?各个类型的模板内部封装了哪些函数?这都是你需要自学的内容,因为,算法课只负责告诉你算法的数学逻辑,而不负责具体的编程实现。
- 要求你使用 C 的进阶知识编写操作系统的代码。什么是可变参数列表?我如何自己写出来一个
printf
?什么是函数指针?如何操作一个有很多文件的 C 语言项目?这都是需要你自己研究的内容,因为,操作系统课只负责传授理论知识,而不会教你 C 语言。 - 要求你使用 Java 完成综合性编程题。Java 环境怎么配?Java 语法是是什么?Java 怎么写才规范?或许没有人告诉你答案,因为,面向对象程序设计课程讲述的是“面向对象”思想,而非 Java 语言教学。
所以,大家会在猪脚说中看到我们频繁地介绍一些课程内容以外的知识、频繁地用尽可能易懂的语言介绍某些规范、某些设计、某些思想,这是有必要的。数据结构课是一门内容并不那么复杂(虽然题目比较复杂)的课程,借着这一个机会,我们尽可能为大家提供更开阔的视野。回顾一下猪脚说讲过的一些重点内容
- C 语言指针详解:第一期
qsort
、C 结构体、C 标准库文件操作:第二期- 声明与定义、二维数组:第三期
- 数据结构之引入:第四期
- 面向对象的思想介绍、计算机的存储结构:第五期 Part II
- 新型双向链表、宏:第六期
- C 项目与头文件:第八期
- 树的理论:第十期
- 堆:第十一期
- 函数指针:第十三期
接下来,我们从计算机和软件相关的角度,介绍一些同学们可以在暑假探索的东西。
了解一门面向对象的编程语言
配置 Linux 虚拟机,了解一些常用的 Linux 命令。进一步地,可以了解 Shell 编程。你可以参考尚硅谷的课程
了解 C 语言 Linux 系统编程。系统编程是 C 语言的更加底层的应用,如,如何写一个程序强制关闭你的微信,如何运行多个程序并且让它们相互通信,如何用更底层、更快速的方式操作、管理文件等。系统编程能够让你进一步了解 C 的规范、了解操作系统的底层原理、了解大型代码项目的管理。这个网课非常非常好
了解计算机底层、硬件方面的知识,如,一加一这个计算是怎么通过电路实现的,我们常说的内存到底是什么东西,CPU 如何工作、这和我们的程序有什么关系等。或许你可以从这里 了解到大体的知识框架。
了解网页是怎么做出来的。简单来说,一个网页的前端包含以下三个部分
html:描述网页中元素的构成,由一对一对的标签构成,例如
1
2<h1>我来演示演示!</h1> <!-- 这是一级标题 -->
<a href="https://www.baidu.com">这里有一个链接,点击跳转百度</a> <!-- 这是跳转链接 -->这一段代码展现出来就是这个样子
css:描述各类元素的样式。比如,前面我们谈到的 markdown,也是通过 css 来设置样式。例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28/* 设置超链接文本的颜色 */
a {
color: #4183C4;
}
/* 设置各级标题的位置、外边距、字体粗细、行高、鼠标悬浮形状 */
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
/* 设置水平分割线的高度、边距、颜色、边框等属性 */
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}JavaScript:实现网页的一些控制逻辑。例如可以遍历一个图片数组展示图片、可以在用户名为空时弹出一个提醒等。
当然,初步了解即可。上述的网页三件套能够写出一个静态的网页,如果要实现动态的网页,还必须有后端的数据库和接口,这就是另一个故事了。简单了解网页前端,你就踏入了一个新的编程领域,html 这种标签描述结构的规则,和 markdown 有着异曲同工之妙;css 能够帮助你学会样式设计的技巧,是真正意义上的从零开始 diy;JavaScript 则是面向对象的,易于操作网页的一门新的编程语言。
大家是信息大类的学生,一年下来,你听过、了解过下面哪些名词呢?如果结果不是那么理想,是不是有必要自己给自己充充电?
github/gitee 与仓库、git 与版本管理、面向对象、封装、抽象、博客 blog、操作系统 OS、CPU、内存、高速缓存、硬盘、磁盘、闪存、汇编语言、虚拟内存、总线、I/O、预处理 -> 汇编 -> 编译 -> 链接、文件系统、文件和目录、地址、根目录、磁盘分区、内核、vi/vim 编辑器、程序、进程、线程、虚拟机、docker、npm、数据库、SQL/MySQL ……
关于提问
各位的数据结构学习也已告一段落,在此,请允许助教们稍稍吐槽一下这学期中让我们肝火upup⬆️的提问吧😋大家可以当作消遣来看一看,自己判断一下哪种提问方式更有效。
我们在开学第一节课就强调过如何提问,并不是说一定要有一个规矩、树立一种权威,而是希望大家能以一种更高效、彼此愉悦的方式与课程助教沟通。需要说明的是,大家下学期进入新的学院后,专业课的课程助教往往是正在忙着毕业的学长学姐,亦或是研究生们。他们的时间安排可能更加紧张,也未必会像我们一样及时地解决大家的问题。很多时候,问他们问题从来都是杳无音信、从不回答。这个时候,正确地问问题是非常重要的。
话不多说,直接上图😋(无针对性)
大家不妨自己评判😋上面四张图(随机挑选)中,哪些提问是有效的,哪些提问只会让人血压飙升。
如果你是助教,一天都是满课,下课了还要写各种实验报告和作业,突然微信提示音一响、手机一震,看见一些同学直接发来一个.c
文件代码,啥也不说让你帮他看,你会是什么心情捏?
在这里分享这些内容的目的不是为了针对各位提问题的同学,而是希望大家理解,上机题目 debug、帮看大作业本应是大家自己完成的课后作业与任务,帮助大家完成作业、平时分拿满并不是助教的义务和责任,助教的存在只是为了协助老师管理班级、批改作业、查阅考试情况,各位进入大二的学习之后,遇到的很多助教的工作方式与态度会让各位对这一点有着更深的感悟。学习是自己的事,一门课程的得分并不需要任何人施以援手。
关于时间安排与规划
总体来说,任何学院与专业的大二学年的学业任务都是非常繁重的。那么助教们是如何做到在完成自身学业任务的同时,几乎秒回大家的所有提问与 debug 需求呢?下图是 diandian 这学期博雅报告中的一段话
不难看出,哪儿有大学生不疯的啊?哪儿有大学生不疯的啊?
因此,作为过来人的我们告诉大家,进入大二之后,首先以自己的学业为重,如果感觉力不从心,请一定适当放下一些学生工作与无关紧要的社交活动。大二学期末的各种报告、大作业与实验真的会特别多,因此也建议大家不要把事情都堆在期末完成,这会严重影响你的烤漆复习。
补充说明的是,实验(lab)是一个比较泛化的说法,物理学的各类仪器、化学的各种瓶瓶罐罐,乃至计算机软件的编程题、代码补全、理论问答,都可以算做实验。这里 Riccardo 也特别建议大家一定一定保存、管理好各类课件、作业、实验报告、考试题等材料。
diandian 烤漆的 10 天里,与不少于 300 个微信好友有过聊天记录。其中少部分是各位的 debug 需求或是烤漆答疑,最多的是 2 系的各种熟与不熟的同学来问 diandian 学科问题、找 diandian 要往年题答案,真的搞得人很 b 溃。有图为证。
当然,我们也乐意做大家在心情低落时的倾听者,也希望大家在后续学习中遇到不顺心的事情时,愿意相信我们,我们也愿意提供一切力所能及的帮助。
写在最后
时间真的过的很快。想起这学期刚开始时,两位助教第一次走进上机教室的慌张与急促还深深在脑海里挥之不去,转眼间就要和大家说再见了。第一次与大家见面时,我们有一个 ppt 叫做“说在前面”。
请允许我们有一个“写在最后”。一件事情的结束,永远是另一件事情的开始。
送给大家几条箴言,里面包含了助教们学习生活体验中最最深刻的感悟。
你需要找到一件自己喜欢的事物。
学业真的只是你自己的事情。
不太推荐在学习上形成物理或精神上的依赖。宁可两个人在一栋楼的两个地方各干各的,有事情发个微信到走廊上说说话,也好过两个人坐在一起低效率地做事情。
由友谊、同宿舍、娱乐、恋爱等带来的玩伴或伴侣,未必是你组队的首选对象。谨慎地考虑组队这件事。
你非常需要发挥自主性,你的大部分知识摄入来源于自学。
祝愿大家能去到自己心仪的专业,学业有成!如果在这段时间里存在对 2 系的疑问,欢迎来找 diandian 聊天;如果存在对 21 系或 6 系的疑问,欢迎来找 Riccardo 聊天😋
放假前十来天助教会去实践活动 / 旅游,可能不能回复那么及时哦(小声)
祝大家暑假愉快,能做自己想做的事情。我们 9 月份学院路见!
我们终会再次相遇在炽热的晚风中。
常联系。
Author: diandian, Riccardo
- Title: 猪脚说第十六期
- Author: Diandian
- Created at : 2023-07-14 23:07:39
- Updated at : 2023-07-14 23:28:28
- Link: https://cutedian.github.io/2023/07/14/猪脚说第十六期/
- License: This work is licensed under CC BY-NC-SA 4.0.