Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
1

Превратить дату в минуты

10.01.2014, 13:26. Просмотров 505. Ответов 16
Метки нет (Все метки)

Есть дата вот такого типа:
year = 2013
mounth = 10
day = 15
Ее нужно перевести в минуты. В принципе не трудно, но мне не получается..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 13:26
Ответы с готовыми решениями:

Программа, которая переводит часы и минуты в минуты или минуты – в часы и минуты
Составьте программу, которая в зависимости от входных данных переводит ...

Превратить заданную пользователем дату в формате "дд.мм.гг" в формат "месяц дд. год"
Помогите пожалуйста написать программу на рядки. Условие Превратить заданную...

Дана строка, содержащая дату в виде «dd.mm.yyyy». Определить дату через n дней
Что исправить нужно? #include<iostream> #include<string> using namespace...

Ввести одну дату и вывести дату следующего дня
Примеры: 1) Введите дату в программу, и она должна вывести вам дату следующего...

Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату
вот еще одно =) Написать программу, которая предлагает пользователю ввести...

16
MicM
824 / 483 / 324
Регистрация: 29.12.2009
Сообщений: 1,106
Завершенные тесты: 1
10.01.2014, 14:44 2
Цитата Сообщение от Insane__ Посмотреть сообщение
Ее нужно перевести в минуты.
Т.е. сколько минут прошло с начала года до этой даты или сколько минут в 2013 годах, 10 месяцах и 15 дней?
0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 15:02  [ТС] 3
Нужно решить вот такую ​​задачу:

http://www.e-olimp.com/ru/problems/4552

Сначала я перевожу всю дату в минуты, затем нахожу разницу этих дат, и от этой разницы отнимаю по 15 до тех пор пока разница не будет меньше 15. И соответственно сколько раз я отнял столько и "пробъют" часы. Но почему-то мой вариант проходит только два теста, почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <iostream>
 
int getDays( int month, int year )
{
  const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  int result = -1;
 
  if( month < 0 || month > 11 )
    return result;
 
  result = days[ month ];
  if( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ))
    ++result;
 
  return result;
}
 
int main()
{
    unsigned long year1,day1,mounth1,hour1,minute1;
    unsigned long year2,day2,mounth2,hour2,minute2;
    double sum_minute1 = 0,sum_minute2 = 0;
    std::cin >> year1 >> mounth1 >> day1 >> hour1 >> minute1;
    std::cin >> year2 >> mounth2 >> day2 >> hour2 >> minute2;
    sum_minute1 += day1 * 24 * 60;
    sum_minute1 += mounth1 * getDays(mounth1 - 1,year1) * 24 * 60;
    if(year1%4)
        sum_minute1 += year1 * 525600;
    else
        sum_minute1 += year1 * 527040;
    sum_minute1 += minute1 + (hour1*60);
 
    sum_minute2 += day2 * 24 * 60;
    sum_minute2 += mounth2 * getDays(mounth2 - 1,year2) * 24 * 60;
    if(year2%4)
        sum_minute2 += year2 * 525600;
    else
        sum_minute2 += year2 * 527040;
 
    sum_minute2 += minute2 + (hour2*60);
 
    long int minute = sum_minute2 - sum_minute1;
    int count = 0;
    while(minute >= 15){
        count++;
        minute -= 15;
    }
    std::cout << count << std::endl;
    return 0;
}
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.01.2014, 15:28 4
Количество дней, минут можно легко получить используя Boost.Date_Time:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/lexical_cast.hpp>
 
namespace gr = boost::gregorian;
namespace dt = boost::date_time;
 
