PDA

Visualizza la versione completa : [C++]Iterazione per sequenza


signoredeltempo
17-09-2012, 21:28
Salve,

Devo creare una sequenza (determinata) con un iterazione.
Mi serve per stampare i numeri di una tabella, i quali appunto, seguono questa sequenza.
Ecco il codice:

//SEQUENZA: +1 - +1 - +1 - +5
int x=4, y=1, z=5;
while (x <=100)
{
cout << x << "\t";
x+=y;
cout << x << "\t";
x+=y;
cout << x << "\t";
x+=y;
cout << x << "\t";
x+=z;



}

E' sbagliato, perchè arriva a 103.
Una soluzione sarebbe aggiungere un if-break, ma voglio capire da dove deriva questo "errore" e come ovviarlo per evitare ripetizioni in futuro.

Ringrazio e saluto.

oregon
17-09-2012, 21:42
L'errore deriva dal fatto che le x sono aumentate all'interno e il controllo della while avviene solo alla fine ...

Devi inserire le if...break ...

Se i valori degli incrementi sono costanti, non usare le variabili y e z ...



int x=4, lim = 100;
while (x<=lim)
{
cout << x << "\t";
x++; if(x>lim) break;

cout << x << "\t";
x++; if(x>lim) break;

cout << x << "\t";
x++; if(x>lim) break;

cout << x << "\t";
x+=5;
}

MItaly
17-09-2012, 21:49
O, se preferisci una soluzione più generale:


int x=4;
int max=100;
int incr[]={1, 1, 1, 5}; // qui metti i valori di cui incrementare di volta in volta
size_t period=sizeof(incr)/sizeof(*incr);
for(int i=0; x<=max; i++, x+=incr[i%period])
cout << x << "\t";

oregon
17-09-2012, 21:53
Originariamente inviato da MItaly



int x=4;





Oops ... arrivato dopo ... :D

signoredeltempo
17-09-2012, 22:19
Bene, il programma è finito.
Ma prima vorrei fare delle domande (o servono altri 3d? :madai!?: )...aspetto conferma.

MItaly
17-09-2012, 22:24
Originariamente inviato da signoredeltempo
Ma prima vorrei fare delle domande (o servono altri 3d? :madai!?: )...aspetto conferma.
Non c'è bisogno di prendere in giro, e comunque basta un minimo di buon senso...

Ciascuna discussione deve trattare esclusivamente uno e un solo problema: quello indicato nel titolo. Per ogni nuovo problema che non sia strettamente correlato, è necessario aprire una nuova discussione.
se hai domande sul codice che abbiamo postato o ancora inerenti all'argomento iniziale della discussione vanno qui, se la domanda è un'altra si fa una nuova discussione... :fagiano:

signoredeltempo
17-09-2012, 22:31
Cercavo un rolleyes, ma non l'ho trovato :( .
Allora:
perchè usi size_t? Non equivale ad unsigned int?
Il while, non controlla la condizione all'inizio (anziché alla fine)?
(continua...)

MItaly
17-09-2012, 22:36
Originariamente inviato da signoredeltempo
perchè usi size_t? Non equivale ad unsigned int?
Non necessariamente; un size_t è un tipo senza segno tale per cui è garantito che possa contenere le dimensioni di qualunque oggetto tu possa creare (di fatto se non erro è definito come il tipo restituito da sizeof). Ovviamente per array di quelle dimensioni usare un int qualunque non è un problema, ma tendo ad usare il size_t abitualmente quando si parla di dimensioni di oggetti più che altro come forma di documentazione ("questa variabile non è un intero qualunque, ma è la dimensione di qualcosa").


Il while, non controlla la condizione all'inizio (anziché alla fine)?
Il while controlla all'inizio, ma tu fai degli incrementi a metà del ciclo, per cui fa a tempo a sforare prima che la successiva iterazione del while si "accorga" che hai sforato.

oregon
17-09-2012, 22:42
Originariamente inviato da signoredeltempo
Il while, non controlla la condizione all'inizio (anziché alla fine)?
(continua...)

Intendevo che, dopo aver controllato all'entrata, tutto il codice viene eseguito e solo alla fine di tutti gli incrementi riparte il while e si effettua il controllo.

Così va bene?

signoredeltempo
17-09-2012, 22:44
unsigned int può contenere fino a 4294967295 (preso da climits, spero di non dire sciocchezze): questo vale anche per size_t?
Vorrei postare il codice del programma, magari per qualche consiglio/dritta.
(continua...)

Loading