A última pergunta do exame Python Nível 2 geralmente é a pergunta final, que é difícil e tem uma pontuação alta. Esta questão é geralmente dividida em 1 a 3 questões, e somente vencendo cada etapa podemos resolvê-la melhor. Ao se deparar com esse tipo de problema, antes de tudo, não tenha medo, são necessários alguns passos para resolvê-lo. Hoje temos uma questão de gerenciamento de catálogo de endereços para explicar:
1. Tópicos
Use dicionários e listas para completar o gerenciamento das agendas dos alunos. A lista é fornecida pelo arquivo address.txt, e cada linha é uma informação do aluno. Os exemplos são os seguintes:
学号,姓名,电话号码,地址
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)
Questão 1: Modifique P301-1.py para exibir o menu de funções na tela. O exemplo do menu de funções é o seguinte:
1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字 1-3 选择功能:
Insira a função de seleção de número 1-3 ( requisito: nenhuma entrada de número de ponto flutuante é permitida ): aceite a função de seleção de número de entrada do usuário, se a entrada estiver errada, o usuário deverá reinserir. Se a entrada estiver correta, a instrução de prompt será exibida na tela: 您选择了功能1/2/3
. (5 pontos)
Pergunta 2: Modifique P301-2.py Com base no código da pergunta 1, quando o usuário selecionar 1, leia as informações do arquivo do catálogo de endereços e exiba todas as informações. (5 pontos) Um exemplo é o seguinte:
1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字1-3选择功能:1
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)
Pergunta 3: Modifique P301-3.py Com base no código da pergunta 2, quando o usuário selecionar 2, deixe o usuário inserir as informações do aluno no teclado, separadas por vírgulas. Escreva as informações no arquivo new_address.txt, o formato do arquivo é o mesmo que address.txt. (10 pontos) O exemplo de conteúdo de new_address.txt é o seguinte:
101,aa,12345678,Beijing
102,bb,23456781,shanghai
103,cc,34567,tianj
Exemplo 1 :
输入: "1"
"1"
"2"
"103,cc,34567,tianj"
输出: 内容输出到 new_address.txt 文件中
2. Etapas da solução
1. Solução para o Problema 1
Exemplo:
menu=["1. 显示所有信息","2. 追加信息","3. 删除信息"]
...
ch = int(input("请输入数字1-3选择功能:") )
...
print("您选择了功能", ch)
Solução: Use o sinalizador para definir uma chave, quando seu valor for 1, significa ligado, e quando for 0, significa desligado.
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
O loop acima é loop while. Quando o sinalizador especificado é 1, o programa continua em loop. Quando o sinalizador é 0, o programa para de executar. Use try...except para capturar exceções e use if para julgar o tamanho de num.
2. Solução do problema 2
Com base na pergunta 1, é adicionada uma função de impressão de todos os catálogos de endereços. Podemos definir uma função chamada display que é chamada quando 1 é inserido. Observe que a função deve ser escrita na frente do loop while, caso contrário ela não pode ser chamada.
def display():
with open("address.txt",'r',encoding='utf-8') as f:
for fi in f:
print(fi,end="")
Código original:
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 ()
No código oficial, o julgamento if final é escrito fora do loop while, mas deve ser escrito dentro após o teste, conforme mostra a figura a seguir:
3. Solução do Problema 3
Também precisamos definir outra função de inserção, que aceita os caracteres inseridos na tela e os anexa à lista com append e, em seguida, os escreve em new_address.txt com um loop for.
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()
O código acima usa o código escrito por mim, o seguinte é o código oficial:
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()
A forma de escrever fo no código oficial deve ser w+, se for w, será reportado um erro caso o arquivo não exista. la.append(l.replace('\n','')) Esta etapa parece inútil. Só preciso adicionar um [\n] ao anexar e, em seguida, usar a gravação para escrever diretamente. A própria nova linha vem com ela mesma, portanto, não há necessidade de descartar.
3. Reflexão pós-escolar
- A solução oficial requer uma compreensão profunda de seus princípios, e o algoritmo pode ser ainda mais otimizado e aprimorado com base na compreensão.
- Existem muitas maneiras de lidar com \n, como str.strip() pode remover novas linhas, usar print(string,end="\n") para adicionar novas linhas e assim por diante.