int main()
{
   gr::date_period period(gr::date(2013, 10, 15), gr::date(dt::day_clock<gr::date>::local_day()));
   int days = boost::lexical_cast<int>(period.length());
   std::cout << "days: " << days << "\n";
   std::cout << "minuts: " << (days * 24 * 60) << "\n";
 
   return 0;
}
0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 15:32  [ТС] 5
DiffEreD, тот вариант не пройдет, так как нужно чтобы эта задача прошла на eolimp.
0
MicM
824 / 483 / 324
Регистрация: 29.12.2009
Сообщений: 1,106
Завершенные тесты: 1
10.01.2014, 16:14 6
Insane__, вот что намудрил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
int main()
{
    unsigned long long year1,day1,mounth1,hour1,minute1;
    unsigned long long year2,day2,mounth2,hour2,minute2;
    cin >> year1 >> mounth1 >> day1 >> hour1 >> minute1;
    cin >> year2 >> mounth2 >> day2 >> hour2 >> minute2;
    int count = 0;
    if (year2 > year1)
    {
        count = (year2 - year1)*35712;
        year1 = year2;
    }
    if (mounth2 > mounth1)
    {
        count+=(mounth2 - mounth1)*2976;
        mounth1 = mounth2;
    }
    if (day2 > day1)
    {
        count+=(day2 - day1)*96;
        day1 = day2;
    }
    if (minute1!=0)
        while (minute1!=15 && minute1!=30 && minute1!=45 && minute1!=60)
            ++minute1;
    while (year1!=year2 || mounth1!=mounth2 || hour1!=hour2 || minute1+15<=minute2)
    {
            ++count;
            if (minute1==60)
            {
                ++hour1;
                minute1 = 0;
                if (hour1==24)
                {
                    hour1==0;
                    ++day1;
                    if (day1==32)
                    {
                        day1 = 1;
                        ++mounth1;
                        if (mounth1==13)
                        {
                            ++year1;
                            mounth1 = 1;
                        }
                    }
                }
            }
            minute1+=15;
    }
    cout <<count <<endl;
    return 0;
}
1
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 16:41 7
Зачем столько вычислений? есть стандартная функция difftime()
http://www.cplusplus.com/reference/ctime/difftime/?kw=difftime
Возвращает время в секундах между двумя датами. Потом просто возьмите остаток от деления на 15.

Не по теме:

Программу не выкладываю, потому что дико глючит терминал и IDE, невозможно что-либо запустить. Я в бешенстве :ireful::ireful::ireful:

1
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 17:32  [ТС] 8
gromo, вот пробую сделать через difftime, но программа почему-то выводит 0 независимо от того какие числа я введу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <iostream>
#include <time.h>
 
//int getDays( int month, int year )
//{
//  const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//  int result = -1;
 
//  if( month < 0 || month > 11 )
//    return result;
 
//  result = days[ month ];
//  if( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ))
//    ++result;
 
//  return result;
//}
 
int main()
{
    unsigned long year1,day1,month1,hour1,minute1;
    unsigned long year2,day2,month2,hour2,minute2;
    double sum_minute1 = 0,sum_minute2 = 0;
    std::cin >> year1 >> month1 >> day1 >> hour1 >> minute1;
    std::cin >> year2 >> month2 >> day2 >> hour2 >> minute2;
 
    time_t now =23;
    struct tm date1;
    struct tm date2;
    double seconds;
    date1.tm_hour = hour1;
    date1.tm_mon = month1;
    date1.tm_year = year1;
    date1.tm_min = minute1;
    date1.tm_mday = day1;
 
    date2.tm_hour = hour2;
    date2.tm_mon = month2;
    date2.tm_year = year2;
    date2.tm_min = minute2;
    date2.tm_mday = day2;
    std::cout << difftime(mktime(&date2),mktime(&date1));
//    sum_minute1 += day1 * 24 * 60;
//    sum_minute1 += mounth1 * getDays(mounth1 - 1,year1) * 24 * 60;
//    if(year1%4)
//        sum_minute1 += year1 * 525600;
//    else
//        sum_minute1 += year1 * 527040;
//    sum_minute1 += minute1 + (hour1*60);
 
//    sum_minute2 += day2 * 24 * 60;
//    sum_minute2 += mounth2 * getDays(mounth2 - 1,year2) * 24 * 60;
//    if(year2%4)
//        sum_minute2 += year2 * 525600;
//    else
//        sum_minute2 += year2 * 527040;
 
//    sum_minute2 += minute2 + (hour2*60);
 
//    long int minute = sum_minute2 - sum_minute1;
//    int count = 0;
//    while(minute >= 15){
//        count++;
//        minute -= 15;
//    }
//    std::cout << count << std::endl;
    return 0;
}
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 19:10 9
Insane__, что-то типа этого
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
    // Здесь всё понятно, я думаю ;D
    unsigned long year1,day1,mounth1,hour1,minute1;
    unsigned long year2,day2,mounth2,hour2,minute2;
    scanf("%lu %lu %lu %lu %lu", &year1,&day1,&mounth1,&hour1,&minute1);
    scanf("%lu %lu %lu %lu %lu", &year2,&day2,&mounth2,&hour2,&minute2);
 
    // Задаем начальное время для функции difftime()
    struct tm begin;
    begin.tm_year = year1 - 1900;  // Года в структуре задаются since 1900
    begin.tm_mday = day1;
    begin.tm_mon  = mounth1 - 1;   // Количество месяцев SINCE january
    begin.tm_hour = hour1;
    begin.tm_min  = minute1;
    begin.tm_sec  = 0;            // секунды не берем во внимание, но они нужны для mktime()
 
    // Задаем конечное время для функции difftime()
    struct tm end;
    end.tm_year = year2 - 1900;
    end.tm_mday = day2;
    end.tm_mon  = mounth2 - 1;
    end.tm_hour = hour2;
    end.tm_min  = minute2;
    end.tm_sec  = 0;
    double diff = difftime(mktime(&end), mktime(&begin));
 
    // Сколько раз ударят часы за этот промежуток?
    div_t divresult = div((int)(diff/60.0), 15);
 
    printf("%d\n", divresult.quot);
    return 0;
}
Добавлено через 9 минут
Как видишь, можно посчитать буквально одной строкой.
0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 19:17  [ТС] 10
Цитата Сообщение от gromo Посмотреть сообщение
Как видишь, можно посчитать буквально одной строкой.
Посчитать можно, но какой будет результат? Программа проходит только два теста, у всех остальных неправильный ответ.
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 19:28 11
Цитата Сообщение от Insane__ Посмотреть сообщение
Посчитать можно, но какой будет результат? Программа проходит только два теста, у всех остальных неправильный ответ.
Какие там тесты ? скинь сюда
0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 19:31  [ТС] 12
В том и прикол, тесты хз какие, просто выводить вот такое:

