Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C] funzione contenga multipli 5 di matrice

    ciao ragazzi volevo proporvi sto esercizio:
    Scrivere una funzione che restituisca un vettore (allocato all’interno della funzione stessa) che contenga tutti i numeri multipli di 5 presenti in una matrice di interi unsigned passata come argomento.
    il mio codice è:
    codice:
    int conta(unsigned int **mat,int nrighe, int ncolonne, int dim){
    int i,j,*p;
    p = (int*)calloc(dim,sizeof(int));
    for (i=0; i<nrighe; i++) { 
       for (j=0; j<ncolonne; j++) { 
        if (mat[i][j]*=5)  
        p++; 
      } 
    return p;
     } 
    }
    non ho ancora provato a compilarlo, come vi sembra?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Pur non essendo un programmatore C, direi che il codice che hai scritto ha ben poco senso.

    codice:
        if (mat[i][j]*=5)  
        p++;
    Questo significa, letteralmente:

    "Se il numero contenuto in mat[i][j], moltiplicato per 5 è diverso da 0, allora sposta il puntatore p alla cella successiva".

    Che, tradotto in modo "ragionato", significa:

    "Se il numero contenuto in mat[i][j] è diverso da zero, sposta il puntatore p alla cella successiva".

    In pratica fai dei controlli che non ti sono richiesti e se questi controlli vanno a buon fine, non fai nulla lo stesso.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Originariamente inviato da LeleFT
    Pur non essendo un programmatore C, direi che il codice che hai scritto ha ben poco senso.

    codice:
        if (mat[i][j]*=5)  
        p++;
    Questo significa, letteralmente:

    "Se il numero contenuto in mat[i][j], moltiplicato per 5 è maggiore di 0, allora sposta il puntatore p alla cella successiva".

    Che, tradotto in modo "ragionato", significa:

    "Se il numero contenuto in mat[i][j] è diverso da zero, sposta il puntatore p alla cella successiva".

    In pratica fai dei controlli che non ti sono richiesti e se questi controlli vanno a buon fine, non fai nulla lo stesso.


    Ciao.
    e allora come faresti per contare le celle multiple di 5 nella matrice?

  4. #4
    Peggio, quell'espressione effettivamente moltiplica per 5 il contenuto della cella; se vuoi verificare se una cella è multipla di 5 devi verificare se:
    codice:
        mat[i][j] % 5 == 0
    Il resto del codice comunque non ha senso, allochi della memoria e poi ti limiti ad incrementare un puntatore - che effetto speri che abbia sul contenuto del vettore che hai allocato? Se devi solo contare i numeri multipli di 5 allora ti basta usare un normale intero ed incrementarlo, se invece li vuoi copiare nel vettore che restituirai devi anche copiarci i valori man mano che li trovi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    A parte che l'esercizio non ti chiede di contare, ma di restituire un vettore contenente tutti i numeri multipli di cinque.

    Detto questo, comincerei col chiedermi "come faccio a sapere se un numero è multiplo di 5"? Capito questo, si aggiusta quella if.

    Una volta che la if fa quello che deve fare (ovvero, verificare che il numero sia multiplo di 5 e non semplicemente maggiore di zero), mi preoccuperei di andare a scrivere nella posizione del vettore puntata da p, tale numero e poi farei avanzare p usando l'operatore unario ++.


    Peggio, quell'espressione effettivamente moltiplica per 5 il contenuto della cella
    Sì, questo lo avevo lasciato come effetto collaterale... mi sono concentrato sul "risultato" restituito dalla funzione (col return).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Probabilmente non hai acquisito un buon metodo per individuare l'algoritmo che risolva il problema prima di tradurlo in codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    ragazzi ho modificato il mio codice.
    così come vi sembra?
    codice:
    int conta(unsigned int **mat,int nrighe, int ncolonne){
    int i,j,k,*p;
    p = (int*)calloc(k,sizeof(int));
    for (i=0; i<nrighe; i++) { 
       for (j=0; j<ncolonne; j++) { 
        if (mat[i][j] % 5 == 0)
        p[k++]=mat[i][j];
      } 
    return p;
     } 
    }

  8. #8
    codice:
    p = (int*)calloc(k,sizeof(int));
    Stai allocando un array di int di dimensione k. k, dal momento che non e` inizializzato, ha un valore casuale...

    codice:
    p[k++]=mat[i][j];
    Anche qui k non ha un valore definito.

    codice:
    int conta(unsigned int **mat,int nrighe, int ncolonne){
    La funzione dovrebbe ritornare un int*, non un int.

  9. #9
    Originariamente inviato da clynamen
    codice:
    p = (int*)calloc(k,sizeof(int));
    Stai allocando un array di int di dimensione k. k, dal momento che non e` inizializzato, ha un valore casuale...

    codice:
    p[k++]=mat[i][j];
    Anche qui k non ha un valore definito.

    codice:
    int conta(unsigned int **mat,int nrighe, int ncolonne){
    La funzione dovrebbe ritornare un int*, non un int.
    così andrebbe bene?:
    codice:
    int conta(unsigned int **mat,int nrighe, int ncolonne){
    int i,j,k=0,*p;
    p = (int*)calloc(k,sizeof(int));
    for (i=0; i<nrighe; i++) { 
       for (j=0; j<ncolonne; j++) { 
        if (mat[i][j] % 5 == 0)
        p[k++]=mat[i][j];
      } 
    return p;
     } 
    }
    ho inizializzato k a 0
    perchè dovrebbe restituire un int* ?

  10. #10
    codice:
    int i,j,k=0,*p; 
    p = (int*)calloc(k,sizeof(int));
    Devi immagazzinare tutti i possibili multipli di 5 nell'array p, quindi alloca lo spazio necessario. Se passi 0 ottieni un array di dimensioni pari a 0...

    Deve restituire un puntatore che punta all'inizio dell'array. Ti consiglio di studiare gli array in modo piu` approfondito

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.