RISOLTO Novellino in c++

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

AlligatoreMarrone

Nuovo Utente
Messaggi
115
Reazioni
4
Punteggio
38
Buonasera.
Da qualche giorno, sto cercando di programmare una specie di bancomat, per esercitarmi nel c++.
Ho riscontrato questo errore.

C++:
int friconoscimento() {
int numerotentativi=0;

do {
    system("cls");
    cout<<"inserisci il pin"<<endl;
    cin>>j;
    if(j==pin)
        {
        riconosciuto=1;
        } else {
            numerotentativi++;
            cout<<"il PIN non e' corretto!"<<endl;
            cout<<"hai ancora "<<3 - numerotentativi <<" tentativi per dare il PIN corretto!"<<endl;
          

        }
} while (numerotentativi>3 || riconosciuto==0);
return 0;
}
Questa parte di codice, mi permette di riconoscere, se l'utente abbiamo inserito giustamente il pin o no.
E fin qui tutto bene, quando pero', vado a sbagliare il Pin, la scritta " Il pin non è corretto, hai ancora a disposizione tot numero di tentativi" mi appare per mezzo secondo e poi scompare, sapete dirmi il perche'?
 
C++:
#include <iostream>
#include <math.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

 // -------------------- funzioni
int friconoscimento();
int fricarica();
int fprelievo();
int fstampasaldo();


    // ------------------variabili
int scelta, j, h ,m , z, nsaldo=2000, pin=123456, riconosciuto;


int main()
{
do{
    // ------------------- menù

    //pulizia schermo
    system("cls");
    cout<<"+-----------------------------+"<<endl;
    cout<<"|         1. Prelievo         |"<<endl;
    cout<<"|         2. Saldo            |"<<endl;
    cout<<"|         3. Ricarica         |"<<endl;
    cout<<"|                             |"<<endl;
    cout<<"|         0. Uscita           |"<<endl;
    cout<<"+-----------------------------+"<<endl;
    cin>>scelta;

        switch(scelta){
        case 1: {
                fprelievo();
                break;

                }
        case 2: {
                fstampasaldo();
                break;
                }
        case 3: {
                fricarica();
                break;
                }
        case 0: {
                cout<<"Arrivederci"<<endl;
                break;
                }
        default:    {
                    cout<< "il numero scelto non corrisponde a nessuna operazione del bancomat"<<endl;
                    break;
                    }
        }
}while(scelta!=0);
}



int friconoscimento() {
int numerotentativi=0;

do {
    system("cls");
    cout<<"inserisci il pin"<<endl;
    cin>>j;
    if(j==pin)
        {
        riconosciuto=1;
        } else {
            numerotentativi++;
            cout<<"il PIN non e' corretto!"<<endl;
            cout<<"hai ancora "<<3 - numerotentativi <<" tentativi per dare il PIN corretto!"<<endl;
          

        }
} while (numerotentativi>3 || riconosciuto==0);
return 0;
}


 //--------------------------Operazione Prelievo

int fprelievo() {
int importodaprelevare,sceltaprelievo;
friconoscimento();

if(riconosciuto==1)
    {

    do {
        system("cls");
        cout<<"+-------------------------------------+"<<endl;
        cout<<"| Di quanto vuoi fare il prelievo?    |"<<endl;
        cout<<"|             1. 50                   |"<<endl;
        cout<<"|             2. 100                  |"<<endl;
        cout<<"|             3. 150                  |"<<endl;
        cout<<"|             4. 200                  |"<<endl;
        cout<<"|             5. 250                  |"<<endl;
        cout<<"|                                     |"<<endl;
        cout<<"|             6. Libero               |"<<endl;
        cout<<"+-------------------------------------+"<<endl;
        cin >>sceltaprelievo;


        switch(sceltaprelievo) {
            case 1:{importodaprelevare=50;break;}
            case 2:{importodaprelevare=100;break;}
            case 3:{importodaprelevare=150;break;}
            case 4:{importodaprelevare=200;break;}
            case 5:{importodaprelevare=250;break;}
            case 6:{
                    cout<<"inserisci la somma che vuoi prelevare"<<endl;
                    cin>> importodaprelevare;
                    break;
                    }
            }

        if (importodaprelevare<0 || importodaprelevare>250) {
            cout<<"La cifra da prelevare npn e' accettabile"<<endl;
        } else if (importodaprelevare>nsaldo) {
            cout<<"Non hai abbastanza soldi sul conto corrente"<<endl;
        } else {
            nsaldo=nsaldo-importodaprelevare;
            cout<<endl<<"La somma e' stata prelevata, il tuo saldo attuale e': " <<nsaldo<<endl<<endl;
        }


        } while (sceltaprelievo <1 || sceltaprelievo>6);
    }

}








//------------------------Operazione Ricarica
int fricarica() {
int importodaricaricare,sceltaricarica,cellulare;

if (riconosciuto==0)
    {

    do {
        system("cls");
        cout<<"+-------------------------------------+"<<endl;
        cout<<"| Di quanto vuoi fare il ricarica?    |"<<endl;
        cout<<"|             1. 5                    |"<<endl;
        cout<<"|             2. 10                   |"<<endl;
        cout<<"|             3. 30                   |"<<endl;
        cout<<"|             4. 50                   |"<<endl;
        cout<<"+-------------------------------------+"<<endl;
        cin >>sceltaricarica;

        switch(sceltaricarica) {
            case 1:{importodaricaricare=5;break;}
            case 2:{importodaricaricare=10;break;}
            case 3:{importodaricaricare=30;break;}
            case 4:{importodaricaricare=50;break;}
            }

        if (importodaricaricare>nsaldo) {
            cout<<"Non hai abbastanza soldi sul conto corrente"<<endl;
        } else {
            cout<<endl<<"su quale numero di cellulare devo effettuare la ricarica?"<<endl;
            cin>>cellulare;
                        nsaldo=nsaldo-importodaricaricare;
            cout<<endl<<"La ricarica del numero "<<cellulare<<" e'stata effetttuata. Il tuo saldo attuale e': " <<nsaldo<<endl<<endl;

        }

        } while (sceltaricarica <1 || sceltaricarica>4);
    }


}

//------------------------------Operazione Saldo

int fstampasaldo(){
    cout<<"Il tuo saldo attuale e': "<< nsaldo <<endl;
system("pause");

return 0;
}
Vi lascio il codice di tutto il programma, per eventuali errori in esso,
 
Buonasera.
Da qualche giorno, sto cercando di programmare una specie di bancomat, per esercitarmi nel c++.
Ho riscontrato questo errore.

C++:
int friconoscimento() {
int numerotentativi=0;

do {
    system("cls");
    cout<<"inserisci il pin"<<endl;
    cin>>j;
    if(j==pin)
        {
        riconosciuto=1;
        } else {
            numerotentativi++;
            cout<<"il PIN non e' corretto!"<<endl;
            cout<<"hai ancora "<<3 - numerotentativi <<" tentativi per dare il PIN corretto!"<<endl;
       

        }
} while (numerotentativi>3 || riconosciuto==0);
return 0;
}
Questa parte di codice, mi permette di riconoscere, se l'utente abbiamo inserito giustamente il pin o no.
E fin qui tutto bene, quando pero', vado a sbagliare il Pin, la scritta " Il pin non è corretto, hai ancora a disposizione tot numero di tentativi" mi appare per mezzo secondo e poi scompare, sapete dirmi il perche'?
Perché quando sbagli pin lui fa ripartire il ciclo dal cls e quindi cancella tutto ciò che appare a schermo...prova a mettere un delay o se vuoi vedere se si mantiene la scritta "hai ancora tot tentativi..." commenta il cls per vedere com'è

Edit:
te lo spiego meglio che così è poco chiaro...

Te fai questo:

0. Svolgi il ciclo finché riconosciuto==1 e finché tentativiFalliti < 3
1. Cancella schermo
2. Inserisci il pin
3. Se è esatto riconosciuto = 1 e poi esce dal ciclo
4. Se è sbagliato riparti dal punto 0 e incrementa di 1 il valore dei tentativi falliti


Volendo puoi migliorare il codice.
 
Ultima modifica:
Allora per prima cosa sconsiglio tutte le variabili globali. Bisognerebbe creare una classe.
Poi in C++ esiste in tipo bool e visto che in altri linguaggi bool e int non sono interscambiabili (ad esempio un if richiede espicitamente un tipo boolean e non esistono cast, impliciti o espiciti, da int a bool). bool ha due valori, true o false.
Poi c’è un po di indentazione da sistemare e gli header si indicano con il tipo <c+nome_header> e non <nome_header.h>. Quest’ultima è obsoleta. Tipo <cstdlib>
 