Результат по тестам:
1. Засчитано 2. Неверный ответ 3. Неверный ответ 4. Неверный ответ 5. Засчитано 6. Неверный ответ 7. Неверный ответ 8. Неверный ответ 9. Неверный ответ 10. Неверный ответ 11. Неверный ответ 12. Неверный ответ 13. Неверный ответ 14. Неверный ответ 15. Неверный ответ 16. Неверный ответ 17. Неверный ответ 18. Неверный ответ 19. Неверный ответ 20. Неверный ответ 21. Неверный ответ 22. Неверный ответ 23. Неверный ответ 24. Неверный ответ 25. Неверный ответ 26. Неверный ответ 27. Неверный ответ 28. Неверный ответ 29. Неверный ответ 30. Неверный ответ
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 19:40 13
Цитата Сообщение от Insane__ Посмотреть сообщение
В том и прикол, тесты хз какие, просто выводить вот такое:
Не знаю, что они там хотят, но программа учитывает и високосные года (например между 28 февраля и 1 марта 2016 года пройдет двое суток - результат 192 удара).
Может там проблема во вводе данных? Хз какими кусками оно там на их "тестере" считывает.

Не по теме:

P.s. Лично я никогда не понимал "спортивного" программирования, стремное оно какое-то...

0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 20:02  [ТС] 14
Цитата Сообщение от gromo Посмотреть сообщение
Может там проблема во вводе данных?
Уже по разному пробовал вводить, пробовал менять тип результата, ничего не помогло! Буду дальше думать
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 20:17 15
Попробуй так.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
    // Здесь всё понятно, я думаю ;D
    unsigned long year1,day1,mounth1,hour1,minute1;
    unsigned long year2,day2,mounth2,hour2,minute2;
    scanf("%lu %lu %lu %lu %lu", &year1,&mounth1,&day1,&hour1,&minute1);
    scanf("%lu %lu %lu %lu %lu", &year2,&mounth2,&day2,&hour2,&minute2);
 
    // Задаем начальное время для функции difftime()
    struct tm begin;
    begin.tm_year = year1 - 1900;  // Года в структуре задаются since 1900
    begin.tm_mday = day1;
    begin.tm_mon  = mounth1 - 1;   // Количество месяцев SINCE january
    begin.tm_hour = hour1;
    begin.tm_min  = minute1;
    begin.tm_sec  = 0;            // секунды не берем во внимание, но они нужны для mktime()
 
    // Задаем конечное время для функции difftime()
    struct tm end;
    end.tm_year = year2 - 1900;
    end.tm_mday = day2;
    end.tm_mon  = mounth2 - 1;
    end.tm_hour = hour2;
    end.tm_min  = minute2;
    end.tm_sec  = 0;
    double diff = difftime(mktime(&end), mktime(&begin));
 
    // Сколько раз ударят часы за этот промежуток?
    div_t divresult = div((int)(diff/60.0), 15);
 
    printf("%d\n", divresult.quot);
    return 0;
}
0
Insane__
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
10.01.2014, 20:27  [ТС] 16
Все равно то же.
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
10.01.2014, 20:43 17
Цитата Сообщение от Insane__ Посмотреть сообщение
Все равно то же.
В первом варианте из-за моей невнимательности в переменную дня считывались месяцы и наоборот. Теперь поменял местами и все равно так же? Ясненько...
0
10.01.2014, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2014, 20:43

Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату
Написать программу, которая предлагает пользователю ввести дату в формате YYYY...

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

Превратить одномерный массив в двумерный
Превратить заданный одномерный массив в двухмерный, определив для этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru