Esercizio quadrato magico

Stato
Discussione chiusa ad ulteriori risposte.

ultimoprofeta

Utente Silver
20 Settembre 2009
1
0
0
56
TESTO (esercizio dato dalla mia prof di programamzione):

Scrivete un programma che stampi un quadrato magico di dimensione n × n, con n dispari. Un quadrato magico è una disposizione dei numeri 1, 2, · · · , n2 tale che in ogni riga, in ogni colonna e nelle due diagonali la somma dei numeri sia la stessa.

Memorizzate il quadrato magico in un array bidimensionale. Iniziate mettendo il numero 1 al centro della prima riga. Mettete i rimanenti numeri nell’ordine muovendovi in alto di una riga e a destra di una colonna. Se una cella risulta essere già occupata da un altro numero, allora mettete il numero esattamente sotto al numero che lo precede.

Ogni volta che raggiungete un bordo, proseguite ripartendo dal lato opposto del quadrato. Ad
esempio, se avete messo un numero nella cella di riga 3 e colonna n − 1, allora il successivo andrà messo in riga 2 e colonna 0.


MIO IN C:

Codice:
#include<stdio.h>
int main (void){
	/* Dichiaro le variabili */
	int n, riga, colonna, numero=2, i=0, j=0, z;
	
	/* Richiesta inserimento numero e controllo disparità*/
	do{
		printf("Inserisci un numero DISPARI per creare il quadrato magico: ");
		scanf("%d", &n);
	}while((n%2)==0);
	
	/* Dichiaro la matrice NxN */
	int matrice[n][n];
	
	/* Inizializzo la matrice a 0 */
	for (riga=0;riga<n;riga++){
		for (colonna=0;colonna<n;colonna++){
			matrice[riga][colonna]=0;
		}
	}
	
	j=n/2;
	
	/* Metto 1 al centro della prima riga */
	matrice[i][j]=1;
	
	/* Creo il quadrato magico */
	for (z=0;z<(n*n)-1;z++){
	
		i--; /* Decremento una riga */
		j++; /* e incremento una colonna*/
		
		if (i<0) 			/* Se la riga è inferiore a zero */
			i=n-1;			/* La setto a n-1 */
		if (j>n-1)			/* Se la colonna supera n-1	*/
			j=0;			/* La setto a 0	*/
		if (matrice[i][j]==0)		/* Controllo che numero è presente in posizione i j */
			matrice[i][j]=numero;	/* Se il numero che trovo è 0 gli assegno la variablie numero */
		else{				/* Se il numero non è 0 */
			i++;			/* Incremento due volte la riga e controllo che non superi n-1*/
						/* Altrimenti metto tutto a zero */
			if (i>n-1)
				i=0;
			i++;
			if (i>n-1)
				i=0;
			j--;			/* Decremento una colonna e se è inferiore a zero la setto a n-1 */
			if (j<0)
				j=n-1;
			if (matrice[i][j]!=0)	/* Se il valore della matrice in posizione i j è diverso da 0 */
				break;		/* Blocco tutto e torno al for principale */
			else			/* Altrimenti associo la variabile numero */
				matrice[i][j]=numero;
		}
		numero++;			/* Incremento la variabile numero ad ogni cilco */
	}
	
	
	for (i=0;i<n;i++){			/* Stampo la matrice */
		for (j=0;j<n;j++){
			printf("%d\t", matrice[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}
 
Faresti un favore grandissimo al compilatore se usassi l'allocazione dinamica :(
mettici un
Codice:
#include <stdlib.h>
all'inizio e alloca con
Codice:
matrice = (int **) malloc (n * sizeof (int *));
for (i = 0; i < n; i++)
    matrice[i] = (int *) malloc (n * sizeof (int));
i = 0;
Ricorda di dichiarare tutte le variabili all'inizio in C, del tipo:
Codice:
int ** matrice;

RUBY: http://sprunge.us/ggPR?rb
 
Hai perfettamente ragione shura però le malloc ancora non le ha spiegate la professoressa e quindi mi sono dovuto adeguare facendo l'esercizio con le conoscenze che ha dato fino ad ora...
 
Rispetto innanzi tutto shura, non è perché hai un avatar come quello che aveva meh puoi comportarti come lui.
 
shura ha detto:
Faresti un favore grandissimo al compilatore se usassi l'allocazione dinamica :(
mettici un
Codice:
#include <stdlib.h>
all'inizio e alloca con
Codice:
matrice = (int **) malloc (n * sizeof (int *));
for (i = 0; i < n; i++)
    matrice[i] = (int *) malloc (n * sizeof (int));
i = 0;
Ricorda di dichiarare tutte le variabili all'inizio in C, del tipo:
Codice:
int ** matrice;

RUBY: http://sprunge.us/ggPR?rb

Codice:
int** matrice = (int**) malloc((n * sizeof(int*)) + (n * n * sizeof(int)))

Meglio di un for inutile richiamando inutilmente malloc e creando partizionamento interno no? :)

Se vuoi fare meh, almeno fallo bene :(

Anyway, quanti ricordi che mi porta quell'avatar :(

Edit: avevo scazzato le parentesi in during copypaste.
 
Stato
Discussione chiusa ad ulteriori risposte.