Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить количество рабочих дней между 2мя датами 
V
    Опции темы
ioManip
  Дата 3.6.2013, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Приветствую! Вообщем задача стоит такая: Вычислить количество рабочих дней между 2 мя указаными датами.
Вообщем то пока, готово только общее количество дней без отсеивания ненужных. На праздниках и прочих условиях не будем пока останавливаться, я лишь прошу помочь мне с отсеиванием Выходных(суббота - рабочий день).

В WorkDays реализованно нах - е общего кол - ва дней.
FDay - первоначальная дата
LDay - последняя дата
Код

#include <iostream>
#include <stdlib.h>

using namespace std;

class Date
{
  public:
    Date() {}
    Date(int, int, int);
    int GetDay()     {return day;}
    int GetMonth()   {return month;}
    int GetYear()    {return year;}
    void SetDate(int, int, int);
    void InitDate();
    void PrintDate();
    void LeapYear();
    void CalcAge();
    void WorkDays();
    
  private:
    int day;
    int month;
    int year;
    void SetDay(int userDay)     {day = userDay;}
    void SetMonth(int userMonth) {month = userMonth;}
    void SetYear(int userYear)   {year = userYear;}
};

Date::Date(int uDay, int uMonth, int uYear)
{
    day = uDay;
    month = uMonth;
    year = uYear;    
}

void Date::SetDate(int uDay, int uMonth, int uYear)
{
    Date::SetDay(uDay);
    Date::SetMonth(uMonth);
    Date::SetYear(uYear);
}

void Date::InitDate()
{
    cout << "Введите день: ";
    cin >> day;
    
    if ( (day >= 1) && (day <= 31) )
    {
        Date::SetDay(day);
    }
    else
    {
        cout << "Некорректный ввод, попробуйте еще раз!" << endl;
        Date::InitDate();
    }
    
    cout << "Введите месяц: ";
    cin >> month;
    
    if ( (month >=1) && (month <=12) )
    {
        Date::SetMonth(month);
    }
    else
    {
        cout << "Неккоректный ввод, попробуйте еще раз!" << endl;
        Date::InitDate();
    }
    
    cout << "Введите год: ";
    cin >> year;
  
    if ( year > 0 )
    {
        Date::SetYear(year);
    }
    else
    {
        cout << "Некорректный ввод, попробуйте еще раз!" << endl;
        Date::InitDate();
    }
}

void Date::PrintDate()
{
    cout << endl;
    cout << "Ваша дата: ";
    cout << Date::GetDay() << "." << Date::GetMonth() << "." << Date::GetYear() << endl;
}

void Date::LeapYear()
{   
    if ( (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) )
        cout << "Данный год является високосным" << endl;
    else
        cout << "Данный год не является високосным" << endl;
}
   
void Date::CalcAge()
{
    int yearBirth;
    int result;
    
    cout << "Введите год Вашего рождения: ";
    cin >> yearBirth;
    
    if ( year < yearBirth )
        result = yearBirth - year;
    else
        result = year - yearBirth;
    
    cout << "Ваш возраст: " << result << endl;   
}

void Date::WorkDays()
{
    Date FDay;
    Date LDay;
    
    FDay.InitDate();
    cout << endl;
    LDay.InitDate();
    
    int result;
    
    if (FDay.GetYear() > LDay.GetYear() )
    {
        result = (FDay.GetDay() - LDay.GetDay()) + 30 * (FDay.GetMonth() - LDay.GetMonth()) + 
                  365 * (FDay.GetYear() - LDay.GetYear());
    }
    else
    {
        if (FDay.GetYear() == LDay.GetYear())
        {
            if (FDay.GetMonth() > LDay.GetMonth())
            {
                result = ((FDay.GetDay() - LDay.GetDay()) + 30 * (FDay.GetMonth() - LDay.GetMonth()));           
            }
            else
            {
                if (FDay.GetMonth() == LDay.GetMonth())
                {
                    if (FDay.GetDay() > LDay.GetDay())
                    {
                        result = ((FDay.GetDay() - LDay.GetDay()));
                    }
                    else
                    {
                        result = ((LDay.GetDay() - FDay.GetDay()));
                    }
                }
                result = ((LDay.GetDay() - FDay.GetDay()) + 30 * (LDay.GetMonth() - FDay.GetMonth()));
            }
        }
        result = ((LDay.GetDay() - FDay.GetDay()) + 30 * (LDay.GetMonth() - FDay.GetMonth()) + 
                   365 * (LDay.GetYear() - FDay.GetYear()));
    }
    
    cout << endl;
    cout << "Всего дней: " << result << endl;
}

int main()
{
    Date uDate;
    
//    uDate.InitDate();
//    uDate.PrintDate();
//    uDate.LeapYear();
//    uDate.CalcAge();
    uDate.WorkDays();

    return 0;
}


Если у Вас есть мысли, поделитесь пожалуйста! 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 3.6.2013, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  3.6.2013,  12:33 Найти цитируемый пост)
        result = (FDay.GetDay() - LDay.GetDay()) + 30 * (FDay.GetMonth() - LDay.GetMonth()) + 
                  365 * (FDay.GetYear() - LDay.GetYear());

Неверно же. В месяце не обязательно 30 дней, а в году - 365...

Добавлено через 7 минут и 58 секунд
Не вижу, где вычитаются воскресения...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 4.6.2013, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Цитата(feodorv @  3.6.2013,  11:54 Найти цитируемый пост)
Неверно же. В месяце не обязательно 30 дней, а в году - 365...

Я обязательно это учту smile , но только не сейчас.

Цитата(feodorv @  3.6.2013,  11:54 Найти цитируемый пост)
Не вижу, где вычитаются воскресения... 

А вот с этим я и просил помочь..

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
math64
Дата 4.6.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(ioManip @  3.6.2013,  11:33 Найти цитируемый пост)
Код

result = (FDay.GetDay() - LDay.GetDay()) + 30 * (FDay.GetMonth() - LDay.GetMonth()) + 
                  365 * (FDay.GetYear() - LDay.GetYear());

Это вычисление числа дней, прошедших между двумя датами, неправильное с учётом замечания feodorv.
Вместо этого нужно написать метод, вычисляющий число дней от начальной даты, учитывая это замечание и выбирая в качастве начальной даты воскресенье понедельник.
Тогда
Код

int Date::GetWorkDays() {
int days = GetDays();
int weeks = days / 7;
int daysInLastWeek = days % 7;
int workDaysInLastWeek = daysInLastWeek >= 5 ? 5 : daysInLastWeek;
int workDays = weeks*5 + workDaysInLastWeek;
return workDays;
}

Для определения числа рабочих дней между двумя датами нужно сделать вычитание:
Код

date1.GetWorkDays() - date2.GetWorkDays();

PS: А, суббота рабочий день? тогда 5 меняем на 6

Это сообщение отредактировал(а) math64 - 6.6.2013, 07:54
PM   Вверх
math64
Дата 6.6.2013, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Насчёт праздников, то примерно так:
Код

class Holyday : public Date {
public:
   ...
   // Вычисление сколько данный праздник встречается между двумя датами
   int GetHolydaysBetween(const Date& date1, const Date& date2) const;
   // Вычисление сколько праздников встречается между двумя датами
   static GetHolydaysBetween(const Date& date1, const Date& date2, const list<Holyday>& holydays) {
      int result = 0;
      for(Holyday holyday : holydays) {
         result += GetHolydaysBetween(date1, date2);
      }
      return result;
   }
};

PM   Вверх
ioManip
Дата 8.6.2013, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



math64, 
feodorv,  Большое Вам спасибо!  smile 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.