Stampa matrice a spirale
Buongiorno ragazzi, sto provando a fare il seguente esercizio.
Stampare gli elementi di una matrice NxN secondo un ordinamento a spirale, partendo dalla cornice più esterna e procedendo verso l'interno.
Ho cercato in rete ed ho visto diversi video ed esercizi già fatti ma purtroppo non riesco ancora a capire, spero che qualcuno di voi possa aiutarmi.
Vi posto il mio codice. Ho provato a risolvere l'esercizio con 4 cicli for all'interno di una condizione while.
Stampare gli elementi di una matrice NxN secondo un ordinamento a spirale, partendo dalla cornice più esterna e procedendo verso l'interno.
Ho cercato in rete ed ho visto diversi video ed esercizi già fatti ma purtroppo non riesco ancora a capire, spero che qualcuno di voi possa aiutarmi.
Vi posto il mio codice. Ho provato a risolvere l'esercizio con 4 cicli for all'interno di una condizione while.
#include<stdio.h> #include<stdlib.h> int main() { const int NMAX=3; int matrice[NMAX][NMAX]; int i, j; int l, n, m, p; l=0, m=0; p=NMAX; n=NMAX; for (i=0; i<NMAX; i++) { for (j=0; j<NMAX; j++) { scanf("%d", &matrice[i][j]); } } for (i=0; i<NMAX; i++) { for (j=0; j<NMAX; j++) { printf ("%d\t", matrice[i][j]); } printf("\n"); } while(n>l && p>m) { for (i=m; i<=p; i++) /*prima riga*/ printf("%d", matrice[l][i]); l++; for (i=l; l<=n;i++) /*ultima colonna di destra*/ printf("%d", matrice[i][p]); p--; for (i=p; i>=m; i-- ) /*ultima riga in basso*/ printf("%d%d", matrice[n][i]); n--; for (i=n; i>=l; i--)/*prima colonna a sinistra*/ printf ("%d%d", matrice[i][m]); m++; } }
Risposte
Che cosa non capisci? Come mai non ti funziona il codice o qualcosa nella logica dell'algoritmo?
Il codice non funziona quindi penso che sia un problema dell'algoritmo. Invece di stampare i numeri presenti nella matrice con un ordinamento a spirale, stampa una serie lunghissima di numeri.
Non capisco quali errori logici ho commesso.
Non capisco quali errori logici ho commesso.
Ad una prima occhiata in realtà il problema è di inizializzazione. Le variabili l, n, m, p non mi sembra siano inizializzate prima di essere usate. So che il tuo professore ti ha probabilmente insegnato a mettere tutte le variabili all'inizio del blocco, ma è una limitazione che è stata eliminata da più di 2 decenni ed è molto meglio dichiarare le variabili subito prima dell'uso e inizializzarle SEMPRE ad un valore più o meno sensato. Inoltre sarebbe meglio usare l'indentazione in modo che istruzioni che fanno parte dello stesso blocco siano allo stesso livello di indentazione. Tu invece hai due istruzioni dopo i cicli che sono allo stesso livello di indentazione ma una è il blocco del ciclo e l'altra viene eseguita al di fuori di esso.
Ci sono diversi errori nel codice.
Hai un solo valore passato alla funzione ma due [tt]%d[/tt] nella stringa di formato. Ce ne deve essere uno solo. Inoltre credo che nei cicli tu voglia mettere almeno uno spazio in modo da avere i valori separati e non tutti attaccati uno all'altro.[/*:m:20bfzzcg]
[*:20bfzzcg] Le variabili [tt]p[/tt] e [tt]m[/tt] sono inizializzate a [tt]NMAX[/tt] ma usate per accedere a valori della matrice. [tt]NMAX[/tt] non è un indice valido per la tua matrice in quanto gli indici arrivano fino a [tt]NMAX-1[/tt]. Andrebbero inizializzati a [tt]NMAX - 1[/tt] (in alternativa puoi modificare i cicli in modo da usare quei valori diminuiti di uno).[/*:m:20bfzzcg]
[*:20bfzzcg] Nel ciclo della colonna di destra hai scritto [tt]l[/tt] invece di [tt]i[/tt] nella condizione del ciclo. Questa è una delle ragioni per usare più di una singola lettera per i nomi delle variabili. Soprattutto quando queste lettere sono così simili. [/*:m:20bfzzcg]
[*:20bfzzcg] La condizione del ciclo esterno dovrebbe usare [tt]>=[/tt] invece di [tt]>[/tt] perché in caso contrario salteresti il caso in cui rimane una sola riga o colonna da fare (nel tuo caso l'elemento centrale)..[/*:m:20bfzzcg][/list:u:20bfzzcg]
Il codice con tutto corretto è il seguente e stampa effettivamente la matrice nell'ordine a spirale.
[*:20bfzzcg] Ci sono alcuni errori nelle stringhe di formato di [tt]printf[/tt]. Per esempio:
printf("%d%d", matrice[n][i]);
Hai un solo valore passato alla funzione ma due [tt]%d[/tt] nella stringa di formato. Ce ne deve essere uno solo. Inoltre credo che nei cicli tu voglia mettere almeno uno spazio in modo da avere i valori separati e non tutti attaccati uno all'altro.[/*:m:20bfzzcg]
[*:20bfzzcg] Le variabili [tt]p[/tt] e [tt]m[/tt] sono inizializzate a [tt]NMAX[/tt] ma usate per accedere a valori della matrice. [tt]NMAX[/tt] non è un indice valido per la tua matrice in quanto gli indici arrivano fino a [tt]NMAX-1[/tt]. Andrebbero inizializzati a [tt]NMAX - 1[/tt] (in alternativa puoi modificare i cicli in modo da usare quei valori diminuiti di uno).[/*:m:20bfzzcg]
[*:20bfzzcg] Nel ciclo della colonna di destra hai scritto [tt]l[/tt] invece di [tt]i[/tt] nella condizione del ciclo. Questa è una delle ragioni per usare più di una singola lettera per i nomi delle variabili. Soprattutto quando queste lettere sono così simili. [/*:m:20bfzzcg]
[*:20bfzzcg] La condizione del ciclo esterno dovrebbe usare [tt]>=[/tt] invece di [tt]>[/tt] perché in caso contrario salteresti il caso in cui rimane una sola riga o colonna da fare (nel tuo caso l'elemento centrale)..[/*:m:20bfzzcg][/list:u:20bfzzcg]
Il codice con tutto corretto è il seguente e stampa effettivamente la matrice nell'ordine a spirale.
#include<stdio.h> #include<stdlib.h> int main() { const int NMAX = 3; int matrice[NMAX][NMAX]; int i, j; int l, n, m, p; l = 0, m = 0; p = NMAX - 1; n = NMAX - 1; for (i = 0; i < NMAX; i++) { for (j = 0; j < NMAX; j++) { scanf("%d", &matrice[i][j]); } } for (i = 0; i < NMAX; i++) { for (j = 0; j < NMAX; j++) { printf("%d\t", matrice[i][j]); } printf("\n"); } while (n >= l && p >= m) { for (i = m; i <= p; i++) /*prima riga*/ printf("%d ", matrice[l][i]); l++; for (i = l; i <= n; i++) /*ultima colonna di destra*/ printf("%d ", matrice[i][p]); p--; for (i = p; i >= m; i--) /*ultima riga in basso*/ printf("%d ", matrice[n][i]); n--; for (i = n; i >= l; i--)/*prima colonna a sinistra*/ printf("%d ", matrice[i][m]); m++; } }