Stampa matrice a spirale

Messaggioda Quasar3.14 » 24/05/2023, 18:44

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.

Codice:
#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++;
    }
}
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 49 di 159
Iscritto il: 13/11/2016, 23:00

Re: Stampa matrice a spirale

Messaggioda apatriarca » 25/05/2023, 04:41

Che cosa non capisci? Come mai non ti funziona il codice o qualcosa nella logica dell'algoritmo?
apatriarca
Moderatore
Moderatore
 
Messaggio: 5731 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Stampa matrice a spirale

Messaggioda Quasar3.14 » 25/05/2023, 18:39

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.
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 50 di 159
Iscritto il: 13/11/2016, 23:00

Re: Stampa matrice a spirale

Messaggioda apatriarca » 26/05/2023, 06:46

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
Moderatore
Moderatore
 
Messaggio: 5732 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Stampa matrice a spirale

Messaggioda apatriarca » 27/05/2023, 20:52

Ci sono diversi errori nel codice.
  • Ci sono alcuni errori nelle stringhe di formato di printf. Per esempio:
    Codice:
    printf("%d%d", matrice[n][i]);

    Hai un solo valore passato alla funzione ma due %d 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.
  • Le variabili p e m sono inizializzate a NMAX ma usate per accedere a valori della matrice. NMAX non è un indice valido per la tua matrice in quanto gli indici arrivano fino a NMAX-1. Andrebbero inizializzati a NMAX - 1 (in alternativa puoi modificare i cicli in modo da usare quei valori diminuiti di uno).
  • Nel ciclo della colonna di destra hai scritto l invece di i 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.
  • La condizione del ciclo esterno dovrebbe usare >= invece di > perché in caso contrario salteresti il caso in cui rimane una sola riga o colonna da fare (nel tuo caso l'elemento centrale)..

Il codice con tutto corretto è il seguente e stampa effettivamente la matrice nell'ordine a spirale.
Codice:
#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++;
    }
}
apatriarca
Moderatore
Moderatore
 
Messaggio: 5733 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite