2016-09-19 67 views
0

所以这就是我想实现简单的C++计算星期几,有点卡住了?

enter image description here

这是我的代码。我现在完全陷入困境,我在这里错过了什么,那正好在我面前?我觉得我有所有的功能,但我不认为它会正确计算它。我在这里有一些错误,我无法修复甚至试图运行它。 谢谢你的任何帮助; -

#include <iostream> 
#include <cmath> 
#include <string> 

using namespace std; 

class dayType 
{ 
public: 
    void setDay(int dayNum); 
    // set the day with the dayNum as parameter 
    void printd(dayNum); 
    // print the dayNum 
    int returnDay(); 
    // return the day of the week 
    void dayAfter(); 
    // return next day 
    void dayBefore(); 
    // return previous day 
    void randomDay(int dayNum); 
    // function to return a day after a certain number of days 


    dayType(int dayNum); 
    // Constructor with parameters setting dayNum according to parameters 
    dayType(); 
    //Default constructor 

    private: 
     int today; 
     int yest; 
     int tom; 
     int dayN; 

    }; 




    void dayType::printd(int dayNum) 
    { 
     if (dayNum == 1) 
      cout << "Monday" << endl; 

     if (dayNum == 2) 
      cout << "Tuesday" << endl; 

     if (dayNum == 3) 
      cout << "Wednesday" << endl; 

     if (dayNum == 4) 
      cout << "Thursday" << endl; 

     if (dayNum == 5) 
      cout << "Friday" << endl; 

     if (dayNum == 6) 
      cout << "Saturday" << endl; 

     if (dayNum == 7) 
      cout << "Sunday" << endl; 

    } 


    void dayType::setDay(int dayNum) 
    { 
    today = dayNum; 

    }; 

    int dayType::returnDay() 
    { 
     return today; 

    }; 

    void dayType::printd(<#int dayNum#>); 
    { 
    cout << "The current day is: " << today << endl; 
    } 


    void dayType::dayBefore() 
    { 
     if(today == 0) 
      yest = 6; 
     else today--; 
    }; 


    void dayType::dayAfter() 
    { 
     if(today == 6) 
     tom = 0; 

    }; 

    void dayType::randomDay(int dayNum) 
    { 
     dayN=(today+dayNum); 
     today =(dayN%7); 

    }; 

    dayType::dayType() 
    { 
     today = 0; 
    } 


    dayType::dayType(int daynum) 
    { 
    today = daynum; 
    } 
    // do I need these constructors here doing this? 



      int main() 

      { 
       int dayWeek; 

       cout << "Please enter a number for the day of the week: " << endl; 
       cout << "1 - Monday" << endl; 
       cout << "2 - Tuesday" << endl; 
       cout << "3 - Wednesday" << endl; 
       cout << "4 - Thursday" << endl; 
       cout << "5 - Friday" << endl; 
       cout << "6 - Saturday" << endl; 
       cout << "7 - Sunday" << endl; 

       while (dayWeek<= 7) 

        cin >> dayWeek; 

       dayType thisDay; 

       cout << "Today is: "; 
       thisDay.returnDay(); 
       thisDay.printd(int dayNum); 


       cout << "Yesterday was: "; 
       thisDay.dayBefore(); 
       thisDay.printd(int dayNum); 


       cout << "Tomorrow is: "; 
       thisDay.dayAfter(); 
       thisDay.printd(int dayNum); 

       cout << "Type a number of days from today and it will be: "; 
       thisDay.randomDay(dayNum); 

       return 0; 
      }; 
     } 
+0

嗨Croset!我在代码中看到了一些错误。但首先,你的问题是什么?你有错误吗?行为不是你所期望的吗? – Dylan

+0

嗨迪伦,老实说,我觉得我有那里的功能,但我不认为它会按照我的计划工作。不确定我的打印是否正确。我首先收到一些基本的语法错误,所以我不能运行程序来检查 - 真的可以感谢任何帮助,以了解我出错的地方!谢谢:) – Croset

+0

在你的书中阅读更多有关*返回*函数中的值以及如何调用函数的内容。 (你还没有完成XCode中'printd'参数的定义。) – molbdnilo

回答

1

你的代码应该是更多这样的:

#include <iostream> 
#include <cmath> 
#include <string> 

using namespace std; 

class dayType 
{ 
public: 
    void setDay(int dayNum); 
    void printd(); 
    // set the day with the dayNum as parameter 
    void printd(int dayNum); 
    // print the dayNum 
    int returnDay(); 
    // return the day of the week 
    int dayAfter(); 
    // return next day 
    int dayBefore(); 
    // return previous day 
    int randomDay(int dayNum); 
    // function to return a day after a certain number of days 


    dayType(int dayNum); 
    // Constructor with parameters setting dayNum according to parameters 
    dayType(); 
    //Default constructor 

    private: 
     int today; 

}; 




void dayType::printd(int dayNum) 
{ 
    if (dayNum == 1) 
     cout << "Monday" << endl; 

    if (dayNum == 2) 
     cout << "Tuesday" << endl; 

    if (dayNum == 3) 
     cout << "Wednesday" << endl; 

    if (dayNum == 4) 
     cout << "Thursday" << endl; 

    if (dayNum == 5) 
     cout << "Friday" << endl; 

    if (dayNum == 6) 
     cout << "Saturday" << endl; 

    if (dayNum == 7) 
     cout << "Sunday" << endl; 

} 


void dayType::setDay(int dayNum) 
{ 
    today = dayNum; 

} 

int dayType::returnDay() 
{ 
    return today; 

} 

void dayType::printd() 
{ 
cout << "The current day is: " << today << endl; 
} 


int dayType::dayBefore() 
{ 
    int yest; 
    if(today == 0) 
     yest = 6; 
    else 
     yest = today - 1; 
    return yest; 
}; 


int dayType::dayAfter() 
{ 
    int tom; 

    if(today == 6) 
     tom = 0; 
    else 
     tom = today + 1; 
    return tom; 

}; 

int dayType::randomDay(int dayNum) 
{ 
    int dayN = (today+dayNum); 
    return (dayN % 7) 

}; 

dayType::dayType() 
{ 
    today = 0; 
} 


dayType::dayType(int daynum) 
{ 
    today = daynum; 
} 
// do I need these constructors here doing this? 



int main() 

{ 
    int dayWeek = -1; 
    int random = -1; 

    cout << "Please enter a number for the day of the week: " << endl; 
    cout << "1 - Monday" << endl; 
    cout << "2 - Tuesday" << endl; 
    cout << "3 - Wednesday" << endl; 
    cout << "4 - Thursday" << endl; 
    cout << "5 - Friday" << endl; 
    cout << "6 - Saturday" << endl; 
    cout << "7 - Sunday" << endl; 

    while (dayWeek >= 7 || dayWeek < 0) 

     cin >> dayWeek; 

    dayType thisDay; 
    thisDay.today = dayWeek; 

    thisDay.printd(); 


    cout << "Yesterday was: "; 
    thisDay.printd(thisDay.dayBefore()); 


    cout << "Tomorrow is: "; 
    thisDay.printd(thisDay.dayAfter()); 

    cout << "Type a number of days : "; 

    while (random < 0) 

     cin >> random; 

    cout << "Now we are "; 
    thisDay.printd(thisDay.randomDay(random)); 

    return 0; 
} 

当你调用一个函数是这样的:void fonction(int a, int b),你可以这样调用:fonction(1, 2);。您不必编写参数的类型。在你的课堂上,只声明你需要的功能值。在您之前的代码中,您声明tom,yesdayN,但您不需要保留其值。

我没有测试代码,所以如果你有错误,写下来,我会编辑这篇文章。

+0

谢谢你的帮助!我有几个错误 - 在这里脱机声明 'void dayType :: printd(); {' 和这里 'thisDay.printd();'似乎不喜欢printD?说太少的函数调用和dayNum没有指定? – Croset

+0

你只需要声明void'dayType :: printd()'。我忘了删除;实施后。 – Dylan

+0

AHHHHHH GOTCHA。这现在有道理。谢谢你:) – Croset

1

就个人而言,我建议使用enum而不是int跟踪当天,以及必要的操作员让您循环日子。这将允许您更轻松地定义和与dayType进行交互,轻松解决您遇到的错误。

#include <iostream> 
#include <cmath> 
#include <string> 
#include <limits> 

using namespace std; 

class dayType 
{ 
public: 
    // Days enum: 
    enum Days { 
     D_MONDAY = 1, 
     D_TUESDAY, 
     D_WEDNESDAY, 
     D_THURSDAY, 
     D_FRIDAY, 
     D_SATURDAY, 
     D_SUNDAY 
    }; 

    void setDay(int dayNum); 
    // set the day with the dayNum as parameter 

    void printd(int dayNum); 
    // print the dayNum 
    void printd(); 
    // Prints the current day. 

    Days returnDay(); 
    // return the day of the week 
    Days dayAfter(); 
    // return next day 
    Days dayBefore(); 
    // return previous day 
    Days randomDay(int dayNum); 
    // function to return a day after a certain number of days 


    dayType(int dayNum); 
    // Constructor with parameters setting dayNum according to parameters 
    dayType(); 
    //Default constructor 

private: 
    Days today; 
}; 

// Compound assignment addition: 
dayType::Days& operator+=(dayType::Days& left, int right) 
{ 
    typedef dayType::Days Days; 

    int temp = static_cast<int>(left) + right; 

    // In case of adding negative numbers. 
    while (temp < dayType::D_MONDAY) 
     temp += dayType::D_SUNDAY; 

    while (temp > dayType::D_SUNDAY) 
     temp -= dayType::D_SUNDAY; 

    left = static_cast<Days>(temp); 

    return left; 
} 

// Compound assignment subtraction: 
dayType::Days& operator-=(dayType::Days& left, int right) 
{ 
    typedef dayType::Days Days; 

    int temp = static_cast<int>(left) - right; 

    while (temp < dayType::D_MONDAY) 
     temp += dayType::D_SUNDAY; 

    // In case of subtracting negative numbers. 
    while (temp > dayType::D_SUNDAY) 
     temp -= dayType::D_SUNDAY; 

    left = static_cast<Days>(temp); 

    return left; 
} 


// Addition. Uses compound assignment addition internally. 
dayType::Days operator+(dayType::Days left, int right) 
{ 
    return left += right; 
} 

// Subtraction. Uses compound assignment subtraction internally. 
dayType::Days operator-(dayType::Days left, int right) 
{ 
    return left -= right; 
} 


// Prefix increment (++day): 
dayType::Days operator++(dayType::Days& day) 
{ 
    return day += 1; 
} 

// Postfix increment (day++): 
dayType::Days operator++(dayType::Days& day, int) 
{ 
    typedef dayType::Days Days; 

    Days temp = day; 
    ++day; 
    return temp; 
} 


// Prefix decrement (--day): 
dayType::Days operator--(dayType::Days& day) 
{ 
    return day -= 1; 
} 

// Postfix decrement (day--): 
dayType::Days operator--(dayType::Days& day, int) 
{ 
    typedef dayType::Days Days; 

    Days temp = day; 
    --day; 
    return temp; 
} 


void dayType::printd(int dayNum) 
{ 
    if (dayNum == D_MONDAY) 
     cout << "Monday" << endl; 

    if (dayNum == D_TUESDAY) 
     cout << "Tuesday" << endl; 

    if (dayNum == D_WEDNESDAY) 
     cout << "Wednesday" << endl; 

    if (dayNum == D_THURSDAY) 
     cout << "Thursday" << endl; 

    if (dayNum == D_FRIDAY) 
     cout << "Friday" << endl; 

    if (dayNum == D_SATURDAY) 
     cout << "Saturday" << endl; 

    if (dayNum == D_SUNDAY) 
     cout << "Sunday" << endl; 
} 

void dayType::printd() 
{ 
    cout << "The current day is: "; 
    printd(today); 
} 


void dayType::setDay(int dayNum) 
{ 
    today = static_cast<Days>(dayNum); 
}; 

dayType::Days dayType::returnDay() 
{ 
    return today; 
}; 

dayType::Days dayType::dayBefore() 
{ 
    return today - 1; 
}; 


dayType::Days dayType::dayAfter() 
{ 
    return today + 1; 
}; 

dayType::Days dayType::randomDay(int dayNum) 
{ 
    return today + dayNum; 
}; 

dayType::dayType() 
{ 
    today = D_SUNDAY; 
} 


dayType::dayType(int daynum) 
{ 
    today = static_cast<Days>(daynum); 
} 



int main() 
{ 
    int dayWeek = 0; 

    cout << "Please enter a number for the day of the week: " << endl; 
    cout << "1 - Monday" << endl; 
    cout << "2 - Tuesday" << endl; 
    cout << "3 - Wednesday" << endl; 
    cout << "4 - Thursday" << endl; 
    cout << "5 - Friday" << endl; 
    cout << "6 - Saturday" << endl; 
    cout << "7 - Sunday" << endl; 

    while (!((dayWeek > 0) && (dayWeek < 8))) 
     cin >> dayWeek; 

    dayType thisDay(dayWeek); 

    // ----- 

    cout << "Today is: "; 
    thisDay.printd(thisDay.returnDay()); 

    // ----- 

    cout << "Yesterday was: "; 
    thisDay.printd(thisDay.dayBefore()); 

    // ----- 

    cout << "Tomorrow is: "; 
    thisDay.printd(thisDay.dayAfter()); 

    // ----- 

    cout << "Type a number of days: "; 

    int random; 
    cin >> random; 
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 

    cout << "In " << random << " days, it will be: "; 
    thisDay.printd(thisDay.randomDay(random)); 
}; 

目前,这应该为你想要什么,需要提醒的是,如果你想使用intDays(如初始化中dayType::dayType(int daynum)today),你必须明确地将它转换成一。 (相反,Days可以隐式用作int,受dayType::returnDay()返回值传递给dayType::printd()作为证明,或者如果你传递一个Dayscout。)

如果你想使用的dayTypeDays之外,你可以使用它作为dayType::Days(例如在运营商的回报类型中)。您也可以使用typedef dayType::Days Days;将其带入当前范围,允许您将其作为简单的Days(如dayType::Days operator++(dayType::Days& day, int)dayType::Days operator--(dayType::Days& day, int))使用。同样,要使用枚举值本身,请在dayType::前加上它们的名称。

当你在这里使用这个练习和你的问题,作为一个学习的机会,我留下了一些可以改进的地方。它目前正常工作,但有修改空间,可以使其更好地工作。

+0

@Croset不客气。我只是稍微修改了'dayType :: printd()'(没有参数的那个),所以它会打印当天的名字而不是底层的'int'值,并修正了我在代码下面的第一段中犯的错误(我错误地指出,如果你真的可以传递它,而不需要投射,你明确需要将'Days'转换为'int'以将它传递给'std :: cout')。 –