 
View Full Version : [C/C++]Incrementare variabile una sola volta
MissaW_RaZ_98
14-04-2012, 20:46
Come al solito,ho ancora un banalissimo problema :stordita: 
Voglio incrementare una variabile una sola volta ad una condizione,come nell'esempio:
if(points>=5){
lifes++;
}
L'unico problema è che la variabile aumenta,aumenta e aumenta all'infinito,ma io voglio incrementarlo solo una volta!:muro: 
So che è un problema banalissimo,ma non so proprio come risolverlo :cry: 
:help: :help:
Gimli[2BV!2B]
14-04-2012, 21:10
Non avendo la minima idea della struttura del programma, con una (potenzialmente fastidiosa) variabile globale?
bool bBonusLife = false ;
main()
{
    if(! bBonusLife && points>=5){
        bBonusLife = true ;
        lifes++;
    }
}
int nBonusLifes = 1 ;
main()
{
    if(nBonusLives > 0 && points>=5){
        ++ lifes ;
        -- nBonusLifes ;
    }
}
Con una static in una funzione?
void UpdateLifes( int &nLives, const long nPoints )
{
    static int nBonusLifes = 1 ;
    if(nBonusLives > 0 && nPoints >= 5){
        ++ nLives ;
        -- nBonusLifes ;
    }
}
main()
{
    int lives = 3 ;
    long points = 0 ;
    UpdateLifes( lifes, points ) ;
}
Con un'apposita variabile se è un oggetto?
[Kendall]
14-04-2012, 21:33
Come al solito,ho ancora un banalissimo problema :stordita: 
Voglio incrementare una variabile una sola volta ad una condizione,come nell'esempio:
if(points>=5){
lifes++;
}
L'unico problema è che la variabile aumenta,aumenta e aumenta all'infinito,ma io voglio incrementarlo solo una volta!:muro: 
So che è un problema banalissimo,ma non so proprio come risolverlo :cry: 
:help: :help:
Decisamente devi postarci il codice del tuo programma. Soprattutto bisogna capire cosa sia quel points e in che maniera viene assengato. Oltre a questo, è impossibile che lifes venga incrementato all'infinito se non è all'interno di un loop (cosa che non traspare dal tuo esempio). Quindi, si torna al consiglio iniziale: postaci il codice intero del programma, o per lo meno quello del metodo/funzione in questione ;)
MissaW_RaZ_98
15-04-2012, 17:42
si,scusate ragazzi,ora vi posto tutto il codice :D 
#include <stdio.h>
#include <iostream>
int main(){
int lifes=3;
int points=0;
while(1){
.....qui tutto il giochino (non credo che serva molto per aiutarmi)
if(points==5){
lifes++;
}//E qui il problema:la variabile incrementa all'infinito
}
return 0;
}
quindi si,è all'interno di un loop...
si,scusate ragazzi,ora vi posto tutto il codice :D 
#include <stdio.h>
#include <iostream>
int main(){
int lifes=3;
int points=0;
while(1){
.....qui tutto il giochino (non credo che serva molto per aiutarmi)
if(points==5){
lifes++;
}//E qui il problema:la variabile incrementa all'infinito
}
return 0;
}
quindi si,è all'interno di un loop...
Come hanno già postato gli altri, nel caso generale ti serve una variabile di appoggio per sapere se hai già aggiornato la variabile.
Se invece il loop viene eseguito una sola volta durante l'esecuzione del programma e durante il loop points vale 5 in un solo ciclo di loop, allora potresti fare a meno della variabile di appoggio, ma come dicevo prima in linea generale è meglio usarla (così se fai modifiche successive e ti dimentichi di quel vincolo "una sola volta", non rischi che l'errore rispunti fuori).
lorenzo001
15-04-2012, 18:03
E quindi ?
Utilizza il suggerimento che ti è stato dato, no?
Ad esempio quello della variabile 
bool bBonusLife = false ;
if(points==5 && lifes == 0) lifes++;?
MissaW_RaZ_98
15-04-2012, 18:10
ok...dato che uso il loop infinito(while),dovrò creare un'altra variabile "d'appoggio",che ferma il programma subito dopo che ho incrementato la variabile.
Quindi il codice dovrebbe essere così?
#include <stdio.h>
#include <iostream>
int main(){
int lifes=3;
int points=0;
int increment==1;//questa è la variabile d'appoggio
while(1){
.....qui tutto il giochino (non credo che serva molto per aiutarmi)
if(points==5 && increment==1){
lifes++;
increment=0; 
}
}
return 0;
}
Ma ho un'altra domanda....
Vorrei anche che ogni 5 punti in più aumento la vita di uno...ma per fare questo devo cambiare in qualche modo la variabile increment in modo che diventi 0,poi 1,poi 0,etc.
Come faccio?
grazie per le risposte :D
Gimli[2BV!2B]
15-04-2012, 19:43
Se i punti sono compresi tra 0 e 5 puoi reincrementare il bonus dove azzeri i punti.
Se vanno da zero a MAX_INT ed il punteggio non può diminuire, puoi usare opportunamente l'operatore modulo (%) per sostituire il test di uguaglianza (==), in modo tale da rendere il test valido per ogni scatto di cinque.
Puoi quindi usarlo anche quando il punteggio è divisibile per sei per reincrementare il bonus, in previsione del successivo raggiungimento di un punteggio divisibile per cinque.
MissaW_RaZ_98
15-04-2012, 20:59
;37284456']Se i punti sono compresi tra 0 e 5 puoi reincrementare il bonus dove azzeri i punti.
Se vanno da zero a MAX_INT ed il punteggio non può diminuire, puoi usare opportunamente l'operatore modulo (%) per sostituire il test di uguaglianza (==), in modo tale da rendere il test valido per ogni scatto di cinque.
Puoi quindi usarlo anche quando il punteggio è divisibile per sei per reincrementare il bonus, in previsione del successivo raggiungimento di un punteggio divisibile per cinque.
grande! non ci avevo proprio pensato!
Ora va alla grande!
A chi servisse,ecco il codice:
while(1){
.....
if(increment==1 && points%5==0){
lifes++;
increment=0;
}
if(increment==0 && points%6==0){
increment=1;
}//questo serve per utilizzare il bonus in caso che i punti siano multipli di 5
}
grazie grazie a tutti :)
vendettaaaaa
17-04-2012, 23:46
grande! non ci avevo proprio pensato!
Ora va alla grande!
A chi servisse,ecco il codice:
while(1){
.....
if(increment==1 && points%5==0){
lifes++;
increment=0;
}
if(increment==0 && points%6==0){
increment=1;
}//questo serve per utilizzare il bonus in caso che i punti siano multipli di 5
}
grazie grazie a tutti :)
Scusa ma così il programma fa lifes++ anche se points == 0.
MissaW_RaZ_98
18-04-2012, 19:53
giusto,correggo subito :D
if(points!=0 && increment==0 && points%6==0){
increment=1;
}
Grazie per la segnalazione
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.