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]