1.基本需求
编写一个购物小程序,要求实现如下功能:
(1)让用户输入工资;
(2)输出购物菜单及产品价格;
(3)计算用户是否可支付;
(4)输出用户剩余的钱,问用户是否继续购物,如果选择继续,则继续进行,否则退出程序;
(5)若钱不够,输出用户还需要工作多久才能买得起(这里暂不实现此功能)。
2.实现基本思路
基本思路可如下所示:
在编写程序的时候即以该思路为主线,具体细节下面再提及。
3.实现细节
基于友好用户界面的原则,实现的细节可总结如下:
(1)用户输入工资时,如果输入的是非数字或没有输入,会有提示再次输入,而不会异常退出;
(2)用户输入购买物品时,如果输入的是非商品索引或非quit退出时,会有提示再次输入,而不会异常退出;
(3)每添加商品到购物列表后,会提示用户当前所剩余的money;
(4)用户选择退出时,会打印用户的购物清单,同时输出用户剩余的money;
(5)总的原则是,程序在执行过程中不会有异常情况出现,即使用户输入非法字符。
4.实现代码与注释
基于上述需求的实现代码如下:
#!/usr/bin/env pythonimport sysmarket = [ ['Xiaomi Phone', 2400], ['Iphone', 6000], ['Computer', 3800], ['Ipad', 1800], ['Core Python', 69], ['Router', 109]]shop_list = [] #The shopping list of the buyer.while True: salary = raw_input('Please input your salary per month:').strip() if not salary.isdigit(): print 'Please enter your salary.' continue salary = int(salary) print "Welcome to our market!You can buy something cool here, or you can enter 'quit' to left.\n" break#Upon:input the salary per month.输入工资同时避免异常情况。while True: print 'The goods we serve are as follow:' for goods in market: print market.index(goods),goods[0],goods[1] #Upon:print the goods list. choice = raw_input('What do you want to buy?') if choice == 'quit': #'quit' system print '\nYour shopping list are as follow:' for goods in shop_list: print goods[0],goods[1] print 'Now you have %d left.' % (salary) sys.exit('Goodbye!') elif len(choice) == 0: #'enter' system continue#实际上'luanma' system和'enter' system可以只用前者进行替代,这里只是想输出不同提示而已。(即输入乱码时会提示,输入enter时不进行提示。) if not choice.isdigit(): #'luanma' system,即如果用户输入非数字时,会有提示 print 'Please input the right choice.(Number to buy things and quit to quit.)\n' continue #Upon: 'quit' system , 'enter' system and 'luanma' handle system. choice = int(choice) if choice >= len(market): print 'Could not find the item, try again!\n' continue pri = market[choice] #Upon:To check if the number is legal.确认输入的数字是否在合法范围内 pri = market[choice] if pri[1] <= salary: salary = salary - pri[1] #The remaining money. shop_list.append(pri) #Adding the goods to the list. print 'You have added %s to your shopping list, and you have %d left.\n' % (pri[0], salary) else: print '''You have %d left.You can not afford to buy %s, but you can try to buy other things.\n''' % (salary, pri[0])
因为灵活用了列表作处理,所以相对来说代码不会太复杂。
4.测试
·对输入过程中可能出现的各种情况和说明如下:
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day2$ python myshop.py Please input your salary per month:Please enter your salary. ===>直接输入'Enter'时会有提示Please input your salary per month:klkdfPlease enter your salary. ===>输入乱码时也会有提示Please input your salary per month:10000Welcome to our market!You can buy something cool here, or you can enter 'quit' to left.The goods we serve are as follow: ===>先打印了一个商品菜单0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy?0 ===>正确输入商品索引号,会提示当前用户购物信息You have added Xiaomi Phone to your shopping list, and you have 7600 left.The goods we serve are as follow:0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy? ===>只输入'Enter'时,不会有提示输出,但会再次打印商品菜单The goods we serve are as follow:0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy?3You have added Ipad to your shopping list, and you have 5800 left.The goods we serve are as follow:0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy?eqwer ===>输入乱码时,会有提示,并接受再次输入Please input the right choice.(Number to buy things and quit to quit.)The goods we serve are as follow:0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy?9 ===>输入不在合法范围内的数字时,也会有提示Could not find the item, try again!The goods we serve are as follow:0 Xiaomi Phone 24001 Iphone 60002 Computer 38003 Ipad 18004 Core Python 695 Router 109What do you want to buy?quit ===>正常退出,会打印用户总的购物清单信息 Your shopping list are as follow:Xiaomi Phone 2400Ipad 1800Now you have 5800 left.Goodbye!
相对来说,用户界面还是比较友好的,因为不会有太大的异常情况出现,同时也实现了基本的需求。