Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2020, 00:47   #11
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Arigato, Да извиняюсь мой косяк, вариант рабочий, проблема реально была в том что я вызывал функцию (определенную с 1 параметром) с тремя.
Спасибо )
JOFRIF вне форума Ответить с цитированием
Старый 03.06.2020, 13:20   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Цитата:
Сообщение от JOFRIF Посмотреть сообщение
проблема реально была в том что я вызывал функцию (определенную с 1 параметром) с тремя
В моем коде вообще нет функции с 1 параметром.
Arigato вне форума Ответить с цитированием
Старый 16.06.2020, 00:19   #13
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

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

#define TYPE_ERR_MSG "\t***Type mismatch ERROR***\n\tPlease try again...\n"
#define VLD_ERR_MSG "\t***NOT VALID DATE***\n\tPlease try again...\n"
#define VLD_DAT_LOW 1800      //VALID YEAR 1800-2200
#define VLD_DAT_HIGH 2200

static int DAYS_IN_MONTH[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//1-12 +zero empty case

void calcBetweenDates(int dd1,int mm1,int yyyy1, int dd2,int mm2,int yyyy2, int *res_d_ptr,int *res_m_ptr,int *res_y_ptr) //DATE1 < DATE2
{
    int y,m,d;
    if(yyyy1==yyyy2)
    {
        y=0;
        if(mm1==mm2)
        {
            m=0;
            d=dd2-dd1;
        }//mm1==mm2
        else if(mm2>mm1)
        {
            if(dd1==dd2)
            {
                m=mm2-mm1;
                d=0;
            }
            else//dd2>dd1 dd2<dd1
            {
                if(dd2>dd1)
                {
                    m=mm2-mm1;
                    d=dd2-dd1;
                }

                else//dd2<dd1
                {
                    m=mm2-mm1-1;
                    d=(DAYS_IN_MONTH[mm1]-dd1)+dd2;//15/02/1999 - 10/05/1999 WRONG DAYS CALC???
                }

            }
        }//mm2>mm1
        //else (mm2<mm1) is NOT VALID -  MUST BE DATE1 < DATE2!
        ////////////////////////////////////////////
    } //yy1=yy2
    else //only -> (yyyy1<yyyy2)
    {
        y=yyyy2-yyyy1;
        if(mm1==mm2)
        {
            if(dd1==dd2)
            {
                m=0;
                d=0;
            }
            else if(dd2>dd1)
            {
                m=0;//11 month + remainder of days
                d=dd2-dd1;
            }
        }
        else if(mm2>mm1)
        {
            if(dd1==dd2)
            {
                m=mm2-mm1;
                d=0;
            }
            else if(dd2>dd1)
            {
                m=mm2-mm1;
                d=dd2-dd1;
            }
            else //dd2<dd1
            {
                m=mm2-mm1-1;
                d=(DAYS_IN_MONTH[mm1]-dd1)+dd2;
            }
        }//mm2>mm1
        else //mm2<mm1
        {
            y=yyyy2-yyyy1-1;
            if(dd1==dd2)
            {
                m=(12-mm1)+mm2;
                d=0;
            }
            else if(dd2>dd1)
            {
                m=(12-mm1)+mm2;
                d=dd2-dd1;
            }
            else //dd2<dd1
            {
                m=(12-mm1)+mm2-1;
                d=(DAYS_IN_MONTH[mm1]-dd1)+dd2;//10/08/1993 - 05/03/1994 WRONG DAYS CALC???
            }
        }//end mm2<mm1

    }
    *res_y_ptr = y;
    *res_m_ptr = m;
    *res_d_ptr = d;
}//end func
/*int calc_total_days_between_months(int mm1, int yyyy1, int mm2, int yyyy2)
{
    int t_days_mm1=0, t_days_mm2=0;
    int i;
    //calc mm1 total days
    for(i=mm1; i<=12; i++)
        t_days_mm1+=DAYS_IN_MONTH[i];
    if(isLeapYear(yyyy1))
        t_days_mm1+1;

    printf("TOTAL mm1 DAYS: %d\n",t_days_mm1) ;
    //calc m2 total days
    for(i=1; i<mm2; i++)
        t_days_mm2+=DAYS_IN_MONTH[i];
    if(isLeapYear(yyyy2))
        t_days_mm2+1;

     printf("TOTAL mm2 DAYS: %d\n",t_days_mm2) ;
    //return sum of total duration days
    return t_days_mm1+t_days_mm2;
}*/
int isValidDate(int dd, int mm, int yyyy)
{
    if(yyyy<VLD_DAT_LOW || yyyy>VLD_DAT_HIGH)
        return 0;
    if(mm<1 || mm>12)
        return 0;
    if(dd==29 && mm==2)//ok on specific case
    {
        if(isLeapYear(yyyy))//אולי שנה מעוברת
            return 1;//שנה מעוברת עם 29 יום
        else
            return 0;//לא תקין
    }
    if(dd<1 || dd>DAYS_IN_MONTH[mm])
        return 0;
    return 1; //תאריך תקין
}
int isLeapYear(int yyyy)
{
    if((yyyy % 4 == 0) && (yyyy % 100 != 0) || (yyyy % 400 == 0))
        return 1;
    return 0;
}
int main()
{
    int dd1=0,mm1=0,yyyy1=0;
    int dd2=0,mm2=0,yyyy2=0;
    int t_days=0, t_months=0, t_years=0;

    int n=0;//scanf ret val

    printf("Enter first date: (dd/mm/yyyy) \n");
    n = scanf("%d/%d/%d",&dd1,&mm1,&yyyy1);
    while(n != 3 || !isValidDate(dd1,mm1,yyyy1))
    {
        printf("n=: %d\n",n);
        if(n != 3)
            printf(TYPE_ERR_MSG);
        if (!isValidDate(dd1,mm1,yyyy1))
            printf(VLD_ERR_MSG);
        _flushall();
        n = scanf("%d/%d/%d",&dd1,&mm1,&yyyy1);
    }

    printf("Enter second date: (dd/mm/yyyy) \n");
    n = scanf("%d/%d/%d",&dd2,&mm2,&yyyy2);
    while(n != 3 || !isValidDate(dd2,mm2,yyyy2))
    {
        if(n != 3)
            printf(TYPE_ERR_MSG);
        if (!isValidDate(dd2,mm2,yyyy2))
            printf(VLD_ERR_MSG);
        _flushall();
        n = scanf("%d/%d/%d",&dd2,&mm2,&yyyy2);
    }

    calcBetweenDates(dd1,mm1,yyyy1, dd2,mm2,yyyy2, &t_days,&t_months,&t_years);
    printf("Between %02d/%02d/%d and %02d/%02d/%d there is: \n",dd1,mm1,yyyy1,dd2,mm2,yyyy2);
    printf("%d Years\n%d Months\n%d Days\n",t_years,t_months,t_days);

}
Как и обещал вот прога правда почти рабочая... все равно может кому пригдиться..
проверял себя с помозью этого сайта --> https://www.timeanddate.com/date/dur...&y2=2008&ti=on
JOFRIF вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка даты (Java) zhenya.ya Помощь студентам 0 04.12.2011 19:28
Проверка даты daniil123 Паскаль, Turbo Pascal, PascalABC.NET 1 17.11.2011 22:14
Проверка корректности даты Oleg Romanchuk Общие вопросы Delphi 3 09.07.2011 07:13
Проверка даты на сервере!!! $T@LKER Работа с сетью в Delphi 0 11.05.2010 17:03
Проверка даты Михаил Юрьевич Общие вопросы Delphi 11 24.01.2010 20:39