Allora per prima cosa sconsiglio tutte le variabili globali. Bisognerebbe creare una classe.
Poi in C++ esiste in tipo bool e visto che in altri linguaggi bool e int non sono interscambiabili (ad esempio un if richiede espicitamente un tipo boolean e non esistono cast, impliciti o espiciti, da int a bool). bool ha due valori, true o false.
Poi c’è un po di indentazione da sistemare e gli header si indicano con il tipo <c+nome_header> e non <nome_header.h>. Quest’ultima è obsoleta. Tipo <cstdlib>

È un novellino è normale che non conosca ancora al 100% il linguaggio. Le cose che ha scritto non sono sbagliate, sono solo metodologie obsolete ma che poi imparerà a evitare.
 
È un novellino è normale che non conosca ancora al 100% il linguaggio. Le cose che ha scritto non sono sbagliate, sono solo metodologie obsolete ma che poi imparerà a evitare.
Il tipo bool viene prima delle funzioni di certo, come l’indentazione e gli header.

Anzi va ben fatto notare, perché C++ non è C
 
Perché quando sbagli pin lui fa ripartire il ciclo dal cls e quindi cancella tutto ciò che appare a schermo...prova a mettere un delay o se vuoi vedere se si mantiene la scritta "hai ancora tot tentativi..." commenta il cls per vedere com'è

Edit:
te lo spiego meglio che così è poco chiaro...

Te fai questo:

0. Svolgi il ciclo finché riconosciuto==1 e finché tentativiFalliti < 3
1. Cancella schermo
2. Inserisci il pin
3. Se è esatto riconosciuto = 1 e poi esce dal ciclo
4. Se è sbagliato riparti dal punto 0 e incrementa di 1 il valore dei tentativi falliti


Volendo puoi migliorare il codice.

Grazie mille della spiegazione, mi puoi spiegare cosa sia un delay?
 
Grazie mille della spiegazione, mi puoi spiegare cosa sia un delay?
Un delay è un ritardo, una fase in cui l'esecuzione del codice si blocca per n millisecondi, dove n è un numero intero selezionato dal programmatore. Ora come ora non mi ricordo come si richiama in C++, penso ci sia una classe apposita come in Java. Cerca qualche esempio su internet che ne trovi na valanga.
 
Ultima modifica:
  • Mi piace
Reazioni: BAT
Un delay è una qualsiasi funzione o metodo che rallenta l’esecuzione di un Thread. In questo caso basta un ciclo for che va da 0 a 100000 (dipende dalla velocità del PC)
meglio con un metodo di libreria per sospendere l'esecuzione, inserendo
#include <chrono> // per usare il metodo di sospensione
e dove serve l'istruzione
std::this_thread::sleep_for (std::chrono::seconds(2)); // ferma per 2 secondi
ci sono metodi analoghi anche per sospendere a livell di nanosecondi/micorsecondi millisecondi/minuti/ore

Un ciclo for vuoto ti dà risultati contrastanti non solo a causa della velocità della CPU che lo esegue ma anche sullo stesso computer, prova ad eseguire lo stesso programma più volte di seguito: le istruzioni finiscono in cache e alla fine il ritardo lo percepisci solo la prima/seconda volta che esegui il porgramma, poi il "non far nulla N volte" del ciclo diventa istantaneo e non lo vedi più
 
meglio con un metodo di libreria per sospendere l'esecuzione, inserendo
#include <chrono> // per usare il metodo di sospensione
e dove serve l'istruzione
std::this_thread::sleep_for (std::chrono::seconds(2)); // ferma per 2 secondi
ci sono metodi analoghi anche per sospendere a livell di nanosecondi/micorsecondi millisecondi/minuti/ore

Un ciclo for vuoto ti dà risultati contrastanti non solo a causa della velocità della CPU che lo esegue ma anche sullo stesso computer, prova ad eseguire lo stesso programma più volte di seguito: le istruzioni finiscono in cache e alla fine il ritardo lo percepisci solo la prima/seconda volta che esegui il porgramma, poi il "non far nulla N volte" del ciclo diventa istantaneo e non lo vedi più
Più che altro volevo evitare di introdurgli altri header e funzioni
 
il problema con sleep_for e' che se uno non fa in tempo a leggere il messaggio prima che scada il tempo pefissato :) E se il tempo e' troppo lungo l'utente si scoccia e si chiede cosa debba fare per continuare.
IMHO io metterei un system("pause") oppure un semplice getchar()
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top