Python二级综合应用题:通讯录管理

Python二级考试中的最后一题一般是压轴题,有一定的难度,而且分值也高。此题一般分为1~3个问题,步步为赢,才能更好地解决。遇到这种问题,首先是不要怕,能解决几步是几步。今天我们一个通讯录管理题来说明一下:

一、题干

使用字典和列表完成学生通讯录管理,名单由文件 address.txt 给出,每行是一个学生的信息。示例如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

学号,姓名,电话号码,地址
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)

问题1:修改P301-1.py,在屏幕上显示功能菜单,功能菜单示例如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字 1-3 选择功能:

请输入数字 1-3 选择功能(要求:不允许浮点数输入):接收用户输入数字选择功能,如果输入错误,要求用户重新输入。如果输入正确,在屏幕上显示提示语句:您选择了功能1/2/3。(5分)‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

问题2:修改P301-2.py,在问题1的代码基础上,当用户选择1的时候,从通讯录文件读取信息,并显示所有信息。(5分) 示例如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字1-3选择功能:1
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)

问题3:修改P301-3.py ,在问题2的代码基础上,当用户选择2的时候,让用户从键盘输入一个学生的信息,用逗号隔开。将信息写入文件 new_address.txt 中,文件格式与 address.txt 相同。(10分) new_address.txt 内容示例如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

101,aa,12345678,Beijing
102,bb,23456781,shanghai
103,cc,34567,tianj

示例1:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

输入: "1"
     "1"
     "2"
     "103,cc,34567,tianj"
输出: 内容输出到 new_address.txt 文件中

二、解决步骤

1. 问题一的解决

样例:

menu=["1. 显示所有信息","2. 追加信息","3. 删除信息"]
...
        ch = int(input("请输入数字1-3选择功能:") )
...
print("您选择了功能", ch)

解决:用flag定义一个开关,其数值为1时表示开,0表示关。

menu = ["1.显示所有信息","2.追加信息","3.删除信息"]
flag = 1
while flag:
    for m in menu:
        print(m)
    try:
        num = int(input("请输入数字1-3选择功能:")) #将获取的字符型数字转化为数字
        if num ==1:
            flag = 0
    except:
        flag = 1
        
    if num<1 or num >3:
        flag = 1

以上通过while来进行循环,指定flag为1时程序不断循环,flag为0时,程序停止运行。用try...except捕获异常,通过if来判断num的大小。

2. 问题二的解决

在问题一的基础上,增加了一个打印所有通讯录的功能。我们可以定义一个名为display的函数,当输入1时就调用这个函数。注意要把函数写在while循环的前面,否则无法调用。

def display():
    with open("address.txt",'r',encoding='utf-8') as f:
        for fi in f:
            print(fi,end="")

原代码:

def display():
    fi = open("address.txt", 'r')
    for line in fi:
        print(line,end="")
    fi.close()
    
menu = ["1. 显示所有信息", "2. 追加信息", "3. 删除信息"]
flag = 1
while flag:
    
    for m in menu:
        print(m)
        flag = 0
    try:
        print("请输入数字1-3选择功能:")
        ch = int(input())
        flag = 0
    except:
        flag = 1
    if flag <1 or flag >3:
        flag = 1
    elif ch == 1:
        display ()

官方给出的代码中,最后的if判断写在了while循环的外面,但经过测试应该写在里面,如下面图所示:

3. 问题三的解决

我们还需要另外定义一个插入函数,接受屏幕输入的字符后用append追加到列表中,再用for循环写入到new_address.txt中。

def display():
    fi = open("address.txt", 'r')
    for line in fi:
        print(line,end="")
    fi.close()

def insertrec(text):
    with open("address.txt",'r',encoding='utf-8') as file:
        newline = file.readlines()
        newline.append(text+"\n")
        with open("new_address.txt","w+",encoding='utf-8') as newfile:
            for line in newline:
                newfile.write(line)    

menu = ["1. 显示所有信息", "2. 追加信息", "3. 删除信息"]
flag = 1
while flag:
    for m in menu:
        print(m)
        flag = 0
    try:
        print("请输入数字1-3选择功能:")
        ch = int(input())
        flag = 0
    except:
        flag = 1
    if flag <1 or flag >3:
        flag = 1
    elif ch == 1:
        display ()
    elif ch == 2:
        insertrec()

以上代码中采用的是我自己编写的代码,下面是官方的代码:

def insertrec():
   fi = open("address.txt",'r')
   fo = open("new_address.txt",'w')
   la=[]
   for l in fi:
       la.append(l.replace('\n',''))
   print("请输入要插入的信息,以逗号隔开,示例:103, cc, 34567812, tianjing:")
   rec = input()
   la.append(rec)
   for l in la:
       fo.write(l)
       fo.write('\n')
   fi.close()
   fo.close()

官方代码中fo写入的方式应该是用w+,如果是w,则如果文件不存在就会报错。 la.append(l.replace('\n',''))这一步看似没有什么用。我只用在append时加入一个【\n】,再用write直接写入就可以了,本身就自带了换行,就不用再折腾了。

三、学后反思

  1. 官方给出的解法要深刻理解其原理,在理解的基础上可以进一步优化和改进算法。
  2. 对于\n的处理可以有多种方法,如str.strip()可以去掉换行,用print(string,end="\n")添加换行等等。

猜你喜欢

转载自blog.csdn.net/henanlion/article/details/131274206
今日推荐