前言

同学们是否听说过“编程”这个看起来很厉害的东西,但又不知道它到底是什么? 是否因为看到过电影里的黑客对着黑色的屏幕敲了一串字母最后酷眩地按下回车键,从而对计算机的世界感到好奇?

在本次实验中,我们将会用Python3这个编程语言为主来教会大家如何编写代码、如何运行代码,以及教大家如何像黑客一样对着你的电脑键盘一阵“乱敲”,然后按下回车键耍帅! 当然,我们还需要教会你一些不那么酷炫的事情——如何完成作业以及提交作业。

在开始之前,请先学习一下怎么浏览实验讲义。

  • 点击左侧的目录可以直接跳转到对应的页面。
  • 按下键盘上的右方向键,或点击页面右侧的箭头浏览下一页。
  • 按下键盘上的左方向键,或点击页面左侧的箭头返回上一页。

学习指南

学会如何提问

大学生活和高中差别可大了,大家只有学会自己学习、学会向他人提问才能轻松掌握知识。 能够学会提问不仅能让大家更快解决你的问题,还能让大家更乐意帮助你。

在这里向大家推荐两个必读的传世经典:

知道你不会看的(我也没看),总之就是:

  • 首先尝试去独立解决问题,自己先思考再提问;
  • 尝试自己搜索问题的答案;

遵守学术诚信

学术诚信是大学教学的重要部分,需要大家认真学习并严格遵守。

本课程鼓励大家通过QQ群提问等方式互相交流,但禁止包括但不限于下述的违反学术诚信的行为:

  • 复制粘贴网上找来的代码
  • 展示自己的代码给别人抄
  • 直接提交别人的作业
  • 在考试过程中作弊

根据《南京大学学士学位授予管理办法》,因违反学术诚信受到记过(含记过)以上处分者,不得授予学士学位。 学习并遵守学术诚信是一件非常严肃的事情,请大家务必认真对待。

环境配置

工欲善其事,必先利其器。

在本课程的实验中,我们用Python3这个编程语言来教大家编程。 我们想要用它进行编程,首先需要在自己的电脑上安装Python3和编写代码的工具,并了解如何运行代码。

大家平时可能听得比较多的说法是Python,而不是Python3。 实际上,Python3表示Python这个语言的“3号版本”。聪明的同学可能想到,是不是Python还有其它版本?

没错,Python还有一个“2号版本”,叫做Python2。那还有Python1吗? 有是有,不过这是1991年发布的东西,现在可能已经见不到了。 Python3和Python2有很多不同的地方。但Python3比之Python2更加的新,也是被主流所使用的(Python2在2020年终止支持),因此我们的教学也采用了Python3。 在实验讲义和以后的课程中,如果我们没有明确说明,那么Python指的都是Python3。

本质上,代码就是一堆文本。那我们平时怎么编辑文本?当然是记事本、在线文档!注意,word编写有格式的文本,非我们关心的纯文本,我们并不用它编程。

所以,理论上我们使用Windows自带的记事本就可以写代码了。 你可以用记事本打开实验材料里的hello.py试试(在Windows系统中,请右击文件,在“打开方式”中选择“记事本”,请勿直接双击文件)。 只要看到以下文本就说明没问题:

2023
print(2023)

我们把像Windows上这样的记事本软件称作编辑器(Editor)。 程序猿们开发了很多专门用来写代码的编辑器,VSCode就是目前最为流行的编辑器之一!


接下来,让我们来看看如何在自己的电脑上安装Python3和VSCode。

目前最主流操作系统有Windows系统、macOS系统和GNU/Linux系统。 考虑到同学们可能使用各种不同品牌的电脑与操作系统,本章节会兼顾这三种主流操作系统。

若在按照实验讲义操作的过程中有难以解决的问题,欢迎大家在实验课上或课程群中随时提问。

注意:请同学们按照指导教程准确操作。

Windows

安装Python

在浏览器中访问https://www.python.org,点击下方的“Download”中的最新版本。

在新页面中直接翻到最底下,找到”Windows installer (64-bit)“,点击下载。

运行下载的安装程序,先勾选底部的“添加到PATH”,然后点击安装。请不要忘记这一步!

安装VSCode

在浏览器中访问https://code.visualstudio.com,点击下载按钮下载安装程序。

