PDA

Visualizza la versione completa : [C++]Problema fflush e Sleep( )


Sheldon97
11-01-2014, 18:53
Salve a tutti :) Ho un problema con un programma scritto in c++. Consiste in un bancomat e l'abbiamo realizzato in due, ecco perchŔ ci sono due file.
In pratica il problema si pone alla fine del main, quando si avvia un ciclo for che, combinato alla funzione Sleep( ), genera un timer. Se durante questa pausa si preme qualche tasto sulla tastiera, me lo ritrovo scritto nella nuova videata: ho giÓ provato ad usare fflush(stdin) come ho fatto per altri casi, ma in quel particolare punto e solo lý non funziona.
Idee? Grazie in anticipo e vi "avverto" che Ŕ il frutto di due ragazzi di 3░ superiore che hanno voluto ampliare una traccia "troppo banale" dataci dal professore

Sheldon97
11-01-2014, 18:54
main.cpp


#include <iostream>#include <string>
#include <vector>
#include "scelta.h"
#include <windows.h>


#define DimArray 3


using namespace std;


extern void error();
extern void tab();
extern void tal();
extern void Prelievo();
extern void Deposito();
extern void TabMan();
extern void ContCorr();
extern void EstrCont();
extern void FuoriServ();
extern void carta();
extern void Rosso();


int NumConto[DimArray];
int Pin[DimArray] = {0000, 0001, 0002};
int NumDep[DimArray];
int NumPrel[DimArray];
int cont[6]={50, 50, 50, 50, 150, 200};
int tagli[6]={500, 200, 100, 50, 20, 10};
char ch;
int N, scelta, InputConto, i;


bool ciclo, cart;


int main(){
int sec[2];
int min;
system("color 0a");
do {
cart=false;
system("CLS");
carta();
do {
system("CLS");
ciclo=true;
if (InputConto==0) {
TabMan();
cout<<"Scelta: ";
cin>>scelta;
if (scelta < 1 || scelta > 4) {
error();
ch= getchar();
cout<< "Scelta non valida!"<<endl;
ch= getchar();
cout<< "Reinserire la scelta!"<<endl;
ch= getchar();
fflush(stdin);
} else {
cout<<endl;
switch (scelta) {
case 1: { Deposito();
ch = getchar();
ch = getchar();
} break;
case 2: { ContCorr();
ch = getchar();
ch = getchar();
} break;
case 3: { system("CLS");
cout<<"Inserire numero di conto"<<endl;
cin>>InputConto;
EstrCont();
InputConto=0;
ch = getchar();
ch = getchar();
} break;
case 4: { ciclo=false;
} break;
}
fflush(stdin);
}
} else {
tab();
cout<<"Scelta: ";
cin>>scelta;
if (scelta < 1 || scelta > 4) {
error();
ch= getchar();
cout<< "Scelta non valida!"<<endl;
ch= getchar();
cout<< "Reinserire la scelta!"<<endl;
ch= getchar();
fflush(stdin);
} else {
cout<<endl;
switch (scelta) {
case 1: { ciclo=false;
if (NumConto[InputConto]>0) {
NumPrel[InputConto]++;
Prelievo();
ch = getchar();
} else {
Rosso();
ch = getchar();
}
} break;
case 2: { ciclo=false;
NumDep[InputConto]++;
Deposito();
} break;
case 3: { EstrCont();
ch = getchar();
ch = getchar();
} break;
case 4: { ciclo=false;
} break;
}
fflush(stdin);
}
}
} while (ciclo==true);
min=2;
sec[0]=0;
sec[1]=0;
for (i=120;i!=0;i--) {
system("CLS");
if (GetAsyncKeyState(VK_NUMPAD0)) {
cart=true;
}
if (cart==true) {
cout<<"Attendere "<<min<<":"<<sec[0]<<sec[1]<<endl;
} else if (i>60) {
cout<<"Prelevare la carta(premere 0) entro "<<sec[0]<<sec[1]<<" secondi ed attendere "<<min<<":"<<sec[0]<<sec[1]<<endl;
} else {
cout<<"Carta non prelevata. Per riottenerla recarsi presso la propria banca \n"<<"Attendere "<<min<<":"<<sec[0]<<sec[1]<<endl;
}
if (sec[1]==0) {
if (sec[0]==0) {
min--;
sec[0]=5;
sec[1]=9;
} else {
sec[0]--;
sec[1]=9;
}
} else {
sec[1]--;
}
Sleep(1000);
}
ciclo=false;
for (i=0; i<6; i++) {
if (cont[i]!=0) {
ciclo=true;
}
}
} while (ciclo==true);
FuoriServ();
}


void Prelievo() {
system("CLS");
tal();
cout<<"Scelta: ";
cin>>scelta;
if (scelta < 1 || scelta > 11){
error();
ch= getchar();
cout<< "Scelta non valida!"<<endl;
ch= getchar();
cout<< "Reinserire la scelta!"<<endl;
ch= getchar();
fflush(stdin);
} else {
system("CLS");
cout<<endl;
switch (scelta){
case 1: { cout<< "Hai scelto di prelevare 20EURO....!"<<endl;
ch = getchar();
ch = getchar();
N=20;
PrelLib();
} break;
case 2: { cout<< "Hai scelto di prelevare 50EURO....!"<<endl;
ch = getchar();
ch = getchar();
N=50;
PrelLib();
}break;
case 3: { cout<< "Hai scelto di prelevare 100EURO....!"<<endl;
ch = getchar();
ch = getchar();
N=100;
PrelLib();
} break;
case 4: { cout<< "Hai scelto di prelevare 150EURO....!"<<endl;
ch = getchar();
ch = getchar();
N=150;
PrelLib();
}break;
case 5: { cout<< "Hai scelto di prelevare 200EURO....!"<<endl;
ch = getchar();
ch = getchar();
N=2000;
PrelLib();
} break;
case 6: { cout<< "Hai scelto di prelevare 250EURO....!"<<endl;
ch= getchar();
ch = getchar();
N=200;
PrelLib();
} break;
case 7: { cout<< "Hai scelto di prelevare 500EURO....!"<<endl;
ch= getchar();
ch = getchar();
N=500;
PrelLib();
} break;
case 8: { cout<< "Hai scelto di prelevare 750EURO....!"<<endl;
ch= getchar();
ch = getchar();
N=750;
PrelLib();
} break;
case 9: { cout<< "Hai scelto di prelevare 1000EURO....!"<<endl;
ch= getchar();
ch = getchar();
N=1000;
PrelLib();
} break;
case 10: { do{
cout<<"Quanto vuole prelevare? \nInserire 0 per uscire"<<endl;
cin>>N;
cout<<endl;
if (N==0) {
NumPrel[InputConto]--;
ciclo=true;
} else if (N<0) {
cout<<"Impossibile rilasciare un importo negativo"<<endl;
} else if (N%10!=0) {
cout<<"Disponibili sono importi multipli di 10"<<endl;
}
} while (N<0 || N%10!=0);
PrelLib();
ch = getchar();
}break;
case 11: { NumPrel[InputConto]--;
ciclo=true;
} break;
}
fflush(stdin);
}
}


void error()
{
cout<<"##########"<<endl;
cout<<" ERRORE! "<<endl;
cout<<"##########"<<endl;
}


void tab()
{
cout<<" ************************************ "<<endl;
cout<<" * BANCOMAT Longo&Amodio * "<<endl;
cout<<" * * "<<endl;
cout<<" * Scegli le seguenti opzioni * "<<endl;
cout<<" * 1) Prelievo * "<<endl;
cout<<" * 2) Deposito * "<<endl;
cout<<" * 3) Estratto Conto * "<<endl;
cout<<" * 4) USCITA * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
}


void tal()
{
cout<<" ************************************ "<<endl;
cout<<" * IMPORTO DA PRELEVARE * "<<endl;
cout<<" * * "<<endl;
cout<<" * Scegli i seguenti tagli * "<<endl;
cout<<" * 1) 20EURO * "<<endl;
cout<<" * 2) 50EURO * "<<endl;
cout<<" * 3) 100EURO * "<<endl;
cout<<" * 4) 150EURO * "<<endl;
cout<<" * 5) 200EURO * "<<endl;
cout<<" * 6) 250EURO * "<<endl;
cout<<" * 7) 500EURO * "<<endl;
cout<<" * 8) 750EURO * "<<endl;
cout<<" * 9) 1000EURO * "<<endl;
cout<<" * 10) Scegli importo * "<<endl;
cout<<" * 11) USCITA * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
}

Sheldon97
11-01-2014, 18:55
scelta.h

#include <iostream>
#include <string>


#define DimArray 3


using namespace std;


extern void TabDep();
extern void error();
extern void Rosso();


extern int scelta, N, InputConto, i;
extern int NumConto[];
extern int Pin[];
extern int NumDep[];
extern int NumPrel[];
extern int tagli[];
extern int cont[];
extern char ch;
extern bool ciclo;


int InputPin;
int banc[6];


void PrelLib() {
int soldi;
char risp;
bool vero;
fflush(stdin);
for (i=0; i<6; i++) {
banc[i]=0;
}
if (N>NumConto[InputConto]) {
Rosso();
NumPrel[InputConto]--;
} else {
for (i=0; i<6; i++) {
while (N>=tagli[i] && cont[i]>0) {
N-=tagli[i];
cont[i]--;
banc[i]++;
}
}
if (N>0) {
cout<<"L'importo selezionato non e' disponibile"<<endl;
NumPrel[InputConto]--;
for (i=0; i<6; i++) {
cont[i]+=banc[i];
banc[i]=0;
}
vero=false;
soldi=0;
for (i=0; i<6; i++) {
if (cont[i]==0) {
vero=true;
} else {
soldi=soldi+(cont[i]*tagli[i]);
}
}
if (vero) {
cout<<"Sono disponibili solamente "<<soldi<<" euro"<<endl;
ciclo=true;
}
} else {
for (i=0; i<6; i++) {
cout<<"Banconote da "<<tagli[i]<<"EURO: "<<banc[i]<<endl;
}
}
soldi=0;
for (i=0; i<6; i++) {
soldi=soldi+(banc[i]*tagli[i]);
}
NumConto[InputConto]-=soldi;
}
ch = getchar();
fflush(stdin);
}


void Deposito() {
for (i=0; i<6; i++) {
banc[i]=0;
}
system("CLS");
TabDep();
cout<<"Scelta: ";
cin>>scelta;
if (scelta>=0 && scelta<6) {
cout<<endl;
system("CLS");
cout<<"Quante banconote da "<<tagli[scelta]<<"EURO vuoi depositare?";
cin>>banc[scelta];
cont[scelta]+=banc[scelta];
NumConto[InputConto]=NumConto[InputConto]+(banc[scelta]*tagli[scelta]);
} else if (scelta==6) {
cout<<"Quant'Ŕ l'importo dell'assegno?";
cin>>N;
NumConto[InputConto]+=N;
} else if (scelta==7) {
ciclo=true;
NumDep[InputConto]--;
} else {
error();
ch= getchar();
cout<< "Scelta non valida!"<<endl;
ch= getchar();
cout<< "Reinserire la scelta!"<<endl;
ch= getchar();
fflush(stdin);
}
}


void ContCorr() {
system("CLS");
cout<<" Numero di conto | Soldi presenti sul conto | Pin del conto "<<endl;
cout<<endl;
for (N=1; N<DimArray; N++) {
cout<<"> "<<N<<" | "<<NumConto[N]<<" | "<<Pin[N]<<" <"<<endl;
}
}

void EstrCont() {
if (InputConto<1 || InputConto>=DimArray) {
error();
cout<<"Numero di conto inesistente"<<endl;
} else {
cout<<" Soldi presenti sul conto: "<<NumConto[InputConto]<<endl;
cout<<" Prelievi effettuati: "<<NumPrel[InputConto]<<endl;
cout<<" Depositi effettuati: "<<NumDep[InputConto]<<endl;
}
}


void TabDep() {
cout<<" ************************************ "<<endl;
cout<<" * COSA VUOI DEPOSITARE? * "<<endl;
cout<<" * * "<<endl;
cout<<" * Scegli le seguenti opzioni * "<<endl;
cout<<" * 0) Banconote da 500 * "<<endl;
cout<<" * 1) Banconote da 200 * "<<endl;
cout<<" * 2) Banconote da 100 * "<<endl;
cout<<" * 3) Banconote da 50 * "<<endl;
cout<<" * 4) Banconote da 20 * "<<endl;
cout<<" * 5) Banconote da 10 * "<<endl;
cout<<" * 6) Assegni * "<<endl;
cout<<" * 7) USCITA * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
}


void TabMan() {
cout<<" ************************************ "<<endl;
cout<<" * MANUTENZIONE * "<<endl;
cout<<" * * "<<endl;
cout<<" * Scegli fra le seguenti opzioni * "<<endl;
cout<<" * 1) Aggiunta banconote * "<<endl;
cout<<" * 2) Dati dei conti correnti * "<<endl;
cout<<" * 3) Estratti conto * "<<endl;
cout<<" * 4) USCITA * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
}


void FuoriServ() {
cout<<" ************************************ "<<endl;
cout<<" * BANCOMAT FUORI * "<<endl;
cout<<" * SERVIZIO * "<<endl;
cout<<" * * "<<endl;
cout<<" * Ci scusiamo per il disagio * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
}


void carta() {
fflush(stdin);
do {
cout<<" ************************************ "<<endl;
cout<<" * * "<<endl;
cout<<" * Inserire il numero del bancomat * "<<endl;
cout<<" * * "<<endl;
cout<<" ";
cin>>InputConto;
if (InputConto<DimArray) {
cout<<"\n * * "<<endl;
cout<<" * Inserire il pin del bancomat * "<<endl;
cout<<" * * "<<endl;
cout<<" ";
cin>>InputPin;
if (InputPin!=Pin[InputConto]) {
system("CLS");
cout<<" ************************************ "<<endl;
cout<<" * * "<<endl;
cout<<" * PIN ERRATO * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
ch = getchar();
} else {
cout<<"\n * * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
cout<<endl;
cout<<endl;
ch = getchar();
}
} else {
system("CLS");
cout<<" ************************************ "<<endl;
cout<<" * * "<<endl;
cout<<" * NUMERO DI CARTA NON VALIDO * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
ch = getchar();
}
ch = getchar();
fflush(stdin);
system("CLS");
} while (InputPin!=Pin[InputConto] || InputConto>DimArray);
}


void Rosso() {
system("CLS");
cout<<" ************************************ "<<endl;
cout<<" * * "<<endl;
cout<<" * NON SONO PRESENTI ABBASTANZA * "<<endl;
cout<<" * SOLDI SUL CONTO * "<<endl;
cout<<" * * "<<endl;
cout<<" ************************************ "<<endl;
ch = getchar();
fflush(stdin);
}

oregon
11-01-2014, 20:18
Non ho capito bene il problema nÚ cosa c'entri la fflush

In ogni caso la Sleep Ŕ bloccante e quindi per un secondo il thread Ŕ bloccato.

Sheldon97
12-01-2014, 13:13
In pratica il problema si pone alla fine del main, quando si avvia un ciclo for che, combinato alla funzione Sleep( ), genera un timer. Se durante questa pausa si preme qualche tasto sulla tastiera, me lo ritrovo scritto nella nuova videata: ho giÓ provato ad usare fflush(stdin) come ho fatto per altri casi, ma in quel particolare punto e solo lý non funziona.

Cerco di spiegarmi meglio: lo Sleep blocca il thread per un secondo. ripetuto tramite un ciclo for per 120 volte il tutto sarÓ bloccato per 2 minuti. se durante questi due minuti l'utente preme dei tasti sulla tastiera, i caratteri corrispondenti verranno visualizzati appena il programma richiederÓ un input da tastiera. Io volevo utilizzare fflush per pulire lo stdin e non aver questo problema, ma per motivi a me sconosciuti non funziona

Loading