Homework 6

Vedi anche DomandeHomework6aa0203, SoluzioneHomework6aa0203, RisultatiHomework6aa0203.

Obiettivi

  • usare le struct, enum e union
  • approfondire la conoscenza della scanf

Svolgimento

Implementare un programma C che realizzi una rubrica telefonica:
  • la rubrica può contenere al massimo 20 voci
  • ogni voce contiene:
    • Nome (una stringa di max 30 caratteri)
    • Cognome (una stringa di max 30 caratteri)
    • Data di nascita formata da
      • Giorno (da 1 a 31)
      • Mese (da 1 a 12)
      • Anno (4 cifre)
    • email/telefono questa parte della voce può contenere in alternativa:
      • l'indirizzo email (una stringa di max 50 caratteri)
      • altrimenti il numero di telefono diviso in:
        • prefisso internazionale (max 3 cifre)
        • prefisso (max 5 cifre)
        • numero (max 10 cifre)

Input e Output

Il programma deve accettare i seguenti comandi letti da stdin uno per riga:
  • fine esce dal programma
  • add <nome> <cognome> <data> tel <tel>
    • se c'e' spazio aggiunge una nuova voce con numero di telefono (e senza email)
    • altrimenti stampa la parola piena
  • add <nome> <cognome> <data> email <email>
    • se c'e' spazio aggiunge una nuova voce con email (e senza numero di telefono)
    • altrimenti stampa la parola piena
  • del <nome> <cognome>
    • se esistono voci con lo stesso <nome> e <cognome> le cancella
    • altrimenti stampa la parola nessuna
  • print stampa tutto il contenuto della rubrica come una tabella le cui colonne sono, nell'ordine:
    1. Nome (giustificato a destra)
    2. Cognome (giustificato a destra)
    3. Data di nascita (nel formato gg-mm-aaaa)
    4. Telefono oppure email (giustificato a sinistra)
    • le colonne debbono essere larghe quanto i campi corrispondenti della definizione (p.es. Nome va in un campo largo 30)
    • le colonne devono essere precedute, separate e seguite dal carattere '|'
    • non mettete nessuna riga di intestazione alla tabella!
  • prox <giorno>-<mese> stampa le righe della tabella delle persone che compiono gli anni il giorno <giorno>-<mese> (attenti al '-' tra i due numeri)
    • se nessuna persona compie gli anni in tale giorno si stampi la/le prima/e persona/e che compie/ono gli anni dopo il <giorno>-<mese>
      • (ovvero si cerchi il primo <giorno>-<mese> successivo e si stampino tutti quelli che che compiono gli anni in quel giorno)
    • notate che dopo il 31 dicembre viene il 1° gennaio (considerate l'anno circolare)

  • il formato delle <date> è gg-mm-aaaa [ corretto, mi ero dimenticato una a ]
  • il formato dei numeri di <telefono> è ---+<int>-<pref>-<num>, ovvero 3 numeri separati dal carattere '-' (meno) e preceduti dal '+' (più)
  • i <nomi> oppure <cognomi> che contengono spazi dovranno essere racchiusi tra doppi apici " (solo per l'input)

ATTENZIONE: quando scrivo <nome> NON DOVETE INSERIRE < e > !

  • Andrea è giusto
  • <Andrea> è SBAGLIATO!

NOTA: è possibile aggiungere più schede con lo stesso <nome> e <cognome>

Esempio di Input

Esempio di una sequenza di comandi:
add Andrea Sterbini 02-02-1961 email sterbini@dsi.uniroma1NOSPAM.it
add "Pao Lino" "Pape Rino" 13-11-1917 tel---+1-212-555666
print
del Ciccio Franco
del "Pao Lino" "Pape Rino"
print
del Franco Ciccio
add Andrea Sterbini 02-02-1961 tel---+39-06-49918538
print

Esempio di Output

Esempio di output stampato dalla sequenza di cui sopra in cui ho sostituito gli spazi con punti (per evitare problemi con twiki):
|........................Andrea|......................Sterbini|02-02-1961|sterbini@dsi.uniroma1NOSPAM.it....................|
|......................Pao Lino|.....................Pape Rino|13-11-1917|---+1-212-555666.....................................|
nessuna
|........................Andrea|......................Sterbini|02-02-1961|sterbini@dsi.uniroma1NOSPAM.it....................|
nessuna
|........................Andrea|......................Sterbini|02-02-1961|sterbini@dsi.uniroma1NOSPAM.it....................|
|........................Andrea|......................Sterbini|02-02-1961|---+39-06-49918538...................................|

ATTENTI! nel vostro output NON sostituite gli spazi con punti!

Note (vedi anche DomandeHomework6aa0203)

Per evitare difformità di implementazione (e quindi output che non potrei correggere):
  • aggiungete una nuova voce dopo le altre (oppure ricompattate la rubrica dopo ogni cancellazione)
  • attenti nella memorizzazione del prefisso telefonico, che potrebbe iniziare con '0' (zero)

Suggerimenti (inutili?)

Vi consiglio di usare:
  • struct per rappresentare: una voce, una data, un numero di telefono
  • union per la parte che contiene il telefono oppure l'email
    • vi servirà anche qualcosa che vi dica se ciò che segue è l'email o il telefono)
  • enum per i giorni dei mesi e per i mesi

Facoltativo

Si accettino inoltre i seguenti comandi:
  • sort nome si ordini la rubrica in ordine alfabetico crescente di nome
  • sort cognome si ordini la rubrica in ordine alfabetico crescente di cognome
  • sort compleanno si ordini la rubrica in ordine crescente di <mese> e <giorno>
  • Gestione errori
    • stampare data errata se la data o il giorno del compleanno sono errati
    • stampare email errata se la email non ha il formato <username>@<dominio>.<tld>
    • stampare tel errato se il numero di telefono non segue il formato dato

(E' chiaro che, una volta ordinata la rubrica, una stampa produrrà una tabella ordinata)

Consegna

Si consegni l'esercizio:
  • entro le ore 24:00 di lunedì 2 Dicembre 2002
  • esclusivamente usando la form di consegna
  • non saranno accettate consegne via email.

-- AndreaSterbini - 20 Nov 2002 6

Edit | Attach | Watch | Print version | History: r10 < r9 < r8 < r7 < r6 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r10 - 2003-09-30 - AndreaSterbini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback