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

как сравнивать даты?

26.08.2010, 15:51. Показов 21998. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется текстовый файл, в нем список учебных дней когда есть математика, в формате "дд/мм/гг,дд/мм/гг,дд/мм/гг," и т.д. и даты начала и окончания каждого триместра, в таком-же формате. Нужно посчитать сколько уроков математики было в каждом из 3-х триместров.
Как мне сравнивать даты? Как узнать меньше одна дата другой или больше? (Си)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.08.2010, 15:51
Ответы с готовыми решениями:

Как правильно сравнивать даты?
$data_old - в таблице типа 'date' форматом "Y.m.d". $today = date("Y.m.d"); if($data_old = $today){ ... } почему-то условие не...

Как проще всего сравнивать даты?
день добрый! есть необходимость сравнения дат из бд. на данный момент формат такой - "год-месяц-день, часы:минуты". ...

Как сделать так, чтобы даты формата 12/2/1232 не воспринимались как даты а оставались как текст?
Доброго всем времени суток, подскажите, как сделать так что-бы даты формата 12/2/1232 не воспринимались как даты а оставались как текст?...

12
 Аватар для yanyk1n
4342 / 1474 / 680
Регистрация: 12.03.2009
Сообщений: 5,310
26.08.2010, 15:58
Connor, лучше создай отдельный класс, где полями будут день, месяц и год, а затем методом сравнивай две даты по значениям:
C++
1
2
3
int d1 = date1.dd + date1.mm * 31 + date1.yy * 365;
int d2 = date2.dd + date2.mm * 31 + date2.yy * 365;
if (d1 > d2) ...
0
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 16:08  [ТС]
Я в принцыпе так и думал, но надеялся что есть способ по проще, что бы не сравнивать день, месяц и год по отдельности.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.08.2010, 16:09
Цитата Сообщение от k1ry4 Посмотреть сообщение
лучше создай отдельный класс, где полями будут день, месяц и год, а затем методом сравнивай две даты по значениям:
лучше перегрузить операторы сравнения.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.08.2010, 17:27
Цитата Сообщение от k1ry4 Посмотреть сообщение
лучше создай отдельный класс
Цитата Сообщение от fasked Посмотреть сообщение
лучше перегрузить операторы сравнения.
Это... А ничего, что
Цитата Сообщение от Connor Посмотреть сообщение
(Си)
?

Connor, не знаю, как на счёт попроще, вот Вам замороченная числосчиталка, придумайте, как её под свои нужды приспособить...
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>
 
int main(void){
    time_t tToday, tNeeded;
    struct tm stToday = { 0 }, stNeeded = { 0 };
    double dblDiff;
    int sign = 0;
 
    tToday = time(NULL);
    stToday = *(localtime(&tToday));
 
    printf("Enter date in format dd/mm/yyyy: ");
    if ( scanf("%d/%d/%d", &stNeeded.tm_mday, &stNeeded.tm_mon, &stNeeded.tm_year) != 3 ){
        printf("Wrong date format!\n");
        exit(1);
    }
    stNeeded.tm_mon -= 1;
    stNeeded.tm_year -= 1900;
    stNeeded.tm_min = 1;
    if ( ( tNeeded = mktime(&stNeeded) ) == -1 ){
        printf("Error while calculate time.\n");
        exit(1);
    }
 
    if ( ( dblDiff = difftime(tToday, tNeeded) ) < 0.0 ){
        sign = 1;
        dblDiff = fabs(dblDiff);
    }
    dblDiff /= 60.0 * 60.0 * 24.0;
 
    printf("Today is %02d/%02d/%4d\n", stToday.tm_mday, stToday.tm_mon + 1, stToday.tm_year + 1900);
    printf("Entered date is %.0f days %s\n", ( sign ) ? ceil(dblDiff) : floor(dblDiff), ( sign ) ? "after" : "before");
 
    exit(0);
}
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.08.2010, 17:33
Цитата Сообщение от easybudda Посмотреть сообщение
Это... А ничего, что
Дээ, увидел про классы речь зашла. Тогда сделать функция datecmp, которая принимает два указателя на структуры Date и возвращает -1, 0, 1. Как-то так.

Добавлено через 3 минуты
а вообще да, лучше воспользоваться difftime.
0
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 17:42  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
Дээ, увидел про классы речь зашла. Тогда сделать функция datecmp, которая принимает два указателя на структуры Date и возвращает -1, 0, 1. Как-то так.

Добавлено через 3 минуты
а вообще да, лучше воспользоваться difftime.
Я так понял, речь идет о сравнении двух строк с помощью strcmp?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.08.2010, 18:00
Цитата Сообщение от Connor Посмотреть сообщение
Я так понял, речь идет о сравнении двух строк с помощью strcmp?
Нет-нет. Я имел в виду примерно следующий код:

C
1
2
3
4
5
6
7
8
9
10
11
typedef struct
{
   int d;
   int m;
   int y;
} Date;
 
int datecmp(Date *d1, Date *d2)
{
   /* здесь сравнить поля структур и вернуть некоторое значение */
}
1
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 18:01  [ТС]
Ок, спасибо, пошел пробовать
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
26.08.2010, 18:38
попробовал
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
#include <stdio.h>
 
typedef struct
{
   int d;
   int m;
   int y;
} Date;
 
int datecmp(Date *d1, Date *d2)
{
   /* здесь сравнить поля структур и вернуть некоторое значение */
    return ( d1->y != d2->y ) ? d1->y - d2->y : ( d1->m != d2->m ) ? d1->m - d2->m : d1->d - d2->d;
}
 
int main(void){
    Date a = { 26, 8, 2010 }, b = { 25, 8, 2010 }, c = { 27, 8, 2010 }, d = { 26, 8, 2010 };
    int cmp;
 
    printf("A = %02d/%02d/%4d\n", a.d, a.m, a.y);
    printf("B = %02d/%02d/%4d\n", b.d, b.m, b.y);
    printf("C = %02d/%02d/%4d\n", c.d, c.m, c.y);
    printf("D = %02d/%02d/%4d\n", d.d, d.m, d.y);
 
    cmp = datecmp(&a, &b);
    printf("A is %s B\n", ( ! cmp ) ? "same as" : ( cmp < 0 ) ? "before" : "after");
    cmp = datecmp(&a, &c);
    printf("A is %s C\n", ( ! cmp ) ? "same as" : ( cmp < 0 ) ? "before" : "after");
    cmp = datecmp(&a, &d);
    printf("A is %s D\n", ( ! cmp ) ? "same as" : ( cmp < 0 ) ? "before" : "after");
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
27.08.2010, 16:58  [ТС]
Пытаюсь сейчас записать все даты в структуру, но программа просто закрывается с ошибкой
C
1
2
3
4
5
6
7
8
9
10
11
for(i=0;i<size;i++){
     p=strtok(dates[i],"/"); // в dates хранятся все даты в формате char
     date[i].day=atoi(p); //здесь видимо происходит ошибка..
     cont=0;
        while((p=strtok(NULL,"/"))!=NULL)
             if(cont<1){
             date[i].month=atoi(p); 
             cont++;
             }else
             date[i].year=atoi(p); 
     }
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.08.2010, 17:06
Connor, попробуйте так как-то:
C
1
2
3
4
5
...
if ( sscanf(dates[i], "%d/%d/%d", &date[i].day, &date[i].month, &date[i].year) != 3 ){
  // неверный формат
}
...
1
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
27.08.2010, 17:17  [ТС]
А в чем ошибка то? Почему нельзя сделать моим способом?(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2010, 17:17
Помогаю со студенческими работами здесь

Как сравнивать строки?
Что-то смотрю в туториалы, но ничего не выходит. Как написать сравнение строк? add_field_to_table() { BUFFER='add_field_to_table' ...

Как сравнивать строки
Я ввожу в Text2 слово Вашингтон и в коде пишу If Text2.Text = &quot;Вашингтон&quot; Then k = 1 End If изначально k = 0 , но он у меня...

Подскажите как сравнивать
Подскажите как сравнивать между собой введенные значения.(в структурах)

Как сравнивать структуры
Есть структура например struct TIME { int min; int sec; }; TIME A={10,15},B; B=A; //можно...

Как сравнивать строки?
где ошибка? if ((textBox1.Text + textBox1.Text) = (textBox2.Text)) { button2.BackColor = Color.Green; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru