Restituire primi n numeri pari.Funzione

di il
8 risposte

Restituire primi n numeri pari.Funzione

Ciao ragazzi devo scrivere una funzione che restituisca i primi n numeri pari , con n passato come parametro alla funzione.
Ovviamente il problema non è scrivere la funzione in se e trovare i primi n pari, ma mi sono bloccato al return.
Direi che devo restituire un array di numeri, ma non so come fare questa cosa nel return.
Grazie se mi date una diritta

8 Risposte

  • Re: Restituire primi n numeri pari.Funzione

    La funzione deve avere come tipo di ritorno int *
    quindi all'interno della funzione dichiari e allochi un vettore di interi, lo riempi con i dati che desideri e lo ritorni.

    Esempio:
    
    int * fun(int n) {
    	int *v = ....
    	....
    	return v;
    }
    
  • Re: Restituire primi n numeri pari.Funzione

    O ancora meglio
    
    bool fun(size_t *v, size_t sz, size_t n)
    {
         if(......)
         {
              return false;
          }
          /*Qui trovi i numeri pari*/
         return true;
    }
    
  • Re: Restituire primi n numeri pari.Funzione

    Dunque ho fatto cosi, sembrerebbe andare.
    int*fun(int n)
    {
        int contaPari=0;
        int i=0;
        int* v;
        v=(int*)malloc(n*sizeof(int));
        do{
            if(i%2==0){
                contaPari++;
                v[contaPari]=i;
            }
            i++;
        }
    
        while(contaPari<n);
        return v;
    
    }
    Se ora nel main volessi visualizzare l'array, come posso fare?
    grazie
  • Re: Restituire primi n numeri pari.Funzione

    Hai il riferimento al vettore, lo puoi usare per farci quello che necessiti fare.
    Il vettore materialmente si trova nello heap.
    
    int main(){
    	int *v;
    	...
    	v = fun(10);
    	...
    return 0;
    }
    
  • Re: Restituire primi n numeri pari.Funzione

    Si risolto grazie
  • Re: Restituire primi n numeri pari.Funzione

    Sorvolando sulla scelta di usare malloc() e restituire un puntatore, non si può ignorare il modo discutibile in cui hai implementato il calcolo del numero pari successivo. Hai almeno 3 soluzioni migliori (elencate dalla peggiore alla migliore):
    
    size_t i = 0;
    size_t cnt = 0;
    while(cnt < n)
    {
        if(0 == (i & 1))
        {
            v[cnt] = i;
            ++cnt;
         }
        ++i;
    }
    
    oppure
    
    size_t i = 0;
    size_t cnt = 0;
    while(cnt < n)
    {
        v[cnt] = i;
        i += 2;
        ++cnt;
    }
    
    o ancora
    
    size_t i = 0;
    ...
    for(i = 0; i < n; i++)
    {
        v[i] = i << 1;
    }
    
    La tua soluzione è discutibile perché complichi la funzione inutilmente per svolgere un compito banalissimo quale è la ricerca dei numeri pari. Inoltre nella tua implementazione usi il modulo (%) per verificare se un numero pari. Pur non conoscendo gli operatori bitwise & ed <<, avresti potuto implementare l'esercizio seguendo la mia ultima proposta sostituendo " i << 1" con "i * 2" (ovviamente le due scritture si equivalgono ma la prima è più efficiente). Devi sapere che le.operazioni di divisione e moltiplicazione sono decisamente inefficienti e si fa di tutto per evitarle quando possibile. Prova a misurare il tempo di esecuzione delle varie implementazioni e confrontare i dati. Ti basterà usare un tool di profiling per il tuo sistema operativo.

    Inoltre voglio ricordarti che malloc ritorna NULL in caso di fallimento e che tu dovresti controllare qualsiasi valore di ritorno di ciascuna funzione. Fanno eccezione le funzioni per l'output anche perché se puts, printf etc falliscono che fai? Stampi un messaggio di errore su stderr?
  • Re: Restituire primi n numeri pari.Funzione

    Initanto grazie.
    Per evitare malloc ho pensato a una cosa del tipo
    
    void funzione(int v[],int n)
    Cioè passo direttamente l'array dal main (inizializzato a 0) e lo modifico, tanto la funzione lavora sull'indirizzo.
    Forse è meglio cosi?
    Per la tue soluzioni questa è ok, effettivamente è la migliore
    size_t i = 0;
    size_t cnt = 0;
    while(cnt < n)
    {
        v[cnt] = i;
        i += 2;
        ++cnt;
    }
    Però non capisco questa sintassi
    if(0 == (i & 1))
    ho visto che & fa il controllo bit a bit...qualcosa del genere

    e neanche questa
     v[i] = i << 1;
    qui proprio nulla cosmico, << lo uso con cout
  • Re: Restituire primi n numeri pari.Funzione

    Procediamo con ordine:
    - Il prototipo di funzione dovrebbe essere qualcosa del genere
    
    bool func(size_t *v, size_t sz, size_t n);
    
    La scelta di ritornare un booleano permette di dare un feedback al chiamante indicando con true che tutto è andato a buon fine e con false che si è verificato un errore. Qui le due condizioni di errore che si possono verificare riguardano il valore del puntatore *v che potrebbe essere NULL, quindi non valido, e la dimensione dell'array che potrebbe non essere sufficiente per contenere tutti i numeri pari richiesti. Chiaramente se il chiamante passa una dimensione non veritiera si possono verificare due problemi:
    - la funzione restituisce false anche se l'array era potenzialmente in grado di contenere tutti i numeri pari, nel caso in cui al posto di sz venga passato un valore inferiore alla dimensione reale dell'array. Ma qui è "colpa" del chiamante.
    - Segmentation fault su *BSD Linux e "Access violation" su Windows nel caso in cui al posto di sz venga passato un valore che è maggiore della dimensione effettiva dell'array.

    In ogni caso quanto esposto sopra va preso con le pinze ed eventualmente rivisto da persone esperte perché potrebbe facilmente una soluzione poco ottimale, essendo anche io agli inizi. Il software engineering è un'arte e di certo non la conosco.

    - Suppongo che tu sappia convertire un numero decimale in binario e viceversa e che tu conosca almeno i tre operatori logici universali (NOT, AND, OR). Se prendi carta e penna e provi a convertire alcuni numeri in binario, noterai che i numeri pari hanno LSB a 0 mentre quelli dispari a 1. Facendo l'AND bit a bit tra un numero e la costante 1, si ottiene il bit meno significativo che indica se un numero è pari o no. In C ciò può essere fatto così
    
    numero & 1
    
    - Se provi a convertire qualche numero scelto a caso in binario e a convertire in seguito il doppio, noterai che il doppio del primo numero in binario è uguale al primo con uno zero aggiunto a destra. Si può dire sostanzialmente che tutti bit di un numero vengono traslati di una posizione verso sinistra quando tale numero viene moltiplicato per due. L'operatore shift (<< o >>) sposta di x posizioni i bit di un numero verso sinistra o verso destra. Negli interi unsigned MSB e LSB vengono persi usando l'operatore shift, mentre negli interi segnati tutto dipende dall'implementazione.
    
    4 -> 100
    4 << 1 = 1000 = 8
    
    1 >> 4 = 0010 = 2
    
    << in C, come già detto, è l'operatore left shift e non ha nulla a che vedere con << del C++, di cui non so assolutamente nulla.
Devi accedere o registrarti per scrivere nel forum
8 risposte