PDA

View Full Version : [C++] Funzione elimina


Andreww!!!
21-09-2008, 16:50
salve a tutti, devo eliminare da un vettore V tutti gli elementi il cui valore è maggiore di k e calcoli il numero num degli elementi eliminati. La prima parte di input del vettore già l'ho fatta, ma ho problemi sulla funzione elimina, di seguito vi posto quello che ho scritto io!:

void elimina (int V[], int&n, int&k, int&num)

{
int i;
i=0; num=0;
if (V[i]>k)
{elimina=i;
} else i++;
for(i=0;i<n;i++)
{num=i++}

scusate se ho postato male ma è la prima volta per me..e come sempre...HELP!

Fenomeno85
21-09-2008, 16:57
salve a tutti, devo eliminare da un vettore V tutti gli elementi il cui valore è maggiore di k e calcoli il numero num degli elementi eliminati. La prima parte di input del vettore già l'ho fatta, ma ho problemi sulla funzione elimina, di seguito vi posto quello che ho scritto io!:

void elimina (int V[], int&n, int&k, int&num)

{
int i;
i=0; num=0;
if (V[i]>k)
{elimina=i;
} else i++;
for(i=0;i<n;i++)
{num=i++}

scusate se ho postato male ma è la prima volta per me..e come sempre...HELP!

passare il puntatore all'intero k non ha senso. Poi che specifiche hai? Ti va bene un O(n^2) oppure vuoi un O(n) sprecando più memoria?

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:01
devo sprecare meno memoria, comunque la funzione deve avere in ingresso n,v,e k e in uscita mi deve dare num, ovvero il numero delle cifre eliminate. Il vettore è composto da interi. A guardarlo c'è qualcosa che non va, non riesco proprio a capire la logica della funzione e di sicuro V[i]>k non posso assolutamente farlo...un vettore maggiore di uno scalare?? quello che voglio intendere io è ke l'elemento del vettore è maggiore dello scalare ma non so come tradurlo!!

Fenomeno85
21-09-2008, 17:18
devo sprecare meno memoria, comunque la funzione deve avere in ingresso n,v,e k e in uscita mi deve dare num, ovvero il numero delle cifre eliminate. Il vettore è composto da interi.

perfetto allora avrai



/*
* v[] vettore contenente i numeri
* k valore massimo
* n dimensione dell'array
*/
int* elimina (int v[], int k, int n, int &numElementiCancellati)
{
// impostiamo a 0 il numero di elementi eliminati
*numElementiCancellati = 0;

// scorriamo l'array alla ricerca degli elementi da cancellare
for (int i = 0; i < n; i++)
{
// controlliamo che l'elemento sia maggiore del valore passato
if (v[i] > k)
{
// scorriamo per eliminare gli elementi
for (int j = i; j < n -1 ; j++)
{
v[j] = v[j+1];
}

// impostiamo per esempio a 0 l'ultimo elemento
v[n -1] = 0;

// incrementiamo il contatore
*numElementiCancellati ++;
}
}

// ritorniamo l'array modificato
return v;
}


non posso provare perchè non ho su installato nulla per c++

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:21
lo provo io. in ogni caso grazie sei stato molto gentile..

Fenomeno85
21-09-2008, 17:25
lo provo io. in ogni caso grazie sei stato molto gentile..

tranquillo dimmi solo se va bene .. soprattutto per il fatto che dato che non mi hai detto nulla ho impostato a 0 gli elementi.

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:28
void funz1 (int &k, float v[], bool &scambia, int dim, float val, int &j)

{
int i;

for (i=0; i<dim-1; i++)
{
k=0; j=0; scambia=false;
if (v[i]>val)
{
while(v[i+1]<val)
{ v[i]=v[i+1];
j++;
scambia=true;
k++;
}
}
}
}


un mio amico ha usato questo! mi dici qual è la differenza rispetto al tuo?

Fenomeno85
21-09-2008, 17:37
void funz1 (int &k, float v[], bool &scambia, int dim, float val, int &j)

{
int i;

for (i=0; i<dim-1; i++)
{
k=0; j=0; scambia=false;
if (v[i]>val)
{
while(v[i+1]<val)
{ v[i]=v[i+1];
j++;
scambia=true;
k++;
}
}
}
}



un mio amico ha usato questo! mi dici qual è la differenza rispetto al tuo?

allora prima cosa usa il tag code che rende più leggibile il codice, poi rispetto alle specifiche che hai dato quel bool non può esistere come per esempio k o j. Diciamo che o i nomi delle variabili hanno un senso oppure è meglio non programmare.
Guardando poi quel valore booleano è messo a casaccio, non serve a nulla.
Per finire che a vista sembra che quel programma va in loop infinito nel caso in cui v[i] > val ... se v[i+1] < val allora li rimarrà fino a morte dell'universo.

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:39
io vorrei postarti tutto il testo ma il regolamento me lo vieta....come posso spiegartelo senza andare contro le regole?? :muro:

Fenomeno85
21-09-2008, 17:40
io vorrei postarti tutto il testo ma il regolamento me lo vieta....come posso spiegartelo senza andare contro le regole?? :muro:

guarda basta che esprimi a parole cosa dice la funziona elimina. Quella che ti ho postato rispecchia il compito?

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:41
il fatto è ke l'ho detto solo che tu dici che manca qualcosa ma non so a cosa ti riferisci..

Andreww!!!
21-09-2008, 17:43
inoltre ti vorrei far vedere tt il programma per ulteriori kiarimenti, sempre se ne hai voglia e se lo poxo fare.

Fenomeno85
21-09-2008, 17:46
il fatto è ke l'ho detto solo che tu dici che manca qualcosa ma non so a cosa ti riferisci..

il programma "dovrebbe essere corretto" nel senso che dovrebbe compilare, non andare in loop oppure uscire e andare fuori dall'array.
Il problema è che bisogna capire e solo te lo sai se una volta che hai trovato l'elemento da cancellare, in quella cella va messo un segno particolare oppure bisogna shiftare gli elementi? In questo caso se si shifta si va a creare alla fine un buco che va riempito con una marca. Io ho messo 0.


Ovvero pensa se hai questo array e k = 3:

1 2 3 4 5 6 7

1 2 3 5 6 7 0

1 2 3 6 7 0 0

1 2 3 7 0 0 0

1 2 3 0 0 0 0

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 17:47
il programma deve soltanto calcolare quanti elementi sonos tati cancellati non quali

EDIT:ah abbiamo dimenticato di dichiarare j!

Andreww!!!
21-09-2008, 17:51
Ovvero pensa se hai questo array e k = 3:

1 2 3 4 5 6 7

1 2 3 5 6 7 0

1 2 3 6 7 0 0

1 2 3 7 0 0 0

1 2 3 0 0 0 0

~§~ Sempre E Solo Lei ~§~

così io dovrei avere:
V= 1,2,3 e num=4 (quantità elementi cancellati!

Andreww!!!
21-09-2008, 18:00
void elimina (int V[], int&n, int k, int j, int&num)

{
int i;
num=0;
for (i=0;i<n;i++)
{if (V[i]>k)
{ for (j=i;j<n-1;j++)
{V[j]=V[j+1];
}
V[n-num-1]=0;
j++;
}
}
}

ho scritto così io e mi dice:
[Linker error] undefined reference to `elimina(int*, int&, int&, int&)'

Fenomeno85
21-09-2008, 18:07
così io dovrei avere:
V= 1,2,3 e num=4 (quantità elementi cancellati!

il programma che ti ho mandato fa proprio quello.

Quello che non riesci a capire è che se hai 100 elementi e te ne rimangono 3 gli altri 97 devono avere un valore ma questo dipende dal programma. Se invece vuoi un array di dimensione 3 allora quel programma deve essere fatto in maniera diversa usando malloc.

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 18:09
void elimina (int V[], int&n, int k, int j, int&num)

{
int i;
num=0;
for (i=0;i<n;i++)
{if (V[i]>k)
{ for (j=i;j<n-1;j++)
{V[j]=V[j+1];
}
V[n-num-1]=0;
j++;
}
}
}

ho scritto così io e mi dice:
[Linker error] undefined reference to `elimina(int*, int&, int&, int&)'

HELP!! Con return V, il programma mi da errore :
return-statement with a value, in function returning 'void'

Fenomeno85
21-09-2008, 18:12
HELP!! Con return V, il programma mi da errore :
return-statement with a value, in function returning 'void'

non vorrei essere cattivo ma prima devi leggere un libro su come si programma con questo linguaggio.

~§~ Sempre E Solo Lei ~§~

Andreww!!!
21-09-2008, 18:18
purtroppo hai ragione è lunga da spiegare, so di sapere poco e questo forum era l'unica cosa veloce ke mi è venuta in mente per imparare, scusa se ti ho fatto perdere tempo.:doh:

Andreww!!!
21-09-2008, 18:55
in un momento di follia (ma anche di meditato ragionamento) trovando l'errore, la funzione che mi hai scritto tu non funge come dovrebbe....i valori maggiori del k bisogna eliminari e nn eguagliarli a 0!

Fenomeno85
21-09-2008, 19:13
purtroppo hai ragione è lunga da spiegare, so di sapere poco e questo forum era l'unica cosa veloce ke mi è venuta in mente per imparare, scusa se ti ho fatto perdere tempo.:doh:

non mi fai perdere tempo solo che aiutare va bene se chi chiede sa di cosa si sta parlando altrimenti è solo farti l'esercizio e te non imparerai mai nulla.

in un momento di follia (ma anche di meditato ragionamento) trovando l'errore, la funzione che mi hai scritto tu non funge come dovrebbe....i valori maggiori del k bisogna eliminari e nn eguagliarli a 0!

allora come ti avevo detto pocanzi non sapendo le specifiche ho tirato su una soluzione.
Quella del tuo amico oltre che essere orribilante non fa altro che spostare gli elementi senza definire il valore.
Se vuoi modificare la dimensione dell'array allora riguardati come creare array dinamicamente in c++.
Non vorrei essere anche pessimista non avendo letto il testo dell'esercizio, ma se si vogliono delle strutture dinamiche la soluzione sarebbe meglio sceglierla come double linked list o una lista classica.

~§~ Sempre E Solo Lei ~§~