Gli esercizi
Testi e soluzioni di alcuni esercizi
Quadrato "magico"
Generare una matrice quadrata di dimensione n di numeri interi casuali. Scrivere una funzione che restituisca 1 se la matrice è un quadrato magico e zero altrimenti. Una matrice n×n è un quadrato magico se la somma degli elementi su ogni riga, su ogni colonna e sulle due diagonali principali è costante.
/*
**  quadrato_magico.c
**
**  Genera in modo casuale una matrice quadrata di dimensione n
**  e verifica se e` un quadrato magico.
**
**  Marco Liverani (liverani@mat.uniroma3.it) - Febbraio 1999
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_N 10
/*
**  genera
**
**  assegna in modo random i valori alla sotto-matrice
**  quadrata di ordine n.
*/
int genera(int *m) {
  int n, i, j;
  srand((unsigned) time(NULL));
  n = rand() % (MAX_N-2) + 2;
  for (i=0; i<n; i++) {
    for (j=0; j<n; j++) {
      *(m+i*MAX_N+j) = rand() % 100;
    }
  }
  return(n);
}
/*
**  stampa_matrice
**
**  visualizza la matrice in output.
*/
void stampa_matrice(int *m, int n) {
  int i, j;
  for (i=0; i<n; i++) {
    for (j=0; j<n; j++) {
      printf("%3d", *(m+i*MAX_N+j));
    }
    printf("\n");
  }
  return;
}
/*
**  verifica
**
**  verifica se la matrice e` un quadrato magico: appena
**  trova una riga o una colonna o una diagonale con una
**  somma diversa esce dalla funzione.
*/
int verifica(int *m, int n) {
  int i, j, r, s, somma;
  r = 1;
  somma = 0;
  for (j=0; j<n; j++) {
    somma = somma + *(m+j);
  }
  /* controllo le righe */
  i = 1;
  while (i<n && r==1) {
    s = 0;
    for (j=0; j<n; j++) {
      s = s + *(m+i*MAX_N+j);
    }
    if (s != somma) {
      r = 0;
    }
    i++;
  }
  /* controllo le colonne */
  j = 0;
  while (j<n && r==1) {
    s = 0;
    for (i=0; i<n; i++) {
      s = s + *(m+i*MAX_N+j);
    }
    if (s != somma) {
      r = 0;
    }
    j++;
  }
  /* controllo la prima diagonale */
  s = 0;
  i = 0;
  while (i<n && r==1) {
    s = s + *(m+i*MAX_N+i);
    i++;
  }
  if (s != somma) {
    r = 0;
  }
  /* controllo la seconda diagonale */
  s = 0;
  i = 0;
  while (i<n && r==1) {
    s = s + *(m + i*MAX_N + (n-i-1));
    i++;
  }
  if (s != somma) {
    r = 0;
  }
  return(r);
}
/*
**  main
**
**  funzione principale che richiama le altre.
*/
int main(void) {
  int M[MAX_N][MAX_N], n;
  n = genera(&M[0][0]);
  if (verifica(&M[0][0],n) == 1) {
    printf("La matrice\n");
    stampa_matrice(&M[0][0], n);
    printf("e' un quadrato magico.\n");
  } else {
    printf("La matrice\n");
    stampa_matrice(&M[0][0], n);
    printf("non e' un quadrato magico.\n");
  }
  return(0);
}