반응형
학과명, 학번, 이름, 생년월일을 입력받아서 학과명, 학번, 이름, 생년월일, 나이, 현재날짜를 출력하는 C++ 프로그램을 작성하라.
- Date 클래스를 정의해서 이용하라.
- 입출력 예:
환영합니다! 학과명, 학번, 이름, 생년월일(yyyy/mm/dd)을 입력하세요> 소프트웨어학과, 1111222333, 홍길동, 2000/03/01 >> 소프트웨어학과 1111222333 홍길동님 2000년3월1일생 2020년3월16일 현재 20세입니다. ** 프로그램을 수행할 때의 현재 날짜를 출력해야하며, 본인의 학번과 이름은 정확히 기록해야함(출석 및 과제 제출 확인용). 생일은 임의로 작성 가능. |
Code
// use class Date #include <iostream> #include <cstdlib> #include <string> #include <vector> #include <ctime> #pragma warning(disable:4996) using namespace std; const string currentDate() // returns current date as string yyyy/mm/dd { time_t current_time = time(NULL); // save current time to now as type current_time struct tm timeinfo; char buf[80]; timeinfo = *localtime(¤t_time); strftime(buf, sizeof(buf), "%Y/%m/%d", &timeinfo); // yyyy/mm/dd return buf; } class Date { public: void input(string whatday); // ',' , '/' void output(); // 날짜출력형식 void set(int newMonth, int newDay); // year is not to be defined, month and day should form a possible date void check_match(int newMonth, int newDay); // 예외처리 - if the month and the date doesn't match such as 2/30 or 4/31 int getYear(); // read the private member year int getMonth(); // read month int getDay(); // read day private: int year; int month; int day; }; class Information { public: string whole_info; void input(); void output(); int Age(); private: string department; string id_number; string name; string birthday; int age; string current_date; }; void Date::set(int newMonth, int newDay) // data conditions { if ((newMonth >= 1) && (newMonth <= 12)) month = newMonth; else { cout << "생년월일을 제대로 기입했는지 확인해주세요." << endl; exit(1); } if ((newDay >= 1) && (newDay <= 31)) day = newDay; else { cout << "생년월일을 제대로 기입했는지 확인해주세요." << endl; exit(1); } } void Date::check_match(int newMonth, int newDay) // does the month and date match each other? { // 1/31, 2/28, 3/31, 4/30, 5/31, 6/30, 7/30, 8/31, 9/30, 10/31, 11/30, 12/31 - 2,4,6,7,9,11 // 예외처리 - 윤달 if ((newMonth == 2) && (newDay > 28) || (newMonth == 4) && (newDay > 30) || (newMonth == 6) && (newDay > 30) || (newMonth == 7) && (newDay > 30) || (newMonth == 9) && (newDay > 30) || (newMonth == 11) && (newDay > 30)) { cout << "생년월일을 제대로 기입했는지 확인해주세요." << endl; exit(1); } } void Date::input(string whatday) // parse string into year, month and day { // slash 기준으로 string parsing 후 int로 형변환하고 각각 맞는 private 변수에 저장 string delimiter = "/"; size_t last = 0; size_t next = 0; string token; vector<string> date_token; while ((next = whatday.find(delimiter, last)) != string::npos) { token = whatday.substr(last, next - last); date_token.push_back(token); last = next + 1; } date_token.push_back(whatday.substr(last)); year = stoi(date_token[0]); month = stoi(date_token[1]); day = stoi(date_token[2]); set(month, day); // month, day 가 유효한 값인지 확인 check_match(month, day); // 입력한 날짜가 진짜 정상적인지 확인 } void Date::output() // ~년~월~일 { cout << year << "년" << month << "월" << day << "일"; } int Date::getYear() { return year; } int Date::getMonth() { return month; } int Date::getDay() { return day; } // .... void Information::input() // 예외처리 - 4가지 중 하나라도 입력 안 했을 때. 생년월일이 이상할 때. { cout << "환영합니다! 학과명, 학번, 이름, 생년월일(yyyy/mm/dd)을 입력하세요> "; // 쉼표+공백 때문에 while 돌려서 전체 입력값 저장 string partial_info; while (1) { cin >> partial_info; whole_info.append(partial_info); if (cin.get() == '\n') break; } // 쉼표 기준으로 string parsing 후 각각 맞는 private 변수에 저장 string delimiter = ","; size_t last = 0; size_t next = 0; string token; vector<string> info_token; while ((next = whole_info.find(delimiter, last)) != string::npos) { token = whole_info.substr(last, next - last); info_token.push_back(token); last = next + 1; } info_token.push_back(whole_info.substr(last)); department = info_token[0]; id_number = info_token[1]; name = info_token[2]; birthday = info_token[3]; } int Information::Age() // 만 나이 = 생일 지났으면 (현재년도-출생년도), 생일 안 지났으면 (현재년도-출생년도-1) { Date date; string currentdate = currentDate(); date.input(currentdate); int currentyear = date.getYear(); int currentmonth = date.getMonth(); int currentday = date.getDay(); date.input(birthday); int birthyear = date.getYear(); int birthmonth = date.getMonth(); int birthday = date.getDay(); // 현재 날짜가 생월을 지난 경우 if (currentmonth > birthmonth) age = currentyear - birthyear; // 현재 날짜가 생월인 경우 : 생일이거나 지남 or 생일 전 if (currentmonth == birthmonth && currentday >= birthday) age = currentyear - birthyear; if (currentmonth == birthmonth && currentday < birthday) age = currentyear - birthyear - 1; // 현재 날짜가 생월 이전인 경우 if (currentmonth < birthmonth) age = currentyear - birthyear - 1; return age; } void Information::output() // department, id_number, name, birthday, age, current_date { Date date; date.input(birthday); cout << ">> " << department << " " << id_number << " " << name << "님 "; date.output(); cout << "생 "; date.input(currentDate()); date.output(); cout << " 현재 " << age << "세입니다." << endl; } int main() { Information info; info.input(); if (info.Age() < 0) { cout << "생년월일을 제대로 기입했는지 확인해주세요." << endl; exit(1); } info.output(); }
실행결과

점수 10/10
❤와 댓글은 큰 힘이 됩니다. 감사합니다 :-)
반응형
'archive. > Schoolwork' 카테고리의 다른 글
[C++] 자료구조 3주차 과제3 (0) | 2020.08.05 |
---|---|
[C++] 자료구조 2주차 과제2 (0) | 2020.08.05 |
[C++] 문제해결기법 과제 4: 가장 큰 수 (0) | 2020.08.05 |
[C++] 문제해결기법 과제 3: 칸 채우기 (0) | 2020.08.05 |
[C++] 문제해결기법 과제 2: 포로 수용소 - Convex Hull 응용 (0) | 2020.08.05 |