Ada Programlama Dili Temelleri

Ek3

Ada_Text_IO Program Paketi

(Standart Giriş/çıkış Ortamı Uygulamaları)

Ek-3 Sayfa 1

Ada.Text_IO Öntanımlı Paketinin Tanıtımı

Ada çekirdek sisteminde tanımlanmamış olan veri giriş çıkışları, dosya sistemleri, işletim sistemi ile ilişki kurulması gibi yöntemler, Ada derleyicisi ile birlikte verilen öntanımlı paketler halinde verilir. Ada 2012 spesifikasyonu derleyici ile birlikte verilmesi gereken öntanımlı paketleri belirlemiştir. Bu paketlere Standard Kitaplıklar (Standart Libraries) adı verilmiştir.

Ada 2012 spesifikasyonu Standard paketi, program dilinin ayrılmaz bir parçası olarak kabul eder ve Standard paket, her programın otomatik olarak tanıyacağı bir bilgi olarak düşünülür. Bir program with bildirimine gerek duymadan Standard paketten yararlanır. Bu pakette Boolean, Integer, Float, Character, Wide_Character, Wide_Wide_Character, String, Wide_String, Wide_Wide_String, Duration tipi veriler tanımlanır. Standard paket, bu şekilde,tüm öntanımlı veri sistemini tanımlar ve kullanıcının yaralanmasına hazır hale getirir. Bu nedenle, Ada 2012 spesifikasyonu, Standard paketi diğer öntanımlı kitaplık paketleri arasında saymaz ve daha çok Ada derleyicisi ile kaynaşmış olarak kabul eder.

Ada 2012 spesifikasyonu, Öntanımlı Ada Programlama Dili Ortamının üç tane kök kitaplık biriminden oluşacağını belirtmiştir. Bunlar,

paketleridir. Diğer paketler bunların alt paketleridir.

Öntanımlı paketlerden en çok kullanılanı Ada genel paketinin bir alt paketi olarak düzenlenmiş, Ada.Text_IO paketidir. Ada.Text_IO paketinde, Standard pakette tanıtılmış tüm veri sistemi için, dosyalama ve stanadrt giriş/çıkış olarak öntanımlı olan klavye giriş ve ekran çıkışlarının sağlandığı prosedürler tanımlanmıştır. Ada.Text_IO paketi ayrıca kullanıcı tanımlı alt veri tiplerinin de giriş/çıkışlarını sağlayabilmektedir.

Ada.Text_IO Paketinden Yararlanılarak Sözel Verilerin Giriş/Çıkışlarının Gerçekleştirilmesi

Bu kısımda, Ada.Text_IO öntanımlı paketinin sözel verilerin monitör çıkışlarının sağlanması konusunu inceleyeceğiz. Bunun için Ada 2012 Referans kitabının A.10 Ada.Text_IO öntanımlı paketinin sadece sözel verilerin monitör çıkışlarının sağlanması ile ilgili kısımlarının incelenmesi yararlı olacaktır.

The library package Text_IO has the following declaration:
with Ada.IO_Exceptions;
package Ada.Text_IO is
		type File_Type is limited private;
		type File_Mode is (In_File, Out_File, Append_File);
		type Count is range 0 .. implementation-defined;
		subtype Positive_Count is Count range 1 .. Count'Last;
		Unbounded : constant Count := 0; -- line and page length
		subtype Field is Integer range 0 .. implementation-defined;
		subtype Number_Base is Integer range 2 .. 16;
		type Type_Set is (Lower_Case, Upper_Case);
		
-- Specification of line and page lengths

		procedure Set_Line_Length(To : in Count);

		procedure Set_Page_Length(To : in Count);

		function Line_Length return Count;

		function Page_Length return Count;
		
		-- Column, Line, and Page Control
		
    Spacing : in Positive_Count := 1);
    procedure New_Line (Spacing : in Positive_Count := 1);

    Spacing : in Positive_Count := 1);
    procedure Skip_Line (Spacing : in Positive_Count := 1);

    function End_Of_Line return Boolean;

    procedure New_Page;

    procedure Skip_Page;

    function End_Of_Page return Boolean;

    procedure Set_Col (To : in Positive_Count);

    procedure Set_Line(To : in Positive_Count);

    function Col return Positive_Count;

    function Line return Positive_Count;

    function Page return Positive_Count;
		
-- Character Input-Output

    procedure Get(Item : out Character);
		
    procedure Put(Item : in Character);
		
    procedure Look_Ahead (Item : out Character;
                                    End_Of_Line : out Boolean);
																		
    procedure Get_Immediate(Item : out Character);

    procedure Skip_Page;

    function End_Of_Page return Boolean;

    procedure Set_Col (To : in Positive_Count);

    procedure Set_Line(To : in Positive_Count);

    function Col return Positive_Count;

    function Line return Positive_Count;

    function Page return Positive_Count;

-- Character Input-Output

    procedure Get(Item : out Character);

    procedure Put(Item : in Character);

    procedure Get_Immediate(Item : out Character);

    procedure Get_Immediate(Item : out Character;
                                     Available : out Boolean);
-- String Input-Output

    procedure Get(Item : out String);

    procedure Put(Item : in String);

    procedure Get_Line(Item : out String; Last : out Natural);

    function Get_Line return String;

    procedure Put_Line(Item : in String);

......

		

olarak tanımlamıştır. Bu tanımda, çeşitli varsayılan değerler, kulaanıcıların varsayılan değerleri değiştirebilecekleri prosedürler ve güncel değerlerin geri döndürüldüğü, bilgi alma prosedürleri bulunmaktadır.

Ada.Text_IO paketinin tanım kısmında,

    type Count is range 0 .. implementation-defined;
    subtype Positive_Count is Count range 1 .. Count'Last;
		

tanımı bulunmaktadır. Bu ifade, Count tipinin 0 ile yerleştirmeye çalışılan ortamın yapısına) bağlı bir değere kadar olan aralıkta tamsayı değerler alabileceğini gösterir. Bu tipin bir alt tipi olan Positive_Count adlı alt tipin, Count tipi olduğunu ve değer aralığının 1 den başlayacağını belirtir. Bu bilgi kullanıcıların Ada.Text_IO paketinde tanımlı prosedürleri çağırmasında önemli olmaktadır.

Ada.Text_IO paketinde, karakter ve karakter dizisi tipinde verilerin giriş/çıkış işlemlerine yönelik prosedürler :

procedure Put(Item : in Character);
ve
procedure Put(Item : in String);
		

olarak tanımlanmıştır. Görüldüğü gibi, Ada.Text_IO program paketinde sözel verilerin giriş/çıkış işlemleri için iki tane Put prosedürü tanımlanılmaktadır. Ada.Text_IO paketinde başka verilerin giriş/çıkış işlemlerine yönelik daha birçok Put prosedürü bulunmaktadır. Buna prosedür bindirmesi (overloading) adı verilir. Ada derleyicisi, bindirilmiş prosedürlerin çağrıldığı veri tipini algılayarak doğru prosedürü bulur. Bir çelişki görüldüğünde hata oluşur

Put prosedürünün tanımında görüldüğü gibi, sözel verilerin giriş/çıkılına yönelik iki Put prosedürünün birisinin Character diğerinin String tipinde tek bir argümanı bulunmaktadır. String tipi Ada program dilinde özel bir veri tip değil sadece bir karakter dizisi olarak değerlendirilir. Bu düşünce de, bu verilerin Türkçe karşılığı olan Karakter Dizisi deyimini doğrulamaktadır. Burada prosedürün tanımında kullanılan Item adlı ve string tipinde olması gerektiği bildirilen argüman bir tanım argümanıdır. Buna prosedürün değerlendireceği parametre anlamında formal parametre veya tanım argümanı veya sadece argüman adı verilir. Bir prosedür (veya bir fonksiyon çünkü her ikisinin de işleyişi aynıdır) formal parametre ile tanımladığı çalışma yöntemini gerçek parametrelerle gerçekleştirir. Gerçek parametreler, tanım parametrelerinin yerine geçerek kullanılırlar. Gerçek program koşullarında tanım parametresinin tanımı ile uyumlu bir gerçek değişken, tanım parametresinin (formal parametrenin) yerine konularak prosedür çalıştırılır.

Ada programlama dilinde, prosedürlerin çağrılması için iki yöntem kullanılır. Birisi prosedür ismi (formal_parametre => gerçek_parametre , . varsa diğer formal_parametreler => gerçek parametreler şeklindedir. burada parametre sırasının gözetilmesi gerekmez. Diğeri doğrudan doğruya prosedür adı(gerçek_parametre1, varsa gerçek_parametre2.. ) şeklindedir burada formal parametlerinin tanım sırasının gözetilmesi gerekir. Bir prosedürün sadece bir tek argümanı varsa, o prosedürün çağrılması için, adla çağırma yöntemi genellikle gereksiz görülür, Fakat, birden fazla argümanı olan prosedürlerin çağrılması için, isimle çağırma yöntemi daha açıklayıcı ve hata yapılması olasılığı daha az olduğundan, çoğunlukla adla çağırma yöntemi kullanılır.

Put prosedürü, tek karakter veya karakter dizisi verilerini ilk sütündan başlayarak ekrana yazar ve verinin yazımı tamamlanınca, kürsörü bir sonraki sütuna konumlandırarak çıkar. Bundan sonraki ilk Put prosedürü çağrısında, verinin yazımı, kürsörün kaldığı sütündan devam eder. Bu nedenle verilerin yazımının ayrılabilmesi için gerektiğinde New_Line prosedürü kullanılır. Bu prosedür

procedure New_Line(Spacing : in Positive_Count);
		

şeklindedir. New_line prosedürünün argümanı (parametresi) tamsayı olarak atlanması gereken yeni satır sayısını belirtir. Bu sayı varsayılan olarak 1 değerinde olduğundan, New_line prosedürü hiç argümansız olarak kullanıldığında kürsör doğrudan bir alt satırın başına atlar.

Eğer, Put(...);New_Line; çiftinden kurtulmak istenirse, Put_Line prosedürü kullanılabilir. Bu prosedür,

procedure Put_Line(Item : in String);
		

şeklindedir. Argümanı olan karakter dizisini ekrana yazdırdıktan sonra kürsörü bir alt satırın başına atlatır.

Buraya kadar incelediğimiz prosedürlerin uygulamalarını yapalım :

-- Character (Standard.Character)  ve String (Standard.String) veri Tipleri
--  Konsol Çıktıları

with Ada.Text_IO;

procedure e3_1_uyg_1 is

Adı : String (1..5) := ('B' , 'e' , 'd' , 'r' , 'i');

Soyadı : String (1..4);

Boşluk : Character := ' ';

Adı_ve_Soyadı : String (1..10);

Doğum_Yeri : constant String := "Istanbul";

begin

Soyadı := "Emir";

Adı_ve_Soyadı := Adı & Boşluk & Soyadı;

Ada.Text_IO.Put(Item =>"Adı_ve_Soyadı : ");

Ada.Text_IO.Put(Item => Adı_ve_Soyadı);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item =>"Doğum Yeri : ");

Ada.Text_IO.Put(Item => Doğum_Yeri);

end e3_1_uyg_1;

Bu programın sonucu, 

Adı ve Soyadı : Bedri Emir
Doğum Yeri : Istanbul

olmaktadır.
		

olmaktadır. Bunun nedeni, Put_Line prosedürünün argümanı olan karakter dizisini ekrana yazdırdıktan sonra otomatik olarak bir alt satıra geçmesidir. Bu program, kullanıcının ekrana yazımda istediğinde mesaj ve sonucu aynı satırda, istediğinde ise ayrı satırlara yazabilme olanağını olduğunu açıklamaktadır.

Ada.Text_IO paketinden kullanabileceğimiz bir başka prosedür, Get metodudur. Bu metot, buraya kadar incelediklerimizin aksine, bir yakalama (capture) metodudur. Get metodu geçerli, giriş ortamından girilen verileri okur. Get metotları Character ve String veri tipleri için:

procedure Get(Item : out Character);
ve
procedure Get(Item : out String);
		

olarak tanımlanmıştır. Bu tanım, Get metodunun yakaladığı Karakter dizisi veya karakter tipindeki değeri geri döndüreceğini belirtir. Bu prosedür, konsoldan bir değer okunup bir değişkene atamakta yani karşılıklı etkileşimli (interaktif) programlar oluşturmakta kullanılır. Böyle bir program, aşağıda görülmektedir.

-- Character ve String veri Tipleri
--  Konsol Çıktıları
--  Interaktif Program

with Ada.Text_IO;

procedure e3_1_uyg_2 is

Adı : String (1..5);

Soyadı : String (1..4);

Boşluk : constant Character := ' ';

Adı_ve_Soyadı : String (1..10);

Doğum_Yeri : constant String := "Istanbul";

begin

Ada.Text_IO.Put("Adınızı Giriniz : ");

Ada.Text_IO.Get(Item => Adı);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Soyadınızı Giriniz : ");

Ada.Text_IO.Get(Item => Soyadı);

Ada.Text_IO.New_Line;

Adı_ve_Soyadı := Adı & Boşluk & Soyadı;

Ada.Text_IO.Put_Line(Item => "Girilen Ad ve Soyad : " & Adı_ve_Soyadı);

end e3_1_uyg_2;
		

Yukarıdaki programda, ilk kez uygulanan Get metodu, önce konsoldan girilen veriyi yakalamakta sonra bu veriyi, tanımlar kısmında tanıtımı yapılmış olan değişkene atamaktadır. Bu işlem, etkileşimli programların oluşturulmasında temel yöntemdir.

Verilerin klavyeden girilmesi (Get metodu), sonuçların monitörden gösterimi (Put metodu) nun işleyişinin bu şekilde olmasına karşın, bu metodun uygulanmasında kullanıcıyı zorlayan bir yön bulunmaktadır. Ada programlama dili güçlü tip kontrolü yapan (strongly typed) bir programlama dilidir. Bu nedenle, derleyici, tüm veri tiplerinin uygulanmadan önce tam olarak tanımlanmış olmasını kuvvetle kontrol eder. Bu şekilde, dizilerin de tanımı sırasında eleman sayıları belirtilmiş olması gerektiğinden, karakter dizisi olarak algılanan String veri tipinin karakter sayısı, yani eleman sayısı da önceden belirlenmiş olmalıdır. Yukarıdaki program da bu durum, Adı veri tipinin eleman sayısının 5 karakter olacağını, ilk karakterin eleman sırasının 1 olacağını, son karakterin eleman sırasının 5 olacağını belirtir. Soyadı verisinin de aynı şekilde, 4 elemanlı bir karakter dizisi (String) tip veri olacağı belirtilir. Buraya kadar bir sorun yoktur, fakat sorun, bu değişkenlere konsoldan değer atanmak istenirken yaşanır. Bu verileriden Adı veri tipine, konsoldan sadece 5 karakterli bir veri girilebilir. Adı verisine girilen değer 5 den az veya 5 den fazla olursa kapsam aşımı hatası (Constraint Error) oluşur. Girilecek verinin karakter sayısı 5 den az ise, eksik olan karakterler yerine boşluk elemanları girilerek aradaki fark kapatılabilir. Fakat, girilecek değer 5 den yukarı ise sorunun aşılabilmesinin bir olanağı yoktur. Bu nedenle, sabit karakter sayılı String tipi veriler, sadece yukarıdaki programda görüldüğü gibi karakter sayısı önceden belli olan sabitler (constants) için uygundur. Karakter sayısı önceden belli olmayan, (örnek olarak bir insanın ismi değişik sayıda karakter içerebilir) değişken verilerin konsoldan, sabit karakter sayılı String tipi verilere girilebilmesi için, alınabilecek bir önlem bu verilerin karakter sayısını girilebilecek sayının olası değerinden yukarı tutmak ve aradaki farkları boşluk karakterleri ile tamamlamak olabilir. Bu da verilerin girişi için fazla önerilebilecek bir yöntem sayılmayabilir.

Ada programlama dilinde, karakter sayıları belli olmayacak karakter dizisi verilerine değer atanması için kısıtsız (unbounded) karakter dizgileri tanımlanmıştır. Bir sonraki örnekte bu yöntem uygulanmıştır.

Etkileşimli programlarda yararlanılabilecek bir başka metot, Skip_Line metodudur. Bu metot programın çalışmasını durdurmakta ve kullanıcının ekrandan el ile satır atlatmasını (return tuşuna basılmasını) beklemektedir. Etkileşimli programlarda bu metot çok yararlı olabilir Skip_Line metodunun tanımı,

procedure Skip_Line(Spacing : in Positive_Count);
		

şeklindedir. Skip_Line metodunun bir uygulaması aşağıda görülmektedir :

-- Character ve String veri Tipleri
--  Konsol Çıktıları
--  Interaktif Program

with Ada.Text_IO;
with Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO;

procedure e3_1_uyg_3 is

Adı : Ada.Strings.Unbounded.Unbounded_String;

Soyadı : Ada.Strings.Unbounded.Unbounded_String;

Doğum_Yeri : constant String := "Istanbul";

begin

Ada.Text_IO.Put(Item => "Adınızı Giriniz : ");

Ada.Text_IO.Unbounded_IO.Get_Line(Item => Adı);

Ada.Text_IO.Put(Item => "Soyadınızı Giriniz : ");

Ada.Text_IO.Unbounded_IO.Get_Line(Item =>Soyadı);

Ada.Text_IO.Put_Line(Item => "Girilen Ad ve Soyad ve Doğum Yerini Görmek İçin Lütfen Return Tuşuna Basınız !");

Ada.Text_IO.Skip_Line;

Ada.Text_IO.Put_Line(Item => "Adı ve Soyadı : " & Ada.Strings.Unbounded.To_String(Source => Adı) & Ada.Strings.Unbounded.To_String(Source => Soyadı));

Ada.Text_IO.Put_Line(Item => "Doğum Yeri : " & Doğum_Yeri);

end e3_1_uyg_3;

Bu programın sonucu, 

Adı ve Soyadı : Bedri Doğan Emir
Doğum Yeri : Istanbul

olmaktadır. (Program sonucu girilen değerlere bağlıdır)
		

Yukarıdaki programda, karakter dizilerinin boyutlarıında kapsam sınırlaması olmadığından, değişik genişlikte diziler (karakter sayıları birbiribinden farklı karakter dizileri) (karakter sayıları değişebilen String tipi veriler) klavyeden kolylıkla girilebilmektedir. Program yazımı biraz yüklü olarak düşünülebilir. Aslında bu yöntemde, tüm metotların geldiği paketler ve tüm çağrılan metotların tanım argümanlarının yerine geçecek gerçek argümanlar, açıkça belirtilmekte olduğundan, program yazımı yüklü olmakatdır. Yazım yüküne karşılık, oluşturulan program en üst düzeyde bilgi verici, izlenmesi kolay dolayısı ile ilerde başkalarının kullanması ve bakımı, güncelleştirilmesi kolay olan bir programdır. Buna karşılık, Ada programlama dilinde, use bildirimi kullanılarak, paketlerin içinde imiş gibi çalışılması ve metotların ait oldukları paket adlarının önek olarak kullanılma zorunluğunun ortadan kaldırılmış olduğu yazımı olabildiğine kısaltılmış programlar da yazılabilir. Ayrıca çağrılan paket, prosedür veya fonksiyonların gerçek argümanlarının, yerine geçecekleri tanım argümanların isimleri yerine, tanım argümanlarının tanım sıralarına göre belitilmesi, program yazımını daha da kısaltacaktır. Yukarıdaki programın böyle bir kısaltılmış yazımı aşağıdaki programda uygulanmıştır.

-- Character ve String veri Tipleri
--  Konsol Çıktıları
--  Interaktif Program

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;

procedure e3_1_uyg_3_striped is

Adı, Soyadı : Unbounded_String;


Doğum_Yeri : constant String := "Istanbul";

begin

Put("Adınızı Giriniz : ");

Get_Line(Adı);

Put("Soyadınızı Giriniz : ");

Get_Line(Soyadı);

Put_Line("Girilen Ad ve Soyad ve Doğum Yerini Görmek İçin Lütfen Return Tuşuna Basınız !");

Skip_Line;

Put_Line("Adı ve Soyadı : " & To_String(Adı) & To_String(Soyadı));

Put_Line("Doğum Yeri : " & Doğum_Yeri);

end e3_1_uyg_3_striped;

Adınızı Giriniz : Bedri Doğan
Soyadınızı Giriniz : Emir
Girilen Ad,  Soyad ve Doğum Yerini Görmek İçin Lütfen Return Tuşuna Basınız 

Adı ve Soyadı : Bedri Doğan Emir
Doğum Yeri : Istanbul

olmaktadır.  (Program sonucu girilen değerlere bağlıdır)
		

Eğer bu programın yazımı size çekici geldi ise, bir an önce bu düşünceden kurtulmakta yarar bulunmaktadır. Çünkü bu tür yazım, tam bir bilinmezler topluğudur. Hiçbir büyüklüğün nereden kaynaklandığı belli değildir. Bu program başka birisine gönderilse, o kişi bu programdan hiçbir şey anlayamaz. Derleyici bile hangi metodun hangi paketten kaynaklandığını belirlemekte zorlanır. Bu tür programlarla bir proje yapılsa, kısa sürede o proje felaketle sonuçlanır. Bu programı yazan kısa bir süre sonra bu programı bakım vaya yenileme amacı ile yeniden okumaya çalışşsa, kendi programından kendisi bile birşey anlamaz. Bu tür program yazımını düşünmemek gerekir. Sadece, prosedürleri çağırırken, argümanlar tanım isimleri ile değil, tanım sıralarına göre yerleştirilebilir. Bu fazla bir karışıklık yaratmaz, çünkü, hangi prosedürle çalışıldığı bellidir, gerekirse spesifikasyonu açılıp bakılır. Bunun dışında hiçbir kısaltma düşünülmemelidir.

Ada.Text_IO paketinde, sayfa genişliği, sütun kontrolu gibi işlemlerin gerçekleştirilebileceği prosedürler bulunmaktadır. Bunlardan birisi, satır genişliğini belirleyen Set_Line_Length diğeri de sayfa genişliğini belirleyen Set_Page_Length prosedürüdür. Bu prosedürler,

procedure Set_Line_Length (To :  in count)
ve
procedure Set_Page_Length (To :  in count);
		

şeklinde tanımlanırlar. Bu konuda bir örnek aşağıda görülmektedir:

with Ada.Text_IO;

procedure e3_1_uyg_4 is
			
begin

Ada.Text_IO.Set_Line_Length(To => 80);

end e3_1_uyg_4;
		

Yeni bir sayfaya geçilmesini sağlayan metotlar

procedure New_Page
ve
procedure Skip_Page;
		

olarak verilmiştir. Bu metotlar gerektiğinde kullanılabilirler.

Sütun ve satır başlangıcını belirleyen prosedür,

procedure Set_Col (To :  in Positive_Count)
ve
procedure Set_Line (To :  in Positive_Count);
		

olarak tanımlamıştır. Sütun belirlenmesi tablo çıkışları için çok yararlıdır. Bu konudaki bir örnek, aşağıdaki uygulamada görülebilir.

with Ada.Text_IO;

procedure e3_1_uyg_5 is

İsim : String :="Ali";

begin

Ada.Text_IO.Set_Col(To => 40);

Ada.Text_IO.Put(Item => "Adı :");

Ada.Text_IO.Set_Col(To => 50);

Ada.Text_IO.Put(Item => İsim);

end e3_1_uyg_5;

Bu programın sonucu, 

 Adı :     Ali

olmaktadır.
		

Satır belirlenmesi yine tablo çıkışları için çok yararlıdır. Bu konudaki bir örnek, aşağıdaki uygulamada görülebilir.

with Ada.Text_IO;

procedure e3_1_uyg_6 is

İsim : String :="Ahmet";

begin

Ada.Text_IO.Set_Col(To => 40);

Ada.Text_IO.Put(Item => "Adı :");

Ada.Text_IO.Set_Line(To => 3);

Ada.Text_IO.Set_Col(To => 40);

Ada.Text_IO.Put(Item => İsim);

end e3_1_uyg_6;
		
Bu programın sonucu,



                                       Adı :

                                       Ahmet

olmaktadır.
		

Ada 2005 den geçerli olarak konsoldan karakter dizisi verilerinin okunması için, Get_Line metodu geliştirilmiştir. Get_Line prosedürünün iki argümanı tanımlanmıştır. Bunlardan ilki, Item, bir karakter dizisi (String) verisidir. Her String de olduğu gibi, bu String verisinin de bir uzunluğu tanımlanmalıdır. Burada, bu uzunluğun karşılaşılabilecek en uzun karakter dizisi verisi düşünülerek verilmesi uygun olacaktır. Last bir Natural tipinde tamsayı değeridir. Başlangıç değerinin verilmesi şart değildir. Bu metot, klavyeden girilen tüm karakterleri okuyacak ve son karakteri last argümanına atayacak, sonra alt satıra geçecektir. Eğer satır sonuna gelinirse, okuma bitirilecek ve alt satıra geçilecektir. Klavyeden girilmeyen karakterler, karakter dizisine eleman olarak yerleştirilmeyecek, karakter dizisi verisinin, tanımlanan kapsamından beklenen fakat klavyeden girilmeyen karakterler yok sayılacaktır. Klavyeden girilerek değişkene atanan karakter dizisi değerinin ilk konum sayısı 1 olacak son konum numarası Last olacaktır. Bu metodun basit bir kullanımı aşağıdaki programda verilmiştir:

with Ada.Strings;

with Ada.Text_IO;

procedure e3_1_uyg_7 is
			
Str1, Str2 : String (1..25);

