鱼C论坛

 找回密码
 立即注册
查看: 2587|回复: 12

[已解决]帮忙用面向对象思想解决下面问题

[复制链接]
发表于 2016-2-16 15:01:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小生帅气 于 2016-2-17 16:46 编辑

题目:1. 程序运行后可以循环输入操作命令
         2.操作命令输入0,打印出程序帮助信息,即每个操作命令的介绍
         3.操作命令输入1,打印出程序中存储的所有课程ID及课程名称
         4.输入2,打印出课程数量
         5.输入3,打印出最长的课程名称与其ID
         6.输入4,删除最后一个课程并打印出剩余课程数量
         7.输入5,退出程序
课程名:         c
                   shell
                  linux
                  c#
                   java
                   hadoop
                 python
                 c++
                   openstack



最佳答案
2016-2-18 12:22:15
小生帅气 发表于 2016-2-18 11:19
有一个疑惑:当用coursesDict.pop('9'),输入一次4,删除了最后一个,当再次运行时,没有第9项,会报错;c ...

1.这是我的疏忽,没考虑那么多
2.你把coursesDict字典的key('1','2','3')改成(1,2,3)试试,这时key是可迭代的,每次打印出来的按序的(注意,这是我自己的经验,我自己也没弄明白具体原因,慎用)
3.在这题里面可以把‘9’弄成变量,删除一次-1,下一次就成了8,依次类推

  1. coursesDict ={ 1:'linux',    2:'python',    3:'c' }

  2. i = len(coursesDict)
  3. while i >0:
  4.     coursesDict.pop(i)
  5.     i-=1
  6.     print(coursesDict)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-16 15:41:34 | 显示全部楼层
