Python笔记:经典案例(选择结构和循环结构)

综合案例

案例1 输入若干个成绩,求所有成绩的平均分。每输入一个成绩后询问是否继续输入下一个成绩,回答“yes”就继续输入下一个成绩,回答“no”就停止输入成绩。

numbers = []
while True:
    x = input('请输入一个成绩:')
    #异常处理结构,用来保证用户只能输入实数
    try:
        #先把x转换成实数,然后追加到列表numbers尾部
        numbers.append(float(x))
    except:
        print('不是合法成绩')

    #下面的循环用来限制用户只能输入任意大小写的“yes”或者“no”
    while True:
        flag = input('继续输入吗?(yes/no)').lower()
        if flag not in ('yes', 'no'):
            print('只能输入yes或no')
        else:
            break
    if flag=='no':
        break

#计算平均分
print(sum(numbers)/len(numbers))

案例2 编写程序,判断今天是今年的第几天。

import time

date = time.localtime()                         #获取当前日期时间
year, month, day = date[:3]
day_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if year%400==0 or (year%4==0 and year%100!=0):   #判断是否为闰年
    day_month[1] = 29
if month==1:
    print(day)
else:
    print(sum(day_month[:month-1])+day)

案例3 编写代码,输出由星号*组成的菱形图案,并且可以灵活控制图案的大小。

def main(n):
    for i in range(n):
        print((' * '*i).center(n*3))
    for i in range(n, 0, -1):
        print((' * '*i).center(n*3))

例4 快速判断一个数是否为素数。

n = input("Input an integer:")
n = int(n)
if n in (2,3):
    print('Yes')
#偶数必然不是素数
elif n%2 == 0:
    print('No')
else:
    #大于5的素数必然出现在6的倍数两侧
    #因为6x+2、6x+3、6x+4肯定不是素数,假设x为大于1的自然数
    m = n % 6
    if m!=1 and m!=5:
        print('No')
    else:
        for i in range(3, int(n**0.5)+1, 2):
            if n%i == 0:
                print('No')
                break
        else:
            print('Yes')

例5 编写程序,计算组合数C(n,i),即从n个元素中任选i个,有多少种选法。
根据组合数定义,需要计算3个数的阶乘,在很多编程语言中都很难直接使用整型变量表示大数的阶乘结果,虽然Python并不存在这个问题,但是计算大数的阶乘仍需要相当多的时间。本例提供另一种计算方法:以Cni(8,3)为例,按定义式展开如下,对于(5,8]区间的数,分子上出现一次而分母上没出现;(3,5]区间的数在分子、分母上各出现一次;[1,3]区间的数分子上出现一次而分母上出现两次。

在这里插入图片描述
看图比较实在。

def Cni(n, i):
    if not (isinstance(n,int) and isinstance(i,int) and n>=i):
        print('n and i must be integers and n must be larger than or equal to i.')
        return
    result = 1
    Min, Max = sorted((i,n-i))
    for i in range(n,0,-1):
        if i>Max:
            result *= i
        elif i<=Min:
            result //= i
    return result

print(Cni(6,2))

例6 编写程序,输入一个自然数n,然后计算并输出前n个自然数的阶乘之和1!+2!+3!+…+n!的值。

n = int(input('请输入一个自然数:'))
#使用result保存最终结果,t表示每一项
result, t = 1, 1
for i in range(2, n+1):
    #在前一项的基础上得到当前项
    t *= i
    #把当前项加到最终结果上
    result += t
print(result)

例7 编写代码,模拟决赛现场最终成绩的计算过程。有至少3个评委,打分规则为删除最高分和最低分之后计算剩余分数的平均分。

while True:
    try:
        n = int(input('请输入评委人数:'))
        if n <= 2:
            print('评委人数太少,必须多于2个人。')
        else:
            break
    except:
        pass
    
scores = []
for i in range(n):
    #这个while循环用来保证用户必须输入0到100之间的数字
    while True:
        try:
            score = input('请输入第{0}个评委的分数:'.format(i+1))
            #把字符串转换为实数
            score = float(score)
            assert 0<=score<=100
            scores.append(score)
            #如果数据合法,跳出while循环,继续输入下一个评委的分数
            break
        except:
            print('分数错误')
 #计算并删除最高分与最低分
highest = max(scores)
lowest = min(scores)
scores.remove(highest)
scores.remove(lowest)
finalScore = round(sum(scores)/len(scores),2)

formatter = '去掉一个最高分{0}\n去掉一个最低分{1}\n最后得分{2}'
print(formatter.format(highest, lowest, finalScore))

例8 编写程序,实现人机对战的尼姆游戏。

from random import randint

n = int(input('请输入一个正整数:'))
while n > 1:
    #人类玩家先走
    print("该你拿了,现在剩余物品数量为:{0}".format(n))
    #确保人类玩家输入合法整数值
    while True:
        try:
            num = int(input('输入你要拿走的物品数量:'))
            #确保拿走的物品数量不超过一半
            assert 1 <= num <= n//2
            break
        except:
            print('最少必须拿走1个,最多可以拿走{0}个。'.format(n//2))
    n -= num
    if n == 1:
        print('恭喜,你赢了!')
        break
    #计算机玩家随机拿走一些,randint()用来生成指定范围内的一个随机数
    n -= randint(1, n//2)            
else:
    print('哈哈,你输了。')

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/108246238