一.设计目标
二.所需知识点
三.系统所需的数据结构
1.基本结构
2.将具体操作抽象化
四.实现步骤
1.文件准备
2.基本代码
3.功能代码
五.主文件完整代码
六.功能文件完整代码
1.搭建名片管理系统,其功能为存储多人的多种名片信息,包括姓名、电话、QQ、邮箱。
2.此系统具有一个主界面和多个分界面,主界面且支持与用户交互的3种功能:新建名片、显示全部名片、查询名片。每种功能执行完成后都会回到主菜单,在主菜单可选择退出此系统,即结束程序。
3.在查询名片界面下,对查询到的名片还支持3个功能:修改、删除、退回上一步
主界面期望形式如下图:
变量、流程控制、函数、模块
1.基本结构
使用字典记录每一张名片的信息
使用列表记录每一个字典
2.将具体操作抽象化
新建名片:将信息存入字典,再将字典作为一个元素增加入列表中
显示全部名片:循环遍历并打印列表中的元素
查询名片:循环遍历并对每一个元素的姓名进行匹配
(1)新建项目(cardManageSystem)
(2)新建主文件(cards_main.py)
作用:程序的入口、与用户进行交互
(3)主菜单框架实现
要求每次用户命令交互完成后都会再次回到主菜单,所以将主程序放入死循环中,只有用户输入“4”才会跳出循环,即退出系统
(4)新建功能文件(cards_tools.py)
作用:将名片不同功能封装在不同函数中
(5)定义存放名片字典的列表
A.定义在文件第一行方便后续函数调用
B.需要定义在功能文件而非主文件中,因为对此列表的操作在功能文件中
# 名片列表
card_list = []
基本功能实现:显示主菜单、提示用户输入信息、选项判断
在用户输入信息部分不对输入的信息进行数字转换的原因:我们无法保证用户不输入其他字符,所以一旦转换,在用户输入非数字内容时就会报错,程序无法继续执行,而我们只想判断用户输入的是不是菜单提供的操作而已
# 将整个主菜单放入死循环中
while True:
# 显示主菜单
cards_tools.show_menu()
# 提示输入操作编号
action = input("请您输入操作编号")
print("您选择的操作是【%s】" % action)
# 选项判断
if action in ["1", "2", "3"]: # 进行对应操作
if action == "1": # 新建名片
cards_tools.new_a_card()
if action == "2": # 显示全部名片
cards_tools.show_all_cards()
if action == "3": # 查询名片
cards_tools.search_card()
elif action == "4": # 退出循环
print("感谢您的使用 再见")
break
else: # 提示输入错误
print("您输入的选项有误 请重新输入")
(1)显示主菜单(show_menu)
直接使用print函数打印即可,我还使用字符串的center方法进行了标题居中处理
def show_menu():
"""显示主菜单"""
print("*" * 50)
print("欢迎使用【名片管理系统】".center(40) + "") # 居中菜单标题
print("1.新建名片")
print("2.显示全部名片")
print("3.查询名片")
print("4.退出系统")
print("*" * 50)
(2)新建名片(new_a_card)
输入信息、建立字典、新增列表、提示成功
def new_a_card():
"""新建名片"""
print("=" * 50)
print("新增名片 请输入信息".center(70))
# 输入姓名、电话、qq号、邮件
name = input("请输入您的姓名:")
phone = input("请输入您的电话:")
qq = input("请输入您的qq号:")
email = input("请输入您的邮箱:")
# 使用信息建立字典
information = {
"姓名": name,
"电话": phone,
"qq号": qq,
"email": email
}
# 将字典添加到列表中
card_list.append(information)
# 提示用户添加成功
print("添加%s的名片成功" % name)
(3)显示全部名片(show_all_cards)
判断空、打印表头分割线、打印信息、打印分割线
显示名片界面期望形式如下图:
def show_all_cards():
"""显示全部名片"""
print("=" * 50)
print("显示全部名片".center(70))
# 判断是否为空
if len(card_list) == 0:
print("名片系统为空")
return
# 打印表头、分割线
print("姓名\t\t\t\t电话\t\t\t\tqq号\t\t\t\temail")
print("=" * 50)
# 打印信息
for i in card_list:
print("%s\t\t\t\t%s\t\t\t\t%s\t\t\t\t%s" % (i["姓名"], i["电话"], i["qq号"], i["email"]))
# 打印分割线
print("=" * 50)
(4)查询名片(search_card)
判断空、输入、查找(打印、三种操作)
def search_card():
"""查询名片"""
print("=" * 50)
print("查询名片".center(70))
# 判断是否为空
if len(card_list) == 0:
print("名片系统为空")
return
# 输入并查找
search_name = input("请输入要查询的姓名:")
# 打印信息
for i in card_list:
# 查找此人
if i["姓名"] == search_name:
print("姓名\t\t\t\t电话\t\t\t\tqq号\t\t\t\temail")
print("=" * 50)
print("%s\t\t\t\t%s\t\t\t\t%s\t\t\t\t%s" % (i["姓名"], i["电话"], i["qq号"], i["email"]))
print("=" * 50)
# 三种操作
deal_search_one(i)
break
else:
print("查无此人")
(5)查询成功后的三种操作(deal_search_one)
A.是在找到某人名片的前提下对其进行的,所以应当注意层次位置
B.操作如果写在原代码内部会非常多,所以建议使用单独的函数进行操作
C.执行完1或2操作后也希望直接返回系统主菜单
def deal_search_one(search_dictionary):
"""
对选出的人的信息修改或删除操作
:param search_dictionary: 找到的人的信息字典
"""
while True:
function_choice = input("请输入想要执行的操作:1.修改 2.删除 3.返回上级目录")
if function_choice == "1":
print("修改名片".center(70))
search_dictionary["姓名"] = new_input(search_dictionary["姓名"], "姓名:")
search_dictionary["电话"] = new_input(search_dictionary["电话"], "电话:")
search_dictionary["qq号"] = new_input(search_dictionary["qq号"], "qq号:")
search_dictionary["email"] = new_input(search_dictionary["email"], "邮箱:")
break
elif function_choice == "2":
print("删除名片".center(70))
card_list.remove(search_dictionary)
break
elif function_choice == "3":
return
else:
print("没有此操作 请重新输入")
print("处理完成")
(6)自定义输入功能(new_input)
想要在输入时实现对不想修改的内容回车跳过,需要自己定义函数
def new_input(value, tip_message):
"""
新的输入函数,输入为空时不改变原值
:param value: 原来的值
:param tip_message: 提示信息
:return:
"""
# 提示输入内容
input_thing = input(tip_message)
# 如果有内容就返回,无内容返回原值
if len(input_thing) > 0:
return input_thing
else:
return value
# 导入功能模块文件
import cards_tools
# 将整个主菜单放入死循环中
while True:
# 显示主菜单
cards_tools.show_menu()
# 提示输入操作编号
action = input("请您输入操作编号")
print("您选择的操作是【%s】" % action)
# 选项判断
if action in ["1", "2", "3"]: # 进行对应操作
if action == "1": # 新建名片
cards_tools.new_a_card()
if action == "2": # 显示全部名片
cards_tools.show_all_cards()
if action == "3": # 查询名片
cards_tools.search_card()
elif action == "4": # 退出循环
print("感谢您的使用 再见")
break
else: # 提示输入错误
print("您输入的选项有误 请重新输入")
# 名片列表
card_list = []
def show_menu():
"""显示主菜单"""
print("*" * 50)
print("欢迎使用【名片管理系统】".center(40) + "") # 居中菜单标题
print("1.新建名片")
print("2.显示全部名片")
print("3.查询名片")
print("4.退出系统")
print("*" * 50)
def new_a_card():
"""新建名片"""
print("=" * 50)
print("新增名片 请输入信息".center(70))
# 输入姓名、电话、qq号、邮件
name = input("请输入您的姓名:")
phone = input("请输入您的电话:")
qq = input("请输入您的qq号:")
email = input("请输入您的邮箱:")
# 使用信息建立字典
information = {
"姓名": name,
"电话": phone,
"qq号": qq,
"email": email
}
# 将字典添加到列表中
card_list.append(information)
# 提示用户添加成功
print("添加%s的名片成功" % name)
def show_all_cards():
"""显示全部名片"""
print("=" * 50)
print("显示全部名片".center(70))
# 判断是否为空
if len(card_list) == 0:
print("名片系统为空")
return
# 打印表头、分割线
print("姓名\t\t\t\t电话\t\t\t\tqq号\t\t\t\temail")
print("=" * 50)
# 打印信息
for i in card_list:
print("%s\t\t\t\t%s\t\t\t\t%s\t\t\t\t%s" % (i["姓名"], i["电话"], i["qq号"], i["email"]))
# 打印分割线
print("=" * 50)
def search_card():
"""查询名片"""
print("=" * 50)
print("查询名片".center(70))
# 判断是否为空
if len(card_list) == 0:
print("名片系统为空")
return
# 输入并查找
search_name = input("请输入要查询的姓名:")
# 打印信息
for i in card_list:
# 查找此人
if i["姓名"] == search_name:
print("姓名\t\t\t\t电话\t\t\t\tqq号\t\t\t\temail")
print("=" * 50)
print("%s\t\t\t\t%s\t\t\t\t%s\t\t\t\t%s" % (i["姓名"], i["电话"], i["qq号"], i["email"]))
print("=" * 50)
# 三种操作
deal_search_one(i)
break
else:
print("查无此人")
def deal_search_one(search_dictionary):
"""
对选出的人的信息修改或删除操作
:param search_dictionary: 找到的人的信息字典
"""
while True:
function_choice = input("请输入想要执行的操作:1.修改 2.删除 3.返回上级目录")
if function_choice == "1":
print("修改名片".center(70))
search_dictionary["姓名"] = new_input(search_dictionary["姓名"], "姓名:")
search_dictionary["电话"] = new_input(search_dictionary["电话"], "电话:")
search_dictionary["qq号"] = new_input(search_dictionary["qq号"], "qq号:")
search_dictionary["email"] = new_input(search_dictionary["email"], "邮箱:")
break
elif function_choice == "2":
print("删除名片".center(70))
card_list.remove(search_dictionary)
break
elif function_choice == "3":
return
else:
print("没有此操作 请重新输入")
print("处理完成")
def new_input(value, tip_message):
"""
新的输入函数,输入为空时不改变原值
:param value: 原来的值
:param tip_message: 提示信息
:return:
"""
# 提示输入内容
input_thing = input(tip_message)
# 如果有内容就返回,无内容返回原值
if len(input_thing) > 0:
return input_thing
else:
return value