SOLUZIONE DI RIFERIMENTO in C.
Transcript
SOLUZIONE DI RIFERIMENTO in C.
Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni Avvertenze • • • • • • Usare ESCLUSIVAMENTE penne ad inchiostro nero o blu (NO MATITE). Consegnare solo fogli formato A4 scritti da solo da un lato se si vogliono avere le fotocopie del compito. In testa a ciascun foglio scrivere: cognome, nome, numero progressivo di pagina rispetto al totale, tipo di compito (C)/(C++); esempio per il secondo foglio di 3 consegnati: Giuseppe Russo 2/3 Mantenere sul banco il libretto o altro documento di riconoscimento fino a controllo avvenuto Nient’altro deve trovarsi sul banco: non è consentito consultare libri, dispense, appunti, ecc. La correzione di riferimento per l’autovalutazione verrà fornita sul sito internet del Corso Prova Scritta del 08/11/10 La figura riporta un'icona. Si tratta di una "matrice" di 10 x 10 pixels su 3 piani di colore: Red, Green e Blue (RGB). Una maniera abbastanza intuitiva per rappresentarla è quella di utilizzare una matrice 10 x 10 di strutture con tre campi di tipo "char", dove il codice ISO_8859 del primo carattere rappresenta il grado di rosso, il secondo il grado di verde ed il terzo il grado di blu. Nel caso dell'icona rappresentata in figura, la matrice è la seguente: eAZ FzA FzA FzA FzA FzA FzA FzA eAZ eAZ eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA eAZ FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA eAZ FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ Ciò premesso, si lavori al seguente progetto: a) Caricare da file di testo l'immagine su cui lavorare (il nome del file va fornito da tastiera); b) Specchiare la metà sinistra sulla metà destra e stampare a video l'immagine modificata; c) Ruotare l'immagine di partenza di 180 gradi in senso antiorario e stampare a video l'immagine ruotata; d) Stampare a video l'immagine; e) Salvare su file di testo l'ultima versione dell'immagine (il nome del file va fornito da tastiera); f) Uscire dal menù. Nel caso si inserisca una lettera diversa da: a,b,c,d,e,f il programma dovrà scrivere un messaggio di errore e richiedere nuovamente il Menù. 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected] Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni Una possibile esecuzione potrebbe essere (in grassetto sono indicati i valori forniti da tastiera !!!): MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: a Scrivi il nome del file contenente l'immagine da caricare: prova.txt Immagine caricata dal file prova.txt MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: k Hai inserito un carattere non consentito !!! MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: d L'immagine è: eAZ FzA FzA FzA FzA FzA FzA FzA eAZ eAZ eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA eAZ FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA eAZ FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: c 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected] Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni L'immagine ruotata di 180 gradi è la seguente: eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA eAZ FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA eAZ FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ eAZ eAZ FzA FzA FzA FzA FzA FzA FzA eAZ MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: b L'immagine specchiata è la seguente: eAZ FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA eAZ FzA FzA FzA FzA eAZ FzA FzA FzA FzA FzA eAZ FzA FzA eAZ FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA FzA eAZ FzA FzA eAZ FzA FzA FzA FzA FzA eAZ FzA FzA FzA FzA eAZ FzA FzA eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ eAZ eAZ FzA FzA FzA FzA FzA FzA eAZ eAZ MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: e Scrivi il nome del file su cui salvare l'immagine: prova2.txt Immagine salvata sul file prova2.txt MENU' a) CARICA DA FILE L'IMMAGINE b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO d) STAMPA A VIDEO L'IMMAGINE ORIGINALE 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected] Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni e) SALVA SU FILE L'IMMAGINE f) ESCI Scelta: f (* Fine dell'esempio *) #include <stdio.h> #include <stdlib.h> // qui si definisce la struttura di nome “pixel” dotata di tre campi di tipo char denominati rosso, verde e blu typedef struct prova { unsigned char rosso; unsigned char verde; unsigned char blu; } pixel; // qui si definiscono due matrici 10 x 10 di “pixel” pixel originale[10][10], immagine[10][10], modificata[10][10]; // questa procedura legge da un file 300 caratteri e li dispone nei 3 campi delle 100 strutture della matrice // passatagli come unico argomento attuale void carica_immagine(pixel m[][10], char nomefile[15]) { FILE *fileditesto; fileditesto = fopen(nomefile,"r"); char scarto; // serve per raccogliere lo spazio tra una terna e l'altra int i,j; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) { m[i][j].rosso = getc(fileditesto); m[i][j].verde = getc(fileditesto); m[i][j].blu = getc(fileditesto); scarto = getc(fileditesto); } fclose(fileditesto); } // questa procedura salva su un file 300 caratteri e li dispone nei 3 campi delle 100 strutture della matrice // passatagli come unico argomento attuale void salva_immagine(pixel m[][10], char nomefile[15]) { FILE *fileditesto; fileditesto = fopen(nomefile,"w"); int i,j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { putc(m[i][j].rosso,fileditesto); putc(m[i][j].verde,fileditesto); putc(m[i][j].blu,fileditesto); putc(' ',fileditesto); } putc('\n',fileditesto); 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected] Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni } fclose(fileditesto); } // Questa procedure prende la metà sinistra dell'immagine e la specchia nella metà destra void specchia_immagine(pixel m[][10], pixel s[][10]) { int i,j; for (i = 0; i < 10; i++) for (j = 0; j < 5; j++) { s[i][j] = m[i][j]; s[i][9-j] = m[i][j]; } } // questa procedura ruota di 180 gradi in senso antiorario l'immagine di partenza void ruota_di_180(pixel m[][10], pixel t[][10]) { int i,j; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) t[i][j] = m[9-i][9-j]; } // questa procedura copia il contenuto di una matrice in un altra matrice void copia_matrice(pixel a[][10], pixel b[][10]) { int i,j; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) b[i][j] = a[i][j]; } // questa procedura stampa sul canale di output i 300 caratteri presenti nei 3 campi delle 100 strutture della // matrice ricevuta come primo argomento void stampa_matrice(pixel m[][10]) { int i,j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c%c%c", m[i][j].rosso, m[i][j].verde, m[i][j].blu); printf(" "); } printf("\n"); } } int main() { char c,e; char nome[15]; 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected] Corso di Fondamenti di Informatica (Unificato) Prof Aldo Franco Dragoni do { printf("\nMENU'\n"); printf("a) CARICA DA FILE L'IMMAGINE\n"); printf("b) SPECCHIA LA META' SINISTRA NELLA META' DESTRA\n"); printf("c) RUOTA DI 180 GRADI L'IMMAGINE ORIGINALE IN SENSO ANTIORARIO\n"); printf("d) STAMPA A VIDEO L'IMMAGINE ORIGINALE\n"); printf("e) SALVA SU FILE L'IMMAGINE\n"); printf("f) ESCI\n"); printf("Scelta: "); scanf("%c", &c); switch (c) { case 'a': { printf("\nScrivi il nome del file contenente l'immagine da caricare:\n"); scanf("%s",nome); carica_immagine(originale, nome); copia_matrice(originale,immagine); printf("\nImmagine caricata dal file %s \n\n", nome); }; break; case 'e': { printf("\nScrivi il nome del file su cui salvare l'immagine:\n"); scanf("%s",nome); salva_immagine(modificata, nome); printf("\nImmagine salvata sul file %s \n\n", nome); }; break; case 'd': { printf("\nL'immagine e':\n"); stampa_matrice(originale); }; break; case 'b': { printf("\nL'immagine specchiata e' la seguente: \n"); specchia_immagine(immagine, modificata); copia_matrice(modificata,immagine); stampa_matrice(modificata); }; break; case 'c': { printf("\nL'immagine ruotata di 180 gradi e' la seguente: \n"); ruota_di_180(immagine, modificata); copia_matrice(modificata,immagine); stampa_matrice(modificata); }; break; case 'f': break; default: { printf("Hai inserito un carattere non consentito !!!\n"); }; break; } /* serve per togliere il ritorno a capo ed impedire che il menù venga proposto due volte */ scanf("%c", &e); }while(c != 'f'); return 0; } 60131 ANCONA - ITALY - Via Brecce Bianche Phone (+39) 0712204390 - e-mail: [email protected]