7 gennaio 2010 - compito B
Fondamenti di Informatica - Modulo A - Compito B
Prof. Marco Gavanelli
7 gennaio 2010
Esercizio (punti 16)
Un quadrato quasi-magico è una matrice NxN che contiene dei numeri interi, tali che la somma degli elementi di ciascuna riga (e di ciascuna colonna) ha sempre lo stesso totale. Ad esempio, il quadrato
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
è quasi-magico, in quanto ciascuna delle righe e ciascuna delle colonne ha somma 15.
Si desidera verificare se un quadrato, i cui valori sono riportati nel file binario magic.bin è quasi-magico. Il file magic.bin contiene i seguenti dati:
- la dimensione N del quadrato (int), al massimo 10
- una matrice 10x10 di interi. Di questa matrice, solo i primi NxN elementi sono significativi (ovvero la dimensione logica della matrice è NxN, mentre la dimensione fisica è 10x10).
Si utilizzi il seguente algoritmo:
- nel
main
, si invochi la funzione di lettura (punto 2), e una funzione di verifica (punto 3). Si visualizzi se il quadrato è quasi-magico o no. - Si scriva una funzione di lettura che legge il file magic.bin e ne porta il contenuto in una matrice. Si stampi poi la matrice
- Si scriva una funzione di verifica che fornisce come valore di ritorno
- 1 se il quadrato è quasi-magico (tutte le righe e tutte le colonne hanno la stessa somma)
- 0 altrimenti
somma_riga
(punto 4), che calcola la somma degli elementi di una riga. Allo stesso modo, la funzione di verifica dovrà invocare una funzionesomma_col
(punto 5) per calcolare la somma degli elementi di una colonna. - Si implementi la funzione
somma_riga
che calcola la somma degli elementi di una riga della matrice - Si implementi la funzione
somma_col
che calcola la somma degli elementi di una colonna della matrice
Facoltativo (punti 3)
Un quadrato è magico se è quasi-magico ed inoltre:
- gli elementi della matrice sono tutti diversi fra loro
- nella matrice sono presenti tutti i numeri da 1 a N2.
Si verifichi se il quadrato nel file magic.bin è magico.
Soluzione
#include <stdio.h>
#define DIM 10
int leggi_bin(int L[DIM][DIM])
{
FILE *fp;
int n,i,j;
fp = fopen("magic.bin","rb");
fread(&n,sizeof(int),1,fp);
fread(L,sizeof(int),DIM*DIM,fp);
fclose(fp);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d\t",L[i][j]);
printf("\n");
}
return n;
}
int somma_riga(int Q[DIM][DIM], int r, int n)
{
int i,s=0;
for (i=0;i<n;i++)
s=s+Q[r][i];
return s;
}
int somma_col(int Q[DIM][DIM], int c, int n)
{
int i,s=0;
for (i=0;i<n;i++)
s=s+Q[i][c];
return s;
}
int verifica(int L[DIM][DIM],int n)
{
int i,corretto=1,somma;
somma=somma_riga(L,1,n);
i=1;
while (i<n && corretto)
if (somma_riga(L,i,n)==somma)
i++;
else
corretto = 0;
i=0;
while (i<n && corretto)
if (somma_col(L,i,n)==somma)
i++;
else
corretto = 0;
return corretto;
}
main()
{
int Q[DIM][DIM];
int n;
n=leggi_bin(Q);
if (verifica(Q,n))
printf("quadrato quasi-magico\n");
else
printf("quadrato non quasi-magico\n");
}