Last1, Last2 : Natural;

begin

Ada.Text_IO.Put(Item => "Adınızı Giriniz : ");

Ada.Text_IO.Get_Line(Str1, Last);

Ada.Text_IO.Put(Item => "Soyadınızı Giriniz : ");

Ada.Text_IO.Get_Line(Str2, Last);

Ada.Text_IO.Put_Line(Item => "Girilen Ad ve Soyad ve Doğum Yerini Görmek İçin Lütfen Return Tuşuna Basınız !");

Ada.Text_IO.Skip_Line;

Ada.Text_IO.Put_Line(Item => "Adı ve Soyadı : " & Str1(1..Last1) & " " & Str2(1..Last2));

Ada.Text_IO.Put_Line(Item => "Doğum Yeri : " & Doğum_Yeri);

end e3_1_uyg_7;


Bu programın sonucu,

Adınızı Giriniz : Bedri Doğan
Soyadınızı Giriniz : Emir
Girilen Ad,  Soyad ve Doğum Yerini Görmek İçin Lütfen Return Tuşuna Basınız 

Adı ve Soyadı : Bedri Doğan Emir
Doğum Yeri : Istanbul

olmaktadır.  (Program sonucu girilen değerlere bağlıdır)
		

Yukarıdaki programda klavyeden Uzunluğu farklı karakter dizilerinin girilebilmesi için, etkili Get_Line metodu uygulanmıştır. Bu metot çok kullanışlıdır veAda.Strings.Unbounded paketinin kullanılmasını gereksiz hale getirmekte de program listesini kısaltmaktadır. Buna rağmen bu yöntem sadece Ada 2005 ve daha yukarısını destekleyebilen derleyicilerde derlenebilmektedir. GNAT 2012 nin serbestçe dağıtılması sonunda, derleyici sorunu kalmadığından, yeni yazılacak programlar için, eskiye uyumsuzluk sorun oluşturmayacaktır.

Ada.Text_IO paketinde, karakter tipinde veriler için iki tane Get_Immediate metodu bulunmaktadır. Bu metotların tanımı, aşağıda görülmektedir:

procedure Get_Immediate (Item : out Character) ;
ve
procedure Get_Immediate (Item : out Character ;
Available : out Boolean);
		

Get_Immediate metodunun ilk tanımı için basit bir uygulama:

with Ada.Text_IO;

procedure e3_1_uyg_8 is

Değer : Character; 

begin

Ada.Text_IO.Put_Line("(M)odify, (D)isplay or (Q)uit: ");

Ada.Text_IO.Get_Immediate(Item => Değer);

Ada.Text_IO.Put_Line("Girilen Karakter : " & Değer);


Bu programın sonucu, 

(M)odify, (D)isplay or (Q)uit: D
Girilen Karakter : D

olmaktadır. (Sonuç girilen değere bağlıdır)
		
end e3_1_uyg_8;

Metodun ikinci argümanın değerlendirilmesi için bir uygulama:

with Ada.Text_IO;

procedure e3_1_uyg_9 is

Command : Character; 

Available : Boolean;

begin

Ada.Text_IO.Put_Line("(M)odify, (D)isplay or (Q)uit: ");

Ada.Text_IO.Get_Immediate(Item => Command, Available => Available);

Ada.Text_IO.Put_Line(Item => "Girilen Karakter : " & Command);

Ada.Text_IO.Put_Line(Item => "Available : " & Boolean'Image(Available));

end e3_1_uyg_9

Bu programın sonucu, 

(M)odify, (D)isplay or (Q)uit: Q
Girilen Karakter : Q
Available : TRUE

olmaktadır. (Sonuçlar girilen değerlere bağlıdır)
		

Bu kısımda, standart giriş/çıkış işlemleri için basit metotları ve örnek uygulama programlarını incelemiş ve bu metotları uygulamalarımızda kullanabilecek duruma gelmiş bulunuyoruz. Ada programlarına giriş/çıkış işlemleri bazen çok karmaşık yöntemler içerebilir. Bunlar için bazı örnekler, http://en.wikibooks.org/wiki/Ada_Programming/Mathematical_calculations sayfasında görülebilir. Burada incelenen yöntemler, en azından başlangıçta, tüm sözel verilerin standart giriş ortamından programa veri olarak girilebilmesi ve sonuçların standart çıkış ortamından gösterimi için yeterli olacaktır.

Valid XHTML 1.1