RISOLTO Novellino in c++

Stato
Discussione chiusa ad ulteriori risposte.

AlligatoreMarrone

Nuovo Utente
115
4
CPU
i7-7400
Scheda Madre
asus x99
HDD
2tb
RAM
hyperX fury 8gb
GPU
gtx 1070
OS
OSX
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'?
 

AlligatoreMarrone

Nuovo Utente
115
4
CPU
i7-7400
Scheda Madre
asus x99
HDD
2tb
RAM
hyperX fury 8gb
GPU
gtx 1070
OS
OSX
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,
 

Zio_Sporko

Utente Attivo
179
26
CPU
AMD Ryzen 5 3600
Dissipatore
Corsair Hydro H100i Pro RGB
Scheda Madre
ASUS TUF B450M PRO Gaming
HDD
Samsung 970 EVO Plus NVMe M.2 250 GB; Seagate Barracuda 1TB HDD
RAM
Patriot Viper Steel 16 GB 3200 MHz
GPU
Zotac RTX 2060 Super Mini
Audio
Focusrite Scarlett 2i2 2nd Generation
Monitor
Samsung 24F390 Curved Monitor FHD da 24"
PSU
EVGA Supernova 650 G3
Case
Corsair Carbide 275Q
Periferiche
Kit Devastator 2; 2x KRK Rokit 6 G3
Net
FTTC 100Mbps
OS
Windows 10 Home x64
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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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>
 

Zio_Sporko

Utente Attivo
179
26
CPU
AMD Ryzen 5 3600
Dissipatore
Corsair Hydro H100i Pro RGB
Scheda Madre
ASUS TUF B450M PRO Gaming
HDD
Samsung 970 EVO Plus NVMe M.2 250 GB; Seagate Barracuda 1TB HDD
RAM
Patriot Viper Steel 16 GB 3200 MHz
GPU
Zotac RTX 2060 Super Mini
Audio
Focusrite Scarlett 2i2 2nd Generation
Monitor
Samsung 24F390 Curved Monitor FHD da 24"
PSU
EVGA Supernova 650 G3
Case
Corsair Carbide 275Q
Periferiche
Kit Devastator 2; 2x KRK Rokit 6 G3
Net
FTTC 100Mbps
OS
Windows 10 Home x64
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.
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
È 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
 
  • Mi piace
Reazioni: AlligatoreMarrone

AlligatoreMarrone

Nuovo Utente
115
4
CPU
i7-7400
Scheda Madre
asus x99
HDD
2tb
RAM
hyperX fury 8gb
GPU
gtx 1070
OS
OSX
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?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Grazie mille della spiegazione, mi puoi spiegare cosa sia un delay?
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)
 

Zio_Sporko

Utente Attivo
179
26
CPU
AMD Ryzen 5 3600
Dissipatore
Corsair Hydro H100i Pro RGB
Scheda Madre
ASUS TUF B450M PRO Gaming
HDD
Samsung 970 EVO Plus NVMe M.2 250 GB; Seagate Barracuda 1TB HDD
RAM
Patriot Viper Steel 16 GB 3200 MHz
GPU
Zotac RTX 2060 Super Mini
Audio
Focusrite Scarlett 2i2 2nd Generation
Monitor
Samsung 24F390 Curved Monitor FHD da 24"
PSU
EVGA Supernova 650 G3
Case
Corsair Carbide 275Q
Periferiche
Kit Devastator 2; 2x KRK Rokit 6 G3
Net
FTTC 100Mbps
OS
Windows 10 Home x64
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

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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ù
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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
 

Andretti60

Utente Èlite
6,440
5,091
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()
 

AlligatoreMarrone

Nuovo Utente
115
4
CPU
i7-7400
Scheda Madre
asus x99
HDD
2tb
RAM
hyperX fury 8gb
GPU
gtx 1070
OS
OSX
Grazie mille a tutti, alla fine, ricercando su internet, ho inserito un semplice system("pause"), come detto anche da @Andretti60.
Ringrazio tutti per la cordialità.
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili