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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2008, 00:53   #1
Datrav
 
Регистрация: 06.06.2008
Сообщений: 3
По умолчанию Занятные задачки

Вот одна из тех задач, которые вызвали у меня интерес.Оставляйте свои предложения по решению.
День рождения
Витя с нетерпением ждет своего дня рождения, и дней рождения своих друзей.Чтобы облегчить подсчет оставшихся до праздников дней, он решил написать программу, которая сама считает количество дней, которые остались до указанного день рождения.Заданы день рождения и месяц рождения, а также текущие день,месяц и год. Определить, сколько дней осталось до Д\р.
Примечание:
высокосные года-это те, номер которых делится на 400, а также те, номер которых делится на 4, но не делится на 100;
Пример1:
Ввод: 19 04 19 04 2002
Вывод:0
Пример2:
Ввод: 05 05 19 04 2002
Вывод:16
Datrav вне форума Ответить с цитированием
Старый 07.06.2008, 01:52   #2
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 06.06.2008
Сообщений: 105
По умолчанию

Хм..
Создаем массив из 12 Integer - кол-во дней в месяце.. - все кроме февраля заполняем, считаем февраль.
Потом просто смотрим какие месяцы пройдут целиком и складываем те дни, с днями - которые в неполных месяцах будут
Olympian вне форума Ответить с цитированием
Старый 08.06.2008, 17:30   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

dwork:=encodeDate(19,4,2002);
dr:=encodedate(05.05,2002);
if dr>dwork then dr:=encodedate(05,05,2002-1);
result:=daybetween(dowrk,dr);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.06.2008, 17:55   #4
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Обычная задача которую уже вроде рассматривали на форуме.

Преподу зачёт что придумал нормальное условие к задаче а не какоенибудь тупое и еле понятно.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 08.06.2008, 18:15   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, процедурки, "выдернутые" из TPDATE ©TurboPower

Код:
  function IsLeapYear(Year : Integer) : Boolean;
    {-Return True if Year is a leap year}
  begin
    IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
      ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;

  function DaysInMonth(Month, Year : Integer) : Integer;
    {-Return the number of days in the specified month of a given year}
  begin
    if Word(Year) < 100 then
      Inc(Year, 1900);
    case Month of
      1, 3, 5, 7, 8, 10, 12 :
        DaysInMonth := 31;
      4, 6, 9, 11 :
        DaysInMonth := 30;
      2 :
        DaysInMonth := 28+Ord(IsLeapYear(Year));
    else
      DaysInMonth := 0;
    end;
  end;

  procedure DateDiff(Date1, Date2 : Date; var Days, Months, Years : Integer);
    {-Return the difference in days,months,years between two valid julian dates}
  var
    Day1, Day2, Month1, Month2, Year1, Year2 : Integer;
  begin
    {we want Date2 > Date1}
    if Date1 > Date2 then
      ExchangeStructs(Date1, Date2, SizeOf(Date));

    {convert dates to day,month,year}
    DateToDMY(Date1, Day1, Month1, Year1);
    DateToDMY(Date2, Day2, Month2, Year2);

    {days first}
    if Day2 < Day1 then begin
      Dec(Month2);
      if Month2 = 0 then begin
        Month2 := 12;
        Dec(Year2);
      end;
      Inc(Day2, DaysInMonth(Month2, Year2));
    end;
    Days := Day2-Day1;

    {now months and years}
    if Month2 < Month1 then begin
      Inc(Month2, 12);
      Dec(Year2);
    end;
    Months := Month2-Month1;
    Years := Year2-Year1;
  end;
Hint: Вам нужно взять последнюю функцию и выделить из неё нужную часть... year1 в вашем случае = year2
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.06.2008, 16:03   #6
Datrav
 
Регистрация: 06.06.2008
Сообщений: 3
По умолчанию

Вот моё решение.Оставляйте комментарии...

Program Den_rozlenya;
Var
dr,mr,dt,mt,g,g1,n,i,k:integer;
a:array[1..100]of integer;
label 10,20;
Begin
a[1]:=31;a[8]:=31;
For i:=2 to 7 do
If a[i-1]=31 then a[i]:=30
else a[i]:=31;
For i:=9 to 12 do
If a[i-1]=31 then a[i]:=30
else a[i]:=31;

Read(dr,mr,dt,mt,g);
If (g mod 400=0)or((g mod 4=0)and(g mod 100<>0)) then a[2]:=29
else a[2]:=28;
If (dr=29)and (mr=2) then
For i:=g to 3000 do
If (i mod 400=0)or((i mod 4=0)and(i mod 100<>0)) then begin g1:=i;
g1:=g1-g;
k:=1;
break;
end;

dr:=28;
20:;
If (mt<mr)or((mt=mr)and(dr>=dt)) then begin
For i:=mt to mr-1 do
n:=n+a[i];
If dt<dr then n:=n+abs(dt-dr)
else n:=n-abs(dt-dr);
goto 10;
end;
n:=0;
For i:=mt to 12 do
n:=n+a[i];
g:=g+1;
If (g mod 400=0)or((g mod 4=0)and(g mod 100<>0)) then a[2]:=29
else a[2]:=28;
mt:=1;
goto 20;


10:;
if k=1 then n:=n+g1*365+1;
Writeln(n);

End.
Datrav вне форума Ответить с цитированием
Старый 13.06.2008, 10:39   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ОЧЕНЬ плохо!! :-(

прежде всего - она НЕ РАБОТАЕТ!!
для тестовых данных из ВАШЕГО ЖЕ примера:
19 04 19 04 2002
программа выводит 9

с алгоритмом просто страшно разбираться!!!

даже на первый взгляд:
зачем массив месяцев до 100, почему он называется a
зачем метки и переходы,
зачем цикл до 3000 года??
(For i:=g to 3000 do ...)

И используйте форматирование с помощью тэга CODE!!

Последний раз редактировалось Serge_Bliznykov; 13.06.2008 в 10:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.10.2012, 13:02   #8
kostan3
- Дорогой, а ты ку
Форумчанин
 
Регистрация: 06.10.2012
Сообщений: 181
По умолчанию

Код:
Const k1='input.txt';        k2='output.txt';
label v1,v2;
Var input,output: text;      i,m,l1,l2,l3,d1,d2:  integer;       a:array[1..12] of integer;
begin clrscr;textcolor(10);textbackground(5);
      assign(input,k1); reset(input);        assign(output,k2); rewrite(output); m:=0;
      a[1]:=31;a[2]:=28;a[3]:=31;a[4]:=30;a[5]:=31;a[6]:=30;
      a[7]:=31;a[8]:=31;a[9]:=30;a[10]:=31;a[11]:=30;a[12]:=31;
      readln(input,d1,d2);    read(input,l1,l2,l3);
      if (d1=29)and(d2=02) then begin
v2:   if l3 mod 4=0 then begin a[2]:=29;
      if d2>l2 then begin
      for i:=l2 to d2 do m:=m+a[i];  m:=m-l1; goto v1; end;
      if d2=l2 then begin  m:=m+d1-l1; goto v1; end;
      if d2<l2 then begin
      if m=0 then m:=1461-l1 else m:=m-l1;
      for i:=d2+1 to l2-1 do m:=m-a[i]; goto v1; end; end
      else begin m:=m+365; l3:=l3+1; goto v2;  end; end;
      if d2>l2 then begin         if l3 mod 4=0 then a[2]:=29;
      for i:=l2 to d2-1 do m:=m+a[i];        m:=m+d1-l1; goto v1; end;
      if d2=l2 then begin
      if d1<l1 then m:=365+d1-l1 else m:=d1-l1; goto v1; end;
      if d2<l2 then begin         if l3 mod 4=0 then a[2]:=29;
      for i:=l2 to 12 do m:=m+a[i];
      for i:=1 to d2-1 do m:=m+a[i];        m:=m+d1-l1; goto v1; end;
v1:   write(output,m:5); close(output)        
end.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 16.10.2012 в 13:32.
kostan3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачки мандаринка Паскаль, Turbo Pascal, PascalABC.NET 3 02.02.2008 17:02
Задачки на Си Cyn4uk Помощь студентам 3 06.12.2007 23:51
Задачки по С Aero Помощь студентам 3 04.10.2007 18:41