2016-03-25 18 views
1

Şu anda C++ programlama sınıfına giriş için bir proje üzerinde çalışıyorum. Proje, kullanıcıdan mm/dd/yyyy biçimini kullanarak bir tarih girmesini ister. Verilen bilgilere dayanarak, program daha sonra tarihin geçerli mi yoksa geçersiz mi olduğunu belirlemek zorundadır, daha sonra buna bir cevap görüntüler. Şu anda her şeyin "İyi tarih!" Sorunun nerede olduğundan emin değilim. Herhangi bir yardım takdir edilir. Bana doğru yönde işaret etmene yardım edersen, bu harika olurdu.C++ Ay, gün ve yıl onayı

#include <iostream> 
#include <conio.h> 

using namespace std; 

void getDate(int *month, int *day, int *year); 
int checkDate(int month, int day, int year); 
void displayMessage(int status); 

int main() 
{ 
    int month, day, year; 
    int s = 0; 

    getDate(&month, &day, &year); 
    do 
    { 
     checkDate(month, day, year); 
     displayMessage(s); 
     getDate(&month, &day, &year); 
    } 
    while (_getch() != EOF); 
} 

void getDate(int *month, int *day, int *year) 
{ 
    char fill; 
    fill = '/'; 
    cout << "Enter a date in mm/dd/yyyy form: "; 
    cin >> *month; 
    if (cin.get() != '/') 
    { 
     cout << "expected /" << endl; 
    } 
    cin >> *day; 
    if (cin.get() != '/') 
    { 
     cout << "expected /" << endl; 
    } 
    cin >> *year; 
    cout << *month << fill << *day << fill << *year << endl; 
}; 

int checkDate(int month, int day, int year) 
{ 
    if ((month = 1) || (month = 3) || (month = 5) || (month = 7) || 
     (month = 8) || (month = 10) || (month = 12)) 
    { 
     day <= 31; 
    } 
    else if ((month = 4) || (month = 6) || (month = 9) || (month = 11)) 
    { 
     day <= 30; 
    } 
    else if ((month = 2) && (year % 4 == 0)) 
    { 
    day <= 29; 
    } 
    else if ((month = 2) && (year % 4 != 0)) 
    { 
     day <= 28; 
    }; 
    int status = 0; 
    if ((year < 999) || (year > 10000)) 
    { 
     status == 1; 
    } 
    if ((month < 1) || (month > 12)) 
    { 
     status == 2; 
    } 
    else if ((day < 1) || (day > 31)) 
    { 
     status == 3; 
    } 
    else if ((day < 1) || (day > 30)) 
    { 
     status == 4; 
    } 
    else if ((day < 1) || (day > 29)) 
    { 
     status == 5; 
    } 
    else if ((day < 1) || (day > 28)) 
    { 
     status == 6; 
    } 
    return status; 
}; 

void displayMessage(int status) 
{ 
    if (status == 0) 
    { 
     cout << "Good date!" << endl; 
    } 
    if (status == 1) 
    { 
     cout << "Bad year" << endl; 
    } 
    if (status == 2) 
    { 
     cout << "Bad month" << endl; 
    } 
    if (status == 3) 
    { 
     cout << "Bad day. Not 1-31" << endl; 
    } 
    if (status == 4) 
    { 
     cout << "Bad day, not 1-30" << endl; 
    } 
    if (status == 5) 
    { 
     cout << "Bad day, not 1-29" << endl; 
    } 
    if (status == 6) 
    { 
     cout << "Bad day, not 1-28" << endl; 
    } 
    _getch(); 
} 
+1

Neden her zaman atılırsa, checkDate() dönüş değeri var mı? Neden hiç değişmeyen main() 'da bir değişken var? –

+1

Hiçbir zaman 's' öğesini hiçbir şeye atamazsınız, dolayısıyla başlangıç ​​değerinde kalır (' 0'). –

+0

@JonathanPotter 'displayMessage' içindeki durumu 'status' ile nasıl ilişkilendiririm? Kafam karıştıran şey bu. İşte bu yüzden 's var çünkü do ekranındaki displayMessage (___) 'ı nasıl dolduracağımdan emin değilim. –

cevap

1

1) Burada sorunlar bir çift, ama en belirgin bir main() Orada gibidir:

int s=0; 
... 
    checkDate(month, day, year); // you don't store the status 
    displayMessage(s);    // so s will always be 0 ! So good date ! 

Bunu düzeltmek zorunda yer: Sonra

s=checkDate(month, day, year); // store the result of the check   
    displayMessage(s);    // and take it to display the message 

2) checkDate(), = ve =='u karıştırırsınız. =, değişkenin değerini solunda değiştirir. == sadece bir karşılaştırma yapar ancak hiçbir şey depolamaz.

int checkDate(int month, int day, int year) 
{ 
    int status=0; 

    if ((month == 1 || month == 3 || month == 5 || month == 7 || 
     month == 8 || month == 10 || month == 12) && (day>31 || day<1)) 
    { 
     status = 3; 
    } 
    else if ((month == 4 || month == 6 || month == 9 || month == 11) && (day>30 || day<1)) 
    { 
     status = 4; 
    } 
    else if ((month == 2) && (year % 4 == 0) && (day>29 || day<1)) 
    { 
     status = 5; 
    } 
    else if ((month = 2) && (year % 4 != 0) && (day>28 || day<1)) 
    { 
     status = 6; 
    } 
    else if ((year < 999) || (year > 10000)) 
    { 
     status = 1; 
    } 
    if ((month < 1) || (month > 12)) 
    { 
     status = 2; 
    } 
    return status; 
}; 

3) Bundan sonra, giriş fonksiyonunu geliştirmek gerektiğini, çünkü:

  • geçersiz ayırıcılar ile baş vermez/Bütün optimizasyon olmadan ayarlama düzeltirken gibi, kod bakmak gerekir . '/' Eksikse, bir hata mesajı görüntülenir, ancak girişi her şey yolundaymış gibi devam ettirirsiniz.
  • geçersiz (örn. Sayısal sayısal) girişle başa çıkmaz. Eğer kullanıcı örneğin XI/1/2016 girerse, girişiniz başarısız olacaktır.

Yani (cin>>xxx) bir if kullanmak ve her şeyin doğru okundu durum geçerlidir olabilir bir ifade olduğunu unutmayın. Ayrıca, cin.clear()'un bir hatadan sonra girişi engelleyen hata bayraklarını da temizlediğini unutmayın.

+0

Mantıklı geliyor .. Aptal Ben bunu görmedim. Ay, gün, yıl değerlerini kullanıcı girdisi tarafından atanan değerlerine nasıl bağlarım? @Christophe –

+0

@JustinFarr Cevabımı, checkDate() 'deki birkaç sistematik sorunla tamamladım. – Christophe

+0

@JustinFarr, tarih bileşenleri için bağlantıyı zaten yaptınız, çünkü giriş işlevindeki işaretçileri kullanırsınız, böylece değerler doğrudan ana() değişkenlerine yazılır. – Christophe

İlgili konular