Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101

Операции со временем

25.06.2016, 04:57. Показов 3115. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, хотел бы узнать на счет времени и операций с ними.
Есть задание, часть которого связана со временем, а именно: необходимо заполнять структуру:
C++
1
2
3
4
5
6
struct train
{
string name;
string date; // Пример - 02.02.2007
string time; // Пример - 22:30 (минуты:секунды)
}
А далее вывести самый быстрый поезд и вывести структуру по признаку: по лучшему времени(сначала самый быстрый поезд, затем медленнее .. самый медленный), а так же по дате, а именно(самая старая запись, затем новее .. самая новая).
Прошу помощи, как можно именно работать со сравнением в виде даты и времени, а так же выводом по признаку. Знаю, что время можно перевести в секунды и сравнивать, но есть ли другой способ? А как же сравнивать по дате?
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
#include <fstream>
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
struct train
{
    string name;
    string date; // Пример - 02.02.2007
    string time; // Пример - 22:30 (минуты:секунды)
};
 
int cr() // считаем кол-во поездов в файле.
{
    char c;
    int n = 0;
    ifstream fin("file1.txt");
    while (!fin.eof())
    {
        if (fin.get() == '\n')
            n++;
    }
    fin.close();
    return n;
}
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    //---------------------- ВВОД
    ofstream fout("file1.txt", ios::app);
    cout << "Сколько записей добавить? ";
    int n; cin >> n;
    train *trn1 = new train[n];
    for (int i = 0; i < n; i++)
    {
        cout << endl;
        cout << "Название поезда: "; cin >> trn1[i].name;
        cout << "Введите дату: "; cin >> trn1[i].date;
        cout << "Введите время: "; cin >> trn1[i].time;
        fout << trn1[i].name << " " << trn1[i].date << " " << trn1[i].time << "\n";
        cout << endl;
    }
    fout.close();
    delete[] trn1;
    system("cls");
    //---------------------- ВЫВОД
    int n2 = cr();
    cout << "n2=" << n2 << endl;
    train *trn = new train[n2];
    ifstream fin("file1.txt");
    for (int i = 0; i < n2; i++)
    {
        fin >> trn[i].name >> trn[i].date >> trn[i].time;
        cout << "Название: " << trn[i].name << ".\nДата - " << trn[i].date << ".\nВремя - " << trn[i].time << "." << endl;
    }
    fin.close();
    //------------------------- Вывод сортировкой по времени(сначала быстрые, потом медленные)
    //------------------------- Вывод сортировкой по дате(сначала старые, потом новые)
    //------------------------- Вывод лучшего результата
    delete[] trn;
    _getch();
}
Благодарю ответивших!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2016, 04:57
Ответы с готовыми решениями:

Операции со временем
Здравствуйте. Прошу помочь в решении задачи: Время задается в формате час.минута.секунда. Реализовать следующие операции (учесть...

Перегрузить операции сравнения комплексных чисел и операции потокового вывода
Создать класс комплексное число. Перегрузить операции сравнения комплексных чисел! =, ==,&gt;, &lt;,&gt; =, &lt;= И операции потокового...

Операции со временем
Привет. Мне нужно два времени, то есть чтобы было две разных задержки времени: на одной у меня игрок перемещается и ему нужна минимальная...

16
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.06.2016, 08:12
Если нужно только сравнивать на больше/меньше, то время можно использовать как есть - сравнивать строки, а дату нужно предварительно преобразовывать либо в число, либо в строку вида ГГГГ.ММ.ДД.
0
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
25.06.2016, 14:21  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Если нужно только сравнивать на больше/меньше, то время можно использовать как есть - сравнивать строки, а дату нужно предварительно преобразовывать либо в число, либо в строку вида ГГГГ.ММ.ДД.
Сделал по вашему предложению и вот что получилось:
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <fstream>
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
struct train
{
    string name;
    string date; // Пример - 02.02.2007
    string time; // Пример - 22:30 (минуты:секунды)
};
 
int cr() // считаем кол-во поездов в файле.
{
    int n = 0;
    ifstream fin("file1.txt");
    while (!fin.eof())
    {
        if (fin.get() == '\n')
            n++;
    }
    fin.close();
    return n;
}
 
inline void menu()
{
    cout << "\tМеню" << endl
        << "1. Добавить поезд" << endl
        << "2. Список поездов" << endl
        << "3. Сортировка по времени" << endl
        << "4. Сортировка по дате" << endl
        << "5. Самый быстрый поезд" << endl
        << "0. Выход" << endl;
}
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    //---------------------- ВВОД
    while (TRUE)
    {
        system("cls");
        menu();
        int j = _getch();
        switch (j)
        {
        case 49:
        {
            system("cls");
            ofstream fout("file1.txt", ios::app);
            cout << "Сколько записей добавить? ";
            int n; cin >> n;
            system("cls");
            train *trn1 = new train[n];
            for (int i = 0; i < n; i++)
            {
                cout << endl;
                cout << "Название поезда: "; cin >> trn1[i].name;
                cout << "Введите дату: "; cin >> trn1[i].date;
                cout << "Введите время: "; cin >> trn1[i].time;
                fout << trn1[i].name << " " << trn1[i].date << " " << trn1[i].time << "\n";
                cout << endl;
            }
            fout.close();
            delete[] trn1;
            system("cls");
            break;
        }
        //---------------------- ВЫВОД
        case 50:
        {
            system("cls");
            int n2 = cr();
            cout << "Количество поездов: " << n2 << endl;
            train *trn = new train[n2];
            ifstream fin("file1.txt");
            for (int i = 0; i < n2; i++)
            {
                fin >> trn[i].name >> trn[i].date >> trn[i].time;
                cout  << trn[i].name << ".\t\tДата - " << trn[i].date << ".\tВремя - " << trn[i].time << "." << endl;
            }
            fin.close();
            delete[] trn;
            _getch();
            break;
        }
        case 51:
        {
            system("cls");
            //------------------------- Вывод сортировкой по времени(сначала быстрые, потом медленные)
            int tt = cr();
            train *ttime = new train[tt];
            ifstream fin2("file1.txt");
            train help;
            for (int i = 0; i < tt; i++)
            {
                fin2 >> ttime[i].name >> ttime[i].date >> ttime[i].time;
            }
            for (int i = 0; i <= tt; i++)
            {
                for (int j = tt - 1; j > i; j--)
                {
                    if (ttime[j].time < ttime[j - 1].time)
                    {
                        help = ttime[j];
                        ttime[j] = ttime[j - 1];
                        ttime[j - 1] = help;
                    }
                }
            }
            for (int i = 0; i < tt; i++)
            {
                cout << ttime[i].name << ".\t\tДата - " << ttime[i].date << ".\tВремя - " << ttime[i].time << "." << endl;
            }
            _getch();
            delete[] ttime;
            fin2.close();
            break;
        }
 
        //------------------------- Вывод сортировкой по дате(сначала старые, потом новые)
        case 52:
        {
            system("cls");
            int td = cr();
            train *tdate = new train[td];
            train help;
            ifstream fin5("file1.txt");
            for (int i = 0; i < td; i++)
            {
                fin5 >> tdate[i].name >> tdate[i].date >> tdate[i].time;
            }
            for (int i = 0; i <= td; i++)
            {
                for (int j = td - 1; j > i; j--)
                {
                    if (tdate[j].date < tdate[j - 1].date)
                    {
                        help = tdate[j];
                        tdate[j] = tdate[j - 1];
                        tdate[j - 1] = help;
                    }
                }
            }
            for (int i = 0; i < td; i++)
            {
                cout << tdate[i].name << ".\t\tДата - " << tdate[i].date << ".\tВремя - " << tdate[i].time << "." << endl;
            }
            _getch();
            delete[] tdate;
            break;
        }
        //------------------------- Вывод лучшего результата
        case 53:
        {
            system("cls");
            int bt = cr();
            train *br = new train[bt];
            ifstream fin4("file1.txt");
            for (int i = 0; i < bt; i++)
            {
                fin4 >> br[i].name >> br[i].date >> br[i].time;
            }
            string best = br[0].time;
            {
                for (int i = 0; i < bt; i++)
                {
                    if (best > br[i].time)
                    {
                        best = br[i].time;
                    }
                }
            }
            cout << "Лучшее время - " << best << ".\n";
            fin4.close();
            delete[] br;
            _getch();
            break;
        }
        //-------------------------
        case 48:
            exit(0);
            break;
        }
    }
}
Во-первых, сортировка по времени идет следующим образом - (вложение1).
Во-вторых, лучший результат выдает тот, который 1-й в первом вложении - 10:00.
В-третьих, сортировка по дате - (вложение2).
Файл выглядит следующим образом:
Кликните здесь для просмотра всего текста
Поезд1 12.04.2008 24:21
Поезд2 09.07.2004 12:35
Поезд3 04.12.2016 13:37
Поезд4 24.02.2004 35:44
Поезд5 12.22.1999 4:34
Поезд6 03.12.2006 9:59
Поезд7 11.03.2005 10:00
0
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
25.06.2016, 14:22  [ТС]
Сами скрины:
Миниатюры
Операции со временем   Операции со временем  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.06.2016, 19:59
У тебя время без лидирующих нулей, надо 04:34, а не 4:34. Значит его нужно преобразовывать. Дата сравнивается без преобразования, где оно?
0
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
25.06.2016, 20:05  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя время без лидирующих нулей, надо 04:34, а не 4:34. Значит его нужно преобразовывать. Дата сравнивается без преобразования, где оно?
дату нужно предварительно преобразовывать либо в число
Я просто не очень понял, что значит преобразовать в число
Если делать через int или double, то ругается на строку. int(string)\double(string)
04:34, а не 4:34
Именно такое и нужно, забыл добавить в задание.
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
25.06.2016, 20:06
Цитата Сообщение от c3490375 Посмотреть сообщение
Знаю, что время можно перевести в секунды и сравнивать, но есть ли другой способ? А как же сравнивать по дате?
Не нужен никакой другой способ.
И время и дата (время + дата) преобразовывается в unix time - число секунд с начала эпохи, эпоха - это начало эпохи UNIX: 1 января 1970 года.
Поэтому любая временная метка уникальна для целочисленного сравнения.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.06.2016, 20:10
Лучший ответ Сообщение было отмечено c3490375 как решение

Решение

Например так:
C++
1
2
3
4
5
6
7
int d, m, y;
string date;
istringstream iss(date);
(iss >> d).get();
(iss >> m).get();
iss >> y;
int dt = y * 10000 + m * 100 + d;
dt и будет дата как число.
Лучше в структуре хранить такое поле и заполнять сразу при считывании.
1
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
25.06.2016, 20:20  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
dt и будет дата как число.
Лучше в структуре хранить такое поле и заполнять сразу при считывании.
Огромное спасибо, надо побольше почитать про sstream.
И почему именно 10000 и 100?
А есть ли обратная операция?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.06.2016, 20:28
Ну чтобы получить из "02.02.2007" число 20070202.

Добавлено через 1 минуту
Цитата Сообщение от c3490375 Посмотреть сообщение
А есть ли обратная операция?
Есть, только тебе она не нужна. Есть же поле с текстом уже.
1
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
25.06.2016, 20:42  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Есть, только тебе она не нужна. Есть же поле с текстом уже.
Ну если нам допустим нужно будет отнять одно время от другого и потом преобразовать из вида 330 в 5:30.
Сказав, что поезд N приехал быстрее поезда M на x секунд.

Добавлено через 7 минут
вернее так
Сказав, что поезд N приехал быстрее поезда M на x:m(5:30).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.06.2016, 21:46
Этот пример про дату. Время надо в секунды переводить. И это всё для сравнения, для сортировки. Если тебя надо разницу вычислять в днях, часах и др., то это уже календарь и лучше использовать вариант Olej.
1
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
26.06.2016, 00:17  [ТС]
Цитата Сообщение от Olej Посмотреть сообщение
Не нужен никакой другой способ.
И время и дата (время + дата) преобразовывается в unix time - число секунд с начала эпохи, эпоха - это начало эпохи UNIX: 1 января 1970 года.
Поэтому любая временная метка уникальна для целочисленного сравнения.
В теории конечно хорошо, но можно узнать, как это будет на практике?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
using namespace std;
 
void main()
{
    string n1 = "22:22",
        n2 = "4:32";
    cout << "n1 - n2 = " << ? ? ; // Что сделать?
    system("pause");
}
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.06.2016, 02:06
del
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
26.06.2016, 02:10
Цитата Сообщение от c3490375 Посмотреть сообщение
В теории конечно хорошо, но можно узнать, как это будет на практике?
Можно
Название: 141943290ct.jpg
Просмотров: 42

Размер: 10.4 Кб
0
3 / 3 / 1
Регистрация: 04.06.2016
Сообщений: 101
26.06.2016, 04:47  [ТС]
Цитата Сообщение от Olej Посмотреть сообщение
Премного благодарен, но неужто необходимо прочитать целую книгу, чтобы выполнить 1 действие? Читаю Страуструпа, поэтому не могу таким образом выполнить данную задачу.

Добавлено через 1 час 9 минут
Может кому будет интересно, самый примитивный вариант сравнивать время:
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
#include <iostream>
#include <Windows.h>
#include <string>
#include <sstream>
 
using namespace std;
 
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    //--------------------------------------------------
    while (TRUE)
    {
        system("cls");
        string s1, s2;
        cout << "Введите первое время: "; cin >> s1;
        cout << "Введите второе время: "; cin >> s2;
        int m, s;
        istringstream i1(s1);
        (i1 >> m).get();
        i1 >> s;
        int dt = m * 60 + s;
 
        istringstream i2(s2);
        (i2 >> m).get();
        i2 >> s;
        int dt2 = m * 60 + s;
 
        if (dt > dt2)
        {
            double d = ((dt - dt2) / 60), d2 = ((dt - dt2) % 60);
            cout << s1 << " > " << s2 << " на " << d << ":" << d2 << endl;
        }
        else if (dt < dt2)
        {
            double d = ((dt2 - dt) / 60), d2 = ((dt2 - dt) % 60);
            cout << s1 << " < " << s2 << " на " << d << ":" << d2 << "." << endl;
        }
        else
        {
            cout << s1 << " = " << s2 << endl;
        }
        system("pause");
    }
}
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.06.2016, 08:07
Цитата Сообщение от c3490375 Посмотреть сообщение
как это будет на практике?
Заполняешь структуру tm и преобразуешь в time_t с помощью mktime(): http://www.cplusplus.com/reference/ctime/mktime/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2016, 08:07
Помогаю со студенческими работами здесь

Операции со временем
Помогите с созданием программы Разработать программу для решения следующей задачи: «Текущее показание электронных часов: m часов (0 m...

Различные операции с временем
Йоу всем, я создал кот но он очень и очень коцаный пошкарябаный и я думаю легче уже создать новый. Задача такая. Время задается в формате...

Арифметические операции со временем
Как вывести на консоль(к примеру) &quot;Привет&quot; если время парное, если не парное тогда &quot;Пока&quot; DateTime localTime = DateTime.Now;...

Арифметические операции со временем из нескольких MaskedTextBox
Есть три maskedTextBox с форматом времени __:__ Необходимо maskedTextBox3 = 24 - maskedTextBox2+maskedTextBox; Кто подскажет как...

Как получить разницу между текущем временем и временем создания файла?
Пробую так #include &lt;time.h&gt; time_t timer; time(&amp;timer); тут timer = 1418974297 милисекунд далее получаю время создани...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru