Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычисление даты
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
NightPaladin
Надо учитывать только то, что месяцы по 30 и 31 дню, высокосным годом и 29 днями февраля.
У Васи Пупкина неожиданно сломался компьютер. Из-за отсутствия нужных материалов на ремонт понадобится N дней. Определите дату окончания ремонта, если известно, что компьютер сломался в текущем году, и ремонт должен закончиться тоже в этом году.
Известна дата поломки в формате ДД.ММ и количество дней ремонта N.
Получить дату окончания ремонта в формате: ДД.ММ.
Пример:
Входные данные: Выходные данные:

01.06 30 01.07



Вот мои наброски она вечно касячит, т.е найдётся такое число при котором она выдаст не тот ответ - помогите пожалуйста
Код

program asd;
Uses
Crt;
const
n = 100;
m = 1000;
var
mas: array[1..n] of String;
mas2: array[1..m] of Integer;
date: String;
count,w,q,e,r,day,k,i: Integer;
pr,od: byte;

begin
ClrScr;
 WriteLn('Input date:');
 Readln(date);
 WriteLn('Input day:');
 Readln(day);

 For count:= 1 to Length(date) do
  mas[count]:=Copy(date,count,1);

     mas[1]:=mas[1]+mas[2];
     For count:= 2 to Length(date) do
     mas[count]:=  mas[count+1];
     Val(mas[1],q,w);
     mas2[1]:=q;

     mas[3]:=mas[3]+mas[4];
     For count:=4 to Length(date)-1 do
     mas[count]:=mas[count+1];
     Val(mas[3],e,r);
     mas2[2]:= e;

  Case e of
   1,3,5,7,9,11: k:=31;
   4,6,8,10,12: k:=30;
   2: k:=30;
  end;

  If day+q > k then
     begin
      i:=(day+q) div k;
      mas2[2]:=e+i;
      day:=day-(k-q);
      If
      For count:= e+1 to mas2[2] do
       begin
        If NOT Odd(count) = true then day:=day - 30;
        Writeln(day);
        If Odd(count) = true then day:= day - 31;
       end;
     For count:=1 to pr do
       day:= day-30;
     For count:=1 to od do
       day:= day-31;
        end;{
   else
      day:=day+q;

If day = 0 then day:=1;
Writeln(day,'.',mas2[2]);}
ReadKey;
end.

Все исходники должны помещаться в теги [ CODE] [ /CODE]
volvo
NightPaladin
Если это еще нужно, я набросал кое-что, погоняй эту программу. Найдешь баги - говори ;)

Код

Function GetInteger(s: String): Integer;
 Var i, Err: Integer;
 Begin
   If s[1] = '0' Then Delete(s, 1, 1);
   Val(s, i, Err); GetInteger := i
 End;

Const
 CurrYear = 2004;
 DayInMonth: Array[1 .. 12] Of Byte =
   (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

(*
{ Тестировалось с этими данными }
Const
 Repair: Integer = 50;
 st: String = '21.06';
*)
Var
 Day, Month, DaysBefore: Integer;
 p, i: Byte;
Var
 Repair: Integer;
 st: String;
begin
 Inc(DayInMonth[2], Byte((CurrYear mod 4) = 0));
 Write('Дата поломки > '); ReadLn(st);
 Write('Длительность ремонта > '); ReadLn(Repair);

 p := Pos('.', st);
 Day := GetInteger( Copy(st, 1, Pred(p)) );
 Month := GetInteger( Copy(st, Succ(p), Length(st)-p) );

 For i := 1 To Pred(Month) Do
   Inc(DaysBefore, DayInMonth[i]);
 Inc(DaysBefore, Day);

 Inc(DaysBefore, Repair);
 i := 1;
 While DaysBefore > DayInMonth[i] Do
   Begin
     Dec(DaysBefore, DayInMonth[i]); Inc(i)
   End;
 WriteLn('Ремонт закончится: ', DaysBefore, '.', i);
end.
NightPaladin
Насчёт тегово спосибо учту. rolleyes.gif Програма тоже очень пригодилась. smile.gif
Безмерно благодарен.
BUGerKola
volvo
мне нужно без вызова функций. Простым тупым языком +)) мы такого ещё не проходили и я мало во что врубляю в твоих записях. Если можно попроще как-нибудь просто определить дату следующего дня и квартал.при помощи того же перечисляемого типа.

М
не было функций - УЧИ САМ! Тебе дали код, если ты "мал" для него то должен вырасти сам! Так или иначе тебе рано или поздно придется познакомиться с функцими.
Altair

BUGerKola
ты мне скажи, вообще можно как нить это без функций сделать?
М
можно. доделаешь.
Altair

BUGerKola
извиняйте, но или я не врубаюсь в код, или программа совсем не то считает что мне нужно. И как её подправить под себя я не пойму. Там совсем другое считает.
Мне нужно ввести сегоднящнюю дату, и чтоб прога вывела дату следующего дня и квартал
а тут что-то другое
volvo
Цитата
или я не врубаюсь в код
Скорее всего... На запрос "Дата поломки" введи сегодняшнюю дату, "Длительность ремонта" введи 1 день... (Не забудь про CurrYear - сейчас уже 2005)... Получишь дату следующего дня. По месяцу определить квартал не должно быть проблемой...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.