Aiuto Esercizio Array Monodimensionale di uscita v1

di il
6 risposte

Aiuto Esercizio Array Monodimensionale di uscita v1

Salve a tutti,
ho bisogno di aiuto per la realizzazione di un esercizio.
Premetto che sono un laureando in ing elettrica e non ho mai avuto a che fare con la programmazione..spero in un aiuto.
Ho il seguente problema :
devo calcolare in un primo array monodimensionale di uscita v1 gli elementi dell'array di ingresso che sono contemporaneamente dispari e maggiori o uguali della media.
ho iniziato a svolgere il prgramma in questo modo:

#include<iostream>
using namespace std;
#include<stdlib.h>
//prototipi delle funzioni

void input( int&n ,int vett[]);
double vetmed(int n,int vett[]);
void vettpari (int n, int vett[],int n_pari,int pari[]);








int main(){
int n;
int vett[100];
int n_pari;
int pari[100];


//chiamate delle funzioni
input(n,vett);
vetmed(n,vett);
vettpari(n,vett,n_pari,pari);






cout<<"\n\n";

system ("PAUSE");
return 0;
}



void input( int&n ,int vett[]){
int i;
cout<<"Assegna un valore intero al numero di elementi del vettore\n";
cin>>n;
cout<<"\n";
cout<<"Assegna "<<n<<" elementi del vettore\n";
cout<<"V=";
for (i=0;i<n;i++)
cin>>vett;
}

double vetmed (int n,int vett[])
{
int i;
int j;
double somma=0;
for(j=0;j<n;j++)

somma+=vett [j];

double media=somma / i;
cout<<"\n";
cout<<"la media dei valori immessi nel vettore e'"<< media;
cout<<"\n";
}

void vettpari (int n, int vett[],int n_pari,int pari[]) {

n_pari=0;
for (int i=0;i<n;i++)
if(vett%2==0) {
pari[n_pari]=vett;
n_pari ++;
}
cout<<"il vettore con i valori pari e':\n";
for (int i=0;i<n_pari;i++)
cout<<" "<<pari;

}

6 Risposte

  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1

    Se potete darmi una mano...ve ne sarei grato... grazie
  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1

    Secondo me ti basta solo trovare la media poi fai una scansione di tutto il vettore e se l'elemento è dispari e superiore alla media lo inserisci in un altro vettore.
    
    if((v[i] >= media) && (v[i]%2 == 1))
        inserisci l'elemento di v in vOutput;
    
  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1


    Ciao, ho letto la tua richiesta d'aiuto ed ho effettuato il debugging del tuo codice ed ho capito perchè non risponde alle tue aspettative.
    In verità ci sarebbero un bel pò di cose da correggere, alcune apperentemene innocue (casting sui tipi) altre strutturali (function: vettpari).
    Dato che mi sembra di capire che non hai una gran dimestichezza con la programmazione mi permetto di darti qualche suggerimento che spero ti possa essere utile.
    La prima cosa da rivedere è la funzione per il calcolo della media:
    
    double vetmed (int n,int vett[])
    {
    int i;
    int j;
    double somma=0;
    for(j=0;j<n;j++)
    
    somma+=vett [j];
    
    double media=somma / i;
    cout<<"\n";
    cout<<"la media dei valori immessi nel vettore e'"<< media;
    cout<<"\n";
    }
    
    Analizzando questo frammento possiamo evincere che:
    - Sarebbe opportuno passare n (il riempimento dell'array mono-dimensionale (vettore) di ingresso come const dato che per la funzione è un parametro d'ingresso.
    - Sul tipo restituito è opinabile ma non errato l'uso del double; in verità essendo il vettore d'ingresso costituito da interi secondo me sarebbe meglio l'utilizzo di float ottenendo lo stesso risultato ma con minor dispendio di memoria.
    - Il calcolo della media è corretto dal punto di vista del risultato ma logicamente errato; perchè:
    + hai utilizzato la variabile i globale (che per caso conteneva il riempimento del vett. d'ingresso) e non n variabile d'ingresso deputata allo scopo.
    + la funzione non restituisce nulla (manca il return) ma stampa a video il risultato.
    In definitiva socondo mio modesto parere la funzione in questione avrebbe dovuta essere scritta così:
    
    /* Da mettere nella sezione dei prototipi. */
    float VetMed(const int,     //Riempimento.
                 int vett[]);   //Vettore d'ingresso.
    
    /* Da mette nella sezione dell'implementazione delle funzioni. */
    float VetMed(const int r,    //Riempimento.
                 int vett[])     //Vettore d'ingresso.
    {
       int somma,   //Somma pariziale degli elementi del vettore d'ingresso.
           i;       //Indice di scansione degli elementi del vettore d'ingresso.
    
       somma= 0;
       for (i=0;i<r;i++)
          somma+=vett[i];
       return ((float) somma/(float) r);   //Casting esplicito.
    }
    
    /* Da mettere all'interno della funzione main. */
       float media;   //Media aritmetica.
    
       media= VetMed(n,vett);   //Calcola la media degli elementi del vettore d'ingresso.
       cout <<"\n";
       cout <<"La media dei valori immessi nel vettore e': "<< media;
       cout <<"\n";
    
    Ovviamente il codice non è completo ma credo di poterti postare il resto anche domani stesso.
    Fammi sapere solo se sei ancora interessato.
    Spero di esserti stato utile in qualche modo..
    [/color]
  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1


    Buon pomeriggio...
    Come ti avevo promesso ti posto qui di seguito il resto del codice e la soluzione completa al tuo problema.
    In primis lascia che ti chieda in che modo la pseudo-funzione vettpari possa risolvere il tuo problema.
    Stando alle specifiche bisogna estrarre da un vettore d'ingresso tutti e soli quegli che sono dispari e che siano non minori della media degli elementi del vettore d'ingresso stesso. Dal debugging del tuo codice evinco che la funzione determina i valori pari; ergo non risolve il tuo problema.
    Al suo posto io aggiungerei le due funzioni seguenti:
    
    /* Da mettere nella sezione dei prototipi. */
    bool IsOdd(const int);      //Elemento da controllare.
    void DetElem(const int,     //Riempimento del vettore d'ingresso.
                 int vett[],    //Vettore d'ingresso.
                 const float,   //Media.
                 int &,         //Riempimento del vettore d'uscita.
                 int v1[]);     //Vettore d'uscita.
    
    /* Da mette nella sezione dell'implementazione delle funzioni. */
    bool IsOdd(const int elem)
    {
       bool odd;   //Flag che indica se elem è dispari o meno.
    
       if ((elem%2) == 1)
          odd= true;
       else
          odd= false;
       return (odd);
    }
    
    void DetElem(const int ri,     //Riempimento del vettore d'ingresso.
                 int vett[],       //Vettore d'ingresso.
                 const float avg,  //Average-Media
                 int &ru,          //Riempimento del vettore d'uscita.
                 int v1[])         //Vettore d'uscita.
    {
       int j,     //Indice di scansione delle posizioni degli elementi del vettore
                  //d'uscita.
           i,     //Indice di scansione delle posizioni degli elementi del vettore
                  //d'ingresso.
           elm;   //Elemento i-mo del vettore d'ingresso.
    
       j= 0;
       for (i=0;i<ri;i++)
       {
          elm= vett[i];
          if ((IsOdd(elm)) && (((float)elm)>=avg))
          {
             v1[j]= elm;
             j++;
          }
       }
       ru= j;
    }
    
    /* Da mettere all'interno della funzione main. */
       DetElem(n,vett,media,m,v1);
       cout <<"il vettore con i valori ricercati e':\n";
       for (j= 0;j<m;j++)
          cout <<" "<<v1[j];
    
    Per essere sinceri la funzione IsOdd è più "coreografica" che necessaria ma migliora senza alcun dubbio la leggibilità del codice.
    A questo punto il codice è completo e funzionante anche se mi permetto di farti osservare alcune cose:
    - Le specifiche non facendo riferimento alcuno al massimo numero di elementi del vettore d'ingresso, ti hanno portato all'assegnazione arbitraria di 100 (in verità 101 se consideriamo il fatto che in C l'indice parte da zero). Questo non è un errore ma se si considera il fatto che il processore del PC è un processore a parola (32-64 bit) è conveniente (non indispensabile) impostare quel valore come multiplo di una potenza di 2. Questo perchè il sistema operativo o meglio la sezione dedicta alla gestione della memoria in questo caso è più efficiente; ciò comporta secondo mio parere modesto una impostazione a 128 e non a 100.
    - Il numero di elementi del vettore d'uscita non è arbitraria (anche se lo può apparire di primo acchitto), quindi la scelta di impostare la sua dimensione a 100 non è errata ma certamente poco efficiente. Da un minimo di analisi matematica 1 sugli insiemi numerici è abbastanza semplice rendersi conto che il vettore d'uscita non contenendo numeri pari sarà almeno la metà rispetto alle dimensioni del vettore d'ingresso. In effetti se uno osserva bene, considerndo un qualsiasi intervallo compatto in N è facile osservare che la media degli interi in esso contenuti possono solo coincidedere con uno degli interi stessi oppure frapporsi fra due di essi. Questo implica che la media fa si che vengano scartati al più la metà degli elementi.
    - In definitiva è possibile asserire che la dimensione nonchè il riempimento del vettore d'uscita sono univocamente legati rispettivamente alla dimensione e riempimento del vettore d'ingresso. Detti r1 ed r2 rispettivamente i riempimenti dei vettori d'ingresso e d'uscita, si ha: r2= int(r1/4).
    Ecco perchè ho impostato a 25 il riempimento di v1.
    A seguire è mostrato l'intero codice:
    
    #include<iostream>
    using namespace std;
    //---------------------------------------------------------------------------
    
    void input( int&n ,int vett[]);
    float VetMed(const int,     //Riempimento.
                 int vett[]);   //Vettore d'ingresso.
    bool IsOdd(const int);      //Elemento da controllare.
    void DetElem(const int,     //Riempimento del vettore d'ingresso.
                 int vett[],    //Vettore d'ingresso.
                 const float,   //Media.
                 int &,         //Riempimento del vettore d'uscita.
                 int v1[]);     //Vettore d'uscita.
    
    int main(int argc, char* argv[])
    {
       int n;
       int vett[100];
       float media;   //Media aritmetica.
       int v1[25];    //Vettore d'uscita.
       int m,         //Riempimento del vettore d'uscita.
           j;         //Indice di scansione delle posizioni degli elementi del
                      //vettore d'uscita.
    
       //chiamate delle funzioni
       input(n,vett);
       media= VetMed(n,vett);
       cout <<"\n";
       cout <<"La media dei valori immessi nel vettore e': "<< media;
       cout <<"\n";
       DetElem(n,vett,media,m,v1);
       cout <<"il vettore con i valori ricercati e':\n";
       for (j= 0;j<m;j++)
          cout <<" "<<v1[j];
       cout <<"\n\n";
       system ("PAUSE");
       return 0;
    }
    //---------------------------------------------------------------------------
    
    void input( int&n ,int vett[]){
    int i;
    cout<<"Assegna un valore intero al numero di elementi del vettore\n";
    cin>>n;
    cout<<"\n";
    cout<<"Assegna "<<n<<" elementi del vettore\n";
    cout<<"V=";
    for (i=0;i<n;i++)
    cin>>vett[i];
    }
    //---------------------------------------------------------------------------
    
    float VetMed(const int r,    //Riempimento.
                 int vett[])     //Vettore d'ingresso.
    {
       int somma,   //Somma pariziale degli elementi del vettore d'ingresso.
           i;       //Indice di scansione delle posizioni degli elementi del vettore
                    //d'ingresso.
    
       somma= 0;
       for (i=0;i<r;i++)
          somma+=vett[i];
       return ((float) somma/(float) r);   //Casting esplicito.
    }
    //---------------------------------------------------------------------------
    
    bool IsOdd(const int elem)
    {
       bool odd;   //Flag che indica se elem è dispari o meno.
    
       if ((elem%2) == 1)
          odd= true;
       else
          odd= false;
       return (odd);
    }
    //---------------------------------------------------------------------------
    
    void DetElem(const int ri,     //Riempimento del vettore d'ingresso.
                 int vett[],       //Vettore d'ingresso.
                 const float avg,  //Average-Media
                 int &ru,          //Riempimento del vettore d'uscita.
                 int v1[])         //Vettore d'uscita.
    {
       int j,     //Indice di scansione delle posizioni degli elementi del vettore
                  //d'uscita.
           i,     //Indice di scansione delle posizioni degli elementi del vettore
                  //d'ingresso.
           elm;   //Elemento i-mo del vettore d'ingresso.
    
       j= 0;
       for (i=0;i<ri;i++)
       {
          elm= vett[i];
          if ((IsOdd(elm)) && (((float)elm)>=avg))
          {
             v1[j]= elm;
             j++;
          }
       }
       ru= j;
    }
    
    Ovvio che altre cose potrebbero essere migliorate, in ogni caso questa è una soluzione efficace al tuo questito.
    Spero di essere stato utile in qualche modo..
    N.B.: Chiedo scusa in anticipo per orrori di battitura
    Cordiali saluti...
    [/color]
  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1

    Tutto giusto ma questo non mi convince
    - In definitiva è possibile asserire che la dimensione nonchè il riempimento del vettore d'uscita sono univocamente legati rispettivamente alla dimensione e riempimento del vettore d'ingresso. Detti r1 ed r2 rispettivamente i riempimenti dei vettori d'ingresso e d'uscita, si ha: r2= int(r1/4).
    se io ho v1 = {5,5,5..................5} 100 volte.
    v2 non sara mai di 25 elementi ma di 100 perche la media è 5 e sono costretto a inserire tutti gli elementi.

    IsOdd si può scrivere in modo + ottimale.
    
    bool IsOdd(const int n)
    {
         return (n & 1);
    }
    
    Esempio completo:
    
    bool IsOdd(const int n)
    {
         return (n & 1);
    }
    
    int main()
    {
    	for(int i = 0; i < 100; i++)
    		cout << "Is " << i << " Odd\? :" << std::boolalpha << IsOdd(i) << endl;
    	return 0;
    }
    
  • Re: Aiuto Esercizio Array Monodimensionale di uscita v1



    Ragione da vendere, in effetti quello che ho detto risulta essere vero nell'ipotesi che il vettore d'ingresso non contenga duplicati.
    L'ho scritto (il post) sotto questa ipotesi ma sarebbe stato meglio scriverla l'ipotesi per un fatto di completezza.
    Grazie per la dritta. In ogni caso è sempre meglio fornire quante più spiegazioni possibili.
    Vero anche per la funzione: IsOdd, la si potrebbe scrivere in quel modo (sfrutta altro meccanismo ma il risultato è identico).
    Buona serata
Devi accedere o registrarti per scrivere nel forum
6 risposte