鑫软Python100天系列(Python经典案例分析笔记)循环结构与判断结构例题分析

在这里插入图片描述

问题引入

一、基本数据类型中的例题:
编写一个根据体重和身高计算BMI值的程序,井同时输出国际和国内的BMI指标建议值。
二、练习题
4.1 判断题: 复杂的程序结构都是由基本结构组合而成。
4.2 判断题: 分支结构可以向已经执行过的语句部分跳转(即向后跳转)。
4.3 下面 是流程图的基本元素的是( )。
A.判断框 B.顺序结构 C.分支结构 D.循环结构
4.4 循环结构可以使用Python 语言中的( ) 语句实现?
A. print B. while C. loop D. if
4.5 判断题:简单分支结构是最基础的程序结构,在设计中一般用不到。
4.6 判断题:多分支结构是使用最广泛的结构,可替代任何选择性结构。
4.7 判断题: Python 语法认为条件x<=y<=z是合法的。
4.8 Python 通过(, )来判断操作是否在分支结构中。-1i
A.括号 B.缩进 C.花括号 D.冒号
4.9 请分析下面的程序, 若输入score为80,输出grade为多少?是否符合逻辑?为什么?
三、程序设计题
4.1 猜数游戏。 在程序中预设一个0-9之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示“遗憾,太大了”:小于预设的数,显示“遗憾,太小了”,如此循环,直至猜中该数,显示“预测N次, 你猜中了!”,其中N是用户输入数字的次数。
4.2 统计不同字符个数。 用户从键盘输入一行字符,编写“个程序, 统计并输(>= u’"u4e00’出其中英文字符、数字、空格和其他字符的个数。
an从ic=u’\ufas’
4.3 最大公约数计算。 从键盘接收两个整数,编写程序求出这两个整数的最大公约数和最小公倍数(提示:求最大公约数可用辗转相除法,求最小公倍数则用两数的积除以最大公约数即可)。
4.4 猜数游戏续。 改编程序练习题4.1,让计算机能够随机产生一个预设数字,范围在0~100之间,其他游戏规则不变。
4.5 猜数游戏续。 对于程序练习题4.4程序,当用户输入的不是整数(如字母、浮点数等)时,程序会终止执行退出。改编该程序,当用户输入出错时给出“输入内容必须为整数!”的提示,并让用户重新输入。
4.6 羊车门问题。有3扇关闭的门,-扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门, 在开启它之前, 主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。请问:参赛者更换选择后能否增加猜中汽车的机会?-这是一 个经典问题。请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的机率。
4.7 请用异常处理改造实例I,使其能够接收并处理用户的任何输入。

关于判断与循环问题求解(流程图演示)

确定一个输入并且使用递归思想来解决循环问题:
在这里插入图片描述
在这里插入图片描述

问题的解决方式

(1)使用循环的方法简单计算
(2)使用递归思想纳入到计算中降低复杂度(优化)

解决代码

BMI值计算问题

#第一种方法:使用简单的循环实现
height, weight = eval(input("请输入身高(米)和体重\(公斤)[逗号隔开]: "))
bmi = weight/(pow(height,2))
print("BMI数值为:{:.2f}".format(bmi))
who,dom = "",""
if bmi< 18.5:
 who = "偏瘦"
elif bmi < 25:
 who = "正常"
elif bmi < 30:
 who = "偏胖"
else:
 who = "肥胖"
if bmi< 18.5:
 dom = "偏瘦"
elif bmi < 24:
 dom = "正常"
elif bmi < 28:
 dom = "偏胖"
else:
 dom = "肥胖"
print("BMI为:国际'{0}',国内'{1}'".format(who,dom))

(第二种方式:if else严格循环方式)

#author fntp 2020/04/05
#第二种实现方法:
height, weight = eval(input("请输入身高(米)和体重\(公斤)逗号隔开]: "))
bmi=weight/pow(height,2)
print("BMI数值为: {:2f}".format(bmi))
who,dom="",""
if bmi< 18.5:
 who, dom = "偏瘦", "偏瘦"
elif 18.5<= bmi < 24:
 who, dom = "正常", "正常"
elif 24<= bmi < 25:
 who, dom ="正常", "偏胖"
elif 25<= bmi < 28:
 who, dom = "偏胖", "偏胖"
elif 28 <= bmi < 30:
 who, dom = "偏胖", "肥胖"
else:
 who, dom = "肥胖", "肥胖"
print("BMI为:国际'{0}',国内'{1}'".format(who, dom))

4.1猜数游戏实现代码:

(第一种:使用简单的循环遍历实现方式)

#第一种方法:使用简单的循环实现
shuru,target,time=eval(input("请输入一个0-9之间的一个正整数!")),8,0
while shuru not in [target]:
 if shuru<target:
    time+=1
    print("很遗憾!太小了!")
 else:
     time += 1
     print("很遗憾!太大了!")
 shuru=eval(input("请输入一个0-9之间的一个正整数!"))
print("恭喜你!才花了",(time+1),"次就猜中了!")

(第二种:随机数递归方法:(优化方法))

#author fntp 2020/04/05
#第一种实现方法:随机数猜数,使用递归方法:
import random
time=0
def caishu():
 shuru,target=eval(input("请输入一个随机正整数!")),5
 if shuru==target:
     global time
     time+=1
     print("恭喜你!才花了",time,"次就猜中了!")
     exit()
 elif shuru<target:
     time+=1
     print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 caishu()
caishu()

4.2统计不同字符个数。

(第一种for循环遍历加判断结构写法:)

#第一种方法
#author fntp 2020/04/05
# 汉字:
# 十六进制 [0x4e00, 0x9fa5]
# 十进制 [19968,40869]
# 数字:
# 十六进制 [0x30, 0x39]
# 十进制 [48, 57]
# 小写字母:
# 十六进制 [0x61, 0x7a]
# 十进制 [97,122]
# 大写字母:
# 十六进制 [0x41, 0x5a]
# 十进制 [65, 90],
def suanfa():
    shuru,zhongwen,yingwenxiaoxie,yingwendaxie,kongge,shuzi,other=input("请输入字符!(不要输入标点符号)"),0,0,0,0,0,0
    for i in shuru:
        if 40869 >= ord(i) >= 19968:
            zhongwen+=1
        elif 57 >= ord(i) >= 48:
            shuzi+=1
        elif 122 >= ord(str.lower(i)) >= 97:
            yingwenxiaoxie+=1
        elif 90>= ord(str.lower(i)) >=65:
            yingwendaxie+=1;
        elif i == ' ':
            kongge+=1
        else:
            other+=1
    print("中文字符数为:",zhongwen,"个")
    print("英文字符数为:",yingwendaxie+yingwenxiaoxie,"个")
    print("英文小写字符数为:",yingwenxiaoxie,"个")
    print("英文大写字符数为:",yingwendaxie,"个")
    print("数字字符数为:",shuzi,"个")
    print("其他字符数为:",other,"个")
    print("所有字符数为:",other+zhongwen+yingwendaxie+yingwenxiaoxie+shuzi,"个")
suanfa()

(第二种:if elif循环结构写法)

#author fntp QQ358566760
#第二种方法
shuru=input("请输入一句任意数据!")
zw,yw_da,yw_xiao,space,num,other=0,0,0,0,0,0
for i in shuru:
    if i.isdigit():
        num+=1
    elif i.isspace():
        space+=1
    elif i.isupper():
        yw_da+=1
    elif i.islower():
        yw_xiao+=1
    elif 40869 >= ord(i) >= 19968:
        zw+=1
    else:
        other+=1
print("中文字符数为:",zw,"个")
print("英文字符数为:",yw_da+yw_xiao,"个")
print("英文小写字符数为:",yw_xiao,"个")
print("英文大写字符数为:",yw_da,"个")
print("数字字符数为:",num,"个")
print("其他字符数为:",other,"个")
print("所有字符数为:",other+zw+yw_xiao+yw_da+num,"个")

4.3最大公约数计算

(第一种:欧几里得算法)

#author fntp 2020/04/05
#被除数不可为零,第一种欧几里得算法:
import math
def suanfa(a,b):
   try :
       return math.gcd(a,b)
   except NameError:
        print("输入错误!请重新输入!")
a,b=eval(input("请输入两个整数!第一个数:")),eval(input("第二个数:"))
print("最大公约数为:",suanfa(a,b))

(第二种方法:辗转相除法)

shuzi1,shuzi2=eval(input("请输入两个数据!第一个数据:")),eval(input("第二个数据:"))
if shuzi2!=0:
    middle=shuzi1 % shuzi2
    while (middle!=0):
         shuzi1=shuzi2
         shuzi2=middle
         middle=shuzi1%shuzi2
    print("最大公约数为:",shuzi2)
else:
    print("您的输入有误!请重新运行")

4.4猜数游戏续。

(第一种方式:随机数递归方式:)

#author fntp 2020/04/05
#第一种实现方法:随机数猜数,使用递归方法:
import random
time=0
def caishu():
 shuru,target=eval(input("请输入一个0-100内随机正整数!")),random.randint(0,100)
 if shuru==target:
     global time
     time+=1
     print("恭喜你!才花了",time,"次就猜中了!")
     exit()
 elif shuru<target:
     time+=1
     print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 caishu()
caishu()

(第二种:使用循环实现)

#第二种方法:使用简单的循环实现
import random
shuru,target,time=eval(input("请输入一个0-100之间的一个正整数!")),random.randint(0,100),0
while shuru not in [target]:
 if shuru<target:
    time+=1
    print("很遗憾!太小了!")
 else:
     time += 1
     print("很遗憾!太大了!")
 shuru=eval(input("请输入一个0-9之间的一个正整数!"))
print("恭喜你!才花了",(time+1),"次就猜中了!")

4.5猜数游戏续。

(第一种方法:随机数猜数递归实现)

#第一种实现方法:随机数猜数,使用递归方法:
import random
time=0
def caishu():
 shuru,target=eval(input("请输入一个0-100内随机正整数!")),random.randint(0,100)
 if shuru==target:
     global time
     time+=1
     print("恭喜你!才花了",time,"次就猜中了!")
     exit()
 elif shuru<target:
     time+=1
     print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 else:
     time += 1
     print("输入内容必须是整数!请重新输入!")
 caishu()
caishu()

(第二种方式:使用简单的循环实现)

#第二种方法:使用简单的循环实现
import random
shuru,target,time=eval(input("请输入一个0-100之间的一个正整数!")),random.randint(0,100),0
while shuru not in [target]:
 if shuru<target:
    time+=1
    print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 else:
     time += 1
     print("输入内容必须是整数!请重新输入!")
 shuru=eval(input("请重新输入一个0-9之间的一个正整数!"))
print("恭喜你!才花了",(time+1),"次就猜中了!")

4.6羊车门问题。(经典问题)

这里要说一下羊车门的实现思路:

在这里插入图片描述
第一种间接方式:元组实现:

#author fntp 2020/04/05
#猜车问题:
#我个人认为会增加选择几率
import random
choice_one,choice_two,one,two,time=False,False,0,0,0
for i in range(10000):
    time+=1
    chushi=['羊','车','羊']
    xuanze=chushi.pop(random.randint(0,2))
    chushi.remove('羊')
    if chushi[0]=='羊':
        one+=1
        choice_one=True
    else:
        two+=1
        choice_two=True
print("第一次选择为正确的时候!概率为:",(one/time))
print("第二次选择是正确的时候!概率为:",(two/time))
if choice_two:
    print("并且本次获胜是因为第2次更改后的才选中的!并且概率为:", (two / time), "所以验证成功!")
else:
    print("并且本次获胜的是根据第1次直接选中的!但是概率为:", (one / time))

第二种方式:传统方式:

from random import*
TIMES = 10000
my_first_choice_1=0#初始化不改选择的次数
my_change_choice_2=0#初始化更改选择的次数
for i in range(TIMES):
	car_inDoor=randint(0,2)
	my_guess=randint(0,2)
	if car_inDoor==my_guess:
		my_first_choice_1+=1
	else:
		my_change_choice_2+=1
print("不改选择:{}".format(my_first_choice_1/TIMES))
print("更改选择:{}".format(my_change_choice_2/TIMES))

4.7 猜数改进:

(第一种方法:)

#author fntp 2020/04/05
#第一种实现方法:随机数猜数,使用递归方法:
import random
time=0
def caishu():
 shuru,target=eval(input("请输入一个随机正整数!")),5
 if shuru==target:
     global time
     time+=1
     print("恭喜你!才花了",time,"次就猜中了!")
     exit()
 elif shuru<target:
     time+=1
     print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 caishu()
caishu()

(第二种方法:)

#第二种方法:使用简单的循环实现
shuru,target,time=eval(input("请输入一个0-9之间的一个正整数!")),8,0
while shuru not in [target]:
 if shuru<target:
    time+=1
    print("很遗憾!太小了!")
 elif shuru>target:
     time += 1
     print("很遗憾!太大了!")
 else:
     time += 1
     print("不对哦!重新输入吧!")
 shuru=eval(input("请输入一个0-9之间的一个正整数!"))
print("恭喜你!才花了",(time+1),"次就猜中了!")

运行测试

4.1测试截图:

在这里插入图片描述

4.2测试截图:

在这里插入图片描述

4.3测试截图:

在这里插入图片描述

4.4测试截图:

在这里插入图片描述

4.5测试截图

在这里插入图片描述

4.6测试截图:

在这里插入图片描述

4.7测试截图

在这里插入图片描述
本期Python编程实例到此结束,感谢大家的耐心阅读!我们下期再见!(PS:由于课程繁忙,我可能更新的不是很及时!大家不要介意!嘻嘻嘻)欢迎各位读者加我QQ一起探讨编程技术!

发布了25 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44085593/article/details/105341049