25 gennaio 2010
Fondamenti di Informatica 1 - Compito A
Prof. Marco Gavanelli
25 Gennaio 2010
Esercizio (punti 16)
Il file binario immagine.bin contiene una struttura definita come segue:
- X, Y: due interi
- M: una matrice di 25 righe e 80 colonne di caratteri
Nella matrice M sono significative solo le prime X colonne e le prime Y righe. La matrice rappresenta una figura: i caratteri che contiene possono essere l'asterisco '*'
oppure lo spazio ' '
.
Ad esempio, se X=9 e Y=7, e la matrice contiene:
* | * | * | * | * | ||||
* | * | * | * | * | ||||
* | * | * | ||||||
* | * | * | * | * | ||||
* | * | * | * | * | ||||
allora la figura rappresentata è
***** *** ** *** *** ** *****
Si scriva un programma in linguaggio C che, dato il file immagine.bin, visualizza il `contorno sinistro' della figura. Una casella è nel contorno sinistro se contiene un asterisco '*'
e la casella alla sua sinistra contiene uno spazio ' '
. Le caselle di contorno vanno visualizzate con punti esclamativi '!'
; le altre con uno spazio. Nell'esempio precedente, il programma dovrà quindi visualizzare:
! | ||||||||
! | ! | |||||||
! | ||||||||
! | ! | |||||||
! | ||||||||
ovvero
! ! ! ! ! ! !
Si utilizzi il seguente algoritmo:
- Nel
main
, si invochi una procedura o funzione di lettura (punto 2), una di stampa (punto 3), una di elaborazione (punto 4) e di nuovo la stampa (punto 3), per visualizzare i risultati. - Si legga il file immagine.bin e se ne porti il contenuto in un'opportuna variabile
- si mostri a video l'immagine letta dal file
- La procedura o funzione di elaborazione prende come parametro l'immagine letta al punto 2 e fornisce al
main
un'altra variabile dello stesso tipo, che rappresenta il contorno sinistro della prima immagine (come indicato al punto 1, ilmain
provvederà poi a stampare questa nuova immagine).Per implementare la procedura di elaborazione, si consiglia di implementare una procedura o funzione che elabora una riga dell'immagine e poi di invocarla per ogni riga dell'immagine
Facoltativo (3 punti)
Si modifichi il programma per calcolare e visualizzare il contorno dell'immagine, invece del contorno sinistro. Una cella è nel contorno se contiene un asterisco e ce n'è una adiacente (in orizzontale o verticale, cioè sopra, sotto, a sinistra o a destra) che contiene uno spazio;
Soluzione
#include <stdio.h>
typedef struct
{ int X,Y;
char M[25][80];
} matrice;
void elabora_riga(char riga[],char riga_conv[], int n)
{
int i;
riga_conv[0]=' '; // Il primo carattere non ha nessuno a sinistra
for (i=1;i<n;i++) // Parto da 1 cosi` posso vedere quanto vale riga[i-1] senza uscire dalla matrice
if (riga[i]=='*' && riga[i-1]==' ')
riga_conv[i]='!';
else
riga_conv[i]=' ';
}
void elabora(matrice I, matrice *C)
{
int r;
(*C).X=I.X;
(*C).Y=I.Y;
for (r=0;r<I.Y;r++)
elabora_riga(I.M[r],(*C).M[r],I.X);
}
void stampa(matrice mat)
{
int i,j;
for (j=0;j<mat.Y;j++)
{
for (i=0;i<mat.X;i++)
printf("%c",mat.M[j][i]);
printf("\n");
}
}
matrice lettura()
{
matrice m;
FILE *fp=fopen("immagine.bin","rb");
fread(&m,sizeof(matrice),1,fp);
fclose(fp);
return m;
}
main()
{
matrice A,Contorno;
A=lettura();
printf("=============================\n");
stampa(A);
elabora(A,&Contorno);
printf("=============================\n");
stampa(Contorno);
}