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.

01.def gera_carta(carta,clientes):
02.    """
03.    carta = texto geral da carta, num ficheiro.
04.    clientes = dicionário com os dados dos clientes.
05.    nome, data de nascimento (dd/mm/aaaa), morada, telefone
06.    """
07.    PREFIXO = '/tempo/data/'
08.    # lê carta
09.    f_in = open(carta,'r')
10.    texto_carta = f_in.read()
11.    f_in.close()
12.    # filtra clientes
13.    lista_clientes = [(nome_cliente(cliente),morada_cliente(cliente)) for cliente in clientes.values() if (ano_cliente(cliente) < 1974)]
14. 
15.    for numero in range(len(lista_clientes)):
16.        # processa
17.        saudacao = 'Caro(a)'
18.        nome = lista_clientes[numero][0]
19.        morada = lista_clientes[numero][1]
20.        preambulo = saudacao+' '+nome + '\n' + morada + '\n\n'
21.         
22.        f_out = open(PREFIXO+nome+str(numero)+'.txt','w')
23.        f_out.write(preambulo)
24.        f_out.write(texto_carta)
25.        f_out.close
26. 
27. 
28.  
29.def dados(cliente):
30.    nome,data,morada,telefone = cliente
31.    dia, ano, mes = data.split('/')
32.    return (nome, (int(dia),int(ano),int(mes)),morada, int(telefone))
33. 
34.def ano_cliente(cliente):
35.    dados_cliente = dados(cliente)
36.    ano = dados_cliente[1][2]
37.    return ano
38. 
39.def nome_cliente(cliente):
40.    dados_cliente = dados(cliente)
41.    nome = dados_cliente[0]
42.    return nome
43. 
44.def morada_cliente(cliente):
45.    dados_cliente = dados(cliente)
46.    morada = dados_cliente[2]
47.    return morada
48. 
49.if __name__ == '__main__':
50.    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')}
51.    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