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)
  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/alexkh/p/2809304.html
Copyright © 2011-2022 走看看