PROBLEMA Rotazione matrice

Pubblicità

ilfe98

Utente Èlite
Messaggi
3,083
Reazioni
1,317
Punteggio
134
Salve a tutti ragazzi vorrei un aiuto da voi per risolvere questo esercizio in c :
ricevo in come parametro un puntatore ad un struct matrice:
struct matrice {
size_t rows, cols;
double *data;
};
struct matrice *ruota_v(const struct matrix *m, int n)


La funzione accetta come parametri un puntatore ad una matrice m e un int n e deve
restituire un puntatore a una nuova matrice allocata dinamicamente che contiene la
matrice ottenuta ruotando le righe di m verticalmente dall’alto verso il basso n
volte, facendo ad ogni rotazione diventare l’ultima riga la prima. Una rotazione
con n negativo è l’operazione inversa.
Ad esempio ruotare la matrice
( 1 2 3 )
( 4 5 6 )
( 7 8 9 )
di n=1 posizioni produce la matrice
( 7 8 9 )
( 1 2 3 )
( 4 5 6 )
Ruotarla invece di di n=-1 posizioni produce la matrice
( 4 5 6 )
( 7 8 9 )
( 1 2 3 )
Se il puntatore passato alla funzione è NULL la funzione ritorna NULL.
Non ho proprio iea di come svolgerlo aiuti?
 
Salve a tutti ragazzi vorrei un aiuto da voi per risolvere questo esercizio in c :
ricevo in come parametro un puntatore ad un struct matrice:
struct matrice {
size_t rows, cols;
double *data;
};
struct matrice *ruota_v(const struct matrix *m, int n)


La funzione accetta come parametri un puntatore ad una matrice m e un int n e deve
restituire un puntatore a una nuova matrice allocata dinamicamente che contiene la
matrice ottenuta ruotando le righe di m verticalmente dall’alto verso il basso n
volte, facendo ad ogni rotazione diventare l’ultima riga la prima. Una rotazione
con n negativo è l’operazione inversa.
Ad esempio ruotare la matrice
( 1 2 3 )
( 4 5 6 )
( 7 8 9 )
di n=1 posizioni produce la matrice
( 7 8 9 )
( 1 2 3 )
( 4 5 6 )
Ruotarla invece di di n=-1 posizioni produce la matrice
( 4 5 6 )
( 7 8 9 )
( 1 2 3 )
Se il puntatore passato alla funzione è NULL la funzione ritorna NULL.
Non ho proprio iea di come svolgerlo aiuti?

Abbozza delle idee su un pezzo di carta, scrivile, testale e vediamo cosa tiri fuori.
 
Beh diciamo che non ho tirato fuori molto.
C:
if(m==null)
return Null;
if (n!=0)
n=n % m->rows \\ in questo modo mi riconduco ad un indice che entra nella matrice
Non ho fatto nulla,ovviamente so allocare la matrice dinamicamente,il problema è il resto
 
Bhe parti facendo quello che sai fare dunque. Scomponi il problema in problemi piu piccoli. Leggendo il testo quindi:
La funzione accetta come parametri un puntatore ad una matrice m e un int n e deve
restituire un puntatore a una nuova matrice
Sei in grado di scrivere la signature di questa funzione? Se si, parti da lì, mostra il tuo codice, e poi continuiamo da lì
 
va bene
C:
struct matrix *rotate_v(const struct matrix *m, int n) {
   size_t r = m->rows, c = m->cols;
   if (m == NULL)
       return NULL;
   if (n != 0)
       n = n % m->rows;
   double *ptemp = malloc(sizeof(double)*(m->cols));
   for (size_t i = 0; i < m->cols; i++) {
       ptemp[i] = m->data[m->cols*(n)+i];

   }
}
 
Al momento non ho voglia di leggere il codice sopra ma ti lascio uno sketch che ho fatto, il mio suggerimento è di riflettere sulla cosa in termini di una lunga linea di elementi, a me aiuta a ragionarci :P
Btw, non garantisco sulla formula che ho scritto (contiene almeno un errore, quindi ti suggerisco di correggerla prima di usarla), sarebbe l'offset al quale tu aggiungi l'index nel quale vuoi scrivere, dovrebbe essere ok come punto di partenza per ragionarci su. Inoltre, evita di scrivere
if (m == NULL)
questo perchè spesso capita una svista e si scrive
if (m = NULL)
suggerisco invece
Codice:
if (!m)
oppure
Codice:
if (NULL == m)
perchè anche se sbagli e metti un solo = , non puoi assegnare a NULL e quindi l'errore è facile da individuare

K29Z13O.png
 
Ultima modifica:
ok sto cominciando a capire in pratica con quella formula mi trovo da dove iniziare a copiare
ora se l'indice è negativo?
 
ok sto cominciando a capire in pratica con quella formula mi trovo da dove iniziare a copiare
ora se l'indice è negativo?
Ripeto, in quella formula c'è un errore, quindi occhio... xD
Per rispondere alla tua domanda, mettiamo che hai row = 3, quindi index 0,1,2. Di questi 3 numeri, quale sarebbe il giusto 'n' positivo richiesto per ottenere la stessa identica matrice prodotta dalla rotazione usando -1?
Quando hai la risposta, allora prova a dedurre una formula che porta qualsiasi numero negativo al numero positivo che ti darebbe la stessa configurazione della matrice, ed usa quel numero come fosse 'n' nel tuo algoritmo.
 
dovrei sommare all'indice negativo il suo doppio es n=-1 +(2*1)=3

Se -1 manda la prima row al posto dell'ultima row, 3 manda la prima row avanti 3 volte, 3%3 dà zero(avanti 2 volte e poi torna a capo) quindi n=3 ti ridà la matrice iniziale, nell'esempio con matrice 3x3.
Quindi no, n=-1 ed n=3 non sono la stessa matrice, riprova xD
 
Mi serve come preparazione per un esame universitario siccome molti esercizi sono di questo tipo capire il ragionamento sarebbe molto raccomandato
 
Pubblicità
Pubblicità
Indietro
Top