学习python之路--Day2:工资管理系统

需求

工资管理系统
Alex 100000
Rain 80000
Egon 50000
Yuan 30000
-----以上是info.txt文件-----
实现效果:
从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件。
效果演示:

  1. 查询员工工资
  2. 修改员工工资
  3. 增加新员工记录
  4. 退出
    >>:1
    请输入要查询的员工姓名(例如:Alex):Alex
    Alex的工资是:100000。
    \1. 查询员工工资
    \2. 修改员工工资
    \3. 增加新员工记录
    \4. 退出

:2
请输入要修改的员工姓名和工资,用空格分隔(例如:Alex 10):Alex 10
修改成功!

  1. 查询员工工资
  2. 修改员工工资
  3. 增加新员工记录
  4. 退出
    >>:3
    请输入要增加的员工姓名和工资,共空格分割(例如:Eric 100000):Eric 100000
    增加成功!
    \1. 查询员工工资
    \2. 修改员工工资
    \3. 增加新员工记录
    \4. 退出
    >>:4
    再见!

这个作业和上周我们做的购物车商家接口,管理商品列表的模块十分类似,可以借鉴一下。
流程图我们可以先画:

salary_manage

实现

根据这个操作流程,我们可以先写出一个demo:

#owner:houyizhong
#version:1.0

staff_dict={}

f=open("info.txt","r")
lines=f.readlines()
f.close()

#read staff
for i in lines:
      raw=i.split(" ")
      name=raw[0]
      salary=raw[1].strip()
      staff_dict[name]=salary

#print staff
f=open("info.txt","r")
for line in f:
      print line,
f.close()

#write file
def write_file():
      f=open("info.txt","w")
      for name in staff_dict:
              f.write("{0} {1}\n".format(name,staff_dict[name]))
      f.close()

def search():
      choice_name=input("请输入要查询的员工姓名(例如:Alex):")
      if choice_name in staff_dict:
              salary=staff_dict[choice_name]
              print("{0}的工资是:{1}".format(choice_name,salary))
      else:
              print("Sorry,your enter is not a staff!")

def modify():
      enter=input("请输入要修改的员工姓名和工资,用空格分隔(例如:Alex 10):")
      list=enter.split(" ")
      name=list[0]
      salary=list[1]
      if name in staff_dict:
              staff_dict[name]=salary
              print("修改成功!")
      else:
              print("Sorry,your enter is not a staff!")

def add():
      enter=input("请输入要增加的员工姓名和工资,共空格分割(例如:Eric 100000):")
      list=enter.split(" ")
      name=list[0]
      salary=list[1]
      staff_dict[name]=salary
      print("操作成功!")

while True:
      print("1. 查询员工工资\n2. 修改员工工资\n3. 增加新员工记录\n4. 退出")
      choice=input(">>")
      if choice == "1":
              search()
      elif choice == "2":
              modify()
      elif choice == "3":
              add()
      elif choice == "4":
              write_file()
              exit("再见!")
      else:
              print("Your enter invalid!Try again.")

这里用字典来盛放员工信息,每次修改只是对字典的修改,只有退出的时候才会将字典写入文件里,这么做的道理是,我修改员工信息或者新增员工时就不用重复的打开、写入文件了,每次运行程序只需一次写入文件操作,大大降低了文件操作的负担,同时避免了修改完文件之后,字典里还是显示启动时读取的内容,没有跟上后续内容的变化,而我们这样写就可以实时看到、修改自己刚才增改的内容了。

按照这个程序运行结果来看,确实实现了需求所述的内容。现在我们来对一些细枝末节的东西做些优化。
我们注意到这个程序还有一个bug,就是修改新增操作的时候如果只写了员工名,没有加工资是会有问题的,所以我们也需要对这一部分内容做个判断,优化之后的代码如下:

#-*- coding:utf-8 -*-
#owner:houyizhong
#version:2.0

staff_dict={}

f=open("info.txt","r")
lines=f.readlines()
f.close()

#read staff
for i in lines:
        raw=i.split(" ")
        name=raw[0]
        salary=raw[1].strip()
        staff_dict[name]=salary

#print staff
f=open("info.txt","r")
for line in f:
        print (line,end='')
f.close()

#write file
def write_file():
        f=open("info.txt","w")
        for name in staff_dict:
                f.write("{0} {1}\n".format(name,staff_dict[name]))
        f.close()

def search():
        choice_name=input("请输入要查询的员工姓名(例如:Alex):")
        if choice_name in staff_dict:
                salary=staff_dict[choice_name]
                print("{0}的工资是:{1}".format(choice_name,salary))
        else:
                print("Sorry,your enter is not a staff!")

def modify():
        enter=input("请输入要修改的员工姓名和工资,用空格分隔(例如:Alex 10):")
        list=enter.split(" ")
        if len(list) == 2:
            name=list[0]
            salary=list[1]
            if salary.isdigit():
                if name in staff_dict:
                        staff_dict[name]=salary
                        print("修改成功!")
                else:
                        print("Sorry,your enter is not a staff!")
            else:
                    print("Please enter correct salary!")
        else:
                print("Please enter correct information!")

def add():
        enter=input("请输入要增加的员工姓名和工资,共空格分割(例如:Eric 100000):")
        list=enter.split(" ")
        if len(list) == 2:
            name=list[0]
            salary=list[1]
            if salary.isdigit():
                staff_dict[name]=salary
                print("操作成功!")
            else:
                print("Please enter correct salary!")
        else:
                print("Please enter correct information!")

while True:
        print("1. 查询员工工资\n2. 修改员工工资\n3. 增加新员工记录\n4. 退出")
        choice=input(">>")
        if choice == "1":
                search()
        elif choice == "2":
                modify()
        elif choice == "3":
                add()
        elif choice == "4":
                write_file()
                exit("再见!")
        else:
                print("Your enter invalid!Try again.")

我们在modify(),add()这两个函数的主逻辑里,加入了if len(list) == 2: 这句话,这样就能判断用户输入的信息是否是两个,是否符合要求,同时也加入了if salary.isdigit():这句,用来判断输入的最后一项是不是个数字。

结语

我们利用了字典,函数和读取写入文件方面的知识,为了避免操作的复杂性,和为了代码的易读性,我们将所有的修改操作都先写入字典中,再由字典写入文件,文件即时修改方面可能不够快,但是保证了信息的一致性和完整性。这个在以后的程序设计中,是一个可以借鉴和考虑的地方。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,016评论 9 467
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 因为热爱互联网,所以身边有很多互联网的朋友,很多时候自己想不明白的事情会跟他们交流。但是发现有时候说了一个事之后对...
    Willsland阅读 761评论 1 3
  • 很想回到小时候,你还在。 一个人离开,除了回忆, 十七年间 能看到的 能碰到的只有这些了。 我不记得从何时起,我...
    小王叫不才阅读 689评论 0 0