Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Connor
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 15:51     как сравнивать даты? #1
Имеется текстовый файл, в нем список учебных дней когда есть математика, в формате "дд/мм/гг,дд/мм/гг,дд/мм/гг," и т.д. и даты начала и окончания каждого триместра, в таком-же формате. Нужно посчитать сколько уроков математики было в каждом из 3-х триместров.
Как мне сравнивать даты? Как узнать меньше одна дата другой или больше? (Си)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
26.08.2010, 15:58     как сравнивать даты? #2
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) ...
Connor
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 16:08  [ТС]     как сравнивать даты? #3
Я в принцыпе так и думал, но надеялся что есть способ по проще, что бы не сравнивать день, месяц и год по отдельности.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.08.2010, 16:09     как сравнивать даты? #4
Цитата Сообщение от k1ry4 Посмотреть сообщение
лучше создай отдельный класс, где полями будут день, месяц и год, а затем методом сравнивай две даты по значениям:
лучше перегрузить операторы сравнения.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.08.2010, 17:27     как сравнивать даты? #5
Цитата Сообщение от 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);
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.08.2010, 17:33     как сравнивать даты? #6
Цитата Сообщение от easybudda Посмотреть сообщение
Это... А ничего, что
Дээ, увидел про классы речь зашла. Тогда сделать функция datecmp, которая принимает два указателя на структуры Date и возвращает -1, 0, 1. Как-то так.

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

Добавлено через 3 минуты
а вообще да, лучше воспользоваться difftime.
Я так понял, речь идет о сравнении двух строк с помощью strcmp?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.08.2010, 18:00     как сравнивать даты? #8
Цитата Сообщение от 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)
{
   /* здесь сравнить поля структур и вернуть некоторое значение */
}
Connor
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
26.08.2010, 18:01  [ТС]     как сравнивать даты? #9
Ок, спасибо, пошел пробовать
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.08.2010, 18:38     как сравнивать даты? #10
попробовал
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;
}
Connor
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
27.08.2010, 16:58  [ТС]     как сравнивать даты? #11
Пытаюсь сейчас записать все даты в структуру, но программа просто закрывается с ошибкой
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); 
     }
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2010, 17:06     как сравнивать даты? #12
Connor, попробуйте так как-то:
C
1
2
3
4
5
...
if ( sscanf(dates[i], "%d/%d/%d", &date[i].day, &date[i].month, &date[i].year) != 3 ){
  // неверный формат
}
...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2010, 17:17     как сравнивать даты?
Еще ссылки по теме:

Как идти по строке с конца к середине и сравнивать буквы C++
C++ Почему два char нельзя сравнивать так ==?
На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней C++

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

Или воспользуйтесь поиском по форуму:
Connor
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 20
27.08.2010, 17:17  [ТС]     как сравнивать даты? #13
А в чем ошибка то? Почему нельзя сделать моим способом?(
Yandex
Объявления
27.08.2010, 17:17     как сравнивать даты?
Ответ Создать тему
Опции темы

Текущее время: 08:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru