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)

 

 

posted on 2012-12-08 22:12  alexkh  阅读(453)  评论(0编辑  收藏  举报