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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 17:16   #1
marz
Новичок
Джуниор
 
Регистрация: 03.12.2014
Сообщений: 2
По умолчанию Помогите доделать задачку на записи, паскаль.

Не могу понять чего я забыл, помогите пожалуйста :3

Код:
{Программа проверяет, предшествует ли дата d1 дате d2, и вычисляет количество суток между датами d1 и d2}
Program record;
type year=1500..2500;
     month=1..12;
     day=1..31;
     data=record   y:year;
                   m:month;
                   d:day;
     end;
type date:record;
     y,m,d:integer;
     end;
     
   var
     d1,d2:date;
   begin
   {Вводим даты}
     writeln('Введите первую дату: год, месяц, число');
     readln(d1.y);
     readln(d1.m);
     readln(d1.d);
     writeln('Введите вторую дату: год, месяц, число');
     readln(d2.y);
     readln(d2.m);
     readln(d2.d);

      if((d1.m>0 and d2.m<13) and (d2.m>0 and d2.n<13)) then
       begin 
        
        if(d1.y*d1.m+d1.d)<(d2.y*d2.m+d2.d) then
        writeln('Предшествует');
         else
         writeln('Не предшествует');
         writeln('количество суток между d1 и d2=',(d2.y*d2.m+d2.d)-(d1.y*d1.m+d1.d));
         end;
         else
         writeln('Такой даты не существует');
         readln;
         end.

Последний раз редактировалось marz; 03.12.2014 в 17:18. Причина: я кривожоп
marz вне форума Ответить с цитированием
Старый 03.12.2014, 17:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему ты решил что что-то забыто?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2014, 21:34   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
d1.y*d1.m+d1.d
это ересь!
(год умноженные на месяц + день ) - вообще ничего полезного не даёт!!

возьмите, например,
1 декабря 2013 года и 1 января 2014 года
12*2013+1 = 24157
1*2014+1 = 2015

т.к. 24157 > 2015 получается, что дата 1 декабря 2013 года НЕ ПРЕДШЕСТВУЕТ дате 1 января 2014 года
и что между этими датами 22142 дня...

p.s. воспользуйте поиском, на форуме были решения подобных задач!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2014, 12:33   #4
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

нет проверки на день то есть у вас может быть 31 февраля
Код:
{Программа проверяет, предшествует ли дата d1 дате d2, и вычисляет количество суток между датами d1 и d2}
Program record;
type year=1500..2500;
     month=1..12;
     day=1..31;
     data=record   y:year;
                   m:month;
                   d:day;
     end;
type date:record;
     y,m,d:integer;
     end;
     
   var
     d1,d2:date;
   ....................
{у вас здесь не существующая переменная d2.n}
      if((d1.m>0 and d2.m<13) and (d2.m>0 and d2.n<13)) then
       begin    
........
         end.
ИМХО это полный бред
Код:
  
  ........
        if(d1.y*d1.m+d1.d)<(d2.y*d2.m+d2.d) then
        writeln('Предшествует');
         else
         writeln('Не предшествует');
         writeln('количество суток между d1 и d2=',(d2.y*d2.m+d2.d)-(d1.y*d1.m+d1.d));
         end;
         else
         writeln('Такой даты не существует');
         readln;
  ........
П.С. я бы попробовал написать процедуру для перевода даты в количество дней с момента отсчета как это в Delphi происходит
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 04.12.2014 в 12:42.
Dvoishnik вне форума Ответить с цитированием
Старый 04.12.2014, 14:32   #5
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

проверить на високосный ли год можно так

Код:
.......
function ve(dy:integer;):BOOLEAN;
var
t:BOOLEAN;
begin
t:=false;
if (dy mod 100) <> 0 then 
  if (dy mod 4) = 0 then t:=true; 
   else t:=false 
 else 
  if (dy mod 400) = 0 then t:=true; 
   else t:=false;  
ve:=t;
end;
..........
где t будет ее значением а dy параметром в который будет передаваться год

проверка на допустимое количество дней в месяце
Код:
{если месяц от 1 до 7 то следуя правилу каждый второй месяц содержит 30 дней кроме февраля после 7 все на оборот каждый четный месяц содержит 31 день здесь это и проверяется} 

function mes(dm,dy:integer;):byte;
var
begin
if dm<=7 then  
 if (dm mod 2) <> 0  then mes:=31
  else
   if dm=2 then      
    if ve(dy) then  mes:=29  {ve это предыдущая функция}
     else mes:=28 
    else then mes:=30    
 else 
  if (dm mod 2) <> 0  then mes:=30 
   else mes:=31;
end;
Код:
{количество дней с точки начала отсчета "1.1.0" включительно}
function kold(dn,dy,dm:Integer;):longInt;
var
i,
mes,
KolVesLet:integer;
begin
mes:=0
KolVesLet:=(dy div 4)+(dy div 400)-(dy div 100);
if dy>2 then
 begin
  for I:=1 to dm-2
   if i<=7 then 
    begin
     if (dm mod 2) = 0 then mes:=mes+30 
      else mes:=mes+31;
    end 
     else 
      begin
       if (dm mod 2) = 0 then mes:=mes+31 
        else mes:=mes+30;
      end;
  if ve then mes:=mes+29 
   else mes:=mes+28;
 end 
  else mes+((dm-1)*31);
mes:=mes+dn;
kold:=(((dy-KolVesLet)*365)+(KolVesLet*366))+mes;
end;
не компилировал так что не могу сказать что все 100% работает но принцип такой.
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 04.12.2014 в 15:14.
Dvoishnik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Помогите доделать программы. Vadim123456 Помощь студентам 3 22.12.2009 16:31
помогите доделать задачку innaa639 Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2009 11:29
Помогите доделать задачу по паскаль. aleksandr_dss Помощь студентам 3 19.12.2008 10:56