C++ elimina max in un array (sono agli inizi)

ilyily87
ciao a tutti...come ho già scritto nel titolo sono agli inizi...quindi scusatemi se per voi queste cose sono stupide..ho davvero bisogno del vostro aiuto

allora, l'esercizio è

Dato un vettore di dimensioni massime DIM costruire tre procedure:
una per inserire il vettore, una che calcolato il massimo elimina le
eventuali occorrenze del massimo e la terza che stampa il vettore ottenuto.
Utilizzare una funzione che inoltre chiede se continuare o terminare


io mi sono bloccata all'inizio.
ho fatto così:

#include <iostream.h>
#include <stdlib.h>
using namespace std; 

void leggivett(int v[], int n); //legge gli elementi del vettore
void stampavett(int v[], int n);  //stampa il vettore inserito da tastier
int maxvett(int v[], int n); // trova il massimo 


int main()
{
    int vett[50],n,max;
    cout<<"inserisci dimensione del vettore"<<endl;
    cin>>n;
    leggivett(vett, n);
    stampavett (vett, n);
    maxvett (vett, n);

    system("PAUSE");
    return 0;
      
    }

void leggivett(int v[], int n)
{
     int i;
     for (i=0;i<n;i++){
         cout<<"inserisci l'elemento "<<i+1<<endl;
         cin>> v[i];
         }
}

void stampavett(int v[], int n)
{
int i;
cout<<"il vettore inserito e'"<<endl;
for(i=0;i<n;i++){
                 cout<<v[i]<<endl;
                 }     
}
 
   int maxvett(int v[50], int n){
       int max,i;
       max = v[0];       
       for(i=0;i<n;i++)
       {       if (max<v[i])
              max=v[i];
              }
       cout<<"il massimo e'"<<max<<endl;
       return max;       
       
       
       }      
 


non so come proseguire per gli altri 2 punti, ovvero eliminare le occorrenze del max e fare la funzione che chiede all'utente se continuare o terminare.

spero possiate aiutarmi


grazie ila

Risposte
eugenio.amitrano
Le procedure che hai scritto, non hanno effetto sul vettore dichiarato nel main che passi come parametro alle funzioni.

Hai studiato i puntatori ?
Se non hai studiato i puntatori l'unico modo per poter intervenire sul vettore nelle varie funzioni e' dichiararlo static globale.

Fammi sapere che ti realizzo un programma che postrebbe aiutarti.

A presto,
Eugenio

ilyily87
no ](*,) non li capisco i puntatori!!!! non sono mai riuscita a capirli ...come si potrebbe fare senza puntatori?

eugenio.amitrano
Vediamo se riesco a farteli capire.

Quando dichiariamo una variabile, significa che associamo ad un nome, un indirizzo ed uno spazio di memoria.

Per esempio:

int var;

Con questa dichiarazione, abbiamo associato al nome var un indirizzo (non ci interessa quale) ed uno spazio di 2 byte di memoria. (short = 8 bits; int = 16 bits; long = 32 bits).

Per identificare l'indirizzo associato ad una variabile si scrive il nome preceduto da una &.
Per il nostro esempio, l'indirizzo di var si identifica con &var.

Immaginiamo di avere l'esigenza di dover modificare il contenuto di una variabile senza poterla usare.
(Per esempio modificare il contenuto di una variabile locale attraverso un'altra funzione)

Come posso farlo ?
La risposta e' semplice, con i puntatori, che non sono mucche in calore, ma variabili in grado di puntare altre variabili.
Cioe' posso modificare il contenuto di una variabile attraverso un'altra variabile. Pazzesco!

Per dichiarare un puntatore devo aggiundere un * al tipo di variabile che voglio puntare:
Per esempio per puntare una variabile
int var;
mi occorre un puntatore ad interi
int * ptr;

per fare in modo che ptr punti alla variabile var devo assegnargli il suo indirizzo:
ptr = &var;

da adesso in poi, tutte le azioni eseguo su *ptr e come se le facessi direttamente su var,
quindi se scrivo *ptr = 5;
e come se avessi scritto var = 5;

FINISH !!!

Ti e' piaciuta la spiegazione ?
Se ti serve qualche chiarimento scrivi pure. Ok ?

Eugenio

P.S.
Una volta chiariti questi concetti si puo' procedere con il programma.

eugenio.amitrano
I puntatori sono importantissimi nella programmazione.
Non riesco proprio a immaginare di programmare senza.
Se programmare senza i puntatori e come possedere un'auto, programmare con i puntatori e come possedere un'astronave, non occorrono strade per arrivare a destinazione.

eugenio.amitrano
Ora devo andare,
purtroppo prima di martedi' non posso leggere le tue eventuali risposte.

A martedi',
ciao ciao,
Eugenio

eugenio.amitrano
Sono riuscito oggi a trovare un po' di tempo per collegarmi. Comunque ritornero' martedi'.

A presto,
Eugenio

gigilatrottola2
"ilyily87":
no ](*,) non li capisco i puntatori!!!! non sono mai riuscita a capirli ...come si potrebbe fare senza puntatori?


Guarda, sono molto tranquilli i puntatori.

Ogni variabile ha un indirizzo di memoria, UNICO (è l'indirizzo che rende unica una variabile, nn il nome) ed un valore di un particolare tipo (intero, reale, carattere).

I puntatori sono variabili che hanno un proprio indirizzo di memoria (sono variabili anch'esse) ma che hanno la particolarità di avere, come valore, l'indirizzo di memoria di un'altra variabile.

Quindi se lavori sul valore del puntatore, modifichi l'area di memoria a cui punta, ossia un'altra variabile.

E' solo questione di entrare nella mentalità dei puntatori. Puoi vederli come un modo diverso per accedere ad una variabile.
Hanno il vantaggio di poter "saltare" da una variabile all'altra :)

hypnotizer
scusatemi, ma il nome dell'array e' il puntatore alla prima cella dell'array stesso, quindi in teoria il suo passaggio di parametro e' corretto. tanto e' vero che l'array v[] nel passaggio di parametri puo' essere tranquillamente scritto *v.

i puntatori non sono difficili, ma possono far venire il mal di testa :)

mettiamo che vengono dichiarati due puntatori e una variabile non-puntatore:
int *p, *q:
int x:

faccio qualche esempio di utilizzo dei puntatori:
p=q;

copi in p l'indirizzo di q, cioe' puntano entrambi alla stessa cella di memoria.
*p=3;

il valore contenuto nella cella puntata da p viene settato a 3.
*p=*q;

il valore contenuto nella cella puntata da p viene settata come il valore contenuto nella cella puntata da q.
p=&x;

p punta all'indirizzo della variabile x.

hypnotizer
uh, scusami eugenio, non avevo visto che la spiegazione gliel'avevi gia' data tu. sorry!

eugenio.amitrano
Quali scuse ?
Ogni ulteriore spiegazione e' sempre bene accetta. :wink:
Aiuta maggiormente la comprensione dell'argomento!

A presto,
Eugenio

ilyily87
grazie a tutti ragazzi...

siete stati molto chiari.

il mio problema è che non riesco a metterli in pratica questi dannati puntatori...non riesco a capire quando utilizzarli...

eugenio.amitrano
per esempio, volgio realizzare una funzione che raddoppia il valore di una variabile.

se la funzione e' dichiarata come segue:

void raddoppia (int var)
{
var *= 2;
return;
}

non ci sara' effetto sul parametro.

Se nel mio main scrivo

int pippo = 5;

raddoppia(pippo);

pippo rimarra' uguale a 5.


Il modo corretto per fare una cosa del genere e' attraverso i puntatori:

invece, se la funzione e' dichiarata come segue:

void raddoppia (int *var)
{
*var *= 2;
return;
}

ci sara' effetto sul parametro.

Se nel mio main scrivo

int pippo = 5;

raddoppia(&pippo); // devo passare l'idirizzo di pippo in modo che var punti a pippo.

a questo punto, pippo sara' uguale a 10.

Chiaro ?

Se hai bisogno, scrivi pure.

Eugenio

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.