Как добавить вариант с проверкой на високосный год в феврале?
Делаю задачку по классу Person и никак не могу понять как впихнуть туда вариант с проверкой на високосный год в феврале(типа 28-29 день). Помогите, пожалуйста. Код прикрепляю:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Date {
private:
int day;
int month;
int year;
/*bool isLeapYear(int y){
return (y % 400 != 0 && y % 4 != 0 || y % 100 == 0); //(y % 400 == 0 || y % 4 == 0 && y % 100 != 0);
}*/
bool IsValid(int d, int m, int y) {
if ( d <= 0 || d > 31) {
throw invalid_argument("Day is invalid.");
}
else if (m > 12 || m < 1) {
throw invalid_argument("Month is invalid.");
}
else if (y < 0) {
throw invalid_argument("Year is invalid.");
}
if(m == 2){
if(d > 29){
throw invalid_argument("Day is invalid.");
}
}
else if(m == 2 && (y%400 == 0 && y % 4 == 0 || y % 100 != 0)){
throw invalid_argument("Day is invalid.");
}
return 1;
}
public:
Date() {}
Date(int d, int m, int y) { //конструктор
if (IsValid(d, m, y)) {
day = d;
month = m;
year = y;
}
}
};
vector<string> CutIntoWords(string s) { //Делит строку на слова через пробел.
vector<string> result;
string buffer = "";
for(int i=0; i < s.size(); i++){
if(s[i] != ' '){
buffer += s[i];
}
else{
result.push_back(buffer);
buffer = "";
}
}
if (buffer != "") {
result.push_back(buffer);
}
return result;
}
class Person {
private:
string fullName; // ФИО
Date birthday; // Дата рождения
int height; // рост
int weight; // вес
string gender; // пол
bool IsValid(string name, Date b, int h, int w, string g) {
if ( h <= 0 || h > 400) {
throw invalid_argument("Height is invalid.");
}
else if (w > 500 || w < 0) {
throw invalid_argument("Weight is invalid.");
}
return 1;
}
public:
Person() { // конструктор по умолчанию
fullName = "Dmitriy Andreevich";
birthday = Date(07,07,2007);
height = 158;
weight = 89;
gender = "male";
}
Person(string name, Date b, int h, int w, string g) { // конструктор
if (IsValid(name, b, h, w, g)) {
fullName = name;
birthday = b;
height = h;
weight = w;
gender = g;
}
}
void ChangeWeight(double percentage) { // метод изменения веса
weight += (percentage*weight/100);
}
bool HasTwoWords() const {
vector<string> words = CutIntoWords(fullName);
return words.size() == 2;
}
string getInfo() const {
return "His name is " + fullName + ", his gender is " + gender + "\n" + "His weight is " + to_string(weight) + ".\n";
}
bool IsFat() const {
return weight > 50;
}
bool HasPatronymic() const {vector<string> words = CutIntoWords(fullName);
return words.size() == 3;
}
};
ostream &operator << (ostream &stream, Person p) {
return stream << p.getInfo();
}
int main()
{
Date d;
try
{
d = Date(29, 02, 1960);
}
catch (exception& e)
{
cerr << e.what() <<endl;
return 0;
}
Person c;
try
{
c = Person("Petr Alekseevich", d, 186, 54, "male");
}
catch (exception& e)
{
cerr << e.what() <<endl;
return 0;
}
cout << c;
cout << "Has Two words in name: " << c.HasTwoWords() <<endl;
c.ChangeWeight(20);
cout << c;
cout << "Weight is more than 50: " << c.IsFat() <<endl;
cout << "Has Patronymic: " << c.HasPatronymic() <<endl;
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Закомментированный комментарий :) у вас верен
bool is_leap(int year)
{
return (year%400==0) || ((year%4==0)&&(year%100!=0));
}
Лишние скобки поставил преднамеренно, для большей ясности :)
Ну, или самую чуточку более быстрый из-за сокращенного вычисления вариант:
bool is_leap(int year)
{
return (year%4==0)&&(year%400==0 || year%100!=0);
}