Problema con ciclo do-while.[RISOLTO]

di il
1 risposte

Problema con ciclo do-while.[RISOLTO]

Salve a tutti. Sono nuovo in questo forum e spero di non avere sbagliato sessione.
Sono alle prime armi con il c++ e sto cercando di fare un semplice programma che salvi in una matrice i dati relativi ad un ID di un utente
e poi in base a come
"chiede" l'utente faccia una ricerca in base all' ID nella matrice per ricercare i valori relativi ad un utente. Fin qui tutto bene, la ricerca, la scrittura e la lettura funzionano tranquillamente...ho pensato inoltre però di gestire eventuali errori di immissione come per esempio non è possibile che il mese della data di nascita di un utente (inteso come ID) sia maggiore di 31 , o che il mese sia maggiore di 12 etc.. ho gestito questa cosa con dei cicli
do-while. Funzionano tutti tranne uno....quello piu "complesso" riguardante l'immissione del giorno e sono 3 ore che lo guardo e lo riguardo senza trovare il perchè non funziona.
POSTO QUI IL CODICE COMPLETO:

#include <cstdlib>
#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    int n,ID;
    char richiesta;
    bool accettato;
    do{
    cout <<"\n Numero di ID da registrare: ";
    cin >> n;
    if(n==0){
        cout << endl;
        cout << " Non e' possibile registrare 0 ID." << endl;
    }
    }while(n == 0);
    n=n-1;
    float utenti[n][6];
    cout << endl;
    for(int i=0; i<=n; i++){
      do{
        cout << " ID UTENTE: ";
        cin >> utenti[i][0];
        if(utenti[i][0]==0){
            cout << endl;
            cout << " Un ID non puo' avere valore 0. " << endl;
            cout << endl;
        }
      }while(utenti[i][0] == 0);
       do{
        cout << " ANNO DI NASCITA: ";
        cin >> utenti[i][1];
        if(utenti[i][1] < 1900){
            cout << endl;
            cout << " Non e' possibile inserire una data antecedente al 1900. " << endl;
            cout << endl;
        }
       }while(utenti[i][1] < 1900);
       do{
        cout << " MESE: ";
        cin >> utenti[i][2];
        if((utenti[i][2] > 12) or (utenti[i][2] < 1)) {
            cout << endl;
            cout << " Mese non valido. " << endl;
            cout << endl;
        }
       }while((utenti[i][2] > 12) or (utenti[i][2] < 1));
       do{
        accettato = false;
        cout << " GIORNO: ";
        cin >> utenti[i][3];
        if((utenti[i][3] > 31) or (utenti[i][3] < 1)){
            cout << endl;
            cout << " Giorno non valido. Non è possibile inserire un valore oltre 31 o minore di 1. " << endl;
            cout << endl;
        }else if(((utenti[i][2] == 4) or (utenti[i][2] == 6) or 
                (utenti[i][2] == 9) or (utenti[i][2] == 11))
                and (utenti[i][3] > 30)){
            cout << endl;
            cout << " Giorno non valido. Il mese indicato non ha piu' di 30 giorni. " << endl;
            cout << endl;
        }else if(utenti[i][2] == 2){
            int a = 0;
            a = utenti[i][1];
            if(utenti[i][3] > 29){
            cout << endl;
            cout << " Giorno non valido. Febbraio non puo' avere piu di 29 giorni. "<< endl;
            cout << endl;
            }else if((utenti[i][3] > 28) and (!(!(a % 400) or (!(a % 4) and (a % 100))))){
            cout << endl;
            cout << " Giorno non valido. Nell' anno indicato ("<< a << ") Febbraio non e' bisestile."<<endl;
            cout << " Impossibile inserire un valore oltre 28. " << endl;
            cout << endl;
            }
        }else{
            accettato = true;
        }
       }while(accettato == false);
       do{
        cout << " ANNO CREAZIONE DEL CONTO: ";
        cin >> utenti[i][4];
        if(utenti[i][4] < 1900){
            cout << endl;
            cout << " Non possono essere inseriti conti correnti creati prima del 1900. " << endl;
            cout << endl;
        }
       }while(utenti[i][4] < 1900);
        cout << " SALDO: ";
        cin >> utenti[i][5];
        cout << endl;
    }
    cout << " Si vogliono estrapolare le informazioni relative ad un ID?(n/Y)" << endl;
    cout << " ";
    cin >>  richiesta;
    if (richiesta == 'Y'){
    do { 
        bool trovato = false;
        cout << "\n (0 per terminare la ricerca)" << endl;
        cout << " Estrapolare le informazioni relative all' ID: ";
        cin >> ID;
        cout << endl;
            for(int i=0; i<=n; i++){
                if(utenti[i][0] == ID){
                    cout << " ANNO DI NASCITA: "<< utenti[i][1]<< endl;
                    cout << " MESE: "<< utenti[i][2] <<endl;
                    cout << " GIORNO: "<< utenti[i][3]<< endl;
                    cout << " ANNO CREAZIONE DEL CONTO: "<< utenti[i][4]<< endl;
                    printf (" SALDO: %0.2f\n", utenti[i][5]);
                    trovato = true;
                }
            }
        if(trovato == false){
            if( ID == 0){
                cout << endl;
            }else{
             cout << " La ricerca dell' ID (" << ID << ") non ha prodotto nessun risultato. "<< endl;
            }
         } 
    }while(ID != 0);
    }
    cout << "\n Visualizzare l'intera lista di clienti?(n/Y)" << endl;
    cout << " ";
    cin >>  richiesta;
    cout << endl;
    if(richiesta == 'Y'){
        for(int i=0; i<=n; i++){
            cout << " ID UTENTE: "<< utenti[i][0]<< endl;
            cout << " ANNO DI NASCITA: "<< utenti[i][1]<< endl;
            cout << " MESE: "<< utenti[i][2] <<endl;
            cout << " GIORNO: "<< utenti[i][3]<< endl;
            cout << " ANNO CREAZIONE DEL CONTO: "<< utenti[i][4]<< endl;
            printf (" SALDO: %0.2f\n", utenti[i][5]); 
            cout << endl;
        } 
    }
    cout << endl;
    system("pause");
    return 0;
}
Il do-while che non funziona è il seguente:

do{
        accettato = false;
        cout << " GIORNO: ";
        cin >> utenti[i][3];
        if((utenti[i][3] > 31) or (utenti[i][3] < 1)){
            cout << endl;
            cout << " Giorno non valido. Non è possibile inserire un valore oltre 31 o minore di 1. " << endl;
            cout << endl;
        }else if(((utenti[i][2] == 4) or (utenti[i][2] == 6) or 
                (utenti[i][2] == 9) or (utenti[i][2] == 11))
                and (utenti[i][3] > 30)){
            cout << endl;
            cout << " Giorno non valido. Il mese indicato non ha piu' di 30 giorni. " << endl;
            cout << endl;
        }else if(utenti[i][2] == 2){
            int a = 0;
            a = utenti[i][1];
            if(utenti[i][3] > 29){
            cout << endl;
            cout << " Giorno non valido. Febbraio non puo' avere piu di 29 giorni. "<< endl;
            cout << endl;
            }else if((utenti[i][3] > 28) and (!(!(a % 400) or (!(a % 4) and (a % 100))))){
            cout << endl;
            cout << " Giorno non valido. Nell' anno indicato ("<< a << ") Febbraio non e' bisestile."<<endl;
            cout << " Impossibile inserire un valore oltre 28. " << endl;
            cout << endl;
            }
        }else{
            accettato = true;
        }
       }while(accettato == false);
Praticamente mi entra in loop continuo, se immetto un giorno non conforme con il mese i controlli funzionano, ma se immetto un giorno conforme è come se non mi entrasse nell' else e non modificasse lo stato di "accettato" infatti mi ripete "GIORNO:"(valore da immettere) e devo immettere un nuovo giorno... e se lo immetto ancora conforme mi stampa nuovamente a video "GIORNO:" (valore da immettere)....
Scusate se è stato un poco lunga la spiegazione... ringrazio chiunque possa darmi uno spunto per ragiornare sulla soluzione... o sappia perchè entra in loop.
Grazie a tutti per l'attenzione!

1 Risposte

  • Re: Problema con ciclo do-while.[RISOLTO]

    Ho risolto, semplicemente mi ero dimenticato di inserire un
    
    else{
    trovato = true;
    }
    
    quando il mese valeva 2.
    Gli errori più banali fanno perdere la testa!
    Comunque ora il ciclo do while corretto si presenta cosi:
    
    do{
            accettato = false;
            cout << " GIORNO: ";
            cin >> utenti[i][3];
            if((utenti[i][3] > 31) or (utenti[i][3] < 1)){
                cout << endl;
                cout << " Giorno non valido. Non è possibile inserire un valore oltre 31 o minore di 1. " << endl;
                cout << endl;
            }else if(((utenti[i][2] == 4) or (utenti[i][2] == 6) or 
                    (utenti[i][2] == 9) or (utenti[i][2] == 11))
                    and (utenti[i][3] > 30)){
                cout << endl;
                cout << " Giorno non valido. Il mese indicato non ha piu' di 30 giorni. " << endl;
                cout << endl;
            }else if(utenti[i][2] == 2){
                int a = 0;
                a = utenti[i][1];
                if(utenti[i][3] > 29){
                cout << endl;
                cout << " Giorno non valido. Febbraio non puo' avere piu di 29 giorni. "<< endl;
                cout << endl;
                }else if((utenti[i][3] > 28) and (!(!(a % 400) or (!(a % 4) and (a % 100))))){
                cout << endl;
                cout << " Giorno non valido. Nell' anno indicato ("<< a << ") Febbraio non e' bisestile."<<endl;
                cout << " Impossibile inserire un valore oltre 28. " << endl;
                cout << endl;
                }else{
                    accettato = true;
                }
            }else{
                accettato = true;
            }
           }while(accettato == false);
    
Devi accedere o registrarti per scrivere nel forum
1 risposte