【第3周程序】基本数据类型
程序设计练习题和考试题
天天向上的力量
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
工作日模式要努力到什么水平,才能与每天努力 1% 一样?
A 君: 一年 365 天,每天进步 1%,不停歇
B 君: 一年 365 天,每周工作 5 天休息 2 天,休息日下降 1% ,要多努力呢?
每周工作 5 天休息 2 天,计算工作日的努力参数是多少才能与每天努力 1% 一样。
要求如下:
- 一年 365 天,以第 0 天的能力值为基数,记为 1.0;
- 当好好学习时,能力值相比前一天提高 1%;当没有学习时,由于遗忘等原因能力值相比前一天下降 1%;
参考答案
def dayUP(df):
dayup = 1
for i in range(365):
if i % 7 in [6,0]:
dayup = dayup*(1 - 0.01)
else:
dayup = dayup*(1 + df)
return dayup
dayfactor = 0.01
while dayUP(dayfactor) < pow(1.01,365):
dayfactor += 0.001
print("工作日的努力参数是: {:.3f}".format(dayfactor))
答案解析
工作日模式,每天要努力到 1.9%,相当于 365 模式每天 1% 的;
采用 {:.3f} 将输出数字变成三位小数点表示时,即使数学上该输出值是整数,也会按照小数方式输出。
文本进度条
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
采用字符串方式打印可以动态变化的文本进度条,进度条需要能在一行中逐渐变化
要求如下:
- 采用 sleep() 模拟一个持续的进度,获得文本进度条的变化时间;
- 通过 print() 函数实现单行动态刷新,在 print() 函数中更换参数 end 的默认值为’’,每次使用 print() 函数输出时不能换行;
- 要能回退:打印后光标到之前的位置 \r。
参考答案
import time
scale = 50
print("执行开始".center(scale//2,'-'))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))
答案解析
这是本课程的实例4,请注意三点:
- 文本进度条程序使用了 perf_counter() 计时,计时方法适合各类需要统间的算问题,例如:比较不同算法时间、统计程序运行时;
- 进度条的单行回退要在命令行(也叫控制台、Windows 的 cmd)下才能使用,IDLE 屏蔽了’\r’的功能;
- 进度条可应用在:任何运行时间需要较长的程序中;任何希望提高用户体验的应中;进度条是人机交互的纽带之一。
最优解
import time
print("执行开始".center(50,'-'))
start = time.perf_counter()
for i in range(101):
a = '*' * i
b = '.' * (100 - i)
c = i
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(50,'-'))
三次方格式化
获得用户输入的一个数字,可能是整数或浮点数,a,计算 a 的三次方值,并打印输出。
输出结果采用宽度 20 个字符、居中输出、多余字符采用减号(-)填充。
如果结果超过 20 个字符,则以结果宽度为准。
参考答案
a = eval(input())
print("{:-^20}".format(pow(a, 3)))
最优解
print ("{:-^20}".format(pow(eval(input()),3)))
星号三角形
读入一个整数 N,N 是奇数,输出由星号字符组成的等边三角形,要求:
第 1 行 1 个星号,第 2 行 3 个星号,第 3 行 5 个星号,依次类推,最后一行共 N 个星号。
参考答案
n = eval(input())
for i in range(1,n+1,2):
print("{0:^{1}}".format('*'*i, n))
答案解析
关键是对 .format() 中槽机制的理解,槽中可以嵌套槽,用来表示宽度、填充等含义。
凯撒密码
恺撒密码是古罗马恺撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:
原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
对于原文字符 P,其密文字符 C 满足如下条件:C=(P+3) mod 26
上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26
假设用户可能使用的输入包含大小写字母 a~zA~Z、空格和特殊符号,请编写一个程序,对输入字符串进行恺撒密码加密,直接输出结果,其中空格不用进行加密处理。使用 input() 获得输入。
参考答案
s = input()
t = ""
for c in s:
if 'a' <= c <= 'z':
t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )
elif 'A' <= c <= 'Z':
t += chr( ord('A') + ((ord(c)-ord('A')) + 3 )%26 )
else:
t += c
print(t)
最优解
s = input()
for c in s:
if 'a' <= c <= 'z':
print(chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 ),end="")
elif 'A' <= c <= 'Z':
print(chr( ord('A') + ((ord(c)-ord('A')) + 3 )%26 ),end="")
else:
print(c,end="")
平方根格式化
获得用户输入的一个整数 a,计算 a 的平方根,保留小数点后 3 位,并打印输出。
输出结果采用宽度 30 个字符、右对齐输出、多余字符采用加号 (+) 填充。
如果结果超过 30 个字符,则以结果宽度为准。
参考答案
a = eval(input())
print("{:+>30.3f}".format(pow(a, 0.5)))
答案解析
注意:如果平凡根后产生一个复数,由于复数的实部和虚部都是浮点数,.3f 可以将实部和虚部分别取三位小数。
最优解
print("{:+>30.3f}".format(pow(eval(input()),0.5)))
字符串分段组合
获得输入的一个字符串 s,以字符减号 (-) 分割 s,将其中首尾两段用加号 (+) 组合后输出。
参考答案
s = input()
ls = s.split("-")
print("{}+{}".format(ls[0], ls[-1]))
答案解析
s.split(k) 以 k 为标记分割 s,产生一个列表。通过该题目,掌握 split() 方法的使用,注意:k 可以是单字符,也可以是字符串。
最优解
s=input().split('-')
print(s[0]+'+'+s[-1])