02分支结构与循环结构/构造程序的逻辑


分支结构与循环结构/构造程序的逻辑

一、分支结构

使用if产生分支

  • 英寸与厘米的转换

    #1英寸=2.54厘米
    #输入长度+单位 inch/cm
    while True:
        lenth=float(input('请输入长度:'))
        unit=input('单位')
        #判断是英寸还是厘米,输出结果
        if unit=='inch':
            print('%.2f inch= %.2f cm'%(lenth,2.54*lenth))
        elif unit=='cm':
            print('%.2f cm= %.2f inch'%(lenth,lenth/2.54))
        else:
            print('输入有错误请重输!')
    
  • 百分制转化为等级

    """
    百分制成绩转换为等级制成绩
    """
    score = float(input('请输入成绩: '))
    if score >= 90:
        grade = 'A'
    elif score >= 80:
        grade = 'B'
    elif score >= 70:
        grade = 'C'
    elif score >= 60:
        grade = 'D'
    else:
        grade = 'E'
    print('对应的等级是:', grade)
    
  • 输入三条边,如果能构成三角形的话计算周长和面积

    from math import sqrt
    #输入三条边长,如果能构成三角形就计算周长和面积
    a=int(input('the first side'))
    b=int(input('the second side'))
    c=int(input('the third side'))
    
    #判断是否是三角形
    #计算周长面积p=(a+b+c)/2)S=sqrt[p(p-a)(p-b)(p-c)]
    if a+b>c and a+c>b and b+c>a:
        p = (a + b + c) / 2
        print('三角形周长是%.2f,面积是%.2f'%
              (a+b+c,sqrt(p*(p-a)*(p-b)*(p-c))))
    
    
    

二、循环结构

for……in:知道次数时使用的循环,一般搭配range

while:不知道循环次数时使用

range的用法解析:特点是包头不包尾

```
range(101):指的是0-100
range(1,101):指的是1-100
range(1,101,2):1-100的奇数
range(100,0,-2):100-1的偶数
```
  • 输入一个正整数判断是不是素数

    from math import sqrt
    
    def sushu(num):
        for i in range(2,int(sqrt(num))+1):
            if num%i==0 :
                return False
        return True if num!=1 else False
    
    num=int(input('输入一个数字:'))
    print(sushu(num))
    
  • 输入两个正整数,计算它们的最大公约数和最小公倍数

    #实现最大公约和最小公倍数的函数
    def max_gongyue(x,y):
        for i in range(x,0,-1):
            if x%i==0 and y%i==0:
                return i
    
    def min_gongbei(x,y):
        i=max_gongyue(x,y)
        return (x*y)/i
    
    def main():
        x=int(input('请输入正整数1:'))
        y=int(input('请输入正整数2:'))
        print('最大公约数是%d,最小公倍数是%d'%(max_gongyue(x,y),min_gongbei(x,y)))
    
    
    if __name__ == '__main__':
        main()
    
  • 打印如下所示的三角形图案

    '''
    *
    **
    ***
    ****
    *****
    '''
    '''
        *
       **
      ***
     ****
    *****
    '''
    '''
        *
       ***
      *****
     *******
    *********
    '''
    def xingxing1():
        #输入要几行
        row=int(input('请输入要打印几行星星'))
        #行数循环
        for i in range(1,row+1):
            # 列循环
            for j in range (i):
                print('*',end='')
            print()
    
    def xingxing2():
        # 输入要几行
        row = int(input('请输入要打印几行星星'))
        for i in range(1,row+1):
            for j in range(row-i):
                print(' ',end='')
            for k in range(i):
                print('*',end='')
            print()
    
    def xingxing3():
        row = int(input('请输入要打印几行星星'))
        for i in range(1, row + 1):
            for j in range(row-i):
                print(' ',end='')
            for k in range(2*i-1):
                print('*',end='')
            for l in range(row-i):
                print(' ',end='')
            print()
    
    if __name__ == '__main__':
        # xingxing1()
        # xingxing2()
        # xingxing3()
        pass
    

三、构造程序的逻辑

#寻找水仙花数、实现正整数的反转
'''
说明:水仙花数也被称为超完全数字不变数、
自恋数、自幂数、阿姆斯特朗数,它是一个
3位数,该数字每个位上数字的立方之和正
好等于它本身,例如:$1^3 + 5^3+ 3^3=153$。
'''
def shuixianhua():
    num_list=[]
    for num in range (100,1000):
        #分离个位
        gewei=num%10
        #分离十位
        shiwei=(num//10)%10
        #分离百位
        baiwei=num//100
        if num == gewei**3+shiwei**3+baiwei**3:
            num_list.append(num)
    print('水仙花数有:')
    for num in num_list:
        print(num,end=' ')

def fanzhuan(num):
    '''
    实现正整数的翻转
    :param num:
    :return:
    '''
    #总数=0
    sum = 0
    while num!=0:
        #总数*10+末位
        sum=sum*10+num%10
        #地板除出新的数字
        num=num//10
    return sum

if __name__ == '__main__':
    # shuixianhua()
    print(fanzhuan(10394954636))
    
#百钱百鸡问题
'''
说明:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,
问公鸡、母鸡、小鸡各有多少只?
'''
def main():
    for x in range(0,(100//5)+1):
        for y in range(0,(100//3)+1):
            for z in range(0,100*3+1,3):
                if x+y+z==100 and  5*x+3*y+z/3==100:
                     print('公鸡%d只,母鸡%d只,小鸡%d只'%(x,y,z))

main()

#CRAPS赌徒游戏
'''
说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。
'''
#玩家第一次摇骰子如果摇出了7点或11点,玩家胜
#玩家第一次如果摇出2点、3点或12点,庄家胜
#其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜
import random

class Player():

    def __init__(self,name):
        self._name=name

    @property
    def name(self):
        return self._name

    def play_dice(self):
        dice1=random.randint(1,6)
        dice2=random.randint(1,6)
        sum_number=dice1+dice2
        return sum_number

class Touzi():
    
    def first_round(self,dice_number,end=False,player_win=False):
        if dice_number == 7 or dice_number == 11:
            print('玩家胜!')
            end=True
            player_win=True
        elif dice_number == 2 or dice_number == 3 or dice_number == 12:
            print('庄家胜!')
            end=True
        else:
            end=False
        return end,player_win

    def other_round(self,dice_number,dice_number_first,end,player_win=False):
        if dice_number==7:
            print('庄家胜!')
            end=True
        elif dice_number==dice_number_first:
            print('玩家胜!')
            end=True
            player_win=True
        return end,player_win
        
def main(name):
    play_continue=True
    player = Player(name)
    touzi = Touzi()
    round = 1
    player_win_count=0
    while play_continue and round<100:
        step=1
        print('这是第%d局游戏'%round)
        #第一次摇色子
        dice_number_first=player.play_dice()
        print('%s第%d局第%d次点数是%d'%(player.name,round,step,dice_number_first))
        #第一轮的胜负
        end,player_win=touzi.first_round(dice_number_first)
        while end==False:
            step+=1
            dice_number=player.play_dice()
            print('%s第%d局第%d次点数是%d' % (player.name, round, step, dice_number))
            end,player_win=touzi.other_round(dice_number,dice_number_first,end)
        if player_win:
            player_win_count+=1
        #不算胜率单纯玩
        # play_next=input('是否还要继续游戏,Y/N:')
        #算胜率
        play_next='y'
        if play_next=='y':
            round+=1
        else:
            print('游戏结束!')
            play_continue=False
    #算胜率
    print('%s胜率为%.2f'%(player.name,player_win_count/round))

if __name__ == '__main__':
    main('小明')

#生成斐波那契数列的前20个数
#生成斐波那契数列前num个数
def feb(num):
    feb_list=[1,1]
    for i in range(2,num):
        number=feb_list[i-1]+feb_list[i-2]
        feb_list.append(number)
    return feb_list

if __name__ == '__main__':
    for _ in feb(20):
        print(_,end=' ')
        
#找出10000以内的完美数
'''
说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。

'''
#找出完美数
def fector(num):
    fector=[]
    for i in range(1,num):
        if num%i==0:
            fector.append(i)
    return fector

def perfect_num(num):
    sum=0
    for i in fector(num):
        sum+=i
    if sum==num:
        return True

def main(num):
    '''

    :param num:多少以内的完美数
    :return:
    '''
    for i in range(1,num+1):
        if perfect_num(i):
            print(i,end=' ')

main(10000)

#输出100以内所有的素数
def sushu(num):
    '''
    判断是不是素数
    :param num: 数字
    :return: 是否是素数
    '''
    if num==2:
        return True
    else:
        for i in range(2,num):
            if num%i==0:
                return False
            else:
                return True

def sushu_range(num):
    '''

    :param num: 范围
    :return: 素数
    '''
    for i in range(2,num+1):
        if sushu(i):
            print(i,end=' ')

if __name__ == '__main__':
    sushu_range(100)