Salta ai contenuti. | Salta alla navigazione

Strumenti personali

14 gennaio 2016

Fondamenti di Informatica - Compito A

Prof. Marco Gavanelli

14 gennaio 2016

Esercizio (punti 16)

Si desidera avere un programma C che legge una data da tastiera e la stampa con tre numberi interi separati dalla barra. Più in dettaglio, la data in ingresso è una struttura (che chiameremo struttura in ingresso); deve essere inserita dall'utente da tastiera con i seguenti campi:

  • giorno: intero
  • mese: stringa
  • anno: intero

L'utente è libero di scrivere la data inserendo il mese in diversi modi. Ad esempio, se vuole inserire la data del 1 maggio 2016 può scriverla in uno dei seguenti modi:

  • 1 5 2016
  • 1 mag 2016
  • 1 maggio 2016

Tutti e tre i modi sono da considerarsi equivalenti; in tutti e tre i casi dell'esempio, il programma dovrà produrre una struttura contenente tre interi (che chiameremo struttura in uscita) e visualizzare i tre interi separati da barre, cioè

1/5/2016

Si noti che il mese può essere inserito da tastiera

  • in forma numerica (nel caso del mese di maggio, quindi, il programma riceve da tastiera la stringa "5" ),
  • oppure inserendo il nome completo del mese, dato in minuscolo (ad es. la stringa "maggio" ),
  • oppure inserendo le prime 3 lettere del mese, sempre in minuscolo (ad es. "mag" ).

Si noti che NON bisogna mostrare un menù per chiedere all'utente in quale dei tre formati vuole inserire la data: il programma deve leggere da tastiera solo ed esclusivamente i tre campi che costituiscono la data: giorno, mese ed anno. Il mese viene letto da tastiera come stringa; il programma, a seconda della stringa che l'utente ha inserito, dovrà interpretare il mese in forma corretta. In altre parole, l'utente inserisce una stringa, poi sarà compito del programma verificare se ha inserito "5", "mag" o "maggio" e produrre in ogni caso l'intero 5.

Per fare questo, viene fornito un file di testo  mesi.txt ; per ciascun mese il file mesi.txt contiene

  • numero: stringa contenente al massimo 2 caratteri, più il terminatore
  • nome: stringa contenente al massimo 9 caratteri, più il terminatore

Nel file, i mesi sono in ordine da gennaio a dicembre.

Si organizzi il programma come segue:

  1. nel main , si invochi una procedura o funzione di lettura del file mesi.txt (da sviluppare nel punto 2); si legga da tastiera una struttura data nel formato di ingresso, si invochi una procedura/funzione che converte la data in una struttura di 3 interi (da sviluppare al punto 3), infine si stampino i 3 interi separati dalle barre.
  2. Si scriva la procedura o funzione di lettura; essa legge il file mesi.txt , ne porta il contenuto in un opportuno array di strutture e visualizza tale array.
  3. Si scriva una procedura/funzione che prende come parametri
    • una data nel formato di ingresso
    • l'array letto al punto 2
    più, eventualmente, altri parametri, e fornisce al main una data nel formato di uscita. Per fare questo, invoca una procedura o funzione che converte il mese in numero intero (da sviluppare al punto 4)
  4. Si scriva una procedura/funzione che prende come parametri
    • una stringa che rappresenta il mese, come inserito dall'utente
    • l'array letto al punto 2
    e fornisce il numero corrispondente al mese dato. Dovrà quindi cercare se la stringa inerita dall'utente compare nell'array in uno dei due campi (eventualmente, con il nome abbreviato) e fornire l'indice in cui si trova quel mese nell'array
    Ad esempio, se l'utente ha inserito la stringa "5", questa verrà trovata nel primo campo della struttura {"5","maggio"}, che è nella posizione 4 dell'array (se si cominciano ad inserire i mesi a partire dalla posizione 0 dell'array). A questo punto, è sufficiente calcolare 4+1 per trovare il numero del mese come intero.
    Se, invece, l'utente ha inserito la stringa "maggio", questa verrà trovata nella stessa struttura {"5","maggio"}, nel secondo campo. Se, invece, ha inserito "mag" si dovranno confrontare le prime 3 lettere del nome del mese trovato nell'array.

È indispensabile organizzare opportunamente il programma in procedure e funzioni; è quindi altamente consigliabile aggiungere altre procedure/funzioni oltre a quelle indicate esplicitamente nel testo.

Esercizio 2 (punti 4)

Si desidera ora stampare la data in uscita in un formato definito dall'utente. Si legga da tastiera una stringa F che rappresenta il formato richiesto dall'utente (che non può contenere spazi). Il programma dovrà stampare la stringa F , sostituendo però le seguenti sequenze di caratteri:

  • g : il carattere 'g' va sostituito col giorno, stampato come numero
  • m : un carattere 'm' singolo va sostituito col mese stampato come numero
  • mm : due caratteri 'm' consecutivi vanno sostituiti con le prime 3 lettere del nome del mese
  • mmm : tre caratteri 'm' consecutivi vanno sostituiti con il nome del mese
  • a : un singolo carattere 'a' va sostituito con le ultime due cifre dell'anno
  • aa : due caratteri 'a' consecutivi vanno sostituiti con l'anno

Ad esempio, se la data inserita è 1 maggio 2016

  • se la stringa formato è "g/m/a" , il programma stamperà 1/5/16
  • se la stringa formato è "mmm-aa-g" , il programma stamperà maggio-2016-1

È indispensabile organizzare il programma in opportune procedure e/o funzioni.

Si consegnino i file:

  • un file COGNOME.c (dove COGNOME va sostituito col cognome dello studente) che contiene il main e le funzioni usate solo nell'esercizio base
  • un file facoltativo.c che contiene il main e le funzioni usate solo nell'esercizio 2
  • un file funzioni.c che contiene le funzioni comuni

più tutti i file header ritenuti necessari.

Nella correzione, il docente creerà due progetti:

  • in uno, inserirà i file COGNOME.c e funzioni.c . L'eseguibile che viene creato dovrà risolvere l'esercizio 1.
  • nell'altro, inserirà i file facoltativo.c e funzioni.c . L'eseguibile che viene creato dovrà risolvere l'esercizio 2.