Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 30.10.2020, 21:31   #1
RaizeN33
Новичок
Джуниор
 
Регистрация: 30.10.2020
Сообщений: 1
По умолчанию С++ Доделать задачу

Создать класс Date для работы с датами в формате "год.месяц.день". Дата представляется структурой с тремя полями типа unsigned int: для года, месяца и дня. Класс должен включать не менее трех функций инициализации: числами, строкой вида "год.месяц.день" (например, "2004.08.31") и датой. Обязательными операциями являются: вычисление даты через заданное количество дней, вычитание заданного количества дней из даты, определение високосности года, присвоение и получение отдельных частей (год, месяц, день), сравнение дат (равно, до, после), вычисление количества дней между датами.

Есть код, но задача в том, чтобы при вводе пользователя целого числа (например 12102002) это число воспринималось как дата и всё вычислялось.

main.cpp:
Код:
#include <iostream>
#include "Date.h"
using namespace std;
int main()
 
{
 
     setlocale( LC_ALL,"Russian" );
    Date n1(20,12, 2018),n2;
    cout << "Введите день, месяц и год, которые хотите назначить" << endl;
    cin >> n2;
    cout << "Дата строкой: ";
    string S;
    cin >> S;
 
    if(n2.check()){
        cout << "error";
    }
    else{
    cout << n1<< endl;
    cout << n2<< endl;
 
    cout << "Дата по прошествии указанного количества дней:" << n1.after_a_specified_number_of_days(10) << endl;
    cout << "Дата после вычитания:" << n1.subtraction_of_a_specified_number_of_days(11) << endl;
    n2.leap_year();
 
 
    cout << "Дни между датами:" << n1.calculating_the_number_of_days_between_dates(n2);
 
    n1.date_comparison(n2);
    }
}
Date.h:
Код:
#ifndef DATE_H
#define DATE_H
#include <iostream>
class Date
{
    friend std::ostream& operator<<(std::ostream&,const Date&);
    friend std::istream& operator>>(std::istream&, Date&);
public:
    static std::string to_string_int(int );
    std::string to_string() const;
    Date();
    Date(int ,int ,int );
    Date(Date const & ) ;
 
    int after_a_specified_number_of_days(int);
    int subtraction_of_a_specified_number_of_days(int);
    void leap_year();
    Date assignment_of_individual_parts(Date d2);
    void date_comparison(Date d2);
    int calculating_the_number_of_days_between_dates(Date d2);
    bool check();
 
private:
    int Year;
    int Day;
    int Month;
};
 
 
#endif //DATE_H
Date.cpp:
Код:
#include "Date.h"
using namespace std;
 
bool Date::check(){
return  Day > 31 || Day < 0 || Month > 12 || Month < 0 || Year < 0;}
Date::Date():Year(2018),Month(1),Day(1){}
Date::Date(int d,int m,int y) :Year(y), Month(m), Day(d) {}
Date::Date(Date const & other) :Year(other.Year), Month(other.Month), Day(other.Day) {}
 
 
std::string  Date::to_string_int(int x) {
    char str_rub [11];
    return std::string(itoa(x,str_rub,10 ));
}
std::string Date::to_string() const {
    return to_string_int(Day) + '/' + to_string_int(Month) + '/' + to_string_int(Year);
}
 
std::ostream& operator<<(std::ostream& out,const Date& date){
    out  << date.to_string();
    return out;
};
std::istream& operator>>(std::istream& in, Date& date){
    char t='.';
    in >>  date.Day >> t >> date.Month >> t >> date.Year;
 
    return in;
};
 
int Date::after_a_specified_number_of_days(int d2)
{
    return(Day + d2);
}
int Date::subtraction_of_a_specified_number_of_days(int d2)
{
    return(Day - d2);
}
 
void Date::leap_year()
{
    if(Year / 4 == 0)
    {
        cout << "Год високосный"<< endl;
    }else
    {
        cout<< "Год не високосный"<< endl;
    }
 
}
Date Date::assignment_of_individual_parts(Date d2)
{
return Date(d2.Day, d2.Month, d2.Year);
}
void Date::date_comparison(Date d2)
{
    int D = Day;
    int D2 = d2.Day;
    if(D < D2 && Month<=d2.Month && Year<=d2.Year)
    {
        cout << "Первая Дата больше чем вторая" << endl;
    }else
    if (D > D2 && Month >= d2.Month && Year >= d2.Year)
    {
        cout << "Первая дата меньше второй" << endl;
    }
    else
    {
        cout << "Первая дата равна второй" << endl;
    }
}
int Date::calculating_the_number_of_days_between_dates(Date d2)
{
    return Day - d2.Day+(Month - d2.Month)*30+((Year - d2.Year)*365);
}
RaizeN33 вне форума Ответить с цитированием
Старый 30.10.2020, 22:00   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,749
По умолчанию

Про распознавание числа как даты не подскажу. А замечания по остальному коду: check грубоват - для февраля будет пропускать 30 и 31 числа, високосность года определяется чуть сложнее (делимости на 4 мало), сравнение дат не совсем верное (день может быть больше, а год меньше, тогда дата все равно меньше, т.е., думаю, подразумевается сравнение по календарю, а не просто какая тройка чисел больше), при добавлении или удалении дней должны меняться все три поля (Year, Day, Month), расчет количества дней между датами грубоват (не учитывается високосность и разное количество дней в месяцах).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.10.2020 в 22:03.
BDA вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доделать задачу! Snezhok2101 Фриланс 5 26.12.2013 22:14
не могу доделать задачу HalvaForever Паскаль, Turbo Pascal, PascalABC.NET 20 18.03.2013 10:11
доделать задачу Sylar9 Общие вопросы C/C++ 0 06.05.2012 10:48
Не могу доделать задачу X-REY Паскаль, Turbo Pascal, PascalABC.NET 1 25.10.2011 19:50


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS