《Python 程序设计》张莉主编 第五章:程序控制结构 课后习题答案(一)

前言

本章主要介绍了在 Python 中对顺序结构、选择结构和循环结构的语句描述,并对列表解析和生成器表达式作简要介绍。

程序 = 算法 + 数据结构

而无论多么复杂的算法,都可以使用上述的三种基本控制中的一种或几种组成。

BTW , 这一章的作业有点长,所以打算分两次上传(实际是因为,我最近摆烂了)


正文

题目一

  • 题目:编写程序读取三角形的三条边长,如果输入合法(三角形任意两边之和大于第三边),则计算它的周长和面积,如果输入是非法的,则输出错误信息。

知识点:

        eval()函数:

            eval(expression,globals=None,local=None)

            作用:将输入的字符串当成有效的 Python 表达式来求值

  • 代码实现
    import math
    
    
    a,b,c = eval(input("请输入三角形三条边长为:"))#输入时使用英文字符
    if a+b>c and a+c>b and b+c>a:
        cir = a+b+c
        p = (cir)/2
        s = math.sqrt(p*(p-a)*(p-b)*(p-c))#海伦公式
        print(cir,s)
    else:
        print("输入数值无法构成三角形")

     

题目二 

 

  • 题目:编写一个程序请用户输入美元与人民币之间的国币汇率,而后提示用户输入“0”表示将美元转换为人民币,输入“1”表示将人民币准换为美元,并将用户输入的美元数或人民币数分别转换为人民币或美元,若输入其他数值,则提示输入错误。
  • 以下为运行示例:

Enter the exchange rate from dollars to RMB:6.81

Enter 0 to convert dollers to RMB and 1 vice veras:0

Enter the doller amount:100

$ 100.0 is 681.0 yuan

 

 

Enter the exchange rate from dollars to RMB:6.81

Enter 0 to convert dollers to RMB and 1 vice veras:1

Enter the doller amount:1000

1000 yuan is $ 156.84

 

 

Enter the exchange rate from dollars to RMB:6.81

Enter 0 to convert dollers to RMB and 1 vice veras:5

Incorrect input

 

  • 代码实现
    Exrate = float(input("Enter the exchange rate from dollars to RMB:"))
    Choose = int(input("Enter 0 to convert dollers to RMB and 1 vice veras:"))
    
    if Choose == 0: 
        amount = float(input("Enter the doller amount:"))   
        reason = amount*Exrate
        print(f"$ {amount} is {reason} yuan")
    elif Choose == 1:
        amount = float(input("Enter the doller amount:")) 
        reason = amount/Exrate
        print(f"{reason} yuan is $ {reason}")
    else:
        print("Incorrect input")

     

题目三 

  • 题目:从键盘输入整数 n (1—9之间),对于 1—100 之间的整数删除包含 n 并且能被 n 整除的数,例如如果 n  为 6 ,16 这样的数及是6的倍数的如 12 和 18 这样的数,输出所有满足条件的数,要求每满 10 个数换行(最后一行可能不满 10 个数)

#   测试数据:

#       6

#   屏幕输出:

#       1,2,3,4,5,7,8,9,10,11

#       13,14,15,17,19,20,21,22,23,25

#       27,28,29,31,32,33,34,35,37,38

#       39,40,41,43,44,45,47,49,50,51

#       52,53,55,57,58,59,70,71,73,74

#       75,77,79,80,81,82,83,85,87,88

#       89,91,92,93,94,95,97,98,99,100

知识点:

        strip() 函数:

            str.strip([chars])

            用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列

            注意:该方法只能删除开头或是结尾的字符,不能删除中间的字符

 

            # 一开始在做这道题时,发现换行后每行的末尾字符保留了“,”,所以想到了可不可         以使用这个函数去除末尾的“,”,不过最后也没用上

 

代码实现

n = int(input("输入整数 n (1-9之间):"))
j = 1
for i in range(1,101):

    if i % n == 0 :     #删除整除 n 的数
        continue
    if i % 10 == n :    #删除个位为 n 的数
        continue
    if i // 10 == n:    #删除十位为 n 的数
        continue
    elif i % n != 0:    #每十个数换行并删除最后一位的','
        if j % 10 != 0 :
            print(i,end=',')
        if j % 10 == 0  :        
            print(i)
            print("\n")
        j += 1  
  • 一点碎碎念:

                做这道题时,调式了很多次数据总是不对,最后一行一行的打断点才发现,有一行代码         中的 i  写成了 n , 难崩……

                此外,这个答案还有一个问题没有解决,就是当最后一行不满 10 个数时,末尾处的“,”         没有删除

题目四

  • 题目:求解 1~4 这4个数字可以组成多少个无重复的三位数,并从小到大的顺序输出这些三位数。
  • 知识点:

    Python itertools 使用详解:

        http://t.csdn.cn/YUy3r

    product(*iterables,repeat=1)

        作用:用来生成 *iterables 各元素之间的不同组合

              但是各个组合中的元素顺序是按照参数的先后顺序固定的

     

  • 代码实现

    #解法一
    #这样做的时间复杂度似乎有点高
    
    
    import itertools
    
    
    for i, j, k, l in itertools.product(range(1,5), range(1,5), range(1,5), range(1,5)):
        print(f"{i}{j}{k}{l}",end=' ')
    #解法二
    #似乎这种方法的时间复杂度也没好多少
    
    
    import itertools
    
    
    for i, j in itertools.product(range(1,5), range(1,5)):
        if j == i :
            continue
        for k in range(1,5):
            if k in [j, i]:
                continue
            for l in range(1,5):
                if l in [k, j, i]:
                    continue    
                print (f"{i}{j}{k}{l}",end=' ')

     

题目五 

  • 题目:

        输出所有满足以下条件的 3 位整数:该数是素数,该数的个位数字与十位数字之和被 10 除所得余数恰好是该数的百位数字。

        例如,293 是素数并且(3+9)被 10 除的余数是 2 ,因此 293 是满足条件的 3 位素数。

代码实现


for i, j, k in itertools.product(range(1,10),range(1,10),range(1,10,2)): 
    a = 100*i + 10*j + k    #所有 3 位整数
    
    for i2 in range (2,math.ceil(math.sqrt(a)) + 1):    
        if a % i2 == 0 :    #素数判断      
            break           
    
        if (j+k)%10 == i:   #判断数的个位数字与十位数字之和被 10 除所得余数恰好是该数的百位数字
            break
    else:  
        print(a,end = ' ')

 

 总结

        总而言之,这一章很重要……感觉考试必考……

        写注释是一个好文明,边看边赞边收藏也是一个好文明 (Q_Q)

 

 

 

你可能感兴趣的:(《Python,程序设计》,python,开发语言)