运行下载的安装程序。注意勾选“其他”下属的四个选项,然后点击安装。请不要忘记这一步!

macOS

安装Python

macOS自带Python3。

安装VSCode

在浏览器中访问https://code.visualstudio.com,点击下载按钮。 你将会得到一个压缩包,将压缩包解压后出现一个VisualStudioCode.app文件,将这个文件拖拽到访达(Finder)的“应用程序”中即可。

GNU/Linux

本节以Ubuntu 22.04为例,其他GNU/Linux操作系统请自行解决。

安装Python

Ubuntu自带Python3。

安装VSCode

在浏览器中访问https://code.visualstudio.com,点击下载按钮。 你将会得到一个.deb文件,使用dpkg安装该软件包。

$ sudo dpkg -i ./code_xxx.deb

小结

到现在,同学们应该已经完成了以下内容:

  • 安装好了Python环境和VSCode编辑器。相关环境变量也已配置完成。

VSCode基础

要学习如何编写程序,首先要知道如何使用编辑器和开发环境。 这些操作不仅在本课程中将被广泛用到,它还会伴随同学们完整的程序员生涯。

在本章中,我们将学习如何使用VSCode,并学习如何执行简单的命令。

认识VSCode

启动我们刚刚安装好的VSCode,你将会看到类似的界面(可能是黑色的,可能是英文的):

我们可以安装中文语言包。

点击左侧的“插件”选项卡,搜索“Chinese”,安装中文语言包。

左边是vscode的菜单,可以打开文件管理器、插件市场等工具。中间就是代码编辑区域。

vscode可以管理单一文件或一个文件夹的编辑。点击菜单的 文件--打开文件,我们就可以打开一个文件进行编辑;点击菜单的 文件--打开文件夹,我们就可以浏览文件夹的内容并进行编辑。此时VSCode的界面主要包含:

在文件资源管理器中,(对文件/文件夹/空白处)右键应能看到“通过Code打开”,点击即调用VScode打开对应文件/文件夹。

文件的保存

就如同大家写word文档时需要保存一样,在VSCode写代码时也需要及时保存。

当你看到下图中被红框框起来的白点时,代表这个文件被修改但没被保存。

在提交或者测试之前要先保存代码,因为提交/测试的工具是从磁盘中(而不是vscode中)读取代码的。

配置VSCode

安装插件

和刚才安装的中文语言包类似,VSCode的很多额外功能都是通过插件的方法来实现的。

下面是一些助教常用的插件:

  • Python:Python开发套件,默认已经安装。
  • SICP: 张天昀助教(tygg)为本课程专门开发的插件

小结

到现在,同学们应该已经完成了以下内容:

  • 安装好了Python环境和VSCode编辑器。
  • 掌握了使用VSCode来:
    • 打开文件或目录

Python基础

我们已经了解了如何打开终端并执行命令。接下来,我们就可以正式开始学习Python了!

Python提供两种方式来运行代码。

  • 交互模式:你输一行,他运行一行
  • 脚本模式:你把代码写到一个文本文件里,他一次性执行

在本章中,我们首先使用Python解释器的“交互模式”来快速尝试各种代码。 最后,我们教大家在文件中编写Python代码,并使用Python解释器执行它。

Python解释器

刚才我们说过,Python解释器是用来执行Python代码的软件。 Python解释器除了能读取文件中的代码执行,也支持在终端上读取我们输入的表达式和语句执行并展示结果——这很方便大家学习Python。 我们来看看如何启动Python解释器的“交互模式”。

安装好python后,我们启动IDLE(Windows可以在开始菜单中搜索,Mac用户可以打开终端输入python3来代替)

$ python3
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2023, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

大家很可能看不懂执行python3命令后终端所显示的内容。不过不用慌,我们带大家分析一下上面的每串字符。首先是第一和第二行:

Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2023, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

这是Python解释器开始运行交互模式后打印的一些信息,比如第一行打头的“Python 3.10.7”这个版本号。 我们不必在意。大家显示的信息不必和这里展示的信息完全一致,但版本号必须是3.x.y的形式。

接着,Python解释器在第四行显示了>>>这个符号。这个符号也是提示符,只不过和我们刚才见过的长得有点不一样。 它代表了我们可以输入一些“东西”跟Python交互了。

举一个例子,我们现在可以在提示符>>>后面输入1 + 1,按下回车键,看看Python会不会计算这个小学生都会算的事情。结果如下:

>>> 1 + 1
2

可以看到,Python解释器很灵性地计算了1 + 1,得到2,并把2输出给你看,然后很积极地再打出了提示符>>>,提醒你输入下一个表达式或语句来让它计算。 概言之,交互模式便是一种“你输入表达式或语句,Python解释器执行它,你再输入表达式或语句,Python解释器再执行它……”的重复过程, 直到你不想再和Python解释器说话,敲入exit()为止(见3.3节),交互模式就结束了。

表达式与语句

接下来,我们来正式学习一下表达式和语句的概念,并在Python解释器的交互模式中来检查它们的执行结果。

大家在高中阶段一定见过8 * 8, a + b , 7 - (x + y)之类的数学表达式, 而程序表达式也是类似的,它们由数字(亦称为常数)、变量(如a, x等,用字母表示)、运算符(如加法、乘法符号等)等组成, 一些表达式还包含了函数,这在课上会讲到(不妨试着用数学里的“函数”概念去理解它)。 我们知道,如果表达式里面每个部分的值都是已知的(例如,a + ba的值为4、b的值为5),那么整个表达式就可以被求值。 让我们来看看Python里面的表达式和求值是什么样的。

1. 基本表达式

基本表达式(Primitive Expressions)只需要一步便可以求得它的值,例如整数、浮点数和布尔值:

>>> 3
3
>>> 12.5
12.5
>>> True
True

同学们可以像上面这样在交互模式下输入表达式,并按回车键查看结果。

浮点数是一种带小数点的数。之所以叫它浮点数,是因为它和计算机底层的表示有关。等大家上《计算机系统基础》这门课的时候就会理解了。

变量名同样也是基本表达式,求值的结果为在当前程序的状态下绑定到的值(更多内容见赋值语句)。

2. 布尔值与布尔表达式

布尔值只有两种值,TrueFalse,表示逻辑上的“真”与“假”。

例如,我们知道数字1是不等于2的,所以若在Python交互模式中输入1 == 2(这个表达式意思是“1等于2”,在Python中一般用==表示“相等”), 则会得到它的值为False;相反,如果输入1 != 2(表示”1不等于2“,在Python中一般用!=表示”不相等“),则会得到值True

这种能计算出布尔值的表达式我们称之为布尔表达式(Boolean Expression)。

>>> 1 == 2
False
>>> 1 != 2
True

3. 算术表达式

可以通过对数字和数学运算符的组合产生复杂的算术表达式(Arithmetic Expression)。 Python中常见的数学运算有+(加)、-(减)、*(乘)、**(乘方)和以下三种:

  • 浮点除法 (/):计算第一个数除以第二个数的结果,得到一个浮点数(即使能够整除)。
  • 下取整除法 (//):计算第一个数除以第二个数的下取整后的结果,得到一个整数。
  • 取模 (%):计算第一个数除以第二个数的余数(>0), 得到一个整数。
>>> 1 + 2
3
>>> 3 - 2
1
>>> 5 * 6
30
>>> 7 / 4
1.75
>>> 7 // 4
1
>>> 7 % 4
3
>>> 4**3
64

像大家平时学过的数学运算一样,算数操作也有优先级,比如乘方运算的优先级大于乘除运算,乘除运算的优先级大于加减运算。 同样地,你也可以通过“加括号”来改变求值优先级。注意,优先级不需要记忆。当你对运算优先级拿不准的时候,就多加括号!

>>> 2 + 6 / 4
3.5
>>> (2 + 6) / 4
2.0

4. 赋值语句

一个赋值语句(Assignment Statement)由一个变量名和一个表达式组成。它会把变量名与该表达式的值绑定。

>>> a = (100 + 50) // 2

注意:在Python中,不能对语句进行求值。

>>> None==(a=1)
  File "<stdin>", line 1
    None==(a=1)
            ^
SyntaxError: invalid syntax

你可以输入一个之前定义过的变量名,例如a,Python解释器会输出其绑定到的值。如果你还记得之前的内容,a也是一个基本表达式:

>>> a
75

注意这里a被绑定到75, 而非(100 + 50) // 2 —— 变量名绑定到值而非表达式上。

5. print

print()是Python3的内置函数,它可以将一个表达式的值输出到终端上(如果还不清楚函数的概念,就单纯记忆一下它的用法吧)。 print(2023)也是一条语句:

>>> 2023
2023
>>> print(2023)
2023

注意,上面在交互模式下输入2023print(2023)显示的结果看上去相同,但前者是交互模式下自动输出的每一行表达式的值, 后者是print()在终端中的输出。在非交互模式下(即执行Python代码时,后面会讲),如果你想知道结果,请用print()

退出交互

当你完成与Python的交互后,可以进行以下操作来退出交互:

  • 输入exit()或者quit()并回车
  • 在Windows下,按下Ctrl+Z并回车
  • 在macOS和Linux下,按下Ctrl+D

执行Python文件

大家已经知道,Python代码是由表达式和语句组成的。而现在大家已经学会了一些简单的表达式和语句,并在交互模式下体验了执行它们的效果。 现在,我们就可以把之前学过的表达式和语句都写入到文件中,然后让Python解释器直接从文件中读取它们并执行。

关于编写代码,我们已经事先准备了一个编写好的文件hello.py(约定俗成,大家以.py的后缀来表示这是一个Python代码文件)。 这个文件中有下面内容:

2023
print(2023)

你也可以利用任何任何文本编辑器修改hello.py,尝试前面提到的其它表达式和语句,或者试一试其它你感兴趣的内容。

如果在vscode中打开这个文件,并且你的vscode安装了python插件,那你就可以在右上角看到一个三角形的图标。点击它就可以运行这个python文件。这等效于在交互模式下把文件的内容一行一行输进去。

然后可以得到结果:

2023

另外,你可能还会疑惑为什么只显示了一个2023。现在你需要回顾一下前面3.2.5小节的内容。

你会发现,原来2023这种表达式仅会在交互模式下显示求值结果。这里不是交互模式,所以表达式2023没有显示任何结果。 屏幕上的2023是由print函数“打印”出来的(难怪它叫print)!

小结

到现在,同学们应该已经完成了以下内容:

  • 安装好了Python环境和VSCode编辑器。
  • 掌握了使用VSCode来:
    • 打开文件或目录

如何完成实验

现在,大家应该熟悉了如何用Python编写代码以及运行代码的过程。那接下来,我们就要讲解大家可能最不愿意看到的东西了——如何完成实验?

在我们的课程实验中,大家需要补充作业文件中的函数定义来完成一些题目(暂时不知道函数是什么也没关系)。不要担心,我们首先带大家一起完成一道题目来熟悉这个流程。

作业文件

首先从课程主页或群文件里下载本次实验所需的文件,对于本次实验是lab00-Code.zip这个压缩包。

首先,新建一个文件夹,再将lab00-Code.zip中的文件解压到这个文件夹。之后每次作业都需要如此解压到一个新文件夹再开始写,切忌直接双击打开压缩包中的文件或者直接解压到旧作业的文件夹中!!!

对第一次接触电脑的同学:解压软件我个人推荐7-Zip。解压方法是点击左上角的【提取】,然后选择刚刚新建的文件夹;或者全选(用鼠标框住或使用快捷键【Ctrl+A】)压缩包中所有文件,再用鼠标拖到刚刚新建的文件夹中。

然后打开刚刚解压到的文件夹,右键点击一处空白区域,再选择【用Code打开】。这样操作相当于用VSCode打开整个文件夹,这对后面的实验会比较方便。我个人不建议通过双击lab00.py来用VSCode打开单个文件的方法。

本次实验的作业文件是lab00.py。 打开lab00.py,首先能看到下面这段代码:

def twenty_twenty_three():
    """Come up with the most creative expression that evaluates to 2023,
    using only numbers and the +, *, and - operators.

    >>> twenty_twenty_three()
    2023
    """
    return ______

上面代码里包含了我们将要完成的第一个题目——2023(这个题目就叫做2023)。看到上面的代码时,你可能是一脸懵逼的。不过不要慌,我们来一步一步理解。

首先,这段代码使用def twenty_twenty_three()定义了一个函数twenty_twenty_three()。如果在实验课前老师还没讲如何定义函数,大家也不用着急。不知道这个知识点也能完成本次实验。不过,在下一次课上你应该就会学到如何定义函数了。

接下来,我们会看到一段被三引号"""包围的文本。我们把这段文本叫做docstring(全称document string,即文档字符串),但对于python来说,这段文本就是一段注释而已,并不会被执行。它一般被用来描述一个函数应该做什么。在我们twenty_twenty_three的例子中,这段docstring告诉我们:“写出一个富有创造力的表达式,使得计算它的值能得到2023”(当然,在本次实验中没那么有创造力也无妨)。此外,它还要求我们只可以使用数字和加减乘除。

紧接着,我们能看到有一行docstring是以>>>开头的。从这行开始往下的docstring被叫做doctest (举一反三一下,它的全称为什么?——document test)。回想一下大家在前面使用的Python交互模式,>>>被我们称为提示符——它告诉我们可以在它后面输入表达式或者语句。是不是当你在>>>后面输入一个表达式后,Python解释器就会在下一行打印这个表达式的值?doctest就是通过这样的示例来告诉你一个函数会做什么:“当我们在交互模式下这样输入代码,就会得到这样的结果”。在我们twenty_twenty_three的例子中,doctest告诉我们:“当我们在交互模式下输入twenty_twenty_three(),就会得到2023”。

总的来说,docstring和doctest分别使用“描述”和“举例”的手段来告诉我们一个函数的行为。未来在大家完成实验题目的时候,除了阅读实验讲义,也最好读一读它们加深自己的理解。

写点代码

现在,我们应该理解了作业文件中的第一个题目,即写一个(有创造力的)表达式,使得它的值为2023

那么我们该把这个表达式写在哪里呢?我们的实验讲义会把这种要求都描述清楚。本次实验其它题目的描述可以在左侧的“本次实验内容”一节中找到。作为一个带大家一起做的例子,我们现在先告诉大家第一个题目的要求:请用你想到的那个表达式替换掉twenty_twenty_three中下划线的部分

当然,我们之前说过第一个题目我们会带大家一起做。所以虽然不知道富有创造力的大家想到了什么表达式,但没有创造力的助教们就想了一个这样的答案:

def twenty_twenty_three():
    """Come up with the most creative expression that evaluates to 2023,
    using only numbers and the +, *, and - operators.

    >>> twenty_twenty_three()
    2023
    """
    return 2024 - 1

大家可以修改各自得到的lab00.py文件,把下划线替换成自己想到的表达式。

我实现的对不对?

现在,大家已经完成了第一个题目。这个题目当然是很简单的,但之后随着知识的增多,我们要完成的题目也越发复杂。那么有没有什么方法能检验我们写的代码对不对呢?

手动测试代码

回想一下,doctest描述了“当我们在交互模式下这样输入代码,就会得到这样的结果”,那么我们是不是可以打开交互模式,按照doctest的描述输入代码,然后观察结果是不是一致的呢?

是的!我们可以打开一个交互模式的python,然后把作业文件粘贴进去,最后按一下回车,python就把文件的代码运行完了。然后,我们就可以对照着doctest输入doctest即可测试:

$ python3
Python 3.9.6 (default, May  7 2023, 23:32:44)
[Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def twenty_twenty_three():
...     """Come up with the most creative expression that evaluates to 2023,
...     using only numbers and the +, *, and - operators.
...
...     Expected result:
...     >>> twenty_twenty_three()
...     2023
...     """
...     return 2023
...
>>>
>>> def sum(a, b):
...     """Compute the sum of a and b.
...
...     Expected result:
...     >>> sum(1, 2)
...     3
...     >>> sum(3, 8)
...     11
...     """
...     return ______
...
>>>
>>> def diff_square(a, b):
...     """Compute the difference of square a and square b.
...
...     Expected result:
...     >>> diff_square(3, 2)
...     5
...     >>> diff_square(3, 4)
...     -7
...     """
...     return ______
...
>>> twenty_twenty_three()
2023

这和doctest描述的一模一样,所以你现在可以松口气,相信自己的代码是对的了。如果发现不一样,你就需要看看自己哪里出问题了。

等一等!刚才其实有一个概念的陷阱。现在让我们思考一个问题:为什么说,经过刚才这样一个过程,我们就有理由相信我们的代码是对的呢?

实际上,“相信自己的代码是对的”是一个错误的说法!准确的说,大家只能有理由相信“自己写的代码和doctest所预期的相符合”,进而推论,自己的代码可能是对的。

其实,像这样一个比较代码的实际执行结果和预期结果的过程就叫做测试。这也是“doctest”中test的中文含义。测试不能保证“代码是对的”,只能保证代码在多大程度上与预期相符合。但如果通过了足够多、足够复杂的测试,我们就更加有信心来相信,我们的代码是对的。

当然也有技术用以保证严格的正确性,相关方法被称为形式化验证(Formal Verification),通过规则和逻辑(而非测试样本)证明程序的正确性。这种技术在涉及生命财产安全的领域有更广泛的运用。

使用Ok进行自动化测试

随着大家做的题目越来越多、越来越复杂,同学们可能会发现,每当自己写了一段新的代码,就要重新走上面一套doctest的流程,然后嫌手动输入表达式很麻烦。我们可以使用tygg开发的SICP插件来方便测试。

首先在VSCode中安装SICP插件

点击绿色框框中的Run来测试代码,点击Debug来给代码debug。

什么是Debug?

Debug就是修复代码中的缺陷(bug)。Debug模式下,我们可以给代码打断点,让它运行到这个地方时停下,然后查看各个变量的值。

为什么我点击Run(或者Debug)打开了浏览器,访问了南京大学代码托管系统?

Ok不仅是一个测试工具,我们还需要用它提交作业。 提交作业时,我们通过南京大学代码托管系统的登陆信息来辨别各个人。 在下一节中我们会介绍怎么注册系统并提交作业,现在不需要管。 直接关闭浏览器,并且关闭VSCode底部弹出的终端即可。

助教会如何测试我的代码?

对于助教来说,很难一一审查每个人的代码来验证大家写得正不正确,所以我们会采用测试的方法来给大家评分。像我们发布给同学的doctest一般都写得比较简单,所以那些写得不正确的代码也有可能通过doctest,比如像下面这段代码,本来助教希望大家写return a + b,但有个小机灵鬼直接返回3试图蒙混过关:

def add(a, b):
    """return the sum of a and b

    >>> add(1, 2)
    3
    """
    return 3

但如果我们的测试写得越“详细”,写得不正确的代码就越难蒙混过关。

def add(a, b):
    """return the sum of a and b

    >>> add(1, 2)
    3
    >>> add(3, 4)
    7
    """
    return 3

因此,助教们会设置一个在线测评(Online Judge, OJ)网站,用更加“详细”的、对大家隐藏起来的测试来给大家评分,尽可能防止不正确的代码蒙混过关。我们会在下一节中教大家如何提交作业,让助教测试你的代码。

本节关于测试的介绍,如果大家理解得不清楚也没关系。重点是记住下一节要讲的提交作业的方法,并知道如何查看自己写的代码拿了多少分。

提交作业与评分

为了获取分数,我们需要使用随作业下发的Ok客户端进行测试并提交。 这里助教特别强调,所有作业都必须使用Ok进行测试并提交,作业系统不再提供直接上传文件的提交功能。

使用Ok(VSCode的SICP插件)是保护作业文件、遵守学术诚信的有效手段。 UC Berkeley开发的Ok是一个对作业进行测试、备份、提交的程序。 助教在2021年的时候把Ok进行了魔改,支持了我们自己的作业系统。 张天昀助教在2022年开发了VSCode插件,使得使用Ok不再需要使用终端。

当你用Ok对自己的代码进行测试时,Ok会把你的代码备份到作业系统。 如果你一不小心手滑把电脑砸了/掰成两半了/泡水里了1/格式化了,可以向助教索要最新的备份文件,或自行在作业系统上下载已经提交的代码。 同时,大家完成作业产生的一系列备份文件,可以用于调查是否存在违反学术诚信的行为,也可以帮助自己证明自己是独立完成作业的。 从2021年收集到的数据来看,很多同学完成困难的作业题需要尝试十几次才能获得满分。

我们考虑这样的一个例子:同学A的在布置作业后一直没有任何尝试,在截止日期当晚直接满分,助教都认为困难的题目没有任何尝试就做对了,且复杂的代码与同学B的高度相似。 在没有能够证明A自己独立完成作业的可信证据的情况下,其行为将被认定为抄袭。 作业抄袭或其他学术不端行为初犯将取消作业成绩(两人的成绩都为0),再犯则课程成绩按0分计并提交到本科生院。

1:真实的事件,某位2019级拔尖班学长喝饮料的时候把饮料浇到了电脑上。

系统注册

为了能够提交作业并获得评分,同学们需要完成下面的事情:

  1. 南京大学电子邮件系统开通自己的学生邮箱,如何开通请看【IT服务】南大邮箱系列问答
  2. 南京大学代码托管系统使用自己的学生邮箱注册一个账号。
    • 第一次登录本课程作业系统必须使用学号邮箱,不能是自定义的邮箱地址。
    • 如果你已经用其他邮箱注册过代码托管系统,可以在用户设置页面修改自己的邮箱。
  3. 点击填写SICP2023作业系统注册&小调查,填写完成后过几秒钟就可以登录作业系统了。

你可能会问,为什么不用用户名密码登录的方式?

  1. 助教不想管理密码。
  2. 很多同学一直都用默认密码不修改2
  3. 代码托管系统提供了重置密码、2FA等功能。

2:真实的事件,不改密码的话,别人可以登录你的账户下载你的作业。

提交作业

在VSCode中,按下Ctrl+Shift+P(在macOS里是Command+Shift+P)打开Command Palette(中文应该是命令面板),然后输入submit来进行搜索,点击Submit your code即可提交。

如果你不习惯使用键盘快捷键,也可以点击VSCode左下角的齿轮,然后点击命令面板,即可打开命令面板。

运行Submit your code后,VSCode底部会弹出终端。如果提交成功,Ok会打印提交ID,可以在课程主页查看评分结果。

=====================================================================
Assignment: lab00
OK, version 2023.09.16
=====================================================================

Submitting lab00 by 230000000 John Smith.
SICP OJ received submission ID xxxxxxxx
Open in browser: https://sicp.pascal-lab.net/2023/oj/web/assignments

查看评分

打开课程主页,点击右上角的“Online Judge”进入作业系统并登录。

在左边点击一个作业,右边将显示你的所有提交和每一次的提交得分。 每次作业的最终得分为你所有提交的最高得分。

如果你存在学术不端的行为并且被检测出来,你将会看到上图中红色的提示框,且你作业的分数将不再是提交的最高得分。再再再再次提醒,代码抄袭会使得双方的作业成绩都变为0。

常见问题

Q: 作业可以提交多少次?

A: 在截止时间之前(以服务器时间为准)你可以提交任意多的次数。 提交的次数不会影响你的成绩。

Q: 我把电脑借给别人了。别人不小心用我的账号提交了他的代码怎么办?

A: 请马上联系助教说明情况,越早越好,避免误会。

Q: 我来不及完成作业了,怎么办?

A: 原则上不允许作业迟交,没有提交的作业均为0分。如果遇到特殊/紧急情况,请先寻求辅导员的帮助,在QQ上与助教联系,任课教师同意迟交后可以延迟作业提交。

本次实验内容

到此,大家应该顺利地做完并提交了第一道题目。希望这段旅程对大家足够顺利。 接下来,我们还有两道简单的题目让大家再熟悉一下整个实验流程。如果你足够熟练的话,可能几分钟就做完了。 此次实验的截止时间(deadline,也就是DDL)设置为一周,大家不用着急。

Problem 1: 2023 (100pts)

用数字和+*-运算符写一个最酷炫的表达式,来替换掉下面twenty_twenty_three函数中的下划线。

def twenty_twenty_three():
    """Come up with the most creative expression that evaluates to 2023,
    using only numbers and the +, *, and - operators.

    Expected result:
    >>> twenty_twenty_three()
    2023
    """
    return ______

Problem 2: A + B (100pts)

写一个代表变量 \( a \) 和 \( b \) 之和的算术表达式,来替换掉下面sum函数中的下划线。

def sum(a, b):
    """Compute the sum of a and b.

    Expected result:
    >>> sum(1, 2)
    3
    >>> sum(3, 8)
    11
    """
    return ______

Problem 3: Diff of Two Squares (100pts)

写一个代表变量 \( a \) 和 \( b \) 的平方差 \( a^2 - b^2 \) 的算术表达式,来替换掉下面diff_square函数中的下划线。

def diff_square(a, b):
    """Compute the difference of square a and square b.

    Expected result:
    >>> diff_square(3, 2)
    5
    >>> diff_square(3, 4)
    -7
    """
    return ______