Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Compito della seguente funzione...

    Salve a tutti...chiedo aiuto per capire dove sto sbagliando con questo esercizio:
    codice:
    int f (int *A, int N, int M) {
      int B[M] , i, j, h, k=0;
      for (i=0;i<M;B[i++]=0) ;
      for (i=0;i<N;i++)
         for (j=0;j<M;j++)  B[j]+=*(A+i*M+j) ;
      for (i=0;i<M;i++)
         if (B[i]>k) {h=i; k=B[i];}
    return h;}
    Devo dire cosa fa questa funzione.....al momento "credo" di aver capito che prende gli elementi nella riga della matrice, li somma a quelli di uguale indice di un Array e poi li confronta con le altre somme, indicando alla fine l'indice dell'elemento che fornisce la somma maggiore....ma....ho alcuni problemi che mi stoppano...

    Primo....ma l'Array B[M] (come faccio per la matrice) va inventato o sono gli elementi della prima riga di A?...(all'inizio ho anche pensato a tutti zero....ma poi l'ho escluso perchè con tutti 0 non si va avanti..)

    Secondo....ipotizzo A[2] [3] = {1,3,7,5,4,2} e B[3]={3,5,2} ed eseguo il codice utilizzando lo schema in colonna che ci ha spiegato il prof. :
    Si arriva al penultimo for dove la B[j]+=*(A+i*M+j) in pratica pone B[0]=B[0]+*(A+i*M+j) giusto? quindi nel mio caso è uguale a 4...
    Poi l'ultimo for con l'if pone k=4 e li confronta con i successivi elementi dell'array e ne viene fuori che l'elemento di indice 2 dà la somma maggiore...quindi h(indice) rimane alla fine del ciclo dell'ultimo for uguale a 2....
    Ma il problema a questo punto è che ritornando al penultimo for j (che è 1)<M e mi ritrovo con un i=3 ed un j=1....ma che significa?? io non ho un elemento A[3][1]....la matrice ha due righe....dove sto sbagliando??
    Grazie mille a tutte le persone che mi daranno una mano!!!

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Non credo che centrino le matrici con questa funzione , visto che non è presente nessuna matrice sia nel corpo della funzione ,sia nei parametri .
    int *A è un puntatore ad intero usano dereferenziato *A , sarebbe equivalente ad un int A


    Secondo me
    codice:
    int f (int *A, int N, int M) {
    int B[M] , i, j, h, k=0; // dichiaro un array di dimensioni M , e variabili di appoggio 
    for (i=0;i<M;B[i++]=0) ; // inizializzo a 0 gli elementi dell'array 
    for (i=0;i<N;i++)
    for (j=0;j<M;j++) B[j]+=*(A+i*M+j) ; // secondo qualche regola do dei valori agli elementi
                                                      // dell'array 
    for (i=0;i<M;i++)
    if (B[i]>k) {h=i; k=B[i];} // trovo l'elemento con valore maggiore e restituisco l'indice con return
    return h;}
    Tecnologia

  3. #3
    Grazie mille per aver risposto....non è da tanto che faccio questi esercizi ma in particolare di questo tipo che ci sta dando il Prof. ne ho visti abbastanza....e ti assicuro che la risposta che ci ha insegnato il Prof. è che quella è una matrice (array A, Nrighe, Mcolonne)...

    ad esempio questo che risolvo tranquillamente fino alla fine :
    codice:
    int f(int*A,int N,int M) {
    int i,j,k,x,y=0;
    for(i=0;i<N;i++) {
    x=*(A+i*M);
    for(j=1;j<M;j++) x+=*(A+i*M+j);
    if(x>y) { y=x; k=i; }
    }
    return k; }
    Ipotizzando che un cliente dichiara una matrice A [2] [3] = { 1, 3, 7, 5, 4, 6 } non fa altro che restituire l'indice della riga con la somma degli elementi massima...

    Ritornando a quello della discussione...al momento non riesco ancora a capire dove cacchio sbaglio....sicuramente sto interpretando male qualcosa....ieri ho notato che l'indice che restituisce non è della colonna ma è della riga N visto che h=i ma per il resto non riesco a terminare ed arrivare al return!!!

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Probabilmente si sta parlando di algebra e matrici , quindi altra storia

    Io avevo inteso un problema di matrici in senso di array bidimensionali in linguaggio c , che effettivamente non centrano , int *A , in c , può essere o un intero o un array di int .
    Tecnologia

  5. #5
    A viene usato come una matrice bidimensionale NxM; B dal punto di vista algebrico può essere visto come un vettore colonna. Riscrivendo il codice in maniera un po' più chiara si ottiene:
    codice:
    int f (int *A, int N, int M)
    {
        // Nota: creare B[M] sullo stack in questa maniera è valido solo da C99 in poi
        int B[M], i, j, h, k=0;
    
        // Azzera il vettore B
        for (i=0; i<M; i++)
            B[i]=0;
    
        // Imposta ogni elemento di B alla somma degli elementi
        // sulla riga corrispondente di A
        for (i=0; i<N; i++)
            for (j=0; j<M; j++)
                B[j]+=A[i*M+j];
    
        // Trova il massimo di B e restituisce al chiamante l'indice corrispondente
        // (assunzione implicita nel fatto che k parte come 0: B contiene
        // solo elementi positivi)
        for (i=0; i<M; i++)
        {
            if (B[i]>k)
            {
                h=i;
                k=B[i];
            }
        }
        return h;
    }
    Ovvero, se A e B sono:



    la funzione fa una cosa di questo tipo:

    che poi di fatto è un prodotto riga per colonna di A con un vettore colonna composto di soli 1:


    e restituisce l'indice corrispondente al massimo valore di B.

    ---

    Nota importante: non tampinare la gente via MP, se non rispondo vuol dire che non ho tempo o voglia in questo momento, e continuare a mandare messaggi dà solo fastidio (e tende a diminuire le probabilità che io risponda); questo non vale solo per me, ma più o meno per chiunque risponda in maniera regolare su un forum.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie mille e scusami per l'insistenza....ero in panico da domanda stupida....pensavo che nessuno avrebbe mai risposto....non si ripeterà mai più!

    Chiarissima la spegazione di cosa fa ogni cliclo di for....

    Ora ho capito che scrivere for (i=0;i<M;B[i++]=0); significa scrivere for (i=0; i<M; i++) B[i]=0; ed azzera il vettore B[M]

    Finalmente la funzione fila liscia con il metodo in colonna che ci ha spegato il Prof. (l'ho messo nell'immagine allegata) e la risposta è che restituisce l'indice della maggiore tra la somme delle colonne di una matrice A[N][M].....ok?
    Scrivere B[j]+=A[i*M+j] significa B[j]=B[j]+A[i*+j] cioè nel mio esempio eseguo B0+A00 poi B1+A01 poi B2+A02 per poi ricominciare a B0+A10...e così via giusto?
    Quindi l'elemento di B è la somma degli elementi della colonna della matrice A visto che è B[M] e non B[N] o sbaglio?

    Grazie ancora per tutto!!!
    Immagini allegate Immagini allegate

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 © 2025 vBulletin Solutions, Inc. All rights reserved.