【第5周程序】函数和代码复用

2022-04-11
2022-04-11
4 min read
Hits

  程序设计练习题和考试题

七段数码管绘制

这是"实例"题,与课上讲解实例相同,请作答检验学习效果。

七段数码管是一种展示数字的有效方式。

要求如下:

  1. 使用 time 库获得系统当前时间,格式如下:20190411
  2. 绘制对应的七段数码管
  3. 数码管风格不限

参考答案

import turtle as t
import time
def drawGap(): #绘制数码管间隔
    t.penup()
    t.fd(5)
def drawLine(draw):   #绘制单段数码管
    drawGap()
    t.pendown() if draw else t.penup()
    t.fd(40)
    drawGap()
    t.right(90)
def drawDigit(d): #根据数字绘制七段数码管
    drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,6,8] else drawLine(False)
    t.left(90)
    drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
    t.left(180)
    t.penup()
    t.fd(20)
def drawDate(date):
    t.pencolor("red")
    for i in date:
            drawDigit(eval(i))
def main():
    t.setup(800, 350, 200, 200)
    t.penup()
    t.fd(-300)
    t.pensize(5)
    drawDate(time.strftime('%Y%m%d',time.gmtime()))
    t.done()
main()

答案解析

基本思路:

  1. 绘制单个数字对应的码管
  2. 获得当前系统时间,变成字符串,绘制对应的码管

思维方法:

  1. 模块化思维:确定接口,封装功能
  2. 规则化思维:抽象过程为规则,计算机自动执行
  3. 化繁为简:将大功能变小组合,分而治之

科赫雪花小包裹

这是"实例"题,与课上讲解实例相同,请作答检验学习效果。

科赫曲线,也叫雪花曲线。绘制科赫曲线。

参考答案

import turtle
def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)
def main(level):
    turtle.setup(600,600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    koch(400,level)     
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.hideturtle()
try:
    level = eval(input("请输入科赫曲线的阶: "))
    main(level)
except:
    print("输入错误")

答案解析

基本思路:

  1. 递归思想:函数 + 分支
  2. 递归链条:线段的组合
  3. 递归基例:初始线段

分形几何是一种迭代的图,广泛存在于自然界中,请尝试选择一个新曲线绘制:

  1. 康托尔集、谢宾斯基三角形门格海绵……
  2. 龙形曲线、空间填充科赫……
  3. 函数递归的深入应用 ……

任意累积

请根据编程模板补充代码,计算任意个输入数字的乘积。

参考答案

def cmul(a, *b):
    m = a
    for i in b:
        m *= i
    return m
print(eval("cmul({})".format(input())))

答案解析

该程序需要注意两个内容:

  1. 无限制数量函数定义的方法,其中 b 在函数 cmul 中表达除了 a 之外的所有输入参数;
  2. 以字符串形式调用函数的方法,“cmul()“与eval() 的组合,提供了很多灵活性。

斐波那契数列计算

根据编程模板补充代码,计算斐波那契数列的值,具体功能如下:

获取用户输入整数 N,其中,N 为正整数

计算斐波那契数列的值

如果将斐波那契数列表示为 fbi(N),对于整数 N,值如下:

fbi(1) 和 fbi(2) 的值是 1,当 N>2 时,fbi(N) = fbi(N-1) + fbi(N-2)

请采用递归方式编写。

参考答案

def fbi(n):
    if n == 1 or n == 2:
        return 1 
    else:
        return fbi(n-1) + fbi(n-2)
n = eval(input())
print(fbi(n))

汉诺塔实践

汉诺塔问题大家都清楚,这里不再赘述。

请补充编程模板中代码,完成如下功能:

有三个圆柱 A、B、C,初始时 A 上有 N 个圆盘,N 由用户输入给出,最终移动到圆柱 C 上。

每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP 是步骤序号,宽度为 4 个字符,右对齐。

请编写代码,获得输入 N 后,输出汉诺塔移动的步骤。

参考答案

steps = 0
def hanoi(src, des, mid, n):
    global steps
    if n == 1:
        steps += 1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
    else:
        hanoi(src, mid, des, n-1)
        steps += 1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))        
        hanoi(mid, des, src, n-1)
N = eval(input())
hanoi("A", "C", "B", N)

答案解析

汉诺塔实例十分经典,学习每门语言都要写一遍。

这个例子要注意:全局变量的使用以及递归的用法。递归用法注意:函数定义 + 分支表示。

随机密码生成

以整数 17 为随机数种子,获取用户输入整数 N 为长度,产生 3 个长度为 N 位的密码,密码的每位是一个数字。每个密码单独一行输出。

产生密码采用 random.randint() 函数。

参考答案

import random
def genpwd(length):
    a = 10**(length-1)
    b = 10**length - 1
    return "{}".format(random.randint(a, b))
length = eval(input())
random.seed(17)
for i in range(3):
    print(genpwd(length))

最优解

import random
def genpwd(length):
    return random.randint(10**(length-1),10**length-1)
length = eval(input())
random.seed(17)
for i in range(3):
    print(genpwd(length))

连续质数计算

获得用户输入数字 N,计算并输出从 N 开始的 5 个质数,单行输出,质数间用逗号 , 分割。

注意:需要考虑用户输入的数字 N 可能是浮点数,应对输入取整数;最后一个输出后不用逗号。

参考答案

def prime(m):
    for i in range(2,m):
        if m % i == 0:
            return False
    return True

n = eval(input())
a = round(n)
a = a + 1 if a < n else a 
count = 5
while count > 0:
    if prime(a):
        if count > 1:
            print(a,end=',')
        else:
            print(a)
        count -= 1
    a += 1

答案解析

这个代码注意:

  1. 需要对输入小数情况进行判断,获取超过该输入的最小整数(这里没用 floor() 函数);
  2. 对输出格式进行判断,最后一个输出后不增加逗号(这里没用 .join() 方法)。
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.