Stampa matrice a spirale

Quasar3.14
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.

#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
apatriarca
Che cosa non capisci? Come mai non ti funziona il codice o qualcosa nella logica dell'algoritmo?

Quasar3.14
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.

apatriarca
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.

apatriarca
Ci sono diversi errori nel codice.

    [*: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++;
        }
    }
    

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.