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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> время между двумя датами 
:(
    Опции темы
Azart11
Дата 30.9.2012, 13:49 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.9.2012

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



Помогите плиз...
Разработать программу, определяющую число часов, прошедших между двумя датами, введенными пользователем. Идей нет)

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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Это приказ?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
NoviceF
Дата 30.9.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Данкинг @ 30.9.2012,  14:16)
Это приказ?

 smile 

 smile

Добавлено через 54 секунды
Цитата(Azart11 @ 30.9.2012,  13:49)
Разработать программу, определяющую число часов, прошедших между двумя датами, введенными пользователем.

А в каком формате будет дата вводиться?
PM MAIL   Вверх
tzirechnoy
Дата 30.9.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: -1
Всего: 16



Это методы внушэния...
PM MAIL   Вверх
mes
Дата 30.9.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Azart11,  опoздали, уже разработано : http://www.boost.org/doc/libs/1_51_0/doc/html/date_time.html smile  smile  smile 

Это сообщение отредактировал(а) mes - 30.9.2012, 16:03


--------------------
PM MAIL WWW   Вверх
feodorv
Дата 30.9.2012, 16:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Данкинг @  30.9.2012,  15:16 Найти цитируемый пост)
Это приказ? 

 smile 
Как-то всё больше и больше замечаю, что народ утрачивает культуру общения.  smile 


Цитата(Azart11 @  30.9.2012,  14:49 Найти цитируемый пост)
определяющую число часов, прошедших между двумя датами

Весьма не мешает уточнить условие задачи. Нужно считать самому или можно положиться на машину? Если последнее, то можно просто перевести даты в формат UTC time_t или FILETIME/ULARGE_INTEGER, потом вычесть из одного значения другое и разделить на число секунд или 100-наносекунд в часе. И всё. Если же первое, то нужно будет не забыть принять во внимание високосность того или иного года.


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


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(feodorv @  30.9.2012,  17:34 Найти цитируемый пост)
Как-то всё больше и больше замечаю, что народ утрачивает культуру общения. 

У Azart11, и прошлая тема примерно такая же по стилю общения.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
mes
Дата 30.9.2012, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Azart11)

http://forum.vingrad.ru/forum/topic-356937.html
скинь мне плиз в сообщение программу в той ссылке которую кинул...не нашел там

чего тут не найти ? http://www.boost.org/doc/libs/1_51_0/doc/h...e_time.examples

выбирай на вкус и допиливай под нужды.. 

Это сообщение отредактировал(а) mes - 30.9.2012, 19:09


--------------------
PM MAIL WWW   Вверх
Azart11
Дата 3.10.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.9.2012

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



Код

#include<iostream.h>
#include<conio.h>
int v(int year,int mes,int day)
{int mm[]={31,28,31,30,31,30,31,31,30,31,30,31};
if ((year/4)&&(!(year/100)||(year/400)))
{mm[1]=29;
year=year*366;}
else year=year*365;
int i=0;
int sm=0;
while (i<mes)
{sm=sm+mm[i];
i=i+1;}
int res=(year+sm+day)*24;
return res;
}

int main()
{
clrscr();
char s;
int day1,mes1,year1,day2,mes2,year2;
cout<<"vvedite pervuy datu:";
cin>>day1>>s>>mes1>>s>>year1;
cout<<"vvedite vtoruy datu:";
cin>>day2>>s>>mes2>>s>>year2;
int ch1,ch2;
ch1=v(day1,mes1,year1);
ch2=v(day2,mes2,year2);
int raz=ch1-ch2;
cout<<"interval "<<raz<<"chasov";
getch();
return 0;
}

Вот моя программа работает не правильно... скажите пожалуйста как исправить...
PM MAIL   Вверх
bsa
Дата 3.10.2012, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



сначала заполняешь struct tm, затем вызываешь mktime() и получаешь time_t. Это делаешь для двух дат. С помощью difftime() делаешь вычитание и получаешь количество секунд. Наконец, делишь полученное число на 3600 и на выходе у тебя количество часов.
PM   Вверх
feodorv
Дата 3.10.2012, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Azart11, направление мысли - правильное  smile 
Считаем число часов от сотворения мира начала времён, а потом смотрим разницу.
Но всё нужно делать аккуратно. Разбейте задачу на две подзадачи - подсчёт числа дней до начата текущего года и подсчёт числа часов с начала текущего года. 

