RISOLTO Problema riempimento matrice a spirale in C

Stato
Discussione chiusa ad ulteriori risposte.

RamboIII

Utente Attivo
498
8
CPU
i5 2400
Scheda Madre
ASRock H61M-GS
HDD
932 GB Seagate ST1000DM005 HD103SJ
RAM
8,00 GB Canale Doppio DDR3 @ 665 MHz
GPU
AMD Radeon HD 7700 Series
Audio
Integrata
Monitor
Asus 21,5 pollici
PSU
600w corsair cx
OS
W7
Ciao a tutti, devo scrivere un programma che riempa una matrice a spirale con un vettore multidimensionale, questa è la traccia:

Si scriva una funzione in linguaggio C per riempire una matrice10x10 a spirale, con valori crescenti da 0 a N^2-1 iniziando dall'angolo superiore sinistro. Si scriva inoltre il main necessario a provare la funzione. Il formato dei dati in ingresso e in uscita può essere dedotto dagli esempi seguenti.

Note:

1) si definisca una matrice di dimensione massima (10x10), e si legga da tastiera la dimensione della sottomatrice da considerare

2) il formato di stampa di ogni elemento della matrice deve essere %6d (senza spazi) e tutte le righe devono essere terminate da uno e un solo spazio

Esempi:

# ./riempi_matrice_a_spirale

dimensione della matrice (quadrata max 10x10): 1
0

# ./riempi_matrice_a_spirale
dimensione della matrice (quadrata max 10x10): 2
0 1
3 2

# ./riempi_matrice_a_spirale
dimensione della matrice (quadrata max 10x10): 3
0 1 2
7 8 3
6 5 4

# ./riempi_matrice_a_spirale
dimensione della matrice (quadrata max 10x10): 4
0 1 2 3
11 12 13 4
10 15 14 5
9 8 7 6

# ./riempi_matrice_a_spirale
dimensione della matrice (quadrata max 10x10): 5
0 1 2 3 4
15 16 17 18 5
14 23 24 19 6
13 22 21 20 7
12 11 10 9 8




Ho scritto questo codice che suddivide il lavoro in 4 fasi:
  1. lavora su riga verso destra
  2. lavora su colonna verso il basso
  3. lavora su riga verso sinistra
  4. lavora su colonna verso l'alto
Sto testando il programma su una matrice 3x3 e quando arriva nella terza fase m[1][2] diventa uguale a 6 nonostante non dovrebbe venire toccata, infatti le "celle" del vettore su cui dovrebbe lavorare sono m[2][1] e m[2][0].
Questo è il primo dei problemi in quanto quando stampo la matrice sono diversi i dati che vengono sbagliati, non capisco cosa però perchè analizzando manualmente l'algoritmo sembra corretto.
Ringrazio in anticipo chi mi aiuterà.
P.S.: perdonate errori banali, sono alle prime armi.

C:
#include <stdio.h>
#include <stdlib.h>

void riempi_matrice(int n, int m[n-1][n-1]);
void stampa_matrice(int dim, int m[dim][dim]);

int main()
{
   int n;
   int matrice[30][30];
   printf("dimensione della matrice (quadrata max 10x10): ");
   scanf("%d", &n);


   riempi_matrice(n, matrice);


  // stampa_matrice(n, matrice);

   return EXIT_SUCCESS;
}

