作业 0.2

第 0.2 课课后作业:Racket 表达式、词句处理、谓词、不定冠词等 8 道练习。

模板

在终端输入下面的命令,把模板文件复制到当前目录(注意末尾的句点):

cp ~cs61as/autograder/templates/hw0-2.rkt .

或者,你可以从这里下载模板。

自动评分器

如果你在实验机房里做作业,grader 命令会运行自动评分器。如果你在自己的个人电脑上做,你需要下载 grader.rkt 和 hw0-2-tests。

练习 0

表达式 (+ 8 2) 的值是 10。它是一个由三个原子组成的复合表达式。对这个练习,请写出另外五个值同样为 10 的 Racket 表达式:

  1. 一个原子
  2. 另一个由三个原子组成的复合表达式
  3. 由四个原子组成的复合表达式
  4. 由一个原子和两个复合子表达式组成的复合表达式
  5. 任何其他种类的表达式

练习 1

我们来构建一些处理词和句子的函数。上一个实验中的 second 过程会提供给你。你也许会觉得 word 函数有用。

  1. 写一个过程 first-two,接收一个词作为实参,返回由实参前两个字母组成的双字母词。
  2. 写一个过程 two-first,接收两个词作为实参,返回由这两个实参首字母组成的双字母词。
  3. 再写一个过程 two-first-sent,接收一个双词句子作为实参,返回由这两个词首字母组成的双字母词。
-> (first-two 'ambulatory)
'am
-> (two-first 'brian 'epstein)
'be
-> (two-first-sent '(brian epstein))
'be

练习 2

写一个谓词 teen?,如果实参在 13 到 19 之间(含两端)则返回 #t。

-> (teen? 19)
#t
-> (teen? (/ 39 2))
#f

练习 3

写一个过程 indef-article,只接收一个词作为实参,返回一个句子。关于 indef-article 应该怎么工作,见下面的例子。记住,以辅音开头的事物的不定冠词是 “a”,以元音开头的是 “an”。你可以忽略任何边缘情况。

-> (indef-article 'beetle)
'(a beetle)
-> (indef-article 'apple)
'(an apple)

练习 4

写一个过程 insert-and,接收一个由若干元素组成的句子,返回一个新句子,在语法正确的位置插入 and。

-> (insert-and '(john bill wayne fred joey))
'(john bill wayne fred and joey)

练习 5

写一个过程 query,把陈述句变成疑问句:交换前两个词的位置,并在最后一个词的末尾加上问号。你可以忽略任何边缘情况。

-> (query '(you are experienced))
'(are you experienced?)
-> (query '(i should have known better))
'(should i have known better?)
-> (query '(you were there))
'(were you there?)

练习 6

写一个过程 european-time,把美式 AM/PM 记法的时间转换成欧式 24 小时记法。再写一个 american-time,实现相反的转换。

-> (european-time '(8 am))
8
-> (european-time '(4 pm))
16
-> (european-time '(12 am))
0

-> (american-time 21)
'(9 pm)
-> (american-time 12)
'(12 pm)

练习 7

写一个过程 describe-time,接收一个秒数作为实参,返回对这段时间更有用的描述。假设一年有 365.25 天。你只需要考虑到一天以内的时间段。

-> (describe-time 45)
'(45 seconds)

-> (describe-time 930)
'(15.5 minutes)

注意

你可能会注意到,Racket 处理整数除法的方式有点奇怪:

-> (/ 1 2)
1/2

你可以在一个或多个实参中使用小数点,强制 Racket 返回带小数点的数(即浮点数):

-> (/ 1.0 2)
0.5

练习 8

下面的程序不能工作。为什么?修复它并解释原因。

(define (superlative adjective word)
  (se (word adjective 'est) word))

superlative 应该这样工作:

-> (superlative 'dumb 'exercise)
'(dumbest exercise)

提交作业!

相关说明请参见这份指南。它涵盖基本终端命令和作业提交。

提交时如有任何困难,请随时向助教请教!