Первая подзадача требует учёта високосных лет. В лоб подзадача может быть решена так:
Код

int dayCount = 0;
for( int y = 1; y < year; y++)
{
  dayCount += 365;
  if( (y/4)&&(!(y/100)||(y/400)) ) dayCount++;
}

(на самом деле цикл не нужен, можно всё вычислить сразу, но это будет домашним заданием smile ) Отсчёт идёт от 1, а не от 0 (0-го года как такового нет, но это не принципиально, поскольку потом будем брать разницу подсчитанных значений).

Вторую подзадачу можно решить аналогичным подсчётом числа дней, прошедших с начала года:
Код

int mm[]={31,28,31,30,31,30,31,31,30,31,30,31};
for( int m = 1; m < month; m++) // отсчитываем от 1: 1 - Январь, 2 - Февраль и т.д.
  dayCount += mm[m-1];
if( month >= 3 && (year/4)&&(!(year/100)||(year/400)) ) dayCount++; // А вдруг year - високосный?

(тут тоже цикла можно избежать, если ввести массив не числа дней в месяце, а массив числа дней, прошедших с начала года, для данного месяца.)

Окончательный подсчёт:
Код

res = dayCount * 24 + hour;



А что у Вас?
  • Цитата(Azart11 @  3.10.2012,  17:27 Найти цитируемый пост)
    if ((year/4)&&(!(year/100)||(year/400)))
    {mm[1]=29;

    Теперь Февраль будет состоять всегда из 29 дней)))
  • Не ведётся подсчёт прошлых високосных годов (например, между 2002 и 2006 годом нужно учесть один високосный год)
  • Цитата(Azart11 @  3.10.2012,  17:27 Найти цитируемый пост)
    year=year*366;}

    Все прошлые года объявлены високосными! Разница в числе дней между 2003 и концом 2004 года будет не единица, а аж 2004 дня. За что?
  • Дальше копать не стал, поэтому что-то мог упустить ;)

Добавлено через 1 минуту и 49 секунд
Ну, или если ручной подсчёт необязателен, и можно положиться на машину, то 
Цитата(bsa @  3.10.2012,  17:54 Найти цитируемый пост)
сначала заполняешь struct tm, затем вызываешь mktime() и получаешь time_t. Это делаешь для двух дат. С помощью difftime() делаешь вычитание и получаешь количество секунд. Наконец, делишь полученное число на 3600 и на выходе у тебя количество часов. 




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


Эксперт
****


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

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



Походу оказалось, что неправильно определяется високосный год:
Код

#include<iostream>
using namespace std;

int isLeakYear( int year )
{
  return ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) ? 1 : 0;
}

int v( int day, int mes, int year)
{
  int sumday = 0;

  for( int y = 1; y < year; y++)
  {
    sumday += 365;
    if( isLeakYear(y) ) sumday++;
  }

  int mm[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  for( int m = 1; m < mes; m++) sumday += mm[m-1];
  if( mes>= 3 && isLeakYear(year) ) sumday++;

  return (sumday+day-1)*24;
}

int main()
{
  char s;
  int day1, mes1, year1, day2, mes2, year2;

  cout << "vvedite pervuy datu:";
  cin >> day1 >> s >> mes1 >> s >> year1;

  cout << "vvedite vtoruy datu:";
  cin >> day2 >> s >> mes2 >> s >> year2;

  int ch1, ch2;
  ch1 = v( day1, mes1, year1);
  ch2 = v( day2, mes2, year2);

  int raz = ch1-ch2;
  cout << "interval " << raz << "chasov";

  return 0;
}



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(feodorv @  6.10.2012,  14:58 Найти цитируемый пост)
Походу оказалось, что неправильно определяется високосный год:
...
int isLeakYear( int year )

Это не 'високосный год', это скорее всего что то к WikiLeak относящееся  smile Високосный будет isLeapYear

PM MAIL   Вверх
feodorv
Дата 8.10.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  8.10.2012,  10:25 Найти цитируемый пост)
Это не 'високосный год', это скорее всего что то к WikiLeak относящееся  smile Високосный будет isLeapYear

Точно! Не заметил)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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