Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 12

Исправить проблему с расчетом дней между датами

15.12.2021, 21:45. Показов 1794. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, программа вроде правильно находит количество дней и часов между введенными данными, но есть такая проблема, что к примеру она посчитает с 29 февраля до 30 февраля 1 день, хоть таких чисел и не существует. Может считать и хоть с 50 января до 65 января и т.д.

Как можно ограничить ввод данных только реальными датами? К примеру, чтобы если пользователь ввел с 30 января до 35 января, ему либо вывело ошибку, либо сказало еще на вводе, что так нельзя


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
#include <iostream>
#include <cmath>
#include <ctime>
#include <string>
 
using namespace std;
 
int month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
int main() {
    setlocale(LC_ALL, "Russian");
    int first_date, first_month, first_year;
    int second_date, second_month, second_year;
    char temp_c;
    cout << "Введите первую дату через точки: ";
    cin >> first_date >> temp_c >> first_month >> temp_c >> first_year;
    while (cin.fail()) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Дата некорректна" << endl;
        cout << "Введите первую дату через точки: ";
        cin >> first_date >> temp_c >> first_month >> temp_c >> first_year;
    }
    cout << "Введите вторую дату через точки: ";
    cin >> second_date >> temp_c >> second_month >> temp_c >> second_year;
    while (cin.fail()) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Дата некорректна" << endl;
        cout << "Введите вторую дату через точки: ";
        cin >> second_date >> temp_c >> second_month >> temp_c >> second_year;
    }
    if (first_year != second_year) {
        cout << "Ошибка. Указаны разные года!";
        return -1;
    }
    if (second_month <= first_month) {
        int tmp;
        tmp = second_date;
        second_date = first_date;
        first_date = tmp;
 
        tmp = second_month;
        second_month = first_month;
        first_month = tmp;
    }
    if (((first_year % 4) == 0) && (((first_year % 100) != 0) || ((first_year % 400) == 0))) {
        month[1]++;
    }
    int days_answer = 0;
    for (int i = first_month - 1; i < second_month - 1; ++i) {
        days_answer += month[i];
    }
    days_answer = days_answer - first_date + second_date;
    cout << "Дней: " << abs(days_answer) << endl;
    cout << "Часов: " << abs(days_answer) * 60;
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2021, 21:45
Ответы с готовыми решениями:

Как вычислить кол-во дней между двумя датами и перевести в кол-во лет, мес. дней?
Собственно, как вычислить кол-во дней я знаю: procedure TForm1.Button3Click(Sender: TObject); var D1,D2,Razn:integer; begin ...

Количество дней между датами в 1С
Добрый день! Мне нужно вычислить количество дней между датами в регистре накопления. Прописываю код: &amp;НаКлиенте Процедура...

Количество дней между датами
Здравствуйте. Подскажите можно ли считать в exel количество дней между датами, испольязуя одну формулу? Считаю сколько держался курс...

5
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6130 / 2825 / 1038
Регистрация: 01.06.2021
Сообщений: 10,300
06.09.2025, 12:56
Цитата Сообщение от stromae Посмотреть сообщение
с 30 января до 35 января
а что не так с 30 и 31 января?
0
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
06.09.2025, 13:17
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Негросеть прекрасно справляется. Я попросил сделать на чистях Сях, получились функции, которые вполне валидно юзать и в С++.
Первая версия (детальная реализация):
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
#include <stdio.h>
#include <time.h>
 
// Структура для хранения даты и времени
typedef struct
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
} DateTime;
 
// Функция для проверки високосного года
int is_leap_year(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
 
// Функция для получения количества дней в месяце
int days_in_month(int month, int year)
{
    static const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && is_leap_year(year))
    {
        return 29;
    }
    return days[month - 1];
}
 
// Функция для проверки корректности даты и времени
int is_valid_datetime(const DateTime* dt)
{
    if (dt->year < 1970 || dt->month < 1 || dt->month > 12 ||
        dt->day < 1 || dt->day > days_in_month(dt->month, dt->year) ||
        dt->hour < 0 || dt->hour > 23 ||
        dt->minute < 0 || dt->minute > 59 ||
        dt->second < 0 || dt->second > 59)
    {
        return 0;
    }
    return 1;
}
 
// Функция для преобразования даты и времени в секунды с эпохи Unix
time_t datetime_to_seconds(const DateTime* dt)
{
    time_t total_seconds = 0;
    
    // Добавляем секунды за годы
    for (int year = 1970; year < dt->year; year++)
    {
        total_seconds += is_leap_year(year) ? 31622400 : 31536000;
    }
    
    // Добавляем секунды за месяцы
    for (int month = 1; month < dt->month; month++)
    {
        total_seconds += days_in_month(month, dt->year) * 86400;
    }
    
    // Добавляем секунды за дни, часы, минуты и секунды
    total_seconds += (dt->day - 1) * 86400;
    total_seconds += dt->hour * 3600;
    total_seconds += dt->minute * 60;
    total_seconds += dt->second;
    
    return total_seconds;
}
 
// Основная функция для вычисления разницы в секундах
long long seconds_between_datetimes(const DateTime* dt1, const DateTime* dt2)
{
    // Проверяем корректность входных данных
    if (!is_valid_datetime(dt1) || !is_valid_datetime(dt2))
    {
        printf("Ошибка: некорректная дата или время\n");
        return -1;
    }
    
    // Преобразуем оба момента времени в секунды
    time_t seconds1 = datetime_to_seconds(dt1);
    time_t seconds2 = datetime_to_seconds(dt2);
    
    // Возвращаем абсолютную разницу
    return (seconds1 > seconds2) ? (seconds1 - seconds2) : (seconds2 - seconds1);
}
 
// Пример использования
int main()
{
    DateTime dt1 = {2024, 1, 15, 12, 30, 45}; // 15 января 2024, 12:30:45
    DateTime dt2 = {2024, 1, 15, 14, 15, 30}; // 15 января 2024, 14:15:30
    
    long long diff = seconds_between_datetimes(&dt1, &dt2);
    
    if (diff != -1)
    {
        printf("Разница в секундах: %lld\n", diff);
        printf("Это примерно %.1f часов\n", diff / 3600.0);
    }
    
    return 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
#include <stdio.h>
#include <time.h>
 
long long seconds_between_dates_simple(struct tm time1, struct tm time2)
{
    // Преобразуем struct tm в time_t
    time_t t1 = mktime(&time1);
    time_t t2 = mktime(&time2);
    
    // Вычисляем разницу в секундах
    return (t1 > t2) ? (t1 - t2) : (t2 - t1);
}
 
// Пример использования простой версии
int main()
{
    struct tm time1 = {0};
    struct tm time2 = {0};
    
    // Устанавливаем первое время: 15.01.2024 12:30:45
    time1.tm_year = 2024 - 1900;
    time1.tm_mon = 0;    // январь (0-11)
    time1.tm_mday = 15;
    time1.tm_hour = 12;
    time1.tm_min = 30;
    time1.tm_sec = 45;
    
    // Устанавливаем второе время: 15.01.2024 14:15:30
    time2.tm_year = 2024 - 1900;
    time2.tm_mon = 0;
    time2.tm_mday = 15;
    time2.tm_hour = 14;
    time2.tm_min = 15;
    time2.tm_sec = 30;
    
    long long diff = seconds_between_dates_simple(time1, time2);
    printf("Разница в секундах: %lld\n", diff);
    
    return 0;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33193 / 21489 / 8233
Регистрация: 22.10.2011
Сообщений: 36,876
Записей в блоге: 12
06.09.2025, 17:01
Цитата Сообщение от Verevkin Посмотреть сообщение
Негросеть
появилась позже 2021-го, если что... Некропост же.
0
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
06.09.2025, 17:08
Цитата Сообщение от volvo Посмотреть сообщение
появилась позже 2021-го, если что... Некропост же.
Я поздно заметил. Чистить пост не стал, пусть будет. Активность разделов, на которые я подписан, и так упала ниже днища, мне скучно.....
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6130 / 2825 / 1038
Регистрация: 01.06.2021
Сообщений: 10,300
21.09.2025, 12:17
ㅤㅤㅤ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.09.2025, 12:17
Помогаю со студенческими работами здесь

Разница к-ва дней между датами
Нужно подсчитать разницу в к-ве дней между текущей датой и заданной. Но по скрипту почему-то не учитывает мес. (или год). Т.е. сегодня 12...

Количество дней между 2-мя датами
Помогите найти количество дней меджу двумя датами, если например даты вводяться в 2 поля Edit1 и Edit2. Объясните как написать даную...

Количество дней между датами
Создаю бд &quot;Библиотека&quot;. необходимо создать расчетное поле количества дней между двумя датами На скриншоте видно поле &quot;кол-во...

Количество дней между датами
Здравствуйте. Есть две даты в ячейках StringGrid , введенные с помощью MonthCalendar1.Date. Как найти количество дней между датами?

Подсчет дней между датами
всем привет! возникла небольшая загвоздка. подскажите пожалуйста как сделать формулу подсчета разницы между двух дат. результат нужен в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru