domingo, 15 de novembro de 2009

Problema 6.18

A partir de um ficheiro com informação sobre clientes, e de uma carta circular, como gerar cartas para clientes que satisfazem determinado critério? Eis uma solução possível.


def gera_carta(carta,clientes):
"""
carta = texto geral da carta, num ficheiro.
clientes = dicionário com os dados dos clientes.
nome, data de nascimento (dd/mm/aaaa), morada, telefone
"""
PREFIXO = '/tempo/data/'
# lê carta
f_in = open(carta,'r')
texto_carta = f_in.read()
f_in.close()
# filtra clientes
lista_clientes = [(nome_cliente(cliente),morada_cliente(cliente)) for cliente in clientes.values() if (ano_cliente(cliente) < 1974)]

for numero in range(len(lista_clientes)):
# processa
saudacao = 'Caro(a)'
nome = lista_clientes[numero][0]
morada = lista_clientes[numero][1]
preambulo = saudacao+' '+nome + '\n' + morada + '\n\n'

f_out = open(PREFIXO+nome+str(numero)+'.txt','w')
f_out.write(preambulo)
f_out.write(texto_carta)
f_out.close



def dados(cliente):
nome,data,morada,telefone = cliente
dia, ano, mes = data.split('/')
return (nome, (int(dia),int(ano),int(mes)),morada, int(telefone))

def ano_cliente(cliente):
dados_cliente = dados(cliente)
ano = dados_cliente[1][2]
return ano

def nome_cliente(cliente):
dados_cliente = dados(cliente)
nome = dados_cliente[0]
return nome

def morada_cliente(cliente):
dados_cliente = dados(cliente)
morada = dados_cliente[2]
return morada

if __name__ == '__main__':
clientes = {100:('Ernesto','15/06/1953','F 26','239790019'),101:('Joana','29/09/2001','A 15','239700400'),102: ('Lurdes','17/06/1913','G 30','808242424'),103:('Daniela','31/03/2002','F 16','239400400')}
gera_carta('/tempo/data/carta.txt', clientes)


O que é que esta solução tem de especial? Bem, desde logo a sua estrutura lógica: primeiro lemos a carta, depois seleccionamos os clientes e, finalmente, geramos as cartas personalizadas. São possíveis muitas variantes à solução apresentada. Fica para a imaginação e implementação do leitor. Um outro aspecto digno de relevo foi o recurso à abstracção e modularização. Esse aspecto está evidenciado no conjunto de operações que acedem aos dados do cliente. Caso decidamos alterar a representação dos dados do cliente, basta apenas alterar estas operações não sendo necessário mexer no resto do programa. Isto é uma gande vantagem!

Sem comentários:

Enviar um comentário