《python语言程序设计基础》第二版-第4章程序练习题答案

                                          **若代码有误,欢迎大家指正。**

1、猜数游戏

from random import randint
ran = randint(0,9)            #产生0-9之间的整数(包括9)
number = eval(input("请输入你猜测的数字:"))
N = 1
while(ran != number):
    if(ran > number):
        print("遗憾,太小了")
    else:
        print("遗憾,太大了")
    number = eval(input("请输入你猜测的数字:"))
    N = N + 1
print("预测{}次,你猜中了!".format(N))

运行结果

请输入你猜测的数字:2
预测1次,你猜中了!

2、统计字符个数

s = input("请输入一行字符:")
letter = 0      #字母
Space = 0       #空格
number = 0      #数字
character = 0   #其他字符
for i in s:
    if ord("a") <= ord(i.lower()) <= ord("z"):
        letter += 1
    elif ord(" ") == ord(i):
        Space += 1
    elif ord("0") <= ord(i) <= ord("9"):
        number += 1
    else:
        character += 1
print("英文个数:" + str(letter))
print("空格个数:" + str(Space))
print("数字个数:" + str(number))
print("其他字符个数:" + str(character))

运行结果

请输入一行字符:I am a 20-year-old college student.
英文个数:25
空格个数:5
数字个数:2
其他字符个数:3

3、最大公约数

a, b = eval(input("请输入两个整数(用,分隔)"))
c, d =a, b
while(b != 0):
    a, b = b, a % b
b = int(c * d / a)
print("这两个整数的最大公约数为:" + str(a) + ", " + "最小公倍数为:" + str(b))

运行结果

请输入两个整数(,分隔)1253,864
这两个整数的最大公约数为:1, 最小公倍数为:1082592

4、猜数游戏续

from random import randint
ran = randint(0,100)
number = eval(input("请输入你猜测的数字:"))
N = 1
while(ran != number):
    if(ran > number):
        print("遗憾,太小了")
    else:
        print("遗憾,太大了")
    number = eval(input("请输入你猜测的数字:"))
    N = N + 1
print("预测{}次,你猜中了!".format(N))

运行结果

由于结果行数过于累赘,这里就不再显示运行结果了。
如果读者想知道运行结果如何,那还请自己去执行!

5、猜数游戏续

from random import randint
ran = randint(0,100)
N = 1

while(1):
    try:
        number = eval(input("请输入你猜测的数字:"))
        if(not(isinstance(number, int))):
            print("输入内容必须为整形!")
            continue
        elif(ran > number):
            print("遗憾,太小了")
        elif(ran < number):
            print("遗憾,太大了")
        else:
            break
        N = N + 1
    except:
        print("输入内容必须为整形!")
print("预测{}次,你猜中了!".format(N))

运算结果

不展示运行结果了。
不过在此讲一下输入的问题:
当你输入字母,就会抛出异常,此时会被except所接受并使print打印字符串。
当你输入浮点数,number就会指向浮点数,在 if(not(isinstance(number, int)))
中,就会判断出来,读进来的数不是整数,这时也会输出字符串。

其实上方代码还存在一个问题,当你输入ran时,就会出现number = ran 这是合法的。

解决方案:

不再使用tryexcept,直接多分支结构
不提前把“”去掉,也就是说不要提前eval()。
先判断字符串是否含有字母,如果含有,则提示用户输入错误。
过了这门槛之后,再调用eval()去掉“”,
然后再if(not(isinstance(number, int)))判断是否是整数,
其余的代码一样,具体实现就交给读者了。(读万卷书,不如行千里路)

如果读者有更好的想法,欢迎下方回复,互相学习

6、羊车门问题

根据题目的意思,门后面物品的次序应该是固定的,不用每次实验都打乱。

from random import *
time = 0    #实验次数
N1 = 0      #坚持选择获胜的次数
N2 = 0      #改变选择获胜的次数
while(time != 100000):
    s = [0, 0, 1]   # 0代表羊,1代表车,下标代表门
    a = randint(0, 2)
    k = randint(0, 1)
    if k != a:
        s[k] = 2
    else:
        s[1 - k] = 2
    if(s[a] == 1):
        N1 = N1 + 1
    for i in range(3):
        if (s[i] != 2) and (i != a):
            a = i
            break
    if (s[a] == 1):
        N2 = N2 + 1
    time = time + 1

print("参赛者坚持选择获胜的概率为:{}%".format(N1 / time * 100))
print("参赛者改变选择获胜的概率为:{}%".format(N2 / time * 100))

运行结果:

参赛者坚持选择获胜的概率为:33.400999999999996%
参赛者改变选择获胜的概率为:66.599%

如果每次实验都打乱门后面物品的次序,其结果为
参赛者坚持选择获胜的概率为:33.219%
参赛者改变选择获胜的概率为:50.105999999999995%
这可能是由于同时改变了实验2个因变量的缘故(这是个人见解,欢迎指教)
下面给出每次实验打乱次序的代码。

from random import *
time = 0    #实验次数
N1 = 0      #坚持选择获胜的次数
N2 = 0      #改变选择获胜的次数
while(time != 100000):
    s = [0, 0, 1]   # 0代表羊,1代表车,下标代表门
    a = randint(0, 2)
    shuffle(s)
    sknow = []              #为了知道门后面是什么,创建一个新的列表,存放羊和车具体在那个门后面
    for i in range(3):
        if (s[i] == 0):
            sknow.insert(1, i)
        else:
            sknow.append(i)
    k = randint(0, 1)
    if sknow[k] != a:
        s[sknow[k]] = 2
    else:
        s[sknow[1 - k]] = 2
    if(s[a] == 1):
        N1 = N1 + 1
    for i in range(3):
        if (s[i] != 2) and (i != a):
            a = i
            break
    if (s[a] == 1):
        N2 = N2 + 1
    time = time + 1

print("参赛者坚持选择获胜的概率为:{}%".format(N1 / time * 100))
print("参赛者改变选择获胜的概率为:{}%".format(N2 / time * 100))

7、异常处理改造实例1

while(1):
    TempStr = input("请输入温度值符号F或者C(大小写都可):")
    if (TempStr != 'F' and TempStr != 'f') and (TempStr != 'C' and TempStr != 'c'):
        print("输入格式错误,请重新输入")
        continue
    try:
        x = eval(input("请输入不带符号的温度值:"))
        if TempStr in ['F','f']:
            C = (x - 32) / 1.8
            print("转化后的温度是{:.2f}C".format(C))
            break
        elif TempStr in ['C', 'c']:
            F = 1.8 * x + 32
            print("转化后的温度是{:.2f}F".format(F))
            break
    except:
        print("输入格式错误,请重新输入")

运行结果

请输入温度值符号F或者C(大小写都可):f
请输入不带符号的温度值:65
转化后的温度是18.33C

请输入温度值符号F或者C(大小写都可):c
请输入不带符号的温度值:as
输入格式错误,请重新输入
请输入温度值符号F或者C(大小写都可):d
输入格式错误,请重新输入
请输入温度值符号F或者C(大小写都可):c
请输入不带符号的温度值:25
转化后的温度是77.00F

猜你喜欢

转载自blog.csdn.net/weixin_46962006/article/details/109317142