PDA

View Full Version : [c++]spiegazione di funzione


SCYHO
12-01-2006, 13:58
ciao. ki mi spiega questa funzione elimina_dispari?

void leggi_vetint(int V[], int & n) {
cout << "\n Procedura di inserimento del vettore";
cout << "\n Inserisci il riempimento: ";
cin >> n;
cout << "\n Inserisci il vettore. Solo numeri interi positivi: ";
for (int i=0; i<n; i++) {
cout << "\n Elemento di posizione " << i << ": ";
cin >> V[i];
}
cout << "\n Inserimento terminato.";
}

int elimina_dispari(int V[], int & n){

int el=0;
int cont=0;
for (int i=0; i<n; i++)
if (V[i]%2) {
for ( int j=i; j<n-1; j++ )
V[j] = V[j+1];
n--;
cont++;
i--;
}
return cont;
}

void stampa_vetint(const int V [], const int n){
if (n)
for (int i=0; i<n; i++) {
cout << "\n Elemento di posizione " << i << ": ";
cout << V[i];
}
else cout << "\n Il vettore e' vuoto!";
}


ke poi viene usata nel main in questo modo

do {
int vettore[DIM];
int n,ris;

leggi_vetint(vettore,n);
cout << "\n Eliminazione di tutti gli elementi dispari dal vettore.";
ris=elimina_dispari(vettore,n);
}


grazie ciaooo

DarkRevenge
12-01-2006, 14:44
Questa funzione, come si può facilmente intuire dal nome, elimina tutti i numeri dispari dall'array passato ad essa.

I parametri passati sono il vettore V[] e la sua grandezza n (passata per indirizzo perchè il suo valore dovrà essere decrementato ogni volta che viene eliminato un elemento).
Il primo for serve a scorrere tutto il vettore. Per ogni elemento viene controllato con un if se esso è dispari, cioè dividendolo per 2 si ottiene resto 1. Se è dispari il valore verrà cancellato mediante un for che sposta tutti gli elementi indietro di una posizione nell'array a partire da quello successivo a quello da cancellare (in questo modo l'elemento da cancellare viene sovrascritto e l'array rimane compatto). Infine viene decrementata la dimensione del vettore (n) e incrementato il contatore degli elementi cancellati. Il decremento della i invece fa in modo che, se è stato cancellato un elemento, venga controllato anche quello che ha preso il suo posto, che altrimenti verrebbe saltato.
Infine la funzione restituisce il numero di elementi cancellati

andbin
12-01-2006, 14:51
ciao. ki mi spiega questa funzione elimina_dispari?

int elimina_dispari(int V[], int & n){

int el=0;
int cont=0;
for (int i=0; i<n; i++)
if (V[i]%2) {
for ( int j=i; j<n-1; j++ )
V[j] = V[j+1];
n--;
cont++;
i--;
}
return cont;
}

grazie ciaooo
Ciao, te la spiego volentieri io.
La funzione elimina_dispari modifica l'array in modo che alla fine ci siano soltanto numeri interi pari all'interno dell'array. In pratica con il primo for verifica se ogni elemento V[i] è dispari (perché V[i]%2 dà 1 come risultato) e in quel caso "shifta" (sposta) tutti gli elementi successivi all'indietro in modo che l'array si "compatti". Alla fine rimangono solo gli elementi pari. Nota che anche il valore della variabile n (il numero degli elementi) viene scalato man mano (ed essendo n un reference, modifica la variabile passata dal chiamante).

Nonostante la funzione elimina_dispari funzioni correttamente, è poco efficiente (deve scalare ogni volta tutti gli elementi successivi).
Una funzione molto più pratica ed efficiente è questa:
void elimina_dispari (int *v, int &n)
{
int i, j=0;
for (i=0; i<n; i++)
if ((v[i] % 2) == 0) // v[i] e` pari?
v[j++] = v[i];
n = j;
}
Non è più semplice così??? Penso che nessuno prenderebbe la macchina per andare dal giornalaio sotto casa o userebbe un cacciavite per piantare un chiodo! Dico bene? :p
Ciao.

SCYHO
12-01-2006, 15:44
Ciao, te la spiego volentieri io.
La funzione elimina_dispari modifica l'array in modo che alla fine ci siano soltanto numeri interi pari all'interno dell'array. In pratica con il primo for verifica se ogni elemento V[i] è dispari (perché V[i]%2 dà 1 come risultato) e in quel caso "shifta" (sposta) tutti gli elementi successivi all'indietro in modo che l'array si "compatti". Alla fine rimangono solo gli elementi pari. Nota che la variabile n (il numero degli elementi) viene anch'esso scalato man mano (ed essendo un reference modifica la variabile passata dal chiamante).

Nonostante la funzione elimina_dispari funzioni correttamente, è poco efficiente (deve scalare ogni volta tutti gli elementi successivi).
Una funzione molto più pratica ed efficiente è questa:
void elimina_dispari_2 (int *v, int &n)
{
int i, j=0;
for (i=0; i<n; i++)
if ((v[i] % 2) == 0) // v[i] e` pari?
v[j++] = v[i];
n = j;
}
Non è più semplice??? Penso che nessuno prenderebbe la macchina per andare dal giornalaio sotto casa o userebbe un cacciavite per piantare un chiodo! Dico bene? :p
Ciao.


si lo so, ma è solo un lucido della professoressa...mica l'ho fatto io. :D

Cmq grazie ad entrambi per la spiegazione. Forse tra 6 giorni, all'esame riuscirò a combinare qualcosa.

GRAZIEEE!! :yeah:

andbin
12-01-2006, 15:48
si lo so, ma è solo un lucido della professoressa...
Ah beh ... allora si spiega tutto ... ;) :Prrr: