CS1602计算导论
Lab 3Part 1 计算基础与 Python 入门AI Level 0

字符串处理与函数入门

A 段七题练字符串、格式化与函数,其中一道专门暴露 print 和 return 的混淆,最后一道把 Lab 2 的海伦公式写成函数再搭出两个新函数;B 段把一行原始数据变成一张对齐的表,最后会遇到中文名对不齐的问题;C 段学在终端里跑 Python 和重定向。

下载 PDF截止:小作业 1 · 10 月 10 日 周六 23:59
本页目录

本次目标

  • 熟练使用 f-string 控制小数位与对齐
  • 正确处理 input() 返回的字符串
  • 写出带参数和返回值的函数
  • 彻底分清 print() 和 return

A 段 · 必做

3-1 温度转换

实现 c_to_f(c),摄氏度转华氏度(F = C * 9/5 + 32),返回保留一位小数的浮点数。

c_to_f(0)     →  32.0
c_to_f(37)    →  98.6
c_to_f(-40)   →  -40.0

3-2 学号脱敏

实现 mask_id(sid):保留学号的前四位和后四位,中间一律换成 *。

mask_id("526030910001")  →  "5260****0001"
mask_id("12345678")      →  "12345678"

只用切片和拼接,不需要循环。

3-3 对齐的成绩表

实现 format_row(name, score),返回一行格式化字符串:姓名左对齐占 10 格, 分数右对齐占 6 格、保留 1 位小数。

format_row("Alex", 87.5)    →  "Alex        87.5"
format_row("Blake", 92.0)   →  "Blake       92.0"
format_row("Chen", 65.25)   →  "Chen        65.2"

用 f-string 的 :<10 和 :>6.1f。

3-4 找出并修正 print/return 的误用

下面这段代码想算出两个数的平均值再乘以 2,但会报 TypeError。 指出原因,改对它,并在答题卡上用一两句话解释。

def average(a, b):
    print((a + b) / 2)

result = average(10, 20) * 2
print(result)

3-5 安全的数字输入

实现 read_int(prompt):显示提示、读入一行、转成整数并返回。

暂时不用处理输入非数字的情况(那要等 L11 的异常处理),但自己试一次: 输入 abc,看它抛的是哪一类错误。答题卡上问的是 input() 的返回类型, 和这件事是同一个根。

3-6 返回多个值

实现 stats(a, b, c),返回三个数的最小值、最大值、平均值三个值。

stats(3, 9, 5)  →  (3, 9, 5.666666666666667)

调用方应该能这样接:

low, high, mean = stats(3, 9, 5)

平均值不要四舍五入,原样返回。

3-7 三角形的外接圆与内切圆(平台判分)

Lab 2 你用海伦公式算过三角形面积,那时候是一段顺序代码。这次把它写成函数, 再用它搭出两个新函数。

def area(a, b, c): ...
def circles(a, b, c): ...    # 返回 (外接圆半径 R, 内切圆半径 r)

公式:

S = 海伦公式算出的面积
s = (a + b + c) / 2          外接圆 R = a·b·c / (4S)
                             内切圆 r = S / s
area(3, 4, 5)      →  6.0
circles(3, 4, 5)   →  (2.5, 1.0)
circles(5, 5, 6)   →  (3.125, 1.5)

circles 里面要调用 area,不要把海伦公式再抄一遍。 这道题考的就是这件事 —— 判题会检查。


B 段 · 深入:把一行原始数据变成一张对齐的表

真实的数据很少是现成可用的。它通常是一行文本,你得先把它拆开、转成对的类型, 再排成人能读的样子。这一段四问,每问建立在前一问上,都不需要循环。

原始数据长这样,一行一条记录:

张三,87.5
李四,65.25
欧阳修远,92

B-1 拆开一条

实现 parse(record),把一条记录拆成姓名和分数,分数要是浮点数:

parse("张三,87.5")   →  ("张三", 87.5)
parse("欧阳修远,92")  →  ("欧阳修远", 92.0)

B-2 排成一行

用 A 段的 format_row 把 parse 的结果排成一行:姓名左对齐占 10 格, 分数右对齐占 6 格保留一位小数。

把三条记录各处理一次(写三次调用,不用循环),输出贴进答题卡。

B-3 中文名对不齐

看你 B-2 的输出。ASCII 名字那几行是齐的,中文名那几行歪了。

请回答:

  1. len("张三") 是多少?len("Alex") 呢?
  2. 但它们在屏幕上占的宽度一样吗?
  3. 所以 f"{名字:<10}" 到底按什么补空格?

B-4 凑合的办法

在不引入新知识的前提下,想一个能让这三行大致对齐的办法,写出来并说明它的局限。


C 段 · 基本功:在终端里跑 Python,以及把输出接走

前两周学了走动(pwd ls cd)和增删改(mkdir touch cp mv rm)。 这周学两件事:在终端里跑 Python 的两种方式,和把输出接到别处去。

交互式与脚本

直接运行 python 进入交互式(提示符是 >>>),一行一行试,适合验证一个想法:

python
>>> 2 ** 100
>>> exit()          # 或者按 Ctrl+D

运行 python 文件名.py 是执行脚本,从头到尾跑一遍。写程序用这个。

按键作用
Ctrl+C打断正在跑的程序
Ctrl+D退出交互式(Windows 上是 Ctrl+Z 再回车)
↑ ↓翻之前敲过的命令

重定向:把输出接到文件里

python hello.py > out.txt      # 输出写进文件,覆盖
python hello.py >> out.txt     # 追加到文件末尾
python guess.py < input.txt    # 把文件内容当作键盘输入喂给程序

C-1 走一遍

把命令和输出从终端复制出来,填进答题卡(不必截图):

  1. 进交互式,算一下 2 ** 100,然后退出
  2. 把 B-2 的程序输出重定向到 table.txt,再用 cat table.txt 看一眼
  3. 建一个 input.txt,里面写两行数字;用 < 喂给你 A 段 3-5 那个读数字的程序

C-2 想一想

  1. > 和 >> 差在哪?你怎么验证?
  2. 用了 > 之后屏幕上还看得到输出吗?为什么?

提交前自查

  • 每个函数都是 return 而不是 print(3-5 的提示除外)
  • 3-1 返回的是浮点数,不是字符串
  • 3-7 的 circles 是调用 area 的,没有把海伦公式抄第二遍
  • A 段答题卡交了(3-2 的边界、3-4 的解释、连读三个数那一问都在里面)
  • B 段答题卡交了
  • C 段答题卡交了