1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

интервал между датами

Тема в разделе "С и С++", создана пользователем TeD, 23 авг 2007.

  1. TeD

    TeD Гость

    Репутация:
    0
    Привет. Я написал функцию которая вычисляет интервал между датами, годы нормально вычисляет, а вот с месецами и днями трабла.


    вот код:

    Код:
    # include <stdio.h>
    #include <math.h>
    
    #include <math.h>
    int year1, month1, day1,year2,month2,day2;
    int date_interval (int year1,int month1,int day1,int year2,int month2,int day2) // Ðåàëèçàöèÿ ôóíêöèè
    {
    
    int year,month,day;
    if(year1<0 || month1 < 0 || day1 < 0 ||year2<0 || month2 < 0 || day2 < 0 || month1 > 12 || day1 > 31 || month2 > 12 || day2>31)
    {
    return 0;
    }
    
    day=abs((year1*365+month1*31+ day1) - (year2*365+month2*31+day2));
    year= day /365;
    month= day / 31 % 31;
    day = day % 7;
    
    printf("Èíòåðâàë ìåæäó ");
    if(year1*365+month1*31+ day1 > year2*365+month2*31+day2)
    {
    printf("%d:%d:%d è %d:%02d\n", year1, month1, day1, year2,month2,day2);
    printf("ðàâíî %d:%d:%d", year,month,day);
    }
    else{
    printf("%d:%d:%d è %d:%d %d\n", year2, month2, day2, year1,month1,day1);
    printf("ðàâíî %d:%d:%d\n", year,month,day);}
    return 1;
    
    }
    int _stdcall SetConsoleOutputCP(unsigned);
    
    int main() // Òî÷êà âõîäà
    {
    
    
    SetConsoleOutputCP(1251);
    do
    {
    
    printf("Ââåäèòå 1 äàòó â ôîðìó ãããã:ìì:ää: ");
    scanf("%d %d %d", &year1, &month1, &day1);
    
    printf("Ââåäèòå 2 ÷àñû â ôîðìàòå ÷÷:ìì:ññ: ");
    scanf("%d %d %d", &year2, &month2, &day2);
    }
    while(date_interval(year1,month1,day1, year2, month2, day2)==0);
    system("PAUSE");
    return 0;
    
    }
     
  2. Pasha

    Pasha Гость

    Репутация:
    0
    Для: TeD
    Да, действительно трабла. Читай хелп по типам tm, time_t, функциям mktime и difftime. Ну и вообще весь раздел Time Management.
     
  3. Herbert

    Herbert Гость

    Репутация:
    0
    Это верно конечно, но у тебя же явных ляпов в коде полно:

    1. Зачем 2 раза-то ?

    Код:
     #include <math.h>
    
    #include <math.h>

    2. Ты перед тем как тип int использовать смотрел какое максимальное значение может иметь переменная типа int? Посмотри, а потом прикинь какое значение может потребоваться для day.

    3. Что ты тут хотел получить? Вообще непонятно...

    Код:
    	year= day /365;
    month= day / 31 % 31;
    day = day % 7;
    4. Для такой проги как твоя, подобные вещи не нужны

    Код:
    SetConsoleOutputCP(1251);
    5. Не используй киррилицу в printf. Велики шансы иероглифы получить.


    Я попробовал чуть подправить:


    Код:
    # include <stdio.h>
    #include <math.h>
    
    long int year1, month1, day1,year2,month2,day2;
    long int date_interval (long int year1,long int month1,long int day1,long int year2,long int month2,long int day2) // ?aaeecaoey ooieoee
    {
    
    long int year,month,day;
    if(year1<0 || month1 < 0 || day1 < 0 ||year2<0 || month2 < 0 || day2 < 0 || month1 > 12 || day1 > 31 || month2 > 12 || day2>31)
    {
    return 0;
    }
    
    day=abs((year1*365+month1*31+ day1) - (year2*365+month2*31+day2));
    year= day /365;
    month= (day-(year*365))/31;
    day = (day-(year*365)-(month*31));
    
    printf("Eioa?aae ia?ao ");
    if(year1*365+month1*31+ day1 > year2*365+month2*31+day2)
    {
    printf("%d:%d:%d e %d:%02d\n", year1, month1, day1, year2,month2,day2);
    printf("?aaii %d:%d:%d", year,month,day);
    }
    else{
    printf("%d:%d:%d e %d:%d %d\n", year2, month2, day2, year1,month1,day1);
    printf("?aaii %d:%d:%d\n", year,month,day);}
    return 1;
    
    }
    
    
    
    
    int main() // Oi?ea aoiaa
    {
    
    do
    {
    printf("Aaaaeoa 1 aaoo a oi?io aaaa:ii:aa: ");
    scanf("%d %d %d", &year1, &month1, &day1);
    printf("Aaaaeoa 2 ?anu a oi?iaoa ??:ii:nn: ");
    scanf("%d %d %d", &year2, &month2, &day2);
    }
    while(date_interval(year1,month1,day1, year2, month2, day2)==0);
    
    return 0;
    }
    Пробуй...
     
  4. TeD

    TeD Гость

    Репутация:
    0
    да перепутал случайно.
    вот теперь понятно почему он года нормально вычислял =)

    хм....у меня никогда такого не было :blink:

    а за помощь спасибо ;)
     
  5. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    ну хотя бы для 32 разрядных систем:

    2^30/365 лет......
     
  6. Herbert

    Herbert Гость

    Репутация:
    0
    Вообще-то да... long int здесь не нужен был.
    Я-то сгоряча решел что day при переходе через 32767 "по новой отсчитывается", а там предел 2147483647 - этого на все случаи жизни хватает.

    Второй пункт снимается. Без лонгов все работать должно.
     
Загрузка...

Поделиться этой страницей