【第4周程序】程序的控制结构
程序设计练习题和考试题
身体质量指数 BMI
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
BMI :Body Mass Index 国际上常用的衡量人体肥胖和健康程度重要标准,主要用于统计分析
定义:BMI = 体重(kg)/身高2(m2)
获取用户输入的体重和身高值,计算并给出国际和国内的 BMI 分类
分类 | 国际 BMI 值 | 国内 BMI 值 |
---|---|---|
偏瘦 | <18.5 | <18.5 |
正常 | 18.5 ~ 25 | 18.5 ~ 24 |
偏胖 | 25 ~ 30 | 24 ~ 28 |
肥胖 | ≥30 | ≥28 |
要求如下:
- 混合计算并给出国际和国内的 BMI 分类;
- 使用 input() 获得测试用例输入时,不要增加提示字符串。
参考答案
height,weight = eval(input())
bmi = weight/pow(height,2)
print("BMI数值为:{:.2f}".format(bmi))
if bmi < 18.5:
who, nat = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24:
who, nat = "正常", "正常"
elif 24 <= bmi < 25:
who, nat = "正常", "偏胖"
elif 25 <= bmi < 28:
who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
who, nat = "偏胖", "肥胖"
else:
who, nat = "肥胖", "肥胖"
print("BMI指标为:国际'{}',国内'{}'".format(who,nat))
答案解析
多分支条件之间的覆盖是重要问题。
圆周率的计算
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
求解圆周率可以采用蒙特卡罗方法,在一个正方形中撒点,根据在 1/4 圆内点的数量占总撒点数的比例计算圆周率值。
请以 123 作为随机数种子,获得用户输入的撒点数量,编写程序输出圆周率的值,保留小数点后 6 位。
参考答案
from random import random, seed
DARTS = eval(input())
seed(123)
hits = 0.0
for i in range(DARTS):
x, y = random(), random()
dist = pow(x ** 2 + y ** 2, 0.5)
if dist <= 1.0:
hits += 1
pi = 4 * (hits/DARTS)
print("{:.6f}".format(pi))
答案解析
注意:from…import 引入具体的函数,使用 seed() 需要提前引入
整数的加减和
编写程序计算如下数列的值:
1-2+3-4…966
其中,所有数字为整数,从 1 开始递增,奇数为正,偶数为负
参考答案
s = 0
count = 1
while count <=966:
if count%2 == 0:
s -= count
else:
s += count
count += 1
print(s)
最优解
s = 967*483
for n in range(2,967):
if n % 2 == 0:
s -= n * 2
print(s)
三位水仙花数
“水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身。
例如:ABC 是一个"3 位水仙花数”,则:$A^3+B^3+C^3=ABC$。
请按照从小到大的顺序输出所有的 3 位水仙花数,请用"逗号"分隔输出结果。
参考答案
s = ""
for i in range(100, 1000):
t = str(i)
if pow(eval(t[0]),3) + pow(eval(t[1]),3) + pow(eval(t[2]),3) == i :
s += "{},".format(i)
print(s[:-1])
答案解析
这里采用了 s[:-1] 方式不输出最后一个逗号。也可以把所有结果放到一个列表中,采用字符串的 .join() 方法输出结果。
最优解
s = ""
for i in range(100, 1000):
if pow(eval(str(i)[0]),3) + pow(eval(str(i)[1]),3) + pow(eval(str(i)[2]),3) == i :
s += "{},".format(i)
print(s[:-1])
用户登录的三次机会
给用户三次输入用户名和密码的机会,要求如下:
- 如输入第一行输入用户名为 ‘Kate’,第二行输入密码为 ‘666666’,输出‘登录成功!’,退出程序;
- 当一共有 3 次输入用户名或密码不正确输出“3次用户名或者密码均有误!退出程序。”。
参考答案
count = 0
while count < 3:
name = input()
password = input()
if name == 'Kate'and password == '666666':
print("登录成功!")
break
else:
count += 1
if count == 3:
print("3次用户名或者密码均有误!退出程序。")
答案解析
这里是参考答案,运用 while 进行非确定次数循环。
四位玫瑰数
四位玫瑰数是 4 位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。
例如:当 n 为 3 时,有 $1^3+5^3+3^3=153$ ,153 即是 n 为 3 时的一个自幂数,3 位数的自幂数被称为水仙花数。
请输出所有 4 位数的四位玫瑰数,按照从小到大顺序,每个数字一行。
参考答案
s = ""
for i in range(1000, 10000):
t = str(i)
if pow(eval(t[0]),4) + pow(eval(t[1]),4) + pow(eval(t[2]),4) + pow(eval(t[3]),4) == i :
print(i)
最优解
for i in range(1000,10000):
if pow(eval(str(i)[0]),4) + pow(eval(str(i)[1]),4) + pow(eval(str(i)[2]),4) + pow(eval(str(i)[3]),4) == i:
print(i)
100 以内素数之和
求 100 以内所有素数之和并输出。
素数指从大于 1,且仅能被 1 和自己整除的整数。
提示:可以逐一判断 100 以内每个数是否为素数,然后求和。
参考答案
#Prime
def is_prime(n):
for i in range(2,n):
if n%i == 0:
return False
return True
sum = 0
for i in range(2,100):
if is_prime(i):
sum += i
print(sum)
最优解
s = 2
for i in range(3,101):
for a in range(2,i):
if i % a == 0:
break
else:
s += i
print(s)