【第4周程序】程序的控制结构

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

  程序设计练习题和考试题

身体质量指数 BMI

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

BMI :Body Mass Index 国际上常用的衡量人体肥胖和健康程度重要标准,主要用于统计分析

定义:BMI = 体重(kg)/身高2(m2)

获取用户输入的体重和身高值,计算并给出国际和国内的 BMI 分类

分类国际 BMI 值国内 BMI 值
偏瘦<18.5<18.5
正常18.5 ~ 2518.5 ~ 24
偏胖25 ~ 3024 ~ 28
肥胖≥30≥28

要求如下:

  1. 混合计算并给出国际和国内的 BMI 分类;
  2. 使用 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])

用户登录的三次机会

给用户三次输入用户名和密码的机会,要求如下:

  1. 如输入第一行输入用户名为 ‘Kate’,第二行输入密码为 ‘666666’,输出‘登录成功!’,退出程序;
  2. 当一共有 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)
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.