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

  • Автор темы TeD
  • Дата начала
T
#1
Привет. Я написал функцию которая вычисляет интервал между датами, годы нормально вычисляет, а вот с месецами и днями трабла.


вот код:

Код:
# 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;

}
 
P

Pasha

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

Herbert

#3
Читай хелп по типам tm, time_t, функциям mktime и difftime. Ну и вообще весь раздел Time Management.
Это верно конечно, но у тебя же явных ляпов в коде полно:

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;
}
Пробуй...
 
T
#4
1. Зачем 2 раза-то ?
да перепутал случайно.
3. Что ты тут хотел получить? Вообще непонятно...
вот теперь понятно почему он года нормально вычислял =)

5. Не используй киррилицу в printf. Велики шансы иероглифы получить.
хм....у меня никогда такого не было :blink:

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

Kmet

Java Team
25.05.2006
1 036
8
#5
2. Ты перед тем как тип int использовать смотрел какое максимальное значение может иметь переменная типа int? Посмотри, а потом прикинь какое значение может потребоваться для day.
ну хотя бы для 32 разрядных систем:

2^30/365 лет......
 
H

Herbert

#6
ну хотя бы для 32 разрядных систем:

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

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