表示不明白你的‘前面的知识’指什么,然后发现一个小问题,也许是我没明白(勿怪)“ choice =int(input('\t请输入您的选择:'))”在这里直接用int存在一个隐患,如果用户不小心输入了非数字比如‘a’,后出现ValueError: invalid literal for int() with base 10: 'a',所以也话需要错误处理
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-16 16:35:11 | 显示全部楼层
小小大鱼 发表于 2016-2-16 15:41
表示不明白你的‘前面的知识’指什么,然后发现一个小问题,也许是我没明白(勿怪)“ choice =int(input(' ...

前面的知识  是指没有用到面向对象编程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 14:11:06 | 显示全部楼层
小小大鱼 发表于 2016-2-16 15:41
表示不明白你的‘前面的知识’指什么,然后发现一个小问题,也许是我没明白(勿怪)“ choice =int(input(' ...

print ('\n\n\n\t\t祝福大家春节快乐')

#choiceId = ['0','1','2','3','4','5']
coursesDict ={
    '1':'linux',
    '2':'python',
    '3':'c',
    '4':'c++',
    '5':'c#',
    '6':'java',
    '7':'shell',
    '8':'openstack',
    '9':'hadoop',
             }
while True:
    print ('\n\n\n')
    print ('\t0\t帮助\n')
    print ('\t1\t所有课程ID及课程名称\n')
    print ('\t2\t课程数量\n')
    print ('\t3\t最长的课程名称与其ID\n')
    print ('\t4\t删除最后一个课程及剩余课程数量\n')
    print ('\t5\t退出程序\n\n')
    try:
        choice =int(input('\t请输入您的选择:'))
    except:
        print('\t请输入数字')
        
    continue
#        #如果输入有误,需要重新输入
#    if choice not in choiceId:
#        print '请输入正确的选项,么么哒'

    #打印帮助
    if choice == 0:
        print ('''
                         ##########课程管理系统##########

                         输入0,打印出程序帮助信息,即每个操作命令的介绍
                         输入1,打印出程序中存储的所有课程ID及课程名称
                         输入2,打印出课程数量
                         输入3,打印出最长的课程名称与其ID
                         输入4,删除最后一个课程并打印出剩余课程数量
                         输入5,退出程序
                    #######################################
              ''' )

    #打印课程
    elif choice == 1:
        print  ('\t##########学习课程##########')
        print ('\tID\t课程')
        for key,value in coursesDict.items():
            print ('\t',key,'\t',value)
        print ( '\t##############################')

    #打印课程数量
    elif choice == 2:
        print  ('\t##########课程数量##########')
        print  ('\t总共发布了%s门课程' % len(coursesDict))
        print  ('\t###########################')


        #打印最长的课程
    elif choice == 3:
        longKey, longResult = max(coursesDict.items(), key=lambda x:len(x[1]))
        print  ('\t##########名字最长课程##########')
        print ( '\t实名字最长课程是%s  %s ' % (longKey,longResult))
        print ( '\t######################################')


    #打印删除最后一个课程及剩余数量
    elif choice == 4:
        coursesDict.pop
        print ('删除了最后一门课后,还剩余的课程数量:%s' % len(coursesDict) )

        #退出
    elif choice == 5:
        print ('再见。。。。。。')
        break

        #如果是其他字符,则需重新输入
    else:
        print ('请输入正确的选项,么么哒')


帮我看看 怎么加异常处理  ,我现在的不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-17 16:19:26 | 显示全部楼层
小生帅气 发表于 2016-2-17 14:11
print ('\n\n\n\t\t祝福大家春节快乐')

#choiceId = ['0','1','2','3','4','5']

print ('\n\n\n\t\t祝福大家春节快乐')

choiceId = [0,1,2,3,4,5]
coursesDict ={
    '1':'linux',    '2':'python',    '3':'c',    '4':'c++',    '5':'c#',    '6':'java',    '7':'shell',    '8':'openstack',    '9':'hadoop',
             }

print ('\n\n\n')
print ('\t0\t帮助\n')
print ('\t1\t所有课程ID及课程名称\n')
print ('\t2\t课程数量\n')
print ('\t3\t最长的课程名称与其ID\n')
print ('\t4\t删除最后一个课程及剩余课程数量\n')
print ('\t5\t退出程序\n\n')
while True:
    try:
        choice =int(input('\t请输入您的选择:'))
    except:
        print('\t请输入数字')
    else:
        if choice not in choiceId:
            print ('请输入正确的选项,么么哒')


#打印帮助
    if choice == 0:
        print ('''
                         ##########课程管理系统##########

                         输入0,打印出程序帮助信息,即每个操作命令的介绍
                         输入1,打印出程序中存储的所有课程ID及课程名称
                         输入2,打印出课程数量
                         输入3,打印出最长的课程名称与其ID
                         输入4,删除最后一个课程并打印出剩余课程数量
                         输入5,退出程序
                    #######################################
              ''' )
        continue

    #打印课程
    elif choice == 1:
        print  ('\t##########学习课程##########')
        print ('\tID\t课程')
        for key,value in coursesDict.items():
            print ('\t',key,'\t',value)
        print ( '\t##############################')
        continue

    #打印课程数量
    elif choice == 2:
        print  ('\t##########课程数量##########')
        print  ('\t总共发布了%s门课程' % len(coursesDict))
        print  ('\t###########################')
        continue


        #打印最长的课程
    elif choice == 3:
        longKey, longResult = max(coursesDict.items(), key=lambda x:len(x[1]))
        print  ('\t##########名字最长课程##########')
        print ( '\t实名字最长课程是%s  %s ' % (longKey,longResult))
        print ( '\t######################################')
        continue


    #打印删除最后一个课程及剩余数量
    elif choice == 4:
        coursesDict.pop
        print ('删除了最后一门课后,还剩余的课程数量:%s' % len(coursesDict) )
        continue

        #退出
    elif choice == 5:
        print ('再见。。。。。。')
    break;        
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-2-17 16:56:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-17 17:54:20 | 显示全部楼层
小生帅气 发表于 2016-2-17 16:19
print ('\n\n\n\t\t祝福大家春节快乐')

choiceId = [0,1,2,3,4,5]

1.
  1. print ('\n\n\n\t\t祝福大家春节快乐')

  2. choiceId = [0,1,2,3,4,5]
  3. coursesDict ={
  4.     '1':'linux',    '2':'python',    '3':'c',    '4':'c++',    '5':'c#',    '6':'java',    '7':'shell',    '8':'openstack',    '9':'hadoop',
  5.              }

  6. print ('\n\n\n')
  7. print ('\t0\t帮助\n')
  8. print ('\t1\t所有课程ID及课程名称\n')
  9. print ('\t2\t课程数量\n')
  10. print ('\t3\t最长的课程名称与其ID\n')
  11. print ('\t4\t删除最后一个课程及剩余课程数量\n')
  12. print ('\t5\t退出程序\n\n')
  13. while True:
  14.     try:
  15.         choice =int(input('\t请输入您的选择:'))
  16.         if choice in choiceId:
  17.             if choice == 0:
  18.                 print ('''
  19.                                  ##########课程管理系统##########

  20.                                  输入0,打印出程序帮助信息,即每个操作命令的介绍
  21.                                  输入1,打印出程序中存储的所有课程ID及课程名称
  22.                                  输入2,打印出课程数量
  23.                                  输入3,打印出最长的课程名称与其ID
  24.                                  输入4,删除最后一个课程并打印出剩余课程数量
  25.                                  输入5,退出程序
  26.                             #######################################
  27.                       ''' )

  28.             #打印课程
  29.             elif choice == 1:
  30.                 print  ('\t##########学习课程##########')
  31.                 print ('\tID\t课程')
  32.                 for key,value in coursesDict.items():
  33.                     print ('\t',key,'\t',value)
  34.                     print ( '\t##############################')

  35.             #打印课程数量
  36.             elif choice == 2:
  37.                 print  ('\t##########课程数量##########')
  38.                 print  ('\t总共发布了%s门课程' % len(coursesDict))
  39.                 print  ('\t###########################')

  40.             #打印最长的课程
  41.             elif choice == 3:
  42.                 longKey, longResult = max(coursesDict.items(), key=lambda x:len(x[1]))
  43.                 print  ('\t##########名字最长课程##########')
  44.                 print ( '\t实名字最长课程是%s  %s ' % (longKey,longResult))
  45.                 print ( '\t######################################')

  46.             #打印删除最后一个课程及剩余数量
  47.             elif choice == 4:
  48.                 coursesDict.pop#此处有问题,请看后面说明
  49.                 print ('删除了最后一门课后,还剩余的课程数量:%s' % len(coursesDict) )

  50.              #退出
  51.             elif choice == 5:
  52.                 print ('再见。。。。。。')
  53.                 break;   

  54.         else:
  55.              print('请输入1-5的数字')
  56.          
  57.     except ValueError as Err:
  58.         print(Err)
  59.         
  60.    
复制代码


上面是我修改后的代码,只调了下顺序,如果要这样写建议将中间较长的if判断写成函数。否则比较难看。

2.在运行中发现一个问题:
a.这里调用pop并没有删除字典中的项
b.删除最后一项时不能用pop,因为字典是没有顺序的,也就没有最后一项之说.
c.这里说明一下:删除一门课程有两种方法,
coursesDict.pop('9')#删除的是你这题里的最后一项,本身是按指定的key进行删除。
coursesDict.popitem()#注意,它是随机删除
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 11:19:29 | 显示全部楼层

有一个疑惑:当用coursesDict.pop('9'),输入一次4,删除了最后一个,当再次运行时,没有第9项,会报错;coursesDict.popitem()是随机删除 ,这样都不满足题意 ;然后我想,字典不能满足提议;应该怎样设计会更好一点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 12:22:15 | 显示全部楼层    本楼为最佳答案   
小生帅气 发表于 2016-2-18 11:19
有一个疑惑:当用coursesDict.pop('9'),输入一次4,删除了最后一个,当再次运行时,没有第9项,会报错;c ...

1.这是我的疏忽,没考虑那么多
2.你把coursesDict字典的key('1','2','3')改成(1,2,3)试试,这时key是可迭代的,每次打印出来的按序的(注意,这是我自己的经验,我自己也没弄明白具体原因,慎用)
3.在这题里面可以把‘9’弄成变量,删除一次-1,下一次就成了8,依次类推

  1. coursesDict ={ 1:'linux',    2:'python',    3:'c' }

  2. i = len(coursesDict)
  3. while i >0:
  4.     coursesDict.pop(i)
  5.     i-=1
  6.     print(coursesDict)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 16:11:46 | 显示全部楼层
小小大鱼 发表于 2016-2-18 12:22
1.这是我的疏忽,没考虑那么多
2.你把coursesDict字典的key('1','2','3')改成(1,2,3)试试,这时key是可 ...

这样也不行  还是报错     哎  郁闷
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 16:33:32 | 显示全部楼层
小小大鱼 发表于 2016-2-18 12:22
1.这是我的疏忽,没考虑那么多
2.你把coursesDict字典的key('1','2','3')改成(1,2,3)试试,这时key是可 ...

这样写  把所有课程都删除了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-18 16:35:02 | 显示全部楼层
小小大鱼 发表于 2016-2-18 12:22
1.这是我的疏忽,没考虑那么多
2.你把coursesDict字典的key('1','2','3')改成(1,2,3)试试,这时key是可 ...

这样写   输入一次4就会把所有课程删除   ;我的效果是 输入一次4 ,删除最后一门
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-18 17:20:13 | 显示全部楼层
本帖最后由 小小大鱼 于 2016-2-20 20:51 编辑
小生帅气 发表于 2016-2-18 16:35
这样写   输入一次4就会把所有课程删除   ;我的效果是 输入一次4 ,删除最后一门


1.晕, 我那个例子是演示用的,不上让你那样写。
2.你要写成执行一次4,删除一门课程,自己多动手。


此处还有一种方法:对字典排序
需要用到collections模块
下在是例子,自己应用到程序中
  1. import collections
  2. coursesDict ={

  3.     '1':'linux',    '2':'python',    '3':'c',    '4':'c++',    '5':'c#',    '6':'java',    '7':'shell',    '8':'openstack',    '9':'hadoop',

  4.              }
  5. d = collections.OrderedDict(sorted(coursesDict.items()))#对字典进行了排序
  6. d.popitem()#此时默认会删除最后一项,如果d.popitem(last=False)则会删除第一项
  7. #需要记住的是,这里删除的是d这个排序的字典,coursesDict的内容没有改变。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表