PDA

Visualizza la versione completa : [C] Esercizio di rotazione righe di una matrice


felx
09-02-2018, 17:44
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?

alka
09-02-2018, 18:40
Non ho proprio iea di come svolgerlo aiuti?

Per affrontare la discussione in modo costruttivo, spiega cosa non ti è chiaro dell'esercizio oppure prendine una parte e inizia a pensare a una possibile soluzione da proporre, eventualmente chiedendo supporto o informazioni su un ambito specifico.

E' importante contestualizzare perché il forum non è un luogo in cui proporre esercizi e farli risolvere a terzi. :stordita:

Per questa e altre indicazioni, consulta il Regolamento di quest'area del forum.

Ciao! :ciauz:

felx
09-02-2018, 18:54
Per affrontare la discussione in modo costruttivo, spiega cosa non ti è chiaro dell'esercizio oppure prendine una parte e inizia a pensare a una possibile soluzione da proporre, eventualmente chiedendo supporto o informazioni su un ambito specifico.

E' importante contestualizzare perché il forum non è un luogo in cui proporre esercizi e farli risolvere a terzi. :stordita:

Per questa e altre indicazioni, consulta il Regolamento di quest'area del forum.

Ciao! :ciauz:

Hai perfettamente ragione. un abbozzo di ciò che ho fatto è questo

#include"matrix.h"

struct matrix *rotate_v(const struct matrix *m, int n) {
size_t r = m->rows, c = m->cols;
double *ptemp = malloc(sizeof(double)*(m->cols));
for (size_t i = 0; i < m->cols; i++) {
ptemp[i] = m->data[m->cols*(n)+i];

}
}
la difficoltà è appunto nel rotare la matrice:D. come faccio a farla rotare??
ho pensato anche
di "giocare" con l'indice che riceverei.Mi spiego una volta salvata la riga che andrei a rimpiazzare con il codice scritto li sopra potrei costruire il ciclo

for (size_t o=n-1;n>0;n--)
(newmatrix+n+1)->data=(m+n)->data;

in questo modo presumibilmente anderi a rotare tuttavia solo se l'indice è pari... Ora sono consapevole che mi sto complicando la vita, ma non ho altre idee inoltre con "n" negativo come faccio?

felx
10-02-2018, 13:29
up

scimmiaparlante
12-02-2018, 17:52
Devi semplicemente copiare la colonna i nella colonna ((i+rotazione) modulo (numero delle colonne)).
Se deve andare anche per numeri negativi l'operatore % non va bene come modulo quindi devi implementarne uno.

Tipo:


int modulo(int numero, int modulo) {
return ((numero % modulo) + modulo) % modulo;
}


//-----------------------------------

for(size_t i = 0; i < m->rows; i++) {
for(size_t j = 0; j < m->rows; j++)
*(ptemp + i*m->cols + j) = *(m->data + (modulo(i-n, r))*m->cols + j);

Loading