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!