Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13

    [C] Esercizietto di funzione che restituisce un vettore al main

    Salve,

    ecco il testo dell'esercizietto:
    "Data una main che contiene un vettore di interi definito come
    int v1[10]={2,4,11,6,17,1,24,4,45,3} , creare una funzione che crea un Vettore v2, che contiene solo gli elementi di v1 maggiori di 5, e lo restituisce al main."

    io ho risolto come segue:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int* elabora(int v1[],int v2[]);
    int main() {
    
        int v1[10]={2,4,11,6,17,1,24,4,45,3};
        int v2[10];
        int i=0;
        int *p;
        p=elabora(v1,v2);
        for (i=0;i<10;i++)
        printf("%d ",p[i]);
        system("PAUSE");
        return 0;
    }
    
    int* elabora(int v1[],int v2[]) {
         int *w;
         w=v2;
         int i,k=0;
         for (i=0;i<10;i++)
             if(v1[i]>5) {
                          v2[k]=v1[i];
                          k++;
                         }
         return w;
    }
    ma non son ben certo, in effetti forse elabora non doveva avere come parametri v2, ma creare v2 stesso (meglio con allocazione dinamica o statica?) . In ogni caso se creo v2 con elabora, nella main devo sempre dichiarare un vettore v2 giusto?
    Qual'è il modo più corretto per risolvere l'esercizio?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Infatti ... non devi usare v2 e devi usare l'allocazione dinamica per restituire il vettore
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13
    Originariamente inviato da oregon
    Infatti ... non devi usare v2 e devi usare l'allocazione dinamica per restituire il vettore
    grazie per la risposta.
    Intendi qualcosa del genere?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int* elabora(int v1[], int *dim);
    int main() {
        
        int v1[10]={2,4,11,6,17,1,24,4,45,3};
        int i=0;
        int dim=0;
        int *p;
        p=elabora(v1,&dim);
        for (i=0;i<dim;i++)
        printf("%d ",p[i]);
        system("PAUSE");
        return 0;
    }
    
    int* elabora(int v1[], int *dim) {
         int *v2;
         int i,N=0;
         for (i=0;i<10;i++)
              if(v1[i]>5) 
                        N++;
         v2=(int *) malloc (N*sizeof(int));
         for (i=0;i<10;i++)
               if(v1[i]>5) {
                            v2[*dim]=v1[i]; 
                            (*dim)++;
                           }
         return v2;
    }

    Osservazioni correzioni gradite :-)
    Grazie ciao

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' quasi perfetto ... manca la liberazione della memoria e il controllo dell'allocazione ...

    codice:
    int main() {
        int v1[10]={2,4,11,6,17,1,24,4,45,3};
        int i=0;
        int dim=0;
        int *p;
        p=elabora(v1,&dim);
        for (i=0;i<dim;i++)
    	printf("%d ",p[i]);
    
        if(p) free(p);
    
        system("PAUSE");
        return 0;
    }
    
    int* elabora(int v1[], int *dim) {
         int *v2;
         int i,N=0;
         for (i=0;i<10;i++)
              if(v1[i]>5) 
                        N++;
         v2=(int *) malloc (N*sizeof(int));
         if(v2)
         {
    	for (i=0;i<10;i++)
               if(v1[i]>5) 
    	   {
    	        v2[*dim]=v1[i]; 
                    (*dim)++;
               }
         }
    
         return v2;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13
    Originariamente inviato da oregon
    E' quasi perfetto ... manca la liberazione della memoria e il controllo dell'allocazione ...
    ciao,
    scusa il ritardo nella risposta, ma oltre a preparare l'esame lavoro e ho poco tempo purtroppo.Ora va bene?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int* elabora(int v1[], int *dim);
    int main() {
        
        int v1[10]={2,4,11,6,17,1,24,4,45,3};
        int i=0;
        int dim=0;
        int *p;
        p=elabora(v1,&dim);
        if(!p) 
             printf("La funzione elabora() ha restituito NULL al main\n");
        for (i=0;i<dim;i++)
        printf("%d ",p[i]);
        free(p);
        system("PAUSE");
        return 0;
    }
    
    int* elabora(int v1[], int *dim) {
         int *v2;
         int i,N=0;
         for (i=0;i<10;i++)
              if(v1[i]>5) 
                        N++;
         v2=(int *) malloc (N*sizeof(int));
         if(!v2) 
             printf("In elabora(): allocazione array dinamico non riuscita\n");
         for (i=0;i<10;i++)
               if(v1[i]>5) {
                            v2[*dim]=v1[i]; 
                            (*dim)++;
                           }
         return v2;
    }
    volevo chiederti una cosa, in elabora() ho dovuto scansire due volte v1, la prima volta per capire quali dimensioni avrebbe dovuto avere v2 e la seconda per popolare v2.
    Mi sembra di aver utilizzato una soluzione ridondante, si poteva fare meglio?
    Grazie ciao

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.