Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 34
  1. #1

    [C] funzione che scambia celle di righe matrice

    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:
    codice:
    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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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]

  3. #3
    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:
    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]<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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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).

  5. #5
    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:
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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?

  7. #7
    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?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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?

  9. #9
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.