Salta ai contenuti. | Salta alla navigazione

Strumenti personali

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:

 

  1. 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.
  2. Si legga il file immagine.bin e se ne porti il contenuto in un'opportuna variabile
  3. si mostri a video l'immagine letta dal file
  4. 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, il main 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);
}