View Full Version : [c++]spiegazione di funzione
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
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.
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:
si lo so, ma è solo un lucido della professoressa...
Ah beh ... allora si spiega tutto ... ;) :Prrr:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.