[C] Matrici

Messaggioda jarrod » 23/01/2018, 22:13

Ciao, il mio prof ha fatto questo programma in cui data una matrice, ad esempio ho $((1,2,3),(4,5,6),(7,8,9))$, vuole ribaltarla ed ottenere $((7,8,9), (4,5,6), (1,2,3))$

questo è il file.h
Codice:
#include <stdio.h>
#include <stdlib.h>

struct matrix{
   size_t rows, cols;
   double *data;
};

#if !defined MATRIX_H
#define MATRIX_H

extern struct matrix *matrix_flip_v(const struct matrix *m);

#endif


il main.c è:
Codice:
#include "matrix.h"

int main(void){
   double data[] = {
      1, 2, 3, 4, 5, 6, 7, 8, 9
   };
   struct matrix m = { 3, 3, data };

   struct matrix *f = matrix_flip_v(&m);

   return 0;
}


questo è il file.c:
Codice:
#include "matrix.h"

struct matrix *matrix_flip_v(const struct matrix *m){
   if (m == NULL){
      return NULL;
   }

   struct matrix *mflip = malloc(sizeof(struct matrix));      //alloco lo spazio per la struct matrice

   mflip->cols = m->cols;      //copio colonne
   mflip->rows = m->rows;      //copio righe

   mflip->data = malloc(mflip->cols*mflip->rows*sizeof(double));   //alloco lo spazio per gli elementi della matrice   

   for (unsigned int r = 0; r < m->rows; r++){
      for (unsigned int c = 0; c < m->cols; c++){
         int index = (r*m->cols) + c;
         int ind = (r*m->cols) + (m->cols - c - 1);
         mflip->data[ind] = m->data[index];

      }
   }

   return mflip;

}


Però non capisco cosa fa nei due cicli for..
cioè questo passaggio:
Codice:
int index = (r*m->cols) + c;
         int ind = (r*m->cols) + (m->cols - c - 1);
         mflip->data[ind] = m->data[index];


a me sembra di capire che invece di ottenere la matrice dovuta si ottenga questa matrice $((3,2,1),(6,5,4),(9,8,7))$
Perchè index calcola le posizioni dove si trovano gli elementi della matrice iniziale, poi ind calcola le posizioni della nuova matrice in cui vanno a finire gli elementi. Qualcuno mi potrebbe spiegare il ragionamento che sbaglio? ho l'impressione di non riuscire a capire il significato di quelle due righe di codice
jarrod
Junior Member
Junior Member
 
Messaggio: 120 di 358
Iscritto il: 26/02/2017, 13:23

Re: [C] Matrici

Messaggioda vict85 » 24/01/2018, 10:16

Ad uno sguardo veloce mi sembra tu abbia ragione. Comunque puoi facilmente controllare stampando a video le varie matrici.
vict85
Moderatore
Moderatore
 
Messaggio: 9245 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] Matrici

Messaggioda jarrod » 24/01/2018, 11:28

ho stampato facendo
Codice:
printf("%f ", mflip->data[ind]);

è scritta bene la printf secondo te? Perchè mi vengono visualizzati su schermo gli elementi della matrice originale e non la matrice trasposta.. :roll:
jarrod
Junior Member
Junior Member
 
Messaggio: 121 di 358
Iscritto il: 26/02/2017, 13:23

Re: [C] Matrici

Messaggioda apatriarca » 24/01/2018, 11:55

Dove hai messo il printf? Se è nel ciclo allora è normale vengano gli elementi della matrice originaria. Stai infatti scorrendo gli elementi della matrice originaria in ordine mentre la scrittura nella nuova matrice segue un ordine diverso. Devi insomma fare un nuovo ciclo in cui scorri la matrice normalmente e stampi i valori.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4942 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Matrici

Messaggioda vict85 » 24/01/2018, 23:10

Ho stampato la matrice dopo la funzione e, come immaginavo da una prima analisi, hai ragione: il codice produce la matrici che dici tu e non quella che dice il professore.

Prova a cambiare il codice per fare quello che dice il professore.
vict85
Moderatore
Moderatore
 
Messaggio: 9246 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] Matrici

Messaggioda jarrod » 04/02/2018, 21:18

grazie mille a tutti :)
jarrod
Junior Member
Junior Member
 
Messaggio: 122 di 358
Iscritto il: 26/02/2017, 13:23


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite