Salta ai contenuti. | Salta alla navigazione

Strumenti personali

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:

  1. 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.
  2. 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
  3. 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
    Per fare questo, la funzione di verifica dovrà invocare, per ciascuna riga della matrice, una funzione somma_riga (punto 4), che calcola la somma degli elementi di una riga. Allo stesso modo, la funzione di verifica dovrà invocare una funzione somma_col (punto 5) per calcolare la somma degli elementi di una colonna.
  4. Si implementi la funzione somma_riga che calcola la somma degli elementi di una riga della matrice
  5. 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");
}