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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 18:39   #1
Guagpro
 
Регистрация: 21.01.2013
Сообщений: 9
По умолчанию Определить дату

Дата некоторого дня характеризуется тремя натуральными числами: g (год), m (порядковый номер месяца) и n(число). По заданным g, n и m определить дату предыдущего дня.
Сделать программу через подпрограмму.
Код:
var
g,n,m:integer;
procedure a;
var
 g,n,m:integer;
begin
 if g=1 then
 if n=1 then
begin
 g:=31;
 n:=12;
 m:=m-1;
end
else
begin
 n:=n-1;
 if n=1 then 
 g:=31;
 if n=2 then
 g:=28;
 if n=3 then
 g:=31;
 if n=4 then
 g:=30;
 if n=5 then
 g:=31;
 if n=6 then
 g:=30;
 if n=7 then
 g:=31;
 if n=8 then
 g:=31;
 if n=9 then
 g:=30;
 if n=10 then
 g:=31;
 if n=11 then
 g:=30;
 if n=12 then
 g:=31;
end
else
begin
 g:=g-1;
end;
end;
begin
 writeln('введите дату в формате День.Месяц.Год');
 readln(g,n,m);
 a;
 writeln(g,n,m);
end.
Он мне почему то день выводит ту же самую дату что и ввел, и условие где выдает сколько дней в месяце как нибудь поменьше сделать

Последний раз редактировалось Guagpro; 23.01.2013 в 18:54.
Guagpro вне форума Ответить с цитированием
Старый 23.01.2013, 19:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

EncodeDate(g,n,m) - дата
EncodeDate(g,n,m)-1 - дата предыдущего дня
DaysInAMonth - кол-во дней в заданном году и месяце

Не обратил внимания, что паскаль. Это для дельфей
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.01.2013, 19:46   #3
Guagpro
 
Регистрация: 21.01.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
EncodeDate(g,n,m) - дата
EncodeDate(g,n,m)-1 - дата предыдущего дня
DaysInAMonth - кол-во дней в заданном году и месяце

Не обратил внимания, что паскаль. Это для дельфей
пичаль
Guagpro вне форума Ответить с цитированием
Старый 23.01.2013, 19:55   #4
Guagpro
 
Регистрация: 21.01.2013
Сообщений: 9
По умолчанию

Сделал вот так строчка с вызовом процедуры в самом паскале почему то пропускается и выдает мне то же число что я ввел изначально если удаляю строчку mes(g,n,m); ничего не меняется.HELPPP
Код:
var
g,n,m:integer;
procedure mes(g,n,m:integer);
begin
if g =1 then
if n=1 then
begin
g:=31;n:=12;m:=m-1;
end
else
begin
case n of 
3,5,7,8,10,12:g:=31;
4,6,9,11:g:=30;
2:g:=28;
end;
g:=g-1;
end
else
g:=g-1;
end;
begin
write('data');
read(g,n,m);
mes(g,n,m);
writeln(g,'.',n,'.',m);
end.
Guagpro вне форума Ответить с цитированием
Старый 23.01.2013, 20:40   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Мой вариант - без учета високосных лет - как-то так:

Код:
const days:array [1..12] of word=(31,28,31,30,31,30,31,31,30,31,30,31);


Procedure PrevDay(var d,m,y: word);
begin
  if (d=1) then begin
    if (m=1) then begin
      y:=y-1;
      m:=12;
      d:=Days[12];
    end
    else begin
      m:=m-1;
      d:=Days[m];
    end
  end
  else d:=d-1;
end;

var g,n,m:word;

begin
  ReadLn(n,m,g);
  WriteLn(n,'.',m,'.',g);
  PrevDay(n,m,g);
  WriteLn(n,'.',m,'.',g);
  ReadLn;
end.
А в Вашей программе чтобы все заработало - нужна самая малость:

Код:
procedure mes(var g,n,m:integer);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 23.01.2013 в 20:56.
Sciv вне форума Ответить с цитированием
Старый 23.01.2013, 21:29   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Вот мой :
Писал в браузере :
Код:
const
   DayInMonth : array [1..12] of Byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function IsLeapYear (y : Integer) : Boolean;
begin
    IsLeapYear := (y mod 400 = 0) or ((y mod 4 = 0) and (y mod 100 <> 0));
end;
var
    d, m, y : Integer;

begin
    ReadLn (d, m, y);
    if (d = 1) and (m = 1) then begin
        d := 31;
        m := 12;
        Dec (y)
   end
   else
      
    if d = 1 then begin
        d := DayInMonth[m-1];
        Dec (m);
        if (m = 2) and (IsLeapYear (y)) then
             Inc (d);
        
   WriteLn (d, ' ', m, ' ', y)
end.
Poma][a вне форума Ответить с цитированием
Старый 23.01.2013, 21:34   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ромаха, ему через подпрограмму нужно предыдущий день определять, переоформляй. А так - мне нравится, держи плюс
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 23.01.2013, 21:41   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
А так - мне нравится, держи плюс
Спасибо
Цитата:
ему через подпрограмму нужно предыдущий день определять, переоформляй.
Ой, это как нибудь без меня
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить сколько знаков в числе, вычислить сумму цифр и определить старшую цифру Blombox Помощь студентам 5 25.04.2011 15:52
запрос на дату WALL БД в Delphi 22 05.11.2010 20:24
Определить версию ОС, дату установки и последнего перезапуска Manonia Общие вопросы Delphi 4 22.03.2010 18:33
Задачка на дату KREGI Помощь студентам 3 03.06.2009 06:37
Среди 20 введёных чисел определить чётные, распечатать их, определить min Spade Помощь студентам 4 15.06.2008 18:39