Agenda telefonica con dizionario

Forum dedicato ai gruppi di studio di debianizzati.org

Agenda telefonica con dizionario

Messaggioda amosse » 06/06/2011, 23:30

Ciao a tutti

Sto cercando di implementare un piccolo modulo per la gestione di un'agenda telefonica tramite l'uso di un dizionario, su un'idea di risca che aveva proposto come esercizio.
Sono riuscito ad implementare una parte del compito, anche se su alcune funzioni ho ancora dei problemi.

Di seguito il modulo:

Codice: Seleziona tutto
#!/usr/bin/env python3

# Nominativi presenti in agenda:
agenda = {'nando': '100', 'naima': '101', 'amos': '102', 'antonio': '103'}

def menu():
    """È il menu principale con cui l'utente si interfaccia. Deve permettere
di decidere cosa fare: Inserimento, Visualizzazione, Trova, Modifica, Cancellazione, Uscita"""
    funzioni_menu = {'Inserimento': 'I', 'Visualizzazione agenda': 'L', 'Trova nominativi': 'F', 'Modifica': 'M', 'Cancellazione': 'C', 'Uscita': 'E'}
    while True:
        print('Menu Agenda -> ',funzioni_menu)
        scelta_menu = input('Prego selezionare una funzione : > ')
        if scelta_menu.upper() == 'E':
            exit("Arrivederci")
        elif scelta_menu.upper() == 'I':
            add_user()
        elif scelta_menu.upper() == 'L':
            list_user()
        elif scelta_menu.upper() == 'M':
            modify_user()
        elif scelta_menu.upper() == 'C':
            erase_user()
        elif scelta_menu.upper() == 'F':
            find_user()
        else:
            print()
            print('Attenzione! la scelta non è comprensibile')
            print()


def list_user():
    """Stampa a video id, nominativo, n° telefonico di tutti gli utenti"""
    print()
    #Id = 0 # in alternativa della funzione enumerate()
    for k,v in enumerate(agenda.items(),1):
        #Id += 1 # in alternativa della funzione enumerate()
        print(k,v)
    print()


def find_user():
    """Stampa a video id, nominativo, n° telefono che
iniziano con il carattere/i indicato/i dall'utente. Segnala se
non esistono nominativi con il/i carattere/i selezionato/i o se non
viene digitato alcun carattere"""
    while True:
        print()
        find_k = input('Inserisci le iniziali del nome (X:menu agenda) > ')
        if find_k.upper() == 'X':
            print()
            break
        elif find_k == '':
            print('Attenzione! Non hai digitato alcun carattere')
        else:
            Id = 1
            for k in agenda:
                if k.startswith(find_k):
                    print(Id,k,agenda[k])
                    Id += 1
                    # break
            else:
                print('Non è stato trovato alcun nominativo con le iniziali date')

         
def add_user():
    """Permette di inserire nuovi nominativi con relativo n° telefonico.
Segnala se il nominativo o n° telefonico digitato è già presente in agenda,
segnala se non vengono digitati entrambi i dati (Nome, n° telefono) o solo uno dei due"""
    while True:
        print()
        user = input('Inserisci il nome (X:menu agenda) > ')
        if user.upper() == 'X':
            print()
            break
        number = input('Inserisci il numero di telefono (X:menu agenda) > ')
        if number.upper() == 'X':
            print()
            break
        if user and number:
            if user in agenda:
                print('Il nomimativo inserito è già presente')
            elif number in agenda.values():
                print('Il numero inserito è già presente')
            else:
                print('Hai inserito i seguenti dati: ', end='')
                print('Nome: ',user,'','Numero: ',number)
                insert = input('Digitare "Y" per inserire i dati > ')
                if insert.upper() == 'Y':
                    agenda[user] = number
        else:
            print('Devi inserire entrambi i dati')


def modify_user():
    pass


def erase_user():
    pass


if __name__ == '__main__':
    menu()


Chiedo se qualche utente più esperto possa fornire qualche suggerimento ai seguenti quesiti:
list_user()
Nel caso siano presenti molti nominativi, come posso dare all'utente la possibilità di visualizzare una pagina (a video) alla volta, premento spazio o invio si passa alla successiva.
find_user()
Non riesco ad impedire di far leggere l'else alla fine del ciclo for in caso vengano trovati nominativi con i caratteri dati, ho provato con break ma non funziona (visualizza solo il primo dei due nominativi con i caratteri dati).

Ciao e grazie per l'attenzione.


ps: ho caricato lo stesso file anche su Gobby, agenda2.py
amosse
Full Member
Full Member
 
Messaggi: 179
Iscritto il: 18/02/2009, 16:06
Località: Castelfiorentino (FI)

Re: Agenda telefonica con dizionario

Messaggioda Risca » 09/06/2011, 14:20

Ciao, per maggiori dettagli guarda su Gobby.

Sono contento che tu abbia portato avanti il progetto, è un ottimo esercizio, davvero!

Complimenti per la funziona enumerate(), non la conoscevo e come l'hai utilizzata mi sembra molto elegante.


Risolto il problema dell'else. Ovviamente forse potrebbe essere possibile scrivere qualcosa di più elegante. In alternativa sarebbe possibile anche sostituire la mia modifica con l'uso di any() con qualcosa che faccia uso di una variabile di controllo:
Codice: Seleziona tutto
sono state trovate x ricorrenze
se x < 0 allora...


Una cosa importante sarebbe, quando di finiranno anche le rimanenti funzioni, si inserirci una interfaccia grafica. Siamo pronti per le QT? (o GTK)
Avatar utente
Risca
e-zine member
e-zine member
 
Messaggi: 2011
Iscritto il: 09/02/2009, 11:37
Località: Torino-Milano


Torna a Accademia debianizzata

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite