LINUX.ORG.RU
ФорумTalks

[бытие]Сколько дней


0

1
with Ada.Text_IO, Ada.Integer_Text_IO;
use ADa.Text_IO, Ada.Integer_Text_IO;

procedure Age is

   LOW_YEAR    : constant := 1880;
   MAX         : constant := 365.0 * (2100 - LOW_YEAR);
   type AGES is delta 1.0 range -MAX..MAX;
   Present_Age : AGES;

   package Fix_IO is new Ada.Text_IO.Fixed_IO(AGES);
   use Fix_IO;

   type DATE is record
      Month : INTEGER range 1..12;
      Day   : INTEGER range 1..31;
      Year  : INTEGER range LOW_YEAR..2100;
      Days  : AGES;
   end record;

   Today       : DATE;
   Birth_Day   : DATE;

   procedure Get_Date(Date_To_Get : in out DATE) is
   Temp : INTEGER;
   begin
      Put(" month --> ");
      loop
         Get(Temp);
         if Temp in 1..12 then
            Date_To_Get.Month := Temp;
            exit;                       -- month OK
         else
            Put_Line(" Month must be in the range of 1 to 12");
            Put("                    ");
            Put(" month --> ");
         end if;
      end loop;

      Put("                    ");
      Put(" day ----> ");
      loop
         Get(Temp);
         if Temp in 1..31 then
            Date_To_Get.Day := Temp;
            exit;                       -- day OK
         else
            Put_Line(" Day must be in the range of 1 to 31");
            Put("                    ");
            Put(" day ----> ");
         end if;
      end loop;

      Put("                    ");
      Put(" year ---> ");
      loop
         Get(Temp);
         if Temp in LOW_YEAR..2100 then
            Date_To_Get.Year := Temp;
            exit;                       -- year OK
         else
            Put_Line(" Year must be in the range of 1880 to 2100");
            Put("                    ");
            Put(" year ---> ");
         end if;
      end loop;
      Date_To_Get.Days := 365 * AGES(Date_To_Get.Year - LOW_YEAR)
                  + AGES(31 * Date_To_Get.Month + Date_To_Get.Day);

   end Get_Date;

begin
   Put("Enter Today's date; ");
   Get_Date(Today);
   New_Line;

   Put("Enter your birthday;");
   Get_Date(Birth_Day);
   New_Line(2);

   Present_Age := Today.Days - Birth_Day.Days;
   if Present_Age < 0.0 then
      Put("You will be born in ");
      Present_Age := abs(Present_Age);
      Put(Present_Age, 6, 0, 0);
      Put_Line(" days.");
    elsif Present_Age = 0.0 then
      Put_Line("Happy birthday, you were just born today.");
    else
      Put("You are now ");
      Put(Present_Age, 6, 0, 0);
      Put_Line(" days old.");
   end if;

end Age;

Cохраните в age.adb и соберите gnatmake -v age.adb -o age, запустите введите текущие дату, месяц, год и потом дату месяц год своего рождения, может у кого выпадит юбилейный день :-)

★★★★★

Ответ на: комментарий от Deleted

они там не зря з\п получают :-)

splinter ★★★★★
() автор топика

Ну и чем эта Ада так хороша, чтобы её использовать в военно-космических устройствах?ь

Bad_ptr ★★★★★
()

Писать на аде это хорошо, а что на ней написано из ширпотреба?

aptyp ★★★★
()

11226 дней прожитых зря :-)

splinter ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

У неё есть подможество с возможностью formal proof

yoghurt ★★★★★
()
Ответ на: комментарий от splinter
emerge -pv dev-lang/gnat-gcc

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] app-admin/eselect-gnat-1.3-r1  0 kB
[ebuild  N     ] dev-lang/gnat-gcc-4.3.5  USE="nls" 49,206 kB

Total: 2 packages (2 new), Size of downloads: 49,206 kB

Нафиг

Satou ★★★★
()

Если уж решили продемонстрировать нам свое Ада-кунфу, то демонстрируйте по полной. Сделайте такой тип DATA, чтобы в нем были возможны только реально существующие даты, а не какое-либо 31 февраля :)

Deleted
()
Ответ на: комментарий от Deleted

Это не мой код, я просто просматривал примеры.

splinter ★★★★★
() автор топика
Ответ на: комментарий от KivApple

sudo apt-get install gnat-gcc sudo: apt-get: command not found

В винде устанавливается через «скачать»-«распаковать»-«запустить».

splinter ★★★★★
() автор топика
НОВЫЕ пакеты, которые будут установлены:
  gdb gdbserver gnat gnat-4.4 gnat-4.4-base gnat-gps gnat-gps-doc libgnat-4.4
  libgnatprj4.4 libgnatvsn4.4 libgtkada2.14.2 libtemplates-parser11.5
обновлено 0, установлено 12 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 0 B/33,7 MB архивов.
После данной операции, объём занятого дискового пространства возрастёт на 102 MB

Ой, нет, обойдусь

coldy ★★
()
Ответ на: комментарий от Deleted

if Month=2 then
if day > 28 then
Put_Line(«Fuck»);
Get(Temp);
end if;
end if;

Примерно так, еще бы не мешало проверку на високосный год.

splinter ★★★★★
() автор топика
Ответ на: комментарий от Cancellor

Вот всегда говорил и буду говорить Cancellor на LOR мой лучший друг и соратник! :-)

splinter ★★★★★
() автор топика

а в чём прикол этого?

   LOW_YEAR    : constant := 1880;
   MAX         : constant := 365.0 * (2100 - LOW_YEAR);

зачем расчёт на этой константе, для наглядности?

coldy ★★
()
Ответ на: комментарий от coldy

по моему тут все наглядно и логично, жизненный цикл человеа поместили в 220 лет, родиться раньще 2012 года ты немог, а если мог то правь очевидную константу.

splinter ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Она читабельна

По примеру из ОП-поста я бы так не сказал.

power
()
Ответ на: комментарий от buddhist

копипаста - * Ada: После тщательной сборки пакета «нога», вы пытаетесь одновременно зарядить пистолет, нажать курок, завопить и выстрелить себе в ногу. В ходе попыток обнаруживается, однако, что вас постигла неудача, так как ваша нога оказалась неверного типа.

coldy ★★
()
type DATE is record
      Month : INTEGER range 1..12;
      Day   : INTEGER range 1..31;
      Year  : INTEGER range LOW_YEAR..2100;
      Days  : AGES;
   end record;
...
...
Date_To_Get.Days := 365 * AGES(Date_To_Get.Year - LOW_YEAR)
                  + AGES(31 * Date_To_Get.Month + Date_To_Get.Day);

тут не Аду, тут информатику на уровне средней школы надо учить :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

не мой код, комментарий коду:


-- This program will calculate the number of days old you are.
-- It is a rather dumb program, but illustrates some interesting
-- programming techniques. It checks all input to see that they
-- are in the correct range before continuing. Since the number
-- of days can easily exceed the limits of type INTEGER, and we
-- cannot count on LONG_INTEGER being available, a fixed point
-- variable is used for the total number of days since Jan 1, 1880.
-- This program also passes a record to a procedure, where it is
-- modified and returned.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

не мой код

а тогда смысл его просто так публиковать? код реально плох, содержит грубые программные ошибки. Вы бы тогда их хотя-бы указали/разобрали - глядишь для newbeez оказалось-бы полезно.

MKuznetsov ★★★★★
()

Почему никто до сих пор не спросил, зачем руками вводить сегодняшнюю дату? Или ада только так умеет?

gentoo_root ★★★★★
()
Ответ на: комментарий от xorik

Вы прожили 10035 дней!

Кстати, человек живёт в среднем около 30 тысяч дней. Не проживите ни одного дня, не сделав чего-нибудь хорошего и полезного!

треть среднестатистической жизни прожита впустую -_-

dismal_faun ★★
()
Ответ на: комментарий от splinter

Примерно так,

В Ada 2012 есть доп. плюшки как раз на тему условий и инвариантов.

еще бы не мешало проверку на високосный год.

Обязательно!

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.