2010-03-09 28 views
1

看看主函數,我們可以看到我已經將「星期一」硬編碼到了我的setDay公共函數中。從用戶使用c字符串(正如我在setDay中那樣)獲取一週中的某一天很容易,但是如何讓用戶將n添加到設置的日期「星期一」並提出「星期四」?因爲typdef枚舉{INVALID,週一,週二,週三,週四,週五,週六,週日}不解釋圖9是0和/或10如1星期二+ 3 =星期五? C++編程問題

#include <iostream> 

using std::cout; 
using std::endl; 

class DayOfTheWeek //class is encapsulation of functions and members that manipulate the data. 
{ 
public: 

DayOfTheWeek(); // Constructor 
virtual ~DayOfTheWeek(); // Destructor 

void setDay(const char * day); // Function to set the day 
void printDay() const;  // Function to Print the day. 
const char * getDay() const; // Function to get the day. 

const char * plusOneDay(); // Next day function 
const char * minusOneDay(); // Previous day function 
const char * addDays(int addValue); // function that adds days based on parameter value 

private: 
char * day; // variable for the days of the week. 

}; 

DayOfTheWeek::DayOfTheWeek() : day(0) 
{ 
// Usually I would allocate pointer member variables 
// Here in the construction of the Object 
} 

const char * DayOfTheWeek::getDay() const 
{ 
return day; // we can get the day simply by returning it. 
} 

const char * DayOfTheWeek::minusOneDay() 
{ 
if (strcmp(day, "Monday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Sunday"; 
} 
else if (strcmp(day, "Tuesday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Monday"; 
} 
else if (strcmp(day, "Wednesday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Tuesday"; 
} 
else if (strcmp(day, "Thursday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Wednesday"; 
} 
else if (strcmp(day, "Friday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Thursday"; 
} 
else if (strcmp(day, "Saturday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Friday"; 
} 
else if (strcmp(day, "Sunday") == 0) 
{ 
    cout << "The day before " << day << " is "; 
    return "Saturday"; 
} 
else 
{ 
    cout << "'" << day << "'"; 
    return "is an invalid day of the week!"; 
} 
} 

const char * DayOfTheWeek::plusOneDay() 
{ 
if (strcmp(day, "Monday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Tuesday"; 
} 
else if (strcmp(day, "Tuesday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Wednesday"; 
} 
else if (strcmp(day, "Wednesday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Thursday"; 
} 
else if (strcmp(day, "Thursday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Friday"; 
} 
else if (strcmp(day, "Friday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Saturday"; 
} 
else if (strcmp(day, "Saturday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Sunday"; 
} 
else if (strcmp(day, "Sunday") == 0) 
{ 
    cout << "The day after " << day << " is "; 
    return "Monday"; 
} 
else 
{ 
    cout << "'" << day << "'"; 
    return " is an invalid day of the week!"; 
} 
} 

const char * DayOfTheWeek::addDays(int addValue) 
{ 
if (addValue < 0) 
{ 
    if (strcmp(day, "Monday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Friday"; 
    } 
    else if (strcmp(day, "Tuesday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Saturday"; 
    } 
    else if (strcmp(day, "Wednesday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Sunday"; 
    } 
    else if (strcmp(day, "Thursday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Monday"; 
    } 
    else if (strcmp(day, "Friday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Tuesday"; 
    } 
    else if (strcmp(day, "Saturday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Wednesday"; 
    } 
    else if (strcmp(day, "Sunday") == 0) 
    { 
    cout << day << " - " << -addValue << " = "; 
    return "Thursday"; 
    } 
    else 
    { 
    cout << "'" << day << "' "; 
    return "is an invalid day of the week! "; 
    } 
} 
else // if our parameter is greater than 0 (positive) 
{ 
    if (strcmp(day, "Monday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Thursday"; 
    } 
    else if (strcmp(day, "Tuesday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Friday"; 
    } 
    else if (strcmp(day, "Wednesday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Saturday"; 
    } 
    else if (strcmp(day, "Thursday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Sunday"; 
    } 
    else if (strcmp(day, "Friday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Monday"; 
    } 
    else if (strcmp(day, "Saturday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Tuesday"; 
    } 
    else if (strcmp(day, "Sunday") == 0) 
    { 
    cout << day << " + " << addValue << " = "; 
    return "Wednesday"; 
    } 
    else 
    { 
    cout << "'" << day << "' "; 
    return "is an invalid day of the week! "; 
    } 
} 
} 

void DayOfTheWeek::printDay() const 
{ 
cout << "The Value of the " << day; 
} 

void DayOfTheWeek::setDay(const char * day) 
{ 
if (day) 
{// Here I am allocating the object member char day pointer 
    this->day = new char[strlen(day)+1]; 
    size_t length = strlen(day)+1; // +1 for trailing null char 
    strcpy_s(this->day , length , day); // copying c-strings 
} 
else day = NULL; // If their was a problem with the parameter 'day' 
} 

DayOfTheWeek::~DayOfTheWeek() 
{ 
delete day; // Free the memory allocated in SetDay 
} 

int main() 
{ 
DayOfTheWeek MondayObject; // declare an object 

MondayObject.setDay("Monday"); // Call our public function 'setDay' to set a day of the week 
MondayObject.printDay();  // Call our public function 'printDay' to print the day we set 

cout << " object is " << MondayObject.getDay() << endl; // Print the value of the object 

cout << MondayObject.plusOneDay() << endl; 
cout << MondayObject.minusOneDay() << endl; 
cout << MondayObject.addDays(3) << endl; 

    MondayObject.printDay(); 
cout << " object is still " << MondayObject.getDay() << endl; // Print the value of the object 

cout << MondayObject.addDays(-3) << endl; 

return 0; 
} 
+1

別的不說,如果你去打擾有DayOfTheWeek類,返回星期幾的方法應該可能返回它的實例。當然,這不是一個解決方案。 – 2010-03-09 04:14:10

+1

有沒有聽說過'%'?對於這種包裝的東西(例如'星期六(5)+ 3 - >星期二(1)'''可以用作((5 + 3)%7) - > 1)' – 2010-03-09 04:15:09

+0

這是非常有用的作業問題? – 2010-03-09 04:19:11

回答

9

而不是試圖使用字符串這是很難要存儲它的哪一天,你可能只想在類中使用一個整數來存儲星期幾。整數和模數算術最常用於存儲這類數據。

如果您存儲星期幾到星期一的星期幾爲0到6,則可以使用模運算符%對其進行簡單的操作;任何時候你不知道一個操作是否在這個範圍內,你可以做

nDay = nDay % 7; 

它會達到你期望的值;如果它已經從6上升到9,例如,它會回來環繞於2

6

您可以使用枚舉和封裝週日,週一側翻:

enum Weekday { 
    INVALID, 
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 
}; 
Weekday operator+(Weekday w, int n) { 
    if (w == INVALID) return w; 
    n %= 7; 
    if (n < 0) n += 7; 
    return Weekday((n + (w - 1)) % 7 + 1); 
} 
Weekday operator+(int n, Weekday w) { return w + n; } 
Weekday operator-(Weekday w, int n) { return w + -n; } 
Weekday operator-(int n, Weekday w); // not defined -- doesn't make sense and not 
// to be used 

std::string str(Weekday d) { 
    assert(INVALID <= d && d <= SUNDAY); // function precondition 
    static char const* const days[] = { 
    "INVALID", 
    "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" 
    }; 
    return days[d]; 
} 

// you would probably not call this directly, but it shows how you simply have to 
// pick what day int(0) means, and add any int to that day to get a Weekday 
Weekday Weekday_from_num(int n, Weekday zero=MONDAY) { 
    return zero + n; 
} 

Test

int main() { 
    assert(MONDAY + 1 == TUESDAY); 
    assert(MONDAY + 8 == TUESDAY); 
    assert(MONDAY - 1 == SUNDAY); 
    assert(MONDAY - 8 == SUNDAY); 

    cout << "MONDAY + 3 is " << str(MONDAY + 3) << '\n'; 
    return 0; 
} 

但是,我會放棄無效(這也簡化了數學)。你已經寫了一個Weekday_from_str函數,你只需要調整它就可以返回這個枚舉。

+0

很好的努力!大量的代碼+一些測試。 +1。 – 2010-03-09 10:48:58

2

這種(經常碰到)問題並不需要寫一個類,包含枚舉和兩個函數的命名空間是不夠的:

#include <iostream> 
namespace day { 

enum e_DAY { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; 

inline e_DAY GetDay(unsigned int i) 
{ 
    return (e_DAY)(i % 7); 
} 

inline const wchar_t* GetName(unsigned int i) 
{ 
    static wchar_t* Names[] = { L"Sunday", L"Monday", L"Tuesday", L"Wednesday", L"Thursday", L"Friday", L"Saturday" }; 
    return Names[GetDay(i)]; 
} 

} // namespace day 

int main(int argc, wchar_t* argv[]) 
{    
    std::wcout << day::Tue + 3 << "\t" << day::GetName(day::Tue + 3) << std::endl; 
    return 0; 
} 
相關問題