Matrice, Prototipo di Funzione.

di il
11 risposte

Matrice, Prototipo di Funzione.

Ho risolto il seguente esercizio:

 
 void get_submatrix(float**mat, int num_rows, int row, int col, float**res){  
 int r,s; 
 
 for( int i =0; i <num_rows; i++){ 
      for( int j =0; j <num_rows; j++){  
          res[ r ] [ s ]= mat [ i ] [ j ];
           } 
       }
  }
 
 


Dite che ho risolto correttamente la traccia

P.S. per alcuni lettori..... Vedete che io ho scritto il mio codice!
Allegati:
31893_2208591e8f7b46711e4301f1a854b69a.jpg
31893_2208591e8f7b46711e4301f1a854b69a.jpg

11 Risposte

  • Re: Matrice, Prototipo di Funzione.

    No, rileggi bene l'esercizio

    La matrice res è più piccola perché non ci devono essere una particolare riga e una particolare colonna dell'originale

    Oltre al fatto che utilizzi r e s senza assegnare loro un valore...
  • Re: Matrice, Prototipo di Funzione.

    oregon ha scritto:


    No, rileggi bene l'esercizio
    Ho riletto ma non trovo le alternative!

    In sostanza ho utilizzato due cicli for annidati e si evince che il ciclo for più esterno ci da le righe, mentre quello più interno ci da le colonne, alla fine ho impostato quell'uguaglianza per avere righe e colonne....

  • Re: Matrice, Prototipo di Funzione.

    Rileggi il mio post
  • Re: Matrice, Prototipo di Funzione.

    oregon ha scritto:



    La matrice res è più piccola perché non ci devono essere una particolare riga e una particolare colonna dell'originale.

    Su questo non sto riuscendo a comprendere
    Potresti darmi qualche altro indizio, per favore?



    oregon ha scritto:



    Oltre al fatto che utilizzi r e s senza assegnare loro un valore...
    Ma siccome è un prototipo di funzione, il valore, non si dovrebbe scrivere all'inizio del main ?

    Anche perchè la traccia mi ha chiesto il prototipo di funzione!?
  • Re: Matrice, Prototipo di Funzione.

    Come non comprendi? Se la matrice mat è 5x5 allora la res è 4x4 e la colonna e riga mancanti sono indicate

    Il prototipo non ti è stato chiesto ma ti è stato fornito per guidarti sulla scrittura della funzione. Le variabili r e s che hai usato nella funzione devono avere un valore nella funzione, il main non c'entra nulla.
  • Re: Matrice, Prototipo di Funzione.

    Ad esempio se la matrice originale è

    1 2 3
    4 5 6
    7 8 9

    e ti viene chiesto di eliminare la colonna e la riga centrale, il risultato sarà la matrice

    1 3
    7 9
  • Re: Matrice, Prototipo di Funzione.

    oregon ha scritto:


    Ad esempio se la matrice originale è

    1 2 3
    4 5 6
    7 8 9

    e ti viene chiesto di eliminare la colonna e la riga centrale, il risultato sarà la matrice

    1 3
    7 9


    Cavolo, mi hai fatto notare quello che è scritto nel terz'ultimo rigo, intendi che ti riferisci a questo?

    res è una matrice quadrata già allocata di dimensioni num_rows -1

    Giusto
  • Re: Matrice, Prototipo di Funzione.

    Allora, do il valore ad r ed s:
     
      
      
     void get_submatrix(float**mat, int num_rows, int row, int col, float**res){  
     int r,s;  
     r=0; 
     for( int i =0; i <num_rows; i++){  
           s=0;
          for( int j =0; j <num_rows; j++){  
              res[ r ] [ s ]= mat [ i ] [ j ];
               } 
           }
      }
     


    E penso sia corretto farlo nella riga prima di ogni determinato ciclo for, giusto

    Da quello che mi hai fatto notare, ci devono essere delle condizioni da rispettare, dal momento che una matrice mat è più grande della matrice res!

    Imporre delle condizioni significa usare if, else ecc.

    Ed in effetti, i cicli for, scansionano la matrice di partenza che è più grande

    Ed in effetti, la traccia dice:


    La funzione ....., deve riempire la matrice res(che è con una riga e una colonna mancante) con tutti gli elementi presenti nella matrice mat(che è con una riga e una colonna in più rispetto a res), tranne gli elementi che si trovano nella riga row o colonna col.


    Ma quando dice nella riga row o colonna col, siccome dobbiamo restare in tema di matrice quadrata, è ovvio che la dimensione num_rows-1 ci impone che o eliminando una riga o una colonna, dovremo comunque restare in tema con una matrice sempre quadrata ma di dimensione più piccola!

    Puoi darmi qualche altro indizio per favore

    EDIT: Ma quando dice tranne gli elementi che si trovano nella riga row o colonna col, ci si può riferire alla riga numero 1 e alla colonna numero 1
    invece di come hai detto tu:

    1 2 3
    4 5 6
    7 8 9

    non potremmo eleiminare prima riga e prima colonna e farla diventare così:

    5 6
    8 9

  • Re: Matrice, Prototipo di Funzione.

    Quando il testo indica che la riga e la colonna da non copiare sono row e col intende che sono quelle passate come argomenti

    ... int row, int col, ...

    nella chiamata della funzione (vedi tra gli argomenti). Quindi devi tenere in considerazione il fatto che row e col conterranno il numero di riga e colonna da non copiare dall'originale.

    Se row è 1 e col è 1 (ad esempio), avrai la situazione che ti prospettavo poco prima, ovvero riga e colonna centrale da non copiare da una matrice 3x3. Il caso che hai indicato tu può essere ovviamente valido se row=0 e col=0 in quanto avremo appunto

    1 2 3
    4 5 6
    7 8 9

    e in seguito

    5 6
    8 9

    Le variabili r ed s devono avere dei valori ma questi devono cambiare opportunamente durante l'esecuzione del ciclo. Se sono sempre a zero pensi che l'elemento di res possa mai cambiare man mano che i cicli avanzano?

    Se nell'esempio i e j variano tra 0 e 2, ovviamente r ed s devono variare da 0 a 1 (una riga e una colonna in meno).

    E sì, dato che devi evitare di copiare riga e colonna indicate da row e col, ci vuole una if opportuna nel ciclo per non copiare gli elementi che non devono essere passati.
  • Re: Matrice, Prototipo di Funzione.

    Allora vediamo se con le Dritte di Oregon sono riuscito ad arrivare ad una soluzione!?

    Ecco il codice:
     
     void get_submatrix(float**mat, int num_rows, int row, int col, float**res){  
     int r,s;  
     r=0; 
     for( int i =0; i <num_rows; i++){   
         if(i != row){
           s=0;
          for( int j =0; j <num_rows; j++){   
              if(j != col)
              res[ r ] [ s ]= mat [ i ] [ j ]; 
              s++;
               }  
               r++;
             }
           }
      }
     



    Allora mi permetto di dire ad alcuni lettori che spesso intervengono con lunghi discorsi sterili e che ci perdono pure tempo , osservate e prendete esempio da Oregon che ha scritto poco e mi ha portato a concretizzare un ragionamento!

    Non sono nessuno per elogiare nessuno, ma come non tutti "me compreso", possono non avere quella dote in Informatica, di cui questi lettori/scrittori mi attribuiscono, sappiate che non tutti hanno la capacità di essere buoni esempi, quindi, date a Cesare quel che è di Cesare e lasciate fare a quelle persone come Oregon, lo spiegare, altrimenti finite con il riempire il Forum di un sacco di cose inutili!

    Ed in informatica, tutta questa memoria inutile che riempite con le ramanzine sterili, poi alla fine, ricordatevi di utilizzare istruzione free, perchè dovete liberare la memoria da cose inutili!


    Grazie Oregon!
  • Re: Matrice, Prototipo di Funzione.

    Evitiamo polemiche... qui ognuno risponde se vuole, non c'è qualcuno più bravo.

    Il codice è migliorato ma lo hai provato? Come ti ho sempre detto, compila ed esegui controllando i risultati. Anche tanti altri te lo hanno detto ma tu non lo fai...
Devi accedere o registrarti per scrivere nel forum
11 risposte