void riempi_matrice(int n, int m[n-1][n-1])
{

   int i = 0, j = 0, x = 0, k = 0;

   int y,z;

   //fino a quando x < n
   while (x < n)
   {
      printf("prima della riga verso destra\n");
      printf("j = %d, k = %d\n", j, k);
      printf("\n");

      while (k < n - x)
      {
         printf("sono nel ciclo riga verso destra\n");
         m[j][k] = i;
         printf("m[%d][%d] = %d = %d\n", j, k, i, m[j][k]);
         k++;
         i++;
         printf("incremento k, quindi k = %d\n", k);

       
      }
      printf("sono fuori dal ciclo riga verso destra\n");
      printf("\n");
      k--;
      j++;

      //test  
      y = 0;
      z = 0;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 1;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      printf("\n");

      printf("prima della colonna verso il basso\n");
      printf("j = %d, k = %d\n", j, k);
      printf("\n");

      while (j < n - x)
      {
         printf("sono nel ciclo colonna verso il basso\n");
         m[j][k] = i;
         printf("m[%d][%d] = %d = %d\n", j, k, i, m[j][k]);
         j++;
         i++;
         printf("incremento j, quindi j = %d\n", j);

      }
      printf("sono fuori dal ciclo colonna verso il basso\n");
      printf("\n");
      j--;
      k--;

      //test  
      y = 0;
      z = 0;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 1;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 1;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 2;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      printf("\n");

      printf("prima della riga verso sinistra\n");
      printf("j = %d, k = %d\n", j, k);
      printf("\n");

      while(k >= x)
      {
         printf("sono nel ciclo riga verso sinistra\n");
         m[j][k] = i;
         printf("m[%d][%d] = %d = %d\n", j, k, i, m[j][k]);
         k--;
         i++;
         printf("decremento k, quindi k = %d\n", k);

      }
      printf("sono fuori dal ciclo riga verso sinistra\n");
      printf("\n");
      k++;
      j--;

      //test  
      y = 0;
      z = 0;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 1;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 0;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 1;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 2;
      z = 2;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 2;
      z = 1;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      y = 2;
      z = 0;
      printf("m[%d][%d] = %d\n", y, z, m[y][z]);
      printf("\n");

      printf("prima della colonna verso l'alto\n");
      printf("j = %d, k = %d\n", j, k);
      printf("\n");

      while (j > x)
      {
         printf("sono nel ciclo colonna verso l'alto\n");
         m[j][k] = i;
         printf("m[%d][%d] = %d = %d\n", j, k, i, m[j][k]);
         j--;
         i++;
         printf("decremento j, quindi j = %d\n", j);

      }
      printf("sono fuori dal ciclo colonna verso l'alto\n");
      printf("\n");

      x++;
      j = x;
      k = x;
   
   }

   return;
}

void stampa_matrice(int dim, int m[dim][dim])
{
   int i, j;

   for (i = 0; i < dim; i++)
   {
      for(j = 0; j < dim; j++)
      {
         printf("%6d", m[i][j]);
      }
      printf("\n");
   }
   return;
}
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Problemino interessante, mi piacerebbe risolverlo con un unico ciclo.
Ma vediamo al maggiore problema che hai nel tuo codice: quando il parametro di una funzione è una matrice multidimensionale, ne devi dichiarare le dimensioni usando le stesse dimensioni che si è usato quando la matrice venne creata (bel tuo caso 30, che lo definirei mediante un #define) altrimenti il compilatore sbaglia nel calcolare il valore degli indici.
Questa linea di codice è quindi sbagliata:
C:
void riempi_matrice(int n, int m[n-1][n-1])
 

M1n021

Nuovo Utente
143
68
Problemino interessante, mi piacerebbe risolverlo con un unico ciclo.
Ci ho provato, ecco il codice:

C:
#include <stdio.h>

#define N 7

void matrice_a_spirale(unsigned int m[N][N])
{
    for(unsigned int a = 0, i = 0, j = 0, k = N, n = 0; n < N * N; ++n)
    {
        if(!(--k))
        {
            ++a;
            k = N - a / 2 - a % 2;
        }
        m[i][j] = n;
        i +=  (a % 2) * (a / 2 % 2 ? -1 : 1);
        j += !(a % 2) * (a / 2 % 2 ? -1 : 1);
    }
}

void stampa_matrice(unsigned int m[N][N])
{
    for(unsigned int i = 0; i < N; ++i)
    {
        for(unsigned int j = 0; j < N; ++j)
        {
            printf("%4u", m[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    unsigned int m[N][N];
    matrice_a_spirale(m);
    stampa_matrice(m);
    return 0;
}
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili