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]