2010-03-09 2 views
1

주요 기능을 살펴보면 "월요일"을 내 setDay 공용 기능에 하드 코딩 한 것을 볼 수 있습니다. (setDay에서와 마찬가지로) C 문자열을 사용하여 요일을 잡는 것이 쉽지만, "월요일"로 설정 한 날에 n을 추가하도록 사용자에게 요청하는 방법은 무엇입니까? "목요일"? typdef 열거 {INVALID, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일은} 9 0 및/또는 10화요일 + 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을 가지고 귀찮게 거라면 클래스의 경우 요일을 반환하는 메서드는 해당 인스턴스를 반환해야합니다. 물론 해결책은 아닙니다. –

+1

'%'에 대해 들어 본 적이 있습니까? (예 :'토요일 (5) + 3 -> 화요일 (1)')은 ((5 + 3) % 7) -> 1)' –

+0

으로 작동합니다. 숙제 문제? –

답변

9

1과 대신 문자열을 사용하려고 시도하는 것보다 해석하지 않기 때문에 어렵다 어떤 요일인지를 저장하기 위해서는 요일을 저장하기 위해 클래스 내부의 정수를 사용하기 만하면됩니다. 정수 및 모듈러스 산술은 이러한 종류의 데이터를 저장하는 데 가장 일반적으로 사용됩니다.

예를 들어, 일요일부터 월요일까지 요일을 0에서 6까지 저장하면 모듈러스 연산자 %을 사용하여 쉽게 조작 할 수 있습니다. 언제 당신은 작업이이 범위 내에있는 경우, 당신은

nDay = nDay % 7; 

을 할 수 모르고 당신이 기대하고있는 값에 도달 할 것이다; 이 9 6에서까지 간 경우, 예를 들어, 당신이 열거 형을 사용할 수 있습니다 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; 
} 

그러나 INVALID (수학을 단순화하는)를 삭제합니다. Weekday_from_str 함수를 이미 작성 했으므로이 열거 형을 반환하기 위해이 함수를 적용해야합니다.

+0

노력하십시오! 코드의 큰 덩어리 + 몇 가지 테스트. +1. –

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; 
}