PROBLEMA Rotazione matrice

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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?
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
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.
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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ì
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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];

   }
}
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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:

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
ok sto cominciando a capire in pratica con quella formula mi trovo da dove iniziare a copiare
ora se l'indice è negativo?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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.
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
dovrei sommare all'indice negativo il suo doppio es n=-1 +(2*1)=3
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Mi serve come preparazione per un esame universitario siccome molti esercizi sono di questo tipo capire il ragionamento sarebbe molto raccomandato
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili