Ada Programlama Dili — Örnekler: Kayıtlar
Published in
5 min readJun 11, 2024
1. Directions
Bu örnekte aşağıda detayları verilen kayıt türü ve fonksiyonlar yazılacak:
- İçerisinde
Angle_Mod
veDirection
türlerine ait iki elemanı barındıranExt_Angle
kayıt türü oluşturulacak. Display
metoduExt_Angle
türünden bir parametre alacak ve ekrana bu parametrenin içeriğini yazacak.To_Ext_Angle
fonksiyonuAngle_Mod
türünden bir parametre alarakExt_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
fonksiyonuHTML_Color
türünden bir değeri aşağıdaki tabloya göreRGB
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 iseRGB
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ündenName
adında,Natural
türündenQuality
adında veFloat
türündenPrice
adında elemanlar barındıracak.Init
fonksiyonu verilen parametreler doğrultusundaItem
türünden bir nesne döndürecek.Add
metodu iki parametre alıyor:Assets
veI
. 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.