Ada Programlama Dili — Örnekler: Kayıtlar

mozgan
Ada Programlama Dili
5 min readJun 11, 2024
https://intinde.com/wp-content/uploads/2017/11/5-Reasons-Why-Recordkeeping-Is-So-Important.jpg

1. Directions

Bu örnekte aşağıda detayları verilen kayıt türü ve fonksiyonlar yazılacak:

  • İçerisinde Angle_Mod ve Direction türlerine ait iki elemanı barındıran Ext_Angle kayıt türü oluşturulacak.
  • Display metodu Ext_Angle türünden bir parametre alacak ve ekrana bu parametrenin içeriğini yazacak.
  • To_Ext_Angle fonksiyonu Angle_Mod türünden bir parametre alarak Ext_Angle türünden bir nesne döndürecek.

directions.ads

package Directions is

type Angle_Mod is mod 360;

type Direction is
(North, Northeast, East, Southeast, South, Southwest, West, Northwest);

type Ext_Angle is record
Angle_Element : Angle_Mod;
Direction_Element : Direction;
end record;

function To_Direction (N : Angle_Mod) return Direction;
function To_Ext_Angle (N : Angle_Mod) return Ext_Angle;
procedure Display (N : Ext_Angle);

end Directions;

directions.adb

with Ada.Text_IO; use Ada.Text_IO;

package body Directions is

procedure Display (N : Ext_Angle) is
begin
Put_Line
("Angle: " & N.Angle_Element'Image & " => " &
N.Direction_Element'Image & ".");
end Display;

function To_Direction (N : Angle_Mod) return Direction is
begin
case N is
when 0 =>
return North;
when 1 .. 89 =>
return Northeast;
when 90 =>
return East;
when 91 .. 179 =>
return Southeast;
when 180 =>
return South;
when 181 .. 269 =>
return Southwest;
when 270 =>
return West;
when 271 .. 359 =>
return Northwest;
end case;
end To_Direction;

function To_Ext_Angle (N : Angle_Mod) return Ext_Angle is
((Angle_Element => N, Direction_Element => To_Direction (N)));

end Directions;

Derleme ve Test

❯ gnatmake main.adb
gcc -c main.adb
gcc -c directions.adb
gnatbind -x main.ali
gnatlink main.ali

❯ ./main Direction_Chk
Angle: 0 => NORTH.
Angle: 30 => NORTHEAST.
Angle: 45 => NORTHEAST.
Angle: 90 => EAST.
Angle: 91 => SOUTHEAST.
Angle: 120 => SOUTHEAST.
Angle: 180 => SOUTH.
Angle: 250 => SOUTHWEST.
Angle: 270 => WEST.

2. Colors

Bu örnek HTML renklerini RGB formatına dönüştürecek. Yazılacak olan tüm kodlar Color_Types adındaki bir paket içerisinde bulunacak. Bu paketin ayrıntıları ise şöyle:

  • RGB adında bir kayıt türü oluşturulacak. Ve RGB kaydı yalnızca şu üç renge sahip olacak: Red, Green, Blue.
  • To_RGB fonksiyonu HTML_Color türünden bir değeri aşağıdaki tabloya göre RGB türüne dönüştürecek.
+-------------+-----+-------+------+
| Renk | Red | Green | Blue |
+=============+=====+=======+======+
| Salmon | #FA | #80 | #72 |
| Firebrick | #B2 | #22 | #22 |
| Red | #FF | #00 | #00 |
| Darkred | #8B | #00 | #00 |
| Lime | #00 | #FF | #00 |
| Forestgreen | #22 | #8B | #22 |
| Green | #00 | #80 | #00 |
| Darkgreen | #00 | #64 | #00 |
| Blue | #00 | #00 | #FF |
| Mediumblue | #00 | #00 | #CD |
| Darkblue | #00 | #00 | #8B |
+-------------+-----+-------+------+
  • Image fonksiyonu ise RGB türüne ait bir değeri karakter dizisi (string) olarak döndürecek.

color_types.ads

package Color_Types is

type HTML_Color is
(Salmon, Firebrick, Red, Darkred, Lime, Forestgreen, Green, Darkgreen,
Blue, Mediumblue, Darkblue);

function To_Integer (C : HTML_Color) return Integer;

type Basic_HTML_Color is (Red, Green, Blue);

function To_HTML_Color (C : Basic_HTML_Color) return HTML_Color;

subtype Int_Color is Integer range 0 .. 255;

type RGB is record
Red : Int_Color;
Green : Int_Color;
Blue : Int_Color;
end record;

function To_RGB (C : HTML_Color) return RGB;

function Image (C : RGB) return String;

private

HTML_Color_Array : constant array (HTML_Color) of Integer :=
(Salmon => 16#FA_8072#, Firebrick => 16#B2_2222#, Red => 16#FF_0000#,
Darkred => 16#8B_0000#, Lime => 16#00_FF00#,
Forestgreen => 16#22_8B22#, Green => 16#00_8000#,
Darkgreen => 16#00_6400#, Blue => 16#00_00FF#,
Mediumblue => 16#00_00CD#, Darkblue => 16#00_008B#);

RGB_Code_Array : constant array (HTML_Color) of RGB :=
(Salmon => (16#FA#, 16#80#, 16#72#),
Firebrick => (16#B2#, 16#22#, 16#22#),
Red => (16#FF#, 16#00#, 16#00#),
Darkred => (16#8B#, 16#00#, 16#00#),
Lime => (16#00#, 16#FF#, 16#00#),
Forestgreen => (16#22#, 16#8B#, 16#22#),
Green => (16#00#, 16#80#, 16#00#),
Darkgreen => (16#00#, 16#64#, 16#00#),
Blue => (16#00#, 16#00#, 16#FF#),
Mediumblue => (16#00#, 16#00#, 16#CD#),
Darkblue => (16#00#, 16#00#, 16#8B#));

end Color_Types;

color_types.adb

with Ada.Integer_Text_IO;

package body Color_Types is

function To_Integer (C : HTML_Color) return Integer is
(HTML_Color_Array (C));

function To_HTML_Color (C : Basic_HTML_Color) return HTML_Color is
(case C is when Red => Red, when Green => Green, when Blue => Blue);

function To_RGB (C : HTML_Color) return RGB is (RGB_Code_Array (C));

function Image (C : RGB) return String is
subtype Str_Range is Integer range 1 .. 10;
SR : String (Str_Range);
SG : String (Str_Range);
SB : String (Str_Range);
begin
Ada.Integer_Text_IO.Put (To => SR, Item => C.Red, Base => 16);
Ada.Integer_Text_IO.Put (To => SG, Item => C.Green, Base => 16);
Ada.Integer_Text_IO.Put (To => SB, Item => C.Blue, Base => 16);
return
("(Red => " & SR & ", Green => " & SG & ", Blue => " & SB & ")");
end Image;

end Color_Types;

Derleme ve Test

❯ gnatmake main.adb
gcc -c main.adb
gcc -c color_types.adb
gnatbind -x main.ali
gnatlink main.ali

❯ ./main HTML_Color_To_RGB
SALMON => (Red => 16#FA#, Green => 16#80#, Blue => 16#72#).
FIREBRICK => (Red => 16#B2#, Green => 16#22#, Blue => 16#22#).
RED => (Red => 16#FF#, Green => 16#0#, Blue => 16#0#).
DARKRED => (Red => 16#8B#, Green => 16#0#, Blue => 16#0#).
LIME => (Red => 16#0#, Green => 16#FF#, Blue => 16#0#).
FORESTGREEN => (Red => 16#22#, Green => 16#8B#, Blue => 16#22#).
GREEN => (Red => 16#0#, Green => 16#80#, Blue => 16#0#).
DARKGREEN => (Red => 16#0#, Green => 16#64#, Blue => 16#0#).
BLUE => (Red => 16#0#, Green => 16#0#, Blue => 16#FF#).
MEDIUMBLUE => (Red => 16#0#, Green => 16#0#, Blue => 16#CD#).
DARKBLUE => (Red => 16#0#, Green => 16#0#, Blue => 16#8B#).

3. Inventory

Inventory_Pkg paketi içerisinde bulunan Item kayıt türü, Init fonksiyonu ve Add metodu programlanacak:

  • Item kaydı, Item_Name türünden Name adında, Natural türünden Quality adında ve Float türünden Price adında elemanlar barındıracak.
  • Init fonksiyonu verilen parametreler doğrultusunda Item türünden bir nesne döndürecek.
  • Add metodu iki parametre alıyor: Assets ve I. Bu parametreleri kullanarak aşağıdaki formül uygulanacak:
Assets := Assets + Float(I.Quality) * Price;

inventory_pkg.ads

package Inventory_Pkg is

type Item_Name is (Ballpoint_Pen, Oil_Based_Pen_Marker, Feather_Quill_Pen);

function To_String (I : Item_Name) return String;

type Item is record
Name : Item_Name;
Quality : Natural;
Price : Float;
end record;

function Init
(Name : Item_Name; Quantity : Natural; Price : Float) return Item;

procedure Add (Assets : in out Float; I : Item);

end Inventory_Pkg;

inventory_pkg.adb

with Ada.Text_IO; use Ada.Text_IO;

package body Inventory_Pkg is

function To_String (I : Item_Name) return String is
begin
case I is
when Ballpoint_Pen =>
return "Ballpoint Pen";
when Oil_Based_Pen_Marker =>
return "Oil-based Pen Marker";
when Feather_Quill_Pen =>
return "Feather Quill Pen";
end case;
end To_String;

function Init
(Name : Item_Name; Quantity : Natural; Price : Float) return Item
is
begin
Put_Line ("Item: " & To_String (Name) & ".");
return (Name => Name, Quality => Quantity, Price => Price);
end Init;

procedure Add (Assets : in out Float; I : Item) is
begin
Assets := Assets + Float (I.Quality) * I.Price;
end Add;

end Inventory_Pkg;

Derleme ve Test

❯ gnatmake main.adb
gcc -c main.adb
gcc -c inventory_pkg.adb
gnatbind -x main.ali
gnatlink main.ali

❯ ./main Inventory_Chk
Item: Ballpoint Pen.
Assets: $27.75.
Item: Oil-based Pen Marker.
Assets: $927.75.
Item: Feather Quill Pen.
Assets: $1007.75.

--

--