PDA

View Full Version : [C++] Esercizio Vettori


biquidus
24-09-2011, 14:41
Salve ragazzi, devo scrivere questo programma in C++.. ma non sono riuscito a buttare giù niente.. mi fareste vedere come scrivere il seguente programma?

- Carica un vettore Vet di N componenti, con N <= 100, con numeri interi <= 99. Successivamente rileggi il vettore aggiornando un secondo vettore Vet2, formato da dieci componenti, in modo tale da ottenere, alla fine, la quantità di valori inferiori a 10 nella prima posizione di Vet2, i valori compresi tra 10 e 19 nella seconda posizione, i valori tra 20 e 29 nella terza e così via. Terminato l'aggiornamento, stampa il vettore Vet2.

clockover
24-09-2011, 14:53
Salve ragazzi, devo scrivere questo programma in C++.. ma non sono riuscito a buttare giù niente..

misà che almeno qualcosa ti tocca buttare giù :D

biquidus
24-09-2011, 14:55
Il problema è che non riesco a comprendere la traccia. Il codice saprei scriverlo.. mi aiuteresti anche a 'renderla più chiara'? Da quel che ho capito, ho scritto una cosa del tipo:

int main() {
int vet[100],vet2[10], i;
for(i=0;i<100;i++)
{
cout<<"inserisci numero";
cin>>vet[i];
}
for(i=0;i<100;1++)
{
switch(vet[i]/10)
{
case1:=1
vet2[0]=vet2[0]+1;
case2:=2
vet2[1]=vet2[1]+1;
case3:=3
vet2[2]=vet2[2]+1;
case4:=4
vet2[3]=vet2[3]+1;
case5:=5
vet2[4]=vet2[4]+1;
case6:=6
vet2[5]=vet2[5]+1;
case7:=7
vet2[6]=vet2[6]+1;
case8:=8
vet2[7]=vet2[8]+1;
case9:=9
vet2[8]=vet2[8]+1;
case10:=0
vet2[9]=vet2[9]+1;
}
}
for(i=0;i<10;1++)
{
cout<<" "<<vet2[i]
}
return 0;
}
Ma c'è un errore.. non capisco

clockover
24-09-2011, 15:03
Hai un vettore 1 di dimensione 100. Ogni cella può contenere un valore tra 0 e 99
Hai un vettore 2 di dimensione 10. La prima cella conta quanti elementi hai nel primo vettore di valore da 0 - 9, la seconda cella conta quanti ne hai da 10 - 19 e così via

Floris
24-09-2011, 15:08
Dovrebbe essere una cosa del genere:

vector<int> Vet = new vector<int>();
for(int i=0; i<100;i++)
Vet.push_back(rand(0,99))
vector<vector<int>> Vet2 = new vector<vector<int>>();
for(int i =0; i<10; i++){
Vet2.push_back(new vector<int>());
for(int j=0; j<100; j++){
if(Vet[j]>10*i && Vet[j]<10*(i+1))
Vet2[i].push_back(Vet[j]);
}
}

Sicuramente non compilerà...bisogna sistemarlo.

Edit: Vedo che nel codice che hai appena postato hai usato gli array...scrivendo vettori e C++ pensavo volessi usare i vector!

biquidus
24-09-2011, 15:10
Scusami, però non ho capito niente del tuo sorgente.. non per la sintassi, ma per le funzioni che hai usato.. mai viste! No allora ti chiedo scusa.. intendevo gli array!

Floris
24-09-2011, 15:11
Si scusa. Mi sono anche accorto che nel codice sopra ti salvo i valori mentre bastava semplicemente contarli. Allora diventa più semplice:

int* Vet = new int[100];
for(int i=0; i<100;i++)
Vet[i] = rand(0,99);
int* Vet2 = new int[10];
for(int i =0; i<10; i++){
for(int j=0; j<100; j++){
if(Vet[j]>10*i && Vet[j]<10*(i+1))
Vet2[i]++;
}
}

dove rand è la funzione di libreria che ritorna un intero casuale compreso tra 0 e 99 (forse si chiama con qualche altro parametro...guardati le specifiche in rete).
Probabilmente potresti anche farla più efficiente in qualche modo...ad esempio utilizzando funzioni per modificare i due cicli innestati ed averne uno solo:

for(int j=0; j<100; j++){
Vet2[floor(Vet[j]/10)]++;
}

dove floor arrotonda per difetto all'intero più vicino.

Edit:non serve floor...poiché essendo divisione tra interi, ritorna un intero tralasciando i decimali.

biquidus
24-09-2011, 15:13
Edit. E' giusto il mio sorgente? Ho migliorato così:
void main()
{

int vet[100],vet2[10],i,x=0;

for(i=0;i<100;i=i+1)

{
cout<<"inserisci numero";
cin>>vet[i];
}

for(i=0;i<100;i=i+1)
{
x=vet[i];
switch (x)
{
case1:1
vet2[0]=vet2[0]+1
case2:2
vet2[1]=vet2[1]+1
case3:3
vet2[2]=vet2[2]+1
case4:4
vet2[3]=vet2[3]+1
case5:5
vet2[4]=vet2[4]+1
case6:6
vet2[5]=vet2[5]+1
case7:7
vet2[6]=vet2[6]+1
case8:8
vet2[7]=vet2[8]+1
case9:9
vet2[8]=vet2[8]+1
case10:0
vet2[9]=vet2[9]+1;
}
}

for(i=0;i<10;i=i+1)
{
cout<<" "<<vet2[i];
getch();
}
return;
}

clockover
24-09-2011, 15:19
Ma c'è un errore.. non capisco

che tipo di errore

biquidus
24-09-2011, 15:21
Si scusa. Mi sono anche accorto che nel codice sopra ti salvo i valori mentre bastava semplicemente contarli. Allora diventa più semplice:

int* Vet = new int[100];
for(int i=0; i<100;i++)
Vet[i] = rand(0,99);
int* Vet2 = new int[10];
for(int i =0; i<10; i++){
for(int j=0; j<100; j++){
if(Vet[j]>10*i && Vet[j]<10*(i+1))
Vet2[i]++;
}
}

dove rand è la funzione di libreria che ritorna un intero casuale compreso tra 0 e 99 (forse si chiama con qualche altro parametro...guardati le specifiche in rete).
Probabilmente potresti anche farla più efficiente in qualche modo...ad esempio utilizzando funzioni per modificare i due cicli innestati ed averne uno solo:

for(int j=0; j<100; j++){
Vet2[floor(Vet[j]/10)]++;
}

dove floor arrotonda per difetto all'intero più vicino.
Ti ringrazio per tutto ciò che stai facendo, però ancor anon capisco.. io so che '*' è un putatore.. e non ho studiato questo.. sono solo ad un 4° Tecnico. In base al testo dell'esercizio, e in base al mio sorgente, puoi aiutarmi a capire da li se è giust?

Floris
24-09-2011, 15:26
Il case dello switch mi sembra sbagliato nel senso che case 1 sarebbe case 0, case 2 sarebbe case 1 e così via. Puoi semplificarlo usando direttamente l'argomento dello switch come indice sul vettore:

for(int j=0; j<100; j++){
Vet2[ Vet[j]/10 ]++;
}



Ti ringrazio per tutto ciò che stai facendo, però ancor anon capisco.. io so che '*' è un putatore.. e non ho studiato questo.. sono solo ad un 4° Tecnico. In base al testo dell'esercizio, e in base al mio sorgente, puoi aiutarmi a capire da li se è giust?


Va bene anche come li hai dichiarati tu. Io sono abituato così. La differenza è che nel tuo modo il vettore viene allocato nello stack (più efficiente ma meno flessibile), nel mio modo nello heap (meno efficiente ma più flessibile). Per il tuo esercizio va benissimo il tuo metodo.