0

嗨,我希望有人可以帮助我解决我做错的事情。这是我要指出的作业,但需要有人告诉我我是个多么白痴,因为我没有看到我做错了什么。

我应该让用户输入月、日和年来确定它是否是一个神奇的日期。我已经为另一个项目完成的那部分。我应该返回并使用名为 isDateValid 的函数验证日期。我很确定我遗漏了一些明显的东西,并且可以在这个问题上使用任何人的帮助。谢谢!

问题是当我运行它时,我总是得到它是一个无效的日期!

 #include <iostream>
 using namespace std;

 bool leapYear(int);
 bool isDateValid(int, int, int);

 int main()
 {
 int month, day, year;

 cout << "Is the date you are thinking of a magic one? Let's see...\n";
 cout << "What is the month in numeric form only? "; cin >> month;
 cout << "What is the day of the month? "; cin >> day;
 cout << "What is the four digit year? "; cin >> year;

 if (isDateValid(month, day, year) == false)
 {
 cout << "The date you entered, "<< month << "/" << day << "/" << 
 year << " is NOT a VALID Date.\n";
 cout << "If you think I am wrong, please feel free to run me again";
 }

 else   if (month * day == year % 100) // if true then do this
 {
 cout << "The date you entered, " << 
 month << "/" << day << "/" << year << " is a magic date!!\n"; 
 }
 else // if false then do this
 {
 cout << "The date you entered, " << month << "/" << day << "/" <<
 year << " is NOT a magic date!!\n";
 }

                                                            //Program ID
 cout <<"\n" << "L5P1LB.cpp\n" << "11-26-12\n" << endl;
 system ("pause");
 return 0;
 }//end main

 // isDateValid function to validate date entered
 bool isDateValid(int month, int day, int year)
 {
 bool validation = true;
 if(!(year >= 1600 && year <=2100))
     validation = false;    
 if(leapYear(year))
 {
     if ((month == 2) && (day > 29))
         validation = false;
     }
 else if(!leapYear(year))
 {
      if ((month == 2) && (day > 28))
          validation = false;
          }    
 if((month < 1 && month > 12) || (day < 1))
     validation = false;
 if((month == 1) || (month ==3) || (month == 5) || (month == 7) ||
     (month == 8) || (month == 10) || (month == 12) && (day > 31))
     validation = false;
 else if (((month == 4) || (month == 6) || (month == 9) || (month == 11)) && 
      (day > 30))
      validation = false;
 else
      validation == true;
 return validation;
 }
 // leapYear function to determine if the year is a leap year for validation
 bool leapYear(int year)
 {
 return(year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
 } // end leapYear

编辑

好的,现在我的问题是我没有得到它不是一个有效的日期。它一起跳过验证,只运行它的“神奇日期”部分!

这是重写加上我的完整代码,希望在 Bloodshed 中正确缩进。

Description: This program determines if when the user enters a month, 
day, and four digit year which will then be stripped down to its
two digit year and determined to be a magic date if the day entered 
multiplied by the month entered equals the years two digit format.
Design:
    begin main
        input data
            Ask user for a month in number form
            Ask user for a day of the month
            Ask user for four digit month
        Validate
            begin isDateValid
                if year is between 1600 and 2100, inclusive then return 
                    true
                if month is between 1 and 12, inclusive return true
                if month is Jan, Mar, May, July, Aug, Oct, Dec 
                   then if day is between 1 and 31 inclusive return true
                if month is Apr, June, Sept, Nov
                   then if day is between 1 and 30 inclusive return true
                if month is Feb
                   then determine if leap year by running function 
                   leapYear provided for us.
                   if leap year is true 
                   then if day is between 1 and 29, inclusive return true
                   if not leap year then if day is between 1 and 28, 
                   inclusive then return true
            end isDateValid
        if isDateValid is true then 
        Calculate
            if the month times the year is equal to the year modulus 100
            then output it is a magic date
            if it does not equal the year in 2 digit form
            then output that it is not a magic date    
        else output error message

        Output Program ID
    end main

    The output needs to include the books data of 6/10/1960 */
#include <iostream>
using namespace std;

bool leapYear(int);
bool isDateValid(int, int, int);

int main()
{
    int month, day, year;

    cout << "Is the date you are thinking of a magic one? Let's see...\n";
    cout << "What is the month in numeric form only? "; cin >> month;
    cout << "What is the day of the month? "; cin >> day;
    cout << "What is the four digit year? "; cin >> year;

if (isDateValid(month, day, year) == false)
{
    cout << "The date you entered, "<< month << "/" << day << "/" << 
         year << " is NOT a VALID Date.\n";
    cout << "If you think I am wrong, please feel free to run me again";
}

else  if (month * day == year % 100) // if true then do this
{
    cout << "The date you entered, " << 
         month << "/" << day << "/" << year << " is a magic date!!\n"; 
}
else // if false then do this
{
    cout << "The date you entered, " << month << "/" << day << "/" <<
         year << " is NOT a magic date!!\n";
}

                                                            //Program ID
cout <<"\n" << "L5P1LB.cpp\n" << "11-26-12\n" << endl;
system ("pause");
return 0;
} //end main

// isDateValid function to validate date entered
bool isDateValid(int month, int day, int year)
{
    bool validation = true;  // validation set to true
    // if it is not between 1600 and 2100 then set to false
    if(!(year >= 1600 && year <=2100))
        validation = false;
    // call leapYear function
    if(leapYear(year))
{
    // if February and day is greater than 29 then set to false
    if ((month == 2) && (day > 29))
         validation = false;
}
    // else if NOT leapYear
    else if(!leapYear(year))
{
    // if February and day is greater then 28 then set to false
    if ((month == 2) && (day > 28))
          validation = false;
}    
    // if month is less then 1 and over 12 then set to false
    if((month < 1 && month > 12))
          validation = false;
    // if day is less then 1 then set to false    
    if(day < 1)    
          validation = false;
    // if month is 1 (Jan), 3 (Mar), 5 (May), 7 (July), 8 (Aug), 10 (Oct),
    // or 12 (Dec) and day is greater then 31 set to false    
    if((month == 1) || (month ==3) || (month == 5) || (month == 7) ||
         (month == 8) || (month == 10) || (month == 12) && (day > 31))
         validation = false;
    // if month is 4 (Apr), 6 (June), 9 (Sept), or 11 (Nov) and day is 
    // greater then 30 set to false
    if (((month == 4) || (month == 6) || (month == 9) || (month == 11)) && 
         (day > 30))
         validation = false;
    // else everything that is left set validation to true
    else
         validation = true;
return validation;
}  // End isDateValid

// leapYear function to determine if the year is a leap year for validation
bool leapYear(int year)
{
    return(year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
} // end leapYear

对不起,如果我放错了地方或任何东西!

也感谢您的帮助。真的很感激。

4

3 回答 3

3

您在日期验证中出现了一些错误。

Luchian 指出的运算符优先级是 1,但您还有其他几个:

  • 你测试一下month < 1 && month > 12- 这是不可能的,一个月不能小于 1 和大于 12
  • validation == true不做任何事情。==是比较运算符。幸运的是,这并没有像到达此代码时validation那样影响您的功能。true

我冒昧地以我认为更简洁的方式重写了它,但month如果您希望保留您的版本,您可能只需修复检查

bool isDateValid(int month, int day, int year)
{
    bool validation = true;
    if(!(year >= 1600 && year <=2100))
        validation = false;    

    if(day < 1)
        validation = false;

    switch(month)
    {
    case 2:
        if(leapYear(year)) // We only care about leap years in February 
            if(day > 29)
                validation = false;
        else
            if(day > 28)
                validation = false;
        break;
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        if(day > 31)
            validation = false;
        break;
    case 4: case 6: case 9: case 11:
        if(day > 30)
            validation = false;
        break;
    default: // the month is not between 1 and 12
        validation = false;
        break;
    }
    return validation;
}
于 2012-11-27T12:37:19.223 回答
1

||是短路的,因此(month == 1) || (month ==3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12) && (day > 31)评估true是否满足第一个条件。您需要添加一组额外的括号:

((month == 1) || (month ==3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12)) && (day > 31)

其他月份也一样。

还,

validation == true; 

是一个无操作,你可能是说validation = true.

于 2012-11-27T04:48:37.333 回答
1

就个人而言,我会建议一些更直接和简洁的东西。三元运算符一?开始可能会有点混乱,但一旦清楚地理解就会非常简单。我认为它是一种可以嵌入表达式的“if-else”。

bool isDateValid(int month, int day, int year)
{
    return year >= 1600 && year<= 2100 &&
           month >= 1 && month <= 12 &&
           day >= 1 &&
           day <= (month == 2 ? (leapyear(year) ? 29 : 28) :
                   month == 9 || month == 4 || month == 6 || month == 11 ? 30 : 31);
                   // "30 days has September, April, June and November..."
}

如果您对月份常量使用枚举,它可能更具可读性:

enum Month { Jan = 1, Feb, Mar, Apr ... };

目标是实际编码:

day <= (month == Feb ? ...
于 2012-11-28T00:12:02.553 回答