手机通讯录--课后程序(Python程序开发案例教程-黑马程序员编著-第5章-课后作业)

news2024/11/26 13:25:36

实例2:手机通讯录

通讯录是记录了联系人姓名和联系方式的名录,手机通讯录是最常见的通讯录之一,人们可以在通讯录中通过姓名查看相关联系人的联系方式、邮箱、地址等信息,也可以在其中新增联系人,或修改、删除联系人信息。下面是一个常见通讯录的功能菜单,如图1所示。

 

图1 通讯录功能菜单

图1中的通讯录中包含6个功能,每个功能都对应一个序号,用户可根据提示“请输入功能序号”选择序号执行相应的操作,包括:

  1. 添加联系人:用户根据提示“请输入联系人的姓名:”、“请输入联系人的手机号:”、“请输入联系人的邮箱:”和“请输入联系人的地址:”分别输入联系人的姓名、手机号、邮箱和地址,输入完成后提示“保存成功”。注意,若输入的用户信息为空会提示“请输入正确信息”。
  2. 查看通讯录:按固定的格式打印通讯录每个联系人的信息。若通讯录中还没有添加过联系人,提示“通讯录无信息”。
  3. 删除联系人:用户根据提示“请输入要删除的联系人姓名:”输入联系人的姓名,若该联系人存在于通讯录中,则提示“删除成功”,否则提示“该联系人不在通讯录中”。注意,若通讯录中还没有添加过联系人,提示“通讯录无信息”。
  4. 修改联系人:用户根据提示输入要修改联系人的姓名,之后按照提示“请输入新的姓名:”、“请输入新的手机号:”、“请输入新的邮箱:”、“请输入新的地址:”、分别输入该联系人的新姓名、新手机号、新邮箱、新地址,并打印此时的通讯录信息。注意,若通讯录中还没有添加过联系人,提示“通讯录无信息”。
  5. 查找联系人:用户根据提示“请输入要查找的联系人姓名”输入联系人的姓名,若该联系人存在于通讯录中,则打印该联系人的所有信息,否则提示“该联系人不在通讯录中”。注意,若通讯录中还没有添加过联系人提示“通讯录无信息”。
  6. 退出:退出手机通讯录。

本实例要求编写程序,模拟实现如上所述的手机通讯录。

实例目标

  1. 熟练地创建字典
  2. 掌握字典的基本操作,能添加、修改、删除、查询字典中的元素

实例分析

手机通讯录通常包含多个联系人,每个联系人都包含姓名、手机号、邮箱、地址等基本信息,且这些信息之间是相互对应的,因此这里可将联系人视为包含4个键值对的字典,将通讯录视为一个包含多个字典的数组,将通讯录中新增联系人、删除联系人、修改联系人、查看联系人的功能视为字典的增删改查操作。

根据以上分析可整理出以下基本实现思路:

(1)创建一个空列表,使用该列表存储联系人信息;

(2)打印通讯录的功能菜单;

(3)创建一个空字典,使用该字典存储联系人的姓名、手机号、邮箱和地址信息。

(4)接收用户输入的功能序号,并根据输入的序号执行相应的操作:用户输入“1”执行增加字典元素的操作;用户输入“2”执行查看字典元素的操作;用户输入“3”执行删除字典的操作;用户输入“4”执行修改字典元素的操作;用户输入“5”执行查看字典元素的操作;用户输入“6”执行结束程序的操作。

代码实现

person_info = []

print("=" * 20)

print('欢迎使用通讯录:')

print("1.添加联系人")

print("2.查看通讯录")

print("3.删除联系人")

print("4.修改联系人")

print("5.查找联系人")

print("6.退出")

print("=" * 20)

while True:

    per_dict = {}

    fun_num = input('请输入功能序号:')

    if fun_num == '1':

        per_name = input('请输入联系人的姓名:')

        phone_num = input('请输入联系人的手机号:')

        per_email = input('请输入联系人的邮箱:')

        per_address = input('请输入联系人的地址:')

        # 判断输入的是否为空

        if per_name.strip() == '' or phone_num.strip() == ''

 or per_email.strip() == '' or per_address.strip() == '':

            print('请输入正确信息')

            continue

        else:

            per_dict.update({'姓名': per_name,

                                '手机号': phone_num,

                                '电子邮箱': per_email,

                                '联系地址': per_address})

            person_info.append(per_dict)  # 保存到列表中

            print('保存成功')

    elif fun_num == '2':

        if len(person_info) == 0:

            print('通讯录无信息')

        for i in person_info:

            print('--*' * 6)

            for title, info in i.items():

                print(title + ':' + info)

            print('--*' * 6)

    elif fun_num == '3':  # 删除

        if len(person_info) != 0:

            del_name = input('请输入要删除的联系人姓名:')

            for i in person_info:

                if del_name in i.values():

                    person_info.remove(i)

                    print(person_info)

                    print('删除成功')

                else:

                    print('该联系人不在通讯录中')

        else:

            print('通讯录无信息')

    elif fun_num == '4':  # 修改

        if len(person_info) != 0:

            modi_info = input('请输入要修改的联系人姓名:')

            for i in person_info:

                if modi_info in i.values():

                    # 获取所在元组在列表中的索引位置

                    index_num = person_info.index(i)

                    dict_cur_perinfo = person_info[index_num]

                    for title, info in dict_cur_perinfo.items():

                        print(title + ':' + info)

                    modi_name = input('请输入新的姓名:')

                    modi_phone = input('请输入新的手机号:')

                    modi_email = input('请输入新的邮箱:')

                    modi_address = input('请输入新的地址:')

                    dict_cur_perinfo.update(姓名= modi_name)

                    dict_cur_perinfo.update(手机号= modi_phone)

                    dict_cur_perinfo.update(电子邮箱= modi_email)

                    dict_cur_perinfo.update(联系地址= modi_address)

                    print(person_info)

        else:

            print('通讯录无信息')

    elif fun_num == '5':  # 查找

        if len(person_info) != 0:

            query_name = input('请输入要查找的联系人姓名:')

            for i in person_info:

                if query_name in i.values():

                    index_num = person_info.index(i)

                    for title, info in person_info[index_num].items():

                        print(title + ':' + info)

                    break

            else:

                print('该联系人不在通讯录中')

        else:

            print('通讯录无信息')

    elif fun_num == '6':  # 退出

        break

以上代码首先定义了一个空列表person_info,其次打印了通讯录的功能菜单,以提示用户根据序号选择相应的功能,然后创建一个保存联系人的字典per_dict,并接收用户选择的序号fun_num,最后使用if-elif-else结构处理了不同序号的功能:当fun_num为“1”时调用update()方法更新字典元素;当fun_num为“2”时调用遍历查看字典元素;当fun_num为“3”时将列表person_info中相应的字典删除;当fun_num为“4”时调用update()方法更新字典元素;当fun_num为“5”时遍历查看字典元素;当fun_num为“6”时使用break语句结束程序。

需要注意的是,为保证程序能一直保持运行,这里需要使用死循环进行控制,由用户执行退出通讯录的行为。

代码测试

运行程序,在控制台输入“1”之后的结果如下所示:

====================

欢迎使用通讯录:

1.添加联系人

2.查看通讯录

3.删除联系人

4.修改联系人

5.查找联系人

6.退出

====================

请输入功能序号:1

请输入联系人的姓名:小红

请输入联系人的手机号:123456

请输入联系人的邮箱:123456

请输入联系人的地址:北京

保存成功

在控制台输入“2”之后的结果如下所示:

请输入功能序号:2

--*--*--*--*--*--*

姓名:小红

手机号:123456

电子邮箱:123456

联系地址:北京

--*--*--*--*--*--*

在控制台输入“4”之后的结果如下所示:

请输入功能序号:4

请输入要修改的联系人姓名:小红

姓名:小红

手机号:123456

电子邮箱:123456

联系地址:北京

请输入新的姓名:小兰

请输入新的手机号:12345

请输入新的邮箱:12345@163.com

请输入新的地址:北京

[{'姓名': '小兰', '手机号': '12345', '电子邮箱': '12345@163.com', '联系地址': '北京'}]

在控制台输入“5”之后的结果如下所示:

请输入功能序号:5

请输入要查找的联系人姓名:小红

该联系人不在通讯录中

在控制台输入“3”之后的结果如下所示:

请输入功能序号:3

请输入要删除的联系人姓名:小兰

[]

删除成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高级—约束与关系

🍎道阻且长,行则将至。🍓 目录 一、约束 1.约束的基本概念 2.分类 二、关系 1.一对多 2.多对多 3.一对一 三、多表查询 1.多查 2.连接查询 3.子查询 一、约束 1.约束的基本概念 数据库的表示用来存储数据的,为了保证…

PID控制算法详解

1. 前言 PID 即 Proportional(比例),Integral(积分),Differential(微分)的英文缩写。顾名思义,PID 控制算法是结合比例,积分和微分三种环节于一体的自动控制…

cs231n计算机视觉课程-(数据驱动方法)

姿态、环境、遮挡这些问题算法都因该是robust 课程中提到具体写一个识别猫咪的算法是不稳定的,容易出错的。 所以提出了Data-Driven Approach的方法 一个是训练函数, 这函数接受图片和标签,然后输出标签 另一个则是预测函数,输…

团队管理的七个要点

要掌握团队管理的要点和做好团队管理工作,不是一件容易的事,但也远非想象中那么难。首先,我个人比较推荐所有团队管理者都能阅读下《经理人参阅:团队管理》(注意该书仅可其官网获得)这本佳作。相信会为你带…

vue ssr的hydration问题

我的网站百家饭OpenAPI平台是vuepress写的,前段时间我还写了个专栏讲了vuepress2.0教学。 最开始我们的网站是类似公司网站的情况,以介绍为主,后来又加了一个openapi编辑器,编辑器主要在一个页面里面,vuepress还勉强可…

【Springboot系列】Springboot接管所有Controller,magic-api源码阅读

系列文章地址:Spring Boot学习大纲,可以留言自己想了解的技术点 最近在项目中使用了一个第三方的包 magic-api,节省了很多的时间,整体来说就是只用写sql就好了,不用写service,controller那些,全…

Flink从入门到精通系列(二)

3、Flink 部署 Flink 是一个非常灵活的处理框架,它支持多种不同的部署场景,还可以和不同的资源管 理平台方便地集成。 3.1、快速启动一个 Flink 集群 3.1.1、环境配置 Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境…

IO与NIO区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。 二、NIO和IO的主要区别 下表总结了Java I…

GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。

GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。芯片内集成了一个 4 路单一链路的 MIPI DSI 接收器和 8 路双链路 MIPI DSI 发送器。 接 收 器 每 路 可 以 支 持 到 2.0Gbps/lane , 可 以 最 高 支 持 到…

平面设计软件Corel CDR2023又开始放大招啦,CorelDRAW Graphics Suite 2023有哪些新增功能?

CorelDRAW 2023中文版即将于2023年3月14日,在苏州举行线上直播的2023新品发布会,本次发布会主题为“设计新生力,矢量新未来”。 发布会邀请思杰马克丁公司领导、Corel 中国区总经理分享思杰与 Corel 的合作模式及在 CorelDRAW 产品上推动历程…

JavaEE简单示例——Bean管理

简单介绍: 在这一章节我们会比较详细的介绍我们在之前的测试类中以及Bean管理XML配置文件中所使用到的类和方法,以及XML中配置的属性所代表的详细含义。以及之前我们反复提到但是一直没有详细的讲解的一个东西:容器。我们可以大致的有一个概…

react+antdpro+ts实现企业级项目四:注册页面实现及useEmotionCss的介绍

创建文件路径并注册register路由 在pages/User下创建Register文件夹并创建index.tsx文件 然后在config/routes创建register注册路由。注册完后,当在登陆页面点击注册按钮时就可以跳转到此注册页面而不会报404了。 export default [{path: /user,layout: false,rou…

PaddleOCR关键信息抽取(KIE)的训练(SER训练和RE训练)错误汇总

1.SER训练报错: SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception 1.1.问题描述 在执行训练任务的时候报错 单卡训练 python3 tools/train.py -c train_data/my_data/ser_vi_layoutxlm_xfund_zh.yml错误信息如下: T…

初识C++需要了解的一些东西(1)

目录🥇命名空间🏅存在原因🏵命名空间定义🎧命名空间的3种使用方式🏆C输入和输出🌝缺省参数🌜缺省参数概念⭐️缺省参数分类☀️函数重载🔥引用🌚引用概念🌓引…

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组,并输出它的长度。 示例 1: 输入&am…

记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网站效果演示:ashuai.work:8888/#/myLoad GitHub仓库地址代码:github.com/shuirongshu… 加载中思路分析 实现加载中效果,一般有两种方式: 第一种是:搞一…

双馈风力发电机-900V直流混合储能并网系统MATLAB仿真

MATLAB2016b主体模型:双馈感应风机模块、采用真实风速数据。混合储能模块、逆变器模块、转子过电流保护模块、整流器控制模块、逆变器控制模块。直流母线电压:有功、无功输出(此处忘记乘负一信号输出),所以是负的。蓄电…

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出,他们因在模型检查领域的贡献而获得了2007年的…

无监督循环一致生成式对抗网络:PAN-Sharpening

Unsupervised Cycle-Consistent Generative Adversarial Networks for Pan Sharpening (基于无监督循环一致生成式对抗网络的全色锐化) 基于深度学习的全色锐化近年来受到了广泛的关注。现有方法大多属于监督学习框架,即对多光谱&#xff0…

【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建

【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建项目的逐步细分配置git环境创建项目后端前后端不分离写法-url访问路径解析资源安装vuevue文件后端解析数据发送到前端页面解析出来项目的逐步细分 匹配界面:需要用微服务实况直播&#xff1…