PDA

Visualizza la versione completa : [C] funzione che scambia celle di righe matrice


palermo92
10-10-2012, 15:07
ciao ragazzi volevo una mano su questo esercizio:
Scrivere il codice di una funzione C che permetta di invertire l'ordine degli elementi di ciascuna riga di una matrice di numeri reali in singola precisione.
io ho scritto:


void swap(double *v1,double *v2){
double vtemp;
vtemp=*v1;
*v1=*v2;
*v2=vtemp;
}

void scambia( double **a, int dim, int nrighe) {
int i,j,k;
for(i=1; i<nrighe; i++) {
while (a[i+k]<a[dim-k]) {
for(k=0; k<dim; k++)
swap(a[i+k],a[dim-k]);
}
}
}



ma quando provo a integrarlo nel main assieme ad una matrice mi da errore.
dove sbaglio?

c0der
10-10-2012, 15:22
Continui ad avere problemi con le dimensioni degli array, quando le passi come parametri di una funzione.

Allora:
double a => una variabile a di tipo double
double *a => un array a 1 dimensione di variabile double, lo usi cosi a[0], a[1]
double **a => un array a 2 dimensioni di variabili double, lo usi cosi a[0][0], a[0][1]

Come vedi nel prototipo l'hai passato a 2 dimensioni:
void scambia( double **a, int dim, int nrighe)

Poi invece lo usi come avesse solo 1 dimensione:
a[i+k]

palermo92
10-10-2012, 15:57
Originariamente inviato da c0der
Continui ad avere problemi con le dimensioni degli array, quando le passi come parametri di una funzione.

Allora:
double a => una variabile a di tipo double
double *a => un array a 1 dimensione di variabile double, lo usi cosi a[0], a[1]
double **a => un array a 2 dimensioni di variabili double, lo usi cosi a[0][0], a[0][1]

Come vedi nel prototipo l'hai passato a 2 dimensioni:
void scambia( double **a, int dim, int nrighe)

Poi invece lo usi come avesse solo 1 dimensione:
a[i+k]

e se scrivessi quindi:


void scambia( double **a, int dim, int nrighe, int ncolonne) {
int i,j,k,temp;
for(i=1; i<nrighe; i++) {
for(j=1; j<ncolonne; j++)
while (a[i+k]<a[dim-k]) {
for(k=0; k<dim; k++)
temp=a[i+k][j];
a[i+k][j]=a[dim-k][j];
a[dim-k][j]=temp;
}
}
}


cioè tolgo la swap e metto tutto dentro la scambia
così come ti sembra?

c0der
10-10-2012, 16:11
Allora... ci sono 2 problemi:

1) Qui continui a considerarlo a 1 dimensione
while (a[i+k]<a[dim-k]) {

2) Mi pare che neppure tu (perché non l'ho capito neanch'io) hai capito il testo del problema. Rileggiamolo:



Scrivere il codice di una funzione C che permetta di invertire l'ordine degli elementi di ciascuna riga di una matrice di numeri reali in singola precisione.


Dice "invertire" ma non specifica di quante colonne è fatta...
A questo punto dobbiamo decidere: quante colonne consideriamo? diciamo 2 che se dobbiamo invertire ha senso.

Io quindi toglierei quella sfilza di dim, nrighe e ncolonne e lascerei solo:
void scambia(double **a, int nrighe)

Prova riscriverla così (con o senza swap).

palermo92
10-10-2012, 16:21
allora da come l'ho capita io:
immagina di avere una matrice di 5 righe e 5 colonne
analizziamo la prima riga. i valori della riga sono:
1 2 3 4 5

la funzione deve invertire i valori contenuti nelle celle della riga e riscrivere:
5 4 3 2 1

con dim indico la lunghezza di ogni riga,con k di quante posizioni deve spostarsi.

tralasciando la dimenticanza che mi facevi notare ho scritto di nuovo il codice:


void scambia( double **a, int dim, int nrighe, int ncolonne) {
int i,j,k,temp;
for(i=1; i<nrighe; i++) {
for(j=1; j<ncolonne; j++)
while (a[i+k][j]<a[dim-k][j]) {
for(k=0; k<dim; k++)
temp=a[i+k][j];
a[i+k][j]=a[dim-k][j];
a[dim-k][j]=temp;
}
}
}


credo che il testo voglia dire ciò che ti ho spiegato. ma compilando mi da errore

c0der
10-10-2012, 16:39
la funzione deve invertire i valori contenuti nelle celle della riga

Hai ragione tu. A mia discolpa :) dico che mi sono fatto condizionare dalla swap iniziale.
Adesso leggo tutto.

[EDIT]
Mi spieghi ancora dim a cosa serve visto che c'è ncolonne?

palermo92
10-10-2012, 17:10
Originariamente inviato da c0der
Hai ragione tu. A mia discolpa :) dico che mi sono fatto condizionare dalla swap iniziale.
Adesso leggo tutto.

[EDIT]
Mi spieghi ancora dim a cosa serve visto che c'è ncolonne?

se lavorassi sempre con matrici quadrate in cui il numero di righe è uguale a quello delle colonne allora la dimensione delle righe sarebbe uguale a quella delle colonne.
in questo modo faccio dipendere la lunghezza di una riga non dalle colonne ma da dim.
nella matrice 5x5 dim =d
nella matrice 6x3 dim =6
da dim dipendono poi le inversioni che la funzione deve fare.
secondo te come posso farla funzionare?

c0der
10-10-2012, 17:18
C'è qualcosa che non mi torna.

Tu questa funzione la chiami 1 volta per elaborare tutta la matrice.

Come fa dim che passi 1 volta sola a valere per tutte le righe della matrice,
mentre ogni riga della della matrice dovrebbe aver bisogno magari di un dim diverso,
se ogni riga ha lunghezza diversa dalle altre?

palermo92
10-10-2012, 17:29
Originariamente inviato da c0der
C'è qualcosa che non mi torna.

Tu questa funzione la chiami 1 volta per elaborare tutta la matrice.

Come fa dim che passi 1 volta sola a valere per tutte le righe della matrice,
mentre ogni riga della della matrice dovrebbe aver bisogno magari di un dim diverso,
se ogni riga ha lunghezza diversa dalle altre?

non c'è bisogno perchè non esistono matrici al cui interno di sono righe di diversa lunghezza.
ritornando all'esempio di prima cioè ma matrice 6x3.
1 2 3
4 5 7
8 4 3
1 4 7
3 5 2
4 9 9
dicesi matrice 6x3 una matrice avente tutte le 6 righe di lunghezza 3(cioè di 3 colonne)
e avente tutte le colonne di lunghezza 6(cioè di 6 righe).
non esistono matrici del tipo:
1 2 3
4 5 7
8 4 3 4
1 4 7
3 5 2 5
4 9 9

c0der
10-10-2012, 17:34
Questo era quello che avevo capito che tu intendessi per dim.
Sarò duro ma non capisco la differenza fra ncolonne e dim... non sono la stessa cosa?
Mi fai un esempio in cui dim e ncolonne hanno valori diversi? Sarò io che non capisco.

Loading