---++ Homework 6 Vedi anche DomandeHomework6aa0203, SoluzioneHomework6aa0203, RisultatiHomework6aa0203. ---- %TOC% ---- ---+++ 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* %RED%uno per riga%FINE%: * *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) 1 Cognome (giustificato a destra) 1 Data di nascita (nel formato *gg-mm-aaaa*) 1 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* %RED% _[ corretto, mi ero dimenticato una *a* ]_ %FINE% * 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 =="== (%RED%solo per l'input%FINE%) 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: <verbatim> 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 </verbatim> ---++++ 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): <verbatim> |........................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...................................| </verbatim> __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 [[http://twiki.dsi.uniroma1.it/~andrea/consegna.html][form di consegna]] * non saranno accettate consegne via email. -- Users.AndreaSterbini - 20 Nov 2002 6
This topic: Programmazione1/AA0506/PZ
>
WebHome
>
HomeWork6aa0203
Topic revision: r10 - 2003-09-30 - AndreaSterbini
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback