zoukankan      html  css  js  c++  java
  • python核心编程课后题第二版97页第五章

    5-2 操作符。(a)写一个函数,计算并返回两个数的乘机。(b)写一段代码调用这个函数,并显示它的结果。

    def multi(a, b):
        c = a * b
        return c
    
    num1 = 12
    num2 = 9
    print '%d chengyi %d = %d' % (num1, num2, multi(num1, num2))

    5-3 标准类型操作符。写一段脚本,输入一个测试成绩,根据下面的标准,输出他的评分成绩(A-F):
    A: 90~100
    B: 80~89
    C: 70~79
    D: 60~69
    F: <60

    def judge_level(n):
        n = int(n)
        if 90 <= n <= 100:
            return 'A'
        elif 80 <= n < 90:
            return 'B'
        elif 70 <= n < 80:
            return 'C'
        elif 60 <= n < 70:
            return 'D'
        elif 0 <= n < 60:
            return 'F'
        else:
            return 'Please check your score again.'
    
    while 1:
        score = raw_input('Please enter your score>>')
        try:
            int(score)
        except:
            print 'Enter error.'
        else:
            break
    
    print judge_level(score)

    注:加入2个判断,一个是输入时判断是否数字,二是判断输入数据是否在0~100之内。

    5-4 取余。 判断给定年份是否是闰年。使用下面的公式:
    一个闰年就是指它可以被4整除,但不能被100整除,或者它既可以被4整除又可以被100整除。比如1992,19996和2000是闰年,但1967,1900不是闰年,下一个是闰年的整世纪是2400.
    注:书上这样表述明显是矛盾的,我也看了半天生出了类似“是打他还是打他妈”(详见周星驰《功夫》)的苦恼,最后求证下应该是这样的:
    闰年是可以被4整除但不能被100整除,或者它可以被400整除

    y = raw_input('Enter the year>>')
    y = int(y)
    y4 = y % 4
    y100 = y % 100
    y400 = y % 400
    if (y4 == 0 and y100 != 0) or (y400 == 0):
        print '%d is runnian.' % y
    else:
        print '%d is not runnian.' % y

    5-5 取余。取一个任意小于1美元的金额。然后计算可以换成多少枚硬币。硬币有1美分,5美分,10美分和25美分四种。1美元等于100美分。举例来说,0.76美元换算结果应该是3枚25美分,1枚1美分。类似76个1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的结果都是不符合要求的。

    money = raw_input('Enter the money>>')
    money = int(money)
    
    a1, a2 = divmod(money, 25)
    if a2 != 0:
        b1, b2 = divmod(a2, 10)
        if b2 != 0:
            c1, c2 = divmod(b2, 5)
    
    print '%d = %d * 25 + %d * 10 + %d * 5 + %d * 1' % (money, a1, b1, c1, c2)

    另外一种方法:

    def verify(a):
        b = '1234567890'
        if len(a) == 2 and a[0] in b and a[1] in b:
            return True
        else:
            return False
    
    def change(a):
        n25 = int(a) / 25
        n10 = (int(a) - n25 * 25) / 10
        n5 = (int(a) - n25 * 25 - n10 * 10) / 5
        n1 = int(a) - n25 * 25 - n10 * 10 - n5 * 5
        return n25, n10, n5, n1
    
    money = raw_input('Enter the money>>')
    if verify(money):
        r = change(money)
        print '%r can change to %r 25Cents, %r 10Cents, %r 5Cents and %r 1Cents.' % (money, r[0], r[1], r[2], r[3])
    else:
        print 'Enter errors.'

    5-6 算术。写一个计算机程式。你的代码可以接受这样的表达式,两个操作数加一个操作符:N1操作符N2,其中N1和N2为整型或浮点型,操作符可以是+ - * / % **,分别为加法,减法,乘法,除法,取余和求幂。计算这个表达式的结果,然后显示出来。提示:使用字符串方法split(),但不可以使用内建函数eval()。

    def jisuanqi(n):
        if len(n.split('+')) == 2:
            return int(n.split('+')[0]) + int(n.split('+')[1])
        elif len(n.split('-')) == 2:
            return int(n.split('-')[0]) - int(n.split('-')[1])
        elif len(n.split('*')) == 2:
            return int(n.split('*')[0]) * int(n.split('*')[1])
        elif len(n.split('/')) == 2:
            return int(n.split('/')[0]) / int(n.split('/')[1])
        elif len(n.split('%')) == 2:
            return int(n.split('%')[0]) % int(n.split('%')[1])
        elif len(n.split('**')) == 2:
            return int(n.split('**')[0]) ** int(n.split('**')[1])
        else:
            return 'Enter errors.'
    
    exp = raw_input('Please enter the expression, such as 2-1.\n>>')
    print jisuanqi(exp)

    注:并未完成,诸如“1- -4”这样的算式还不能计算。而且计算结果只考虑了整形,浮点型都过滤掉了。

    最后推荐下vim编辑器,用好了很方便的。另外本文参考了Balian同学的笔记http://www.cnblogs.com/balian/archive/2011/01/27/1946088.html

    另外,答案是自己搞的,难免有错误,请注意。

    5-8 几何。计算面积和体积。
    (a)正方形和立方体
    (b)圆和球

    #coding=utf-8
    import math
    def area(leng):
        leng = int(leng)
        return leng ** 2
    
    def vol(leng):
        leng = int(leng)
        return leng ** 3
    
    def round_area(r):
        r = float(r)
        return r ** 2 * math.pi
    
    def ball_vol(r):
        r = float(r)
        return r ** 3 * math.pi * 4 / 3
    
    leng = raw_input('Enter the length.\n>>')
    print 'The area of the square is %r.' % area(leng)
    print 'The volume of the cube is %r.' % vol(leng)
    
    r = raw_input('Enter the radius.\n>>')
    print 'The area of the round is %r.' % round_area(r)
    print 'The volume of the ball is %r.' % ball_vol(r)

    5-9.
    数值形式回答下面关于数值格式的问题:
    (a)为什么下面的例子里17+32等于49,而017+32等于47,017+032等于41?
    >>> 17 + 32
    49
    >>> 017 + 32
    47
    >>> 017 + 032
    41
    (b)为什么下面这个表达式我们得到的结果是134L而不是1342?
    >>> 56l + 78l

    (a)因为Python中0开头的数字表示八进制数。八进制数017表示15,而八进制数032表示26,所以得到如题所示答案。
    (b)561加上781才是1342,而56l加上78l是134L。(这个题不是扯淡吗?!)

    5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为C=(F-32)*(5/9)应该在这个练习中使用真正的除法,否则你会得不到正确的结果。

    from __future__ import division
    def ftoc(f):
        c = (f - 32) * (5 / 9)
        return c
    
    def ctof(c):
        f = 9 / 5 * c + 32
        return f
    
    c = 25
    print ctof(c)
    
    f = 89
    print ftoc(f)

    注:这个懒了点,没有设置输入。

    5-11 取余。
    (a)使用循环和算术运算,求出0-20之间的所有偶数
    (b)同上,不过这次输出所有奇数
    (c)综合(a)和(b),请问辨别奇数和偶数的最简单方法是什么?
    (d)使用(c)的成果,写一个函数,检测一个整型能否被另一个整型整除。先要求用户输入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回True和False。

     (a)

    for n in range(1, 21):
        if n % 2 == 0:
            print n

    (b)

    for n in range(1, 21):
        if n % 2 != 0:
            print n

    (c)判断奇数和偶数最简单的方法就是求余,判断余数是否为0.

    (d)

    #coding=utf-8
    chushu = input('输入除数:')
    beichushu = input('输入被除数:')
    
    if beichushu % chushu == 0:
        print True
    else:
        print False

    注:除数和被除数不知道有没有搞混。

    5-12 系统限制。写一段脚本确认一下你的Python所能处理的整型,长整型,浮点型和复数的范围。

    注:这个暂时没做。

    5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。

    #coding=utf-8
    
    def h_m(h, m):
        return int(h) * 60 + int(m)
    
    tm = raw_input('Please enter time: HH:MM, such as "5:21"\n>>')
    t = tm.split(':')
    print h_m(t[0], t[1])

    5-14 银行利息。写一个函数,以定期存款利息为参数,假定该账户每日计算复利,请计算并返回年回报率。

    #coding=utf-8
    def fuli(m, d):
        return int(m) * 1.0015 ** int(d)
            
    print '日利率为0.15%'
    m = raw_input('Enter your money. >>')
    d = raw_input('Enter days. >>')
    print fuli(m, d)
    
    print (fuli(m, 365) - int(m)) / int(m)

    注:最后一行计算年回报率时有点麻烦了。

     5-15 最大公约数和最小公倍数。请计算两个整型的最大公约数和最小公倍数。

    注:这个题还不知道怎么解,容我思考两天。

    5-16.
    家庭财务。给定一个初始金额和月开销数,使用循环,确定剩下的金额和当月的支出数,包括最后的支出数。Payment()函数会用到初始金额和月额度,输出结果应该类似下面的格式(例子中的数字仅用于演示)。
    Enter opening balance: 100.00
    Enter monthly payment:  16.13

               Amount Remaining
    Pymt#   Paid      Balance
    -----   ----      -------
    0 $ 0.00   $100.00
    1 $16.13    $ 83.87
    2 $16.13    $ 67.74
    3 $16.13    $ 51.61
    4 $16.13    $ 35.48
    5 $16.13    $ 19.35
    6 $16.13    $  3.22
    7 $ 3.22    $  0.00

    #coding=utf-8
    balance = raw_input('Enter opening balance:  ')
    payment = raw_input('Enter monthly payment:  ')
    
    balance = float(balance)
    payment = float(payment)
    
    print '         Amount      Remaining'
    print 'Pymt#    Paid        Balance'
    print '-----    ------      ---------'
    print '0        $ 0.00      $100.00'
    n = 1
    while (balance - n * payment) > payment:
        print '%d        $%.2f       $ %.2f' % (n, payment, (balance - n * payment))
        n += 1
    print '%d        $%.2f       $ 0.00' % (n, (balance - n * payment))

    注:唉,我承认写到最后有点沉不住气了,想早点搞定看下一章。

    5-17 随机数。熟读随机数模块然后解下面的题。

    生成一个有N个元素的由随机数n组成的列表,其中N和n的取值范围分别为(1<N<=100)和(0<=n<=2**31-1)。然后再随机从这个列表中取x(1<=x<=100)个随机数出来,对他们排序,然后显示这个子集。

    import random
    N = random.randint(2, 100)
    num = 1
    n = []
    
    while num <= N:
        n.append(random.randint(0, 2 ** 31 - 1))
        num += 1
    print sorted(n)
  • 相关阅读:
    Hadoop Python 调用自定义so动态库
    Golang Redigo连接Redis 简单使用
    Golang 错误 "bad file descriptor"
    Centos Git 安装与升级
    初识数据库
    MySQL介绍,下载和安装
    并发编程:协程
    并发编程:多线程
    并发编程:多进程
    操作系统,进程理论
  • 原文地址:https://www.cnblogs.com/alexkh/p/2809304.html
Copyright © 2011-2022 走看看