Pascal - Hızlı Kılavuz

Pascal, 1970'lerin başlarında Niklaus Wirth tarafından geliştirilen genel amaçlı, yüksek seviyeli bir dildir. Programlamayı sistematik bir disiplin olarak öğretmek ve güvenilir ve verimli programlar geliştirmek için geliştirilmiştir.

Pascal, Algol tabanlı bir dildir ve birçok Algol yapısını içerir. Algol 60, Pascal'ın bir alt kümesidir. Pascal birkaç veri türü ve programlama yapısı sunar. Pascal programlarını anlamak ve sürdürmek kolaydır.

Pascal, çeşitli nedenlerle öğretim ve akademik arenada popülerliğini artırmıştır:

  • Öğrenmesi kolay.
  • Yapılandırılmış dil.
  • Şeffaf, verimli ve güvenilir programlar üretir.
  • Çeşitli bilgisayar platformlarında derlenebilir.

Pascal Dilinin Özellikleri

Pascal aşağıdaki özelliklere sahiptir -

  • Pascal güçlü yazılmış bir dildir.
  • Kapsamlı hata kontrolü sunar.
  • Diziler, kayıtlar, dosyalar ve kümeler gibi çeşitli veri türleri sunar.
  • Çeşitli programlama yapıları sunar.
  • Fonksiyonlar ve prosedürler aracılığıyla yapısal programlamayı destekler.
  • Nesne yönelimli programlamayı destekler.

Pascal hakkında gerçekler

  • Pascal dili, Fransız matematikçi ve bilgisayar geliştirmede öncü olan Blaise Pascal'dan alınmıştır.

  • Niklaus Wirth, orijinal Pascal programlama dilinin geliştirilmesini 1970 yılında tamamladı.

  • Pascal, Algol programlama dilinin blok yapılı stiline dayanmaktadır.

  • Pascal, uygulamaları hem güvenilir hem de verimli olabilecek sistematik bir disiplin olarak programlamayı öğretmeye uygun bir dil olarak geliştirilmiştir.

  • ISO 7185 Pascal Standardı ilk olarak 1983'te yayınlandı.

  • Pascal, Apple Lisa'da ve Mac'in ilk yıllarında geliştirme için kullanılan birincil yüksek seviyeli dildi.

  • 1986'da Apple Computer ilk Object Pascal uygulamasını yayınladı ve 1993'te Pascal Standartları Komitesi, Pascal'a bir Nesne Yönelimli Uzantı yayınladı.

Pascal'ı neden kullanmalı?

Pascal, programcıların karmaşık yapılandırılmış veri türlerini tanımlamalarına ve listeler, ağaçlar ve grafikler gibi dinamik ve yinelemeli veri yapıları oluşturmalarına olanak tanır. Pascal; kayıtlar, numaralandırmalar, alt aralıklar, dinamik olarak tahsis edilmiş değişkenler ve ilişkili işaretçiler ve kümeler gibi özellikler sunar.

Pascal, herhangi bir derinlik düzeyinde iç içe geçmiş prosedür tanımlarına izin verir. Bu, programlamayı temel kavramlara dayanan sistematik bir disiplin olarak öğrenmek için gerçekten harika bir programlama ortamı sağlar.

Pascal'ın en şaşırtıcı uygulamaları arasında şunlar vardır:

  • Skype
  • Toplam Amir
  • TeX
  • Macromedia Captivate
  • Apple Lisa
  • Çeşitli PC Oyunları
  • Gömülü sistemler

Genel kullanım için birkaç Pascal derleyicisi ve yorumlayıcısı vardır. Bunların arasında -

  • Turbo Pascal - Pascal programlarını CP / M, CP / M-86, DOS, Windows ve Macintosh'ta çalıştırmak için bir IDE ve derleyici sağlar.

  • Delphi- Object Pascal'ı çalıştırmak için derleyiciler sağlar ve 32-bit Mac OS X ve iOS'un yanı sıra 32 ve 64-bit Windows işletim sistemleri için yerel kod üretir. Embarcadero, Linux ve Android işletim sistemi için destek oluşturmayı planlıyor.

  • Free Pascal- Pascal ve Object Pascal programlarını çalıştırmak için ücretsiz bir derleyicidir. Free Pascal derleyicisi Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS ve diğer birçok platform için 32 ve 64-bit Turbo Pascal ve Delphi uyumlu bir Pascal derleyicisidir.

  • Turbo51 - Turbo Pascal 7 sözdizimine sahip, 8051 mikrodenetleyici ailesi için ücretsiz bir Pascal derleyicisidir.

  • Oxygene - .NET ve Mono platformları için bir Object Pascal derleyicisidir.

  • GNU Pascal (GPC) - GNU Derleyici Koleksiyonunun bir ön ucundan oluşan bir Pascal derleyicisidir.

Bu eğitimlerde Free Pascal'ı kullanacağız. Free Pascal'ı işletim sisteminiz için şu bağlantıdan indirebilirsiniz: Free Pascal'ı İndirin

Free Pascal'ı Linux'a Kurmak

Free Pascal'ın Linux dağıtımı üç biçimde gelir -

  • a tar.gz sürüm, ayrı dosyalar olarak da mevcuttur.

  • a .rpm (Red Hat Paket Yöneticisi) sürümü.

  • a .deb (Debian) sürümü.

.Rpm sürümü için kurulum kodu ::

rpm -i fpc-X.Y.Z-N.ARCH.rpm

XYZ, .rpm dosyasının sürüm numarasıdır ve ARCH, desteklenen mimarilerden biridir (i386, x86_64, vb.).

Debian sürümü için kurulum kodu (Ubuntu gibi) -

dpkg -i fpc-XXX.deb

XXX, .deb dosyasının sürüm numarasıdır.

Ayrıntılar için şunu okuyun: Free Pascal Kurulum Kılavuzu

Free Pascal'ı Mac'e Yükleme

Mac OS X kullanıyorsanız, Free Pascal'ı kullanmanın en kolay yolu, Xcode geliştirme ortamını Apple'ın web sitesinden indirmek ve basit kurulum talimatlarını izlemektir. Xcode kurulumunu yaptıktan sonra, Free Pascal derleyicisini kullanabileceksiniz.

Free Pascal'ı Windows'a Kurmak

Windows için, Windows yükleyici setup.exe'yi indireceksiniz. Bu normal bir kurulum programıdır. Kurulum için aşağıdaki adımları uygulamanız gerekir -

  • Bir dizin seçin.

  • Paketin kurmak istediğiniz kısımlarını seçin.

  • İsteğe bağlı olarak, .pp veya .pas uzantılarını Free Pascal IDE ile ilişkilendirmeyi seçin.

Ayrıntılar için şunu okuyun: Free Pascal Kurulum Kılavuzu

Metin düzeltici

Bu, programınızı yazmak için kullanılacaktır. Birkaç düzenleyicinin örnekleri arasında Windows Not Defteri, İşletim Sistemi Düzenleme komutu, Kısa, Epsilon, EMACS ve vim veya vi bulunur.

Metin düzenleyicinin adı ve sürümü farklı işletim sistemlerine göre değişebilir. Örneğin, Windows'ta Not Defteri, Linux veya UNIX'in yanı sıra Windows'ta da vim veya vi kullanılabilir.

Düzenleyicinizle oluşturduğunuz dosyalara kaynak dosyalar denir ve program kaynak kodunu içerir. Pascal programlarının kaynak dosyaları genellikle şu uzantıyla adlandırılır.pas.

Programlamanıza başlamadan önce, bir metin düzenleyiciniz olduğundan ve bir bilgisayar programı yazmak, onu bir dosyaya kaydetmek, derlemek ve sonunda çalıştırmak için yeterli deneyime sahip olduğunuzdan emin olun.

Pascal programlama dilinin temel yapı taşlarını incelemeden önce, onu gelecek bölümlerde referans olarak alabilmemiz için minimum bir Pascal program yapısına bakalım.

Pascal Program Yapısı

Bir Pascal programı temelde aşağıdaki bölümlerden oluşur -

  • Program adı
  • Komut kullanır
  • Tip bildirimleri
  • Sabit beyanlar
  • Değişken bildirimleri
  • İşlev bildirimleri
  • Prosedür beyanları
  • Ana program bloğu
  • Her blokta İfadeler ve İfadeler
  • Comments

Her pascal programın genellikle bir başlık ifadesi, bir bildirimi ve kesinlikle bu sırayla bir yürütme bölümü vardır. Aşağıdaki format, bir Pascal programı için temel sözdizimini gösterir -

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Pascal Hello World Örneği

Aşağıda, "Merhaba, Dünya!" Kelimelerini basacak basit bir pascal kod bulunmaktadır. -

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

Bu, aşağıdaki sonucu verecektir -

Hello, World!

Yukarıdaki programın çeşitli bölümlerine bakalım -

  • Programın ilk satırı program HelloWorld; programın adını gösterir.

  • Programın ikinci satırı uses crt; derleyiciye gerçek derlemeye gitmeden önce crt birimini dahil etmesini söyleyen bir ön işlemci komutudur.

  • Başlangıç ​​ve bitiş deyimlerinde yer alan sonraki satırlar ana program bloğudur. Pascal'daki her blok birbegin ifade ve bir endBeyan. Ancak, ana programın sonunu gösteren bitiş ifadesinin ardından noktalı virgül (;) yerine nokta (.) Gelir.

  • begin ana program bloğunun ifadesi, program yürütmenin başladığı yerdir.

  • İçindeki çizgiler (*...*) derleyici tarafından göz ardı edilecek ve bir comment programda.

  • İfade writeln('Hello, World!');Pascal'da bulunan ve "Merhaba, Dünya!" mesajına neden olan writeln işlevini kullanır. ekranda görüntülenecek.

  • İfade readkey;kullanıcı bir tuşa basana kadar ekranın duraklamasına izin verir. Crt biriminin bir parçasıdır. Bir birim, Pascal'da bir kitaplık gibidir.

  • Son ifade end. programınızı bitirir.

Pascal Programını Derleyin ve Çalıştırın

  • Bir metin düzenleyici açın ve yukarıda belirtilen kodu ekleyin.

  • Dosyayı hello.pas olarak kaydedin

  • Bir komut istemi açın ve dosyayı kaydettiğiniz dizine gidin.

  • Komut istemine fpc hello.pas yazın ve kodunuzu derlemek için enter tuşuna basın.

  • Kodunuzda hata yoksa, komut istemi sizi bir sonraki satıra götürür ve hello yürütülebilir dosya ve hello.o nesne dosyası.

  • Şimdi yazın hello programınızı çalıştırmak için komut isteminde.

  • Ekranda "Merhaba Dünya" yazısını görebileceksiniz ve program siz herhangi bir tuşa basana kadar bekler.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

Ücretsiz pascal derleyicisinin fpc yolunuzdadır ve hello.pas kaynak dosyasını içeren dizinde çalıştırıyorsunuzdur.

Pascal programının temel bir yapısını gördünüz, bu nedenle pascal programlama dilinin diğer temel yapı taşlarını anlamak kolay olacaktır.

Değişkenler

Bir değişken tanımı, bir var anahtar kelime, ardından aşağıdaki gibi değişkenlerin tanımları gelir:

var
A_Variable, B_Variable ... : Variable_Type;

Pascal değişkenleri, fonksiyonun kod gövdesi dışında bildirilir, bu da onların begin ve end çiftler, ancak prosedür / fonksiyon tanımından sonra ve beginanahtar kelime. Global değişkenler için, program başlığından sonra tanımlanırlar.

Fonksiyonlar / Prosedürler

Pascal'da bir procedure herhangi bir dönüş değeri olmayan ve bir functiondönüş değeri olan bir prosedürdür. İşlev / prosedürlerin tanımı aşağıdaki gibi olacaktır -

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

Yorumlar

Çok satırlı yorumlar, süslü parantezler ve yıldız işaretleri (* ... *) şeklinde gösterilir. Pascal, küme parantezleri {...} içine alınmış tek satırlı yoruma izin verir.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

Büyük küçük harf duyarlılığı

Pascal, büyük / küçük harfe duyarlı olmayan bir dildir; bu, değişkenlerinizi, işlevlerinizi ve prosedürlerinizi her iki durumda da yazabileceğiniz anlamına gelir. A_Variable değişkenleri gibi, a_variable ve A_VARIABLE da Pascal'da aynı anlama sahiptir.

Pascal İfadeleri

Pascal programları ifadelerden oluşur. Her ifade, programın kesin bir işini belirtir. Bu işler bildirim, atama, veri okuma, veri yazma, mantıksal kararlar alma, program akış kontrolünü aktarma vb. Olabilir.

Örneğin -

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

Pascal'da Ayrılmış Kelimeler

Pascal'daki ifadeler, ayrılmış sözcükler olarak adlandırılan bazı özel Pascal sözcükleriyle tasarlanmıştır. Örneğin, program, girdi, çıktı, var, real, begin, readline, writeline ve end sözcüklerinin tümü ayrılmış sözcüklerdir.

Pascal'da bulunan ayrılmış sözcüklerin listesi aşağıdadır.

ve dizi başla durum sabit
div yapmak aşağı Başka son
dosya için işlevi git Eğer
içinde etiket mod sıfır değil
nın-nin veya paketlenmiş prosedür program
kayıt tekrar et Ayarlamak sonra -e
tip a kadar var süre ile

Pascal'da Karakter Seti ve Tanımlayıcılar

Pascal karakter seti şunlardan oluşur:

  • Tüm büyük harfler (AZ)

  • Tüm küçük harfler (az)

  • Tüm rakamlar (0-9)

  • Özel semboller - + * /: =,. ;. () [] = {} `beyaz boşluk

Bir Pascal programındaki değişkenler ve sabitler, türler, işlevler, prosedürler ve kayıtlar gibi varlıklar bir ada veya tanımlayıcıya sahiptir. Tanımlayıcı, bir harfle başlayan bir dizi harf ve rakamdır. Bir tanımlayıcıda özel semboller ve boşluklar kullanılmamalıdır.

Bir varlığın veri türleri, onunla ilişkili anlamı, kısıtlamaları, olası değerleri, işlemleri, işlevleri ve depolama modunu gösterir.

Tam sayı, gerçek, Boole ve karakter türleri standart veri türleri olarak adlandırılır. Veri türleri skaler, işaretçi ve yapılandırılmış veri türleri olarak kategorize edilebilir. Skaler veri türlerinin örnekleri tamsayı, gerçek, Boolean, karakter, alt aralık ve numaralandırılmıştır. Yapılandırılmış veri türleri skaler türlerden yapılır; örneğin diziler, kayıtlar, dosyalar ve kümeler. İşaretçi veri türlerini daha sonra tartışacağız.

Pascal Veri Türleri

Pascal veri türleri aşağıdaki diyagramda özetlenebilir -

Tip Beyanları

Tür bildirimi, bir tanımlayıcının veri türünü bildirmek için kullanılır. Tür bildiriminin sözdizimi -

type-identifier-1, type-identfier-2 = type-specifier;

Örneğin, aşağıdaki bildirim, gün ve yaş değişkenlerini tamsayı türü olarak, evet ve doğru değişkenlerini Boole türü olarak, ad ve şehir dize türü olarak, ücretler ve giderleri gerçek tür olarak tanımlar.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Tamsayı Türleri

Aşağıdaki tablo, Object Pascal'da kullanılan depolama boyutları ve değer aralıkları ile standart tam sayı türleri hakkında ayrıntılı bilgi verir -

Tür Minimum Maksimum Biçim
Tamsayı -2147483648 2147483647 32 bit imzalı
Kardinal 0 4294967295 imzasız 32 bit
Shortint -128 127 8 bit imzalı
Smallint -32768 32767 16 bit imzalı
Longint -2147483648 2147483647 32 bit imzalı
Int64 -2 ^ 63 2 ^ 63 - 1 64 bit imzalı
Bayt 0 255 işaretsiz 8 bit
Kelime 0 65535 imzasız 16 bit
Uzun kelime 0 4294967295 imzasız 32 bit

Sabitler

Sabitlerin kullanılması bir programı daha okunabilir hale getirir ve programın başlangıcında özel miktarları tek bir yerde tutmaya yardımcı olur. Pascal sayısal, mantıksal, dizgi ve karakter sabitlerine izin verir . Sabitler, programın bildirim kısmında belirtilerek belirtilebilir.const beyanname.

Sabit tür bildiriminin sözdizimi aşağıdaki gibidir -

const
Identifier = contant_value;

Aşağıda bazı sabit bildirim örnekleri verilmiştir -

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

Tüm sabit bildirimler, değişken bildiriminden önce verilmelidir.

Numaralandırılmış türler

Numaralandırılmış veri türleri, kullanıcı tanımlı veri türleridir. Değerlerin bir listede belirtilmesine izin verirler. Numaralandırılmış veri türünde yalnızca atama operatörlerine ve ilişkisel operatörlere izin verilir. Numaralandırılmış veri türleri aşağıdaki gibi bildirilebilir -

type
enum-identifier = (item1, item2, item3, ... )

Aşağıda, numaralandırılmış tür bildirimlerinin bazı örnekleri verilmiştir -

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

Öğelerin numaralandırılmış bir tür etki alanında listelendiği sıra, öğelerin sırasını tanımlar. Örneğin, numaralandırılmış SUMMER türünde Nisan, Mayıs'tan önce, Mayıs, Haziran'dan önce gelir vb. Numaralandırılmış tür tanımlayıcılarının etki alanı, sayısal veya karakter sabitlerinden oluşamaz.

Alt Aralık Türleri

Alt aralık türleri, bir değişkenin belirli bir aralıkta yer alan değerleri varsaymasına izin verir. Örneğin, seçmenlerin yaşının 18 ila 100 arasında olması gerekiyorsa, yaş adlı bir değişken şu şekilde ilan edilebilir:

var
age: 18 ... 100;

Bir sonraki bölümde değişken bildirimine ayrıntılı olarak bakacağız. Ayrıca tür bildirimini kullanarak bir alt aralık türü de tanımlayabilirsiniz. Bir alt aralık türü bildirmek için sözdizimi aşağıdaki gibidir -

type
subrange-identifier = lower-limit ... upper-limit;

Aşağıda, alt aralık türü bildirimlerinin bazı örnekleri verilmiştir -

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

Alt aralık türleri, önceden tanımlanmış bir numaralandırılmış türün bir alt kümesinden oluşturulabilir, Örneğin -

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

Değişken, programlarımızın değiştirebileceği bir depolama alanına verilen addan başka bir şey değildir. Pascal'daki her değişkenin, değişkenin belleğinin boyutunu ve düzenini belirleyen belirli bir türü vardır; o hafızada saklanabilecek değerlerin aralığı; ve değişkene uygulanabilecek işlemler kümesi.

Bir değişkenin adı harflerden, rakamlardan ve alt çizgi karakterinden oluşabilir. Bir harf veya alt çizgiyle başlamalıdır. Pascalnot case-sensitive, bu nedenle büyük ve küçük harfler burada aynı anlama gelir. Önceki bölümde açıklanan temel türlere göre, aşağıdaki temel değişken türleri olacaktır -

Pascal'da Temel Değişkenler

Sr.No Tip ve Açıklama
1

Character

Genellikle tek bir sekizli (bir bayt). Bu bir tamsayı türüdür.

2

Integer

Makine için en doğal tam sayı boyutu.

3

Real

Tek duyarlıklı kayan nokta değeri.

4

Boolean

Doğru veya yanlış mantıksal değerleri belirtir. Bu aynı zamanda bir tamsayı türüdür.

5

Enumerated

Kullanıcı tanımlı bir listeyi belirtir.

6

Subrange

Değerleri bir aralık içinde yer alan değişkenleri temsil eder.

7

String

Bir dizi karakter saklar.

Pascal programlama dili ayrıca, İşaretçi, Dizi, Kayıtlar, Kümeler ve Dosyalar vb. Gibi sonraki bölümlerde ele alacağımız çeşitli diğer değişken türlerinin tanımlanmasına da izin verir. Bu bölüm için, yalnızca temel değişken türlerini inceleyelim.

Pascal'da Değişken Beyanı

Pascal programında kullanmadan önce tüm değişkenler bildirilmelidir. Tüm değişken bildirimlerinin ardından var anahtar sözcüğü gelir. Bir bildirim, değişkenlerin bir listesini, ardından iki nokta üst üste (:) ve türü belirtir. Değişken bildiriminin sözdizimi -

var
variable_list : type;

Burada tür, karakter, tamsayı, gerçek, boole veya herhangi bir kullanıcı tanımlı veri türü dahil olmak üzere geçerli bir Pascal veri türü olmalıdır ve değişken_listesi virgülle ayrılmış bir veya daha fazla tanımlayıcı adından oluşabilir. Bazı geçerli değişken açıklamaları burada gösterilmektedir -

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

Önceki eğitimde, Pascal'ın bir tür bildirmeye izin verdiğini tartışmıştık. Bir tür, bir ad veya tanımlayıcıyla tanımlanabilir. Bu tür, bu türdeki değişkenleri tanımlamak için kullanılabilir. Örneğin,

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Şimdi, bu şekilde tanımlanan türler değişken bildirimlerinde kullanılabilir -

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

Lütfen tip beyanı ile var beyanı arasındaki farka dikkat edin . Tür bildirimi, tam sayı, gerçek vb. Türlerin kategorisini veya sınıfını belirtirken, değişken özelliği bir değişkenin alabileceği değerlerin türünü belirtir. Pascal'daki tür bildirimini C'deki typedef ile karşılaştırabilirsiniz . En önemlisi, değişken adı, değişkenin değerinin depolanacağı bellek konumunu belirtir. Tip bildiriminde durum böyle değildir.

Pascal'da Değişken Başlatma

Değişkenlere iki nokta üst üste ve eşittir işaretiyle bir değer atanır, ardından sabit bir ifade gelir. Bir değer atamanın genel şekli -

variable_name := value;

Varsayılan olarak, Pascal'daki değişkenler sıfır ile başlatılmaz. Çöp değerleri içerebilirler. Bu nedenle, bir programdaki değişkenleri başlatmak daha iyi bir uygulamadır. Değişkenler bildirimlerinde başlatılabilir (bir başlangıç ​​değeri atanabilir). Başlatma işleminin ardındanvar anahtar kelime ve başlatma sözdizimi aşağıdaki gibidir -

var
variable_name : type = value;

Bazı örnekler -

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

Şimdiye kadar tartışılan çeşitli değişken türlerini kullanan bir örneğe bakalım -

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

Numaralandırılmış Değişkenler

Tam sayı, gerçek ve boole gibi basit değişken türlerini nasıl kullanacağınızı gördünüz. Şimdi, - olarak tanımlanabilecek numaralandırılmış tip değişkenleri görelim.

var
var1, var2, ...  : enum-identifier;

Numaralandırılmış bir tür bildirdiğinizde, bu türdeki değişkenleri bildirebilirsiniz. Örneğin,

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

Aşağıdaki örnek kavramı göstermektedir -

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Which drink do you want?
You can drink limejuice

Alt Aralık Değişkenleri

Alt aralık değişkenleri şu şekilde bildirilir -

var
subrange-name : lowerlim ... uperlim;

Alt aralık değişkenlerinin örnekleri -

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

Aşağıdaki program kavramı göstermektedir -

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

Sabit, programın yürütülmesi sırasında değişmeden kalan bir varlıktır. Pascal, yalnızca aşağıdaki türlerdeki sabitlerin beyan edilmesine izin verir -

  • Sıra türleri
  • Türleri ayarla
  • İşaretçi türleri (ancak izin verilen tek değer Nil'dir).
  • Gerçek türler
  • Char
  • String

Sabitleri Bildirme

Sabitleri bildirmek için sözdizimi aşağıdaki gibidir -

const
identifier = constant_value;

Aşağıdaki tablo, bazı geçerli sabit bildirimlerin örneklerini sunar -

Real type constant

Sr.No Sabit Tip ve Örnekler
1

Ordinal(Integer)type constant

valid_age = 21;

2

Set type constant

Ünlüler = (A, E, I, O, U) kümesi;

3

Pointer type constant

P = NIL;

4

e = 2.7182818;

velocity_light = 3.0E + 10;

5

Character type constant

Operatör = '+';

6

String type constant

başkan = 'Johnny Depp';

Aşağıdaki örnek kavramı göstermektedir -

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter the radius of the circle
23
The circumference of the circle is 144.51

Programın çıktı deyimindeki biçimlendirmeye dikkat edin. Değişken c, ondalık işaretinden sonra 7 ve 2 basamaklı toplam rakamlarla formatlanmalıdır. Pascal, sayısal değişkenlerle bu tür çıktı biçimlendirmesine izin verir.

Operatör, derleyiciye belirli matematiksel veya mantıksal işlemleri gerçekleştirmesini söyleyen bir semboldür. Pascal, aşağıdaki operatör türlerine izin verir -

  • Aritmetik operatörler
  • İlişkisel operatörler
  • Boole operatörleri
  • Bit operatörleri
  • Operatörleri ayarla
  • Dize operatörleri

Aritmetik, ilişkisel, Boole ve bit operatörlerini tek tek tartışalım. Set operatörlerini ve dizgi işlemlerini daha sonra tartışacağız.

Aritmetik operatörler

Aşağıdaki tablo, Pascal tarafından desteklenen tüm aritmetik operatörleri göstermektedir. Değişken varsayA 10 ve değişken tutar B 20 tutar, sonra -

Örnekleri Göster

Şebeke Açıklama Misal
+ İki işlenen ekler A + B 30 verecek
- İlk işlenenden ikinci işleneni çıkarır A - B -10 verir
* Her iki işleneni de çarpar A * B 200 verecek
/ Payı paydaya böler B / A 2 verecek
% Modül İşleci ve bir tamsayı bölmesinden sonra kalanı B% A 0 verir

İlişkisel Operatörler

Aşağıdaki tablo, Pascal tarafından desteklenen tüm ilişkisel operatörleri göstermektedir. Değişken varsayA 10 ve değişken tutar B 20 tutar, sonra -

Örnekleri Göster

Şebeke Açıklama Misal
= İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A = B) doğru değil.
<> İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, değerler eşit değilse koşul doğru olur. (A <> B) doğrudur.
> Sol işlenenin değerinin sağ işlenenin değerinden büyük olup olmadığını kontrol eder, evet ise koşul doğru olur. (A> B) doğru değil.
< Left operand değerinin right operand değerinden küçük olup olmadığını kontrol eder, eğer evet ise, o zaman koşul doğru olur. (A <B) doğrudur.
> = Soldaki işlenenin değerinin sağ işlenenin değerinden büyük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A> = B) doğru değil.
<= Sol işlenenin değerinin sağ işlenenin değerinden küçük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A <= B) doğrudur.

Boole Operatörleri

Aşağıdaki tablo, Pascal dili tarafından desteklenen tüm Boole operatörlerini göstermektedir. Tüm bu operatörler Boole işlenenleri üzerinde çalışır ve Boolean sonuçları üretir. Değişken varsayA doğru ve değişken tutar B yanlış tutar, o zaman -

Örnekleri Göster

Şebeke Açıklama Misal
ve Boolean AND operatörü olarak adlandırılır. Her iki işlenen de doğruysa koşul doğru olur. (A ve B) yanlıştır.
ve sonra AND işlecine benzer, ancak, derleyicinin mantıksal ifadeyi değerlendirme sırasını garanti eder. Soldan sağa ve sağ işlenenler yalnızca gerekli olduğunda değerlendirilir. (A ve sonra B) yanlıştır.
veya Boole VEYA Operatörü olarak adlandırılır. İki işlenenden herhangi biri doğruysa, koşul doğru olur. (A veya B) doğrudur.
ya da başka Boole VEYA'ya benzer, ancak, derleyicinin mantıksal ifadeyi değerlendireceği sırayı garanti eder. Soldan sağa ve sağ işlenenler yalnızca gerekli olduğunda değerlendirilir. (A veya B) doğrudur.
değil Boolean NOT Operatörü olarak adlandırıldı. İşlenenin mantıksal durumunu tersine çevirmek için kullanılır. Bir koşul doğruysa, Mantıksal NOT operatörü onu yanlış yapar. değil (A ve B) doğru değil.

Bit Operatörleri

Bitsel operatörler bitler üzerinde çalışır ve bit bit işlem gerçekleştirir. Tüm bu operatörler tamsayı işlenenler üzerinde çalışır ve tamsayı sonuçlar üretir. Bitsel ve (&), bitsel veya (|) ve bitsel değil (~) için doğruluk tablosu aşağıdaki gibidir -

p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

A = 60 ise; ve B = 13; şimdi ikili biçimde aşağıdaki gibi olacaklar -

Bir = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Pascal tarafından desteklenen Bitwise operatörleri aşağıdaki tabloda listelenmiştir. A değişkeninin 60 ve B değişkeninin 13 olduğunu varsayın, o zaman:

Örnekleri Göster

Şebeke Açıklama Misal
& İkili VE İşleci, her iki işlenende de varsa sonuca bir bit kopyalar. (A & B) 0000 1100 olan 12 verecek
| İkili VEYA İşleci, işlenenlerden herhangi birinde varsa bir bit kopyalar. (A | B), 0011 1101 olan 61 verecek
! İkili VEYA İşleci, işlenenlerden herhangi birinde varsa bir bit kopyalar. Aynı | Şebeke. (A! B) 0011 1101 olan 61 verecek
~ İkili Birler Tamamlayıcı Operatörü tekli ve bitleri 'çevirme' etkisine sahiptir. (~ A), işaretli bir ikili sayı nedeniyle 2'nin tamamlayıcı formunda 1100 0011 olan -61'i verecektir.
<< İkili Sol Kaydırma Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sola taşınır. Bir << 2 240 verir, yani 1111 0000
>> İkili Sağ Shift Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sağa taşınır. A >> 2, 0000 1111 olan 15 verir

Lütfen Pascal'ın farklı uygulamalarının bitsel işleçlerde farklılık gösterdiğini unutmayın. Ancak burada kullandığımız derleyici Free Pascal, aşağıdaki bitsel operatörleri destekler -

Operatörler Operasyonlar
değil Bitsel DEĞİL
ve Bitsel AND
veya Bit tabanlı VEYA
Xor Bit düzeyinde özel VEYA
shl Bit tabanlı sola kaydırma
shr Bit tabanlı sağa kaydırma
<< Bit tabanlı sola kaydırma
>> Bit tabanlı sağa kaydırma

Pascal'da Operatör Önceliği

Operatör önceliği, bir ifadedeki terimlerin gruplandırılmasını belirler. Bu, bir ifadenin nasıl değerlendirileceğini etkiler. Bazı operatörler diğerlerinden daha yüksek önceliğe sahiptir; örneğin, çarpma operatörü toplama operatöründen daha yüksek önceliğe sahiptir.

Örneğin x = 7 + 3 * 2; burada, x operatörü + 'dan daha yüksek önceliğe sahip olduğu için 20 değil, 13 atanır, bu nedenle önce 3 * 2 ile çarpılır ve sonra 7'ye eklenir.

Burada, en yüksek önceliğe sahip operatörler tablonun en üstünde, en düşük olanlar ise en altta görünür. Bir ifade içinde, daha yüksek öncelikli operatörler ilk olarak değerlendirilecektir.

Örnekleri Göster

Şebeke Öncelik
~, hayır, En yüksek
*, /, div, mod ve &
|,!, +, - veya,
=, <>, <, <=,>,> =, içinde
veya başka türlü ve sonra En düşük

Karar verme yapıları, programcının, program tarafından değerlendirilecek veya test edilecek bir veya daha fazla koşulu, koşulun doğru olduğu belirlenirse yürütülecek bir ifade veya ifadeyle birlikte belirtmesini ve isteğe bağlı olarak, koşulun doğru olması durumunda yürütülecek diğer ifadeleri gerektirir. yanlış olduğu belirlenir.

Aşağıda, programlama dillerinin çoğunda bulunan tipik bir karar verme yapısının genel biçimi verilmiştir -

Pascal programlama dili aşağıdaki türden karar verme ifadelerini sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.

Sr.No Açıklama ve Açıklama
1 eğer - sonra ifadesi

Bir if - then statement bir boole ifadesinin ardından bir veya daha fazla ifadeden oluşur.

2 If-then-else ifadesi

Bir if - then statement ardından isteğe bağlı bir else statement, boolean ifadesi yanlış olduğunda çalıştırılır.

3 yuvalanmış if ifadeleri

Birini kullanabilirsin if veya else if bir başkasının içinde ifade if veya else if beyan (lar).

4 vaka beyanı

Bir case ifadesi, bir değişkenin bir değerler listesine karşı eşitlik açısından test edilmesine izin verir.

5 case - else ifadesi

Şuna benzer if-then-else Beyan. Burada, birelse terim takip eder case statement.

6 iç içe geçmiş durum ifadeleri

Birini kullanabilirsin case bir başkasının içinde ifade case beyan (lar).

Bir kod bloğunu birkaç kez çalıştırmanız gereken bir durum olabilir. Genel olarak, ifadeler sıralı olarak yürütülür: Bir fonksiyondaki ilk ifade önce çalıştırılır, ardından ikincisi vb.

Programlama dilleri, daha karmaşık yürütme yollarına izin veren çeşitli kontrol yapıları sağlar.

Bir döngü deyimi, bir deyimi veya deyim grubunu birden çok kez yürütmemize olanak tanır ve aşağıdaki programlama dillerinin çoğunda bir döngü deyiminin genel biçimidir -

Pascal programlama dili, döngü gereksinimlerini karşılamak için aşağıdaki döngü yapı türlerini sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.

Sr.No Döngü Tipi ve Açıklaması
1 while-do döngüsü

Belirli bir koşul doğruyken bir ifadeyi veya ifade grubunu tekrarlar. Döngü gövdesini çalıştırmadan önce koşulu test eder.

2 for-do döngüsü

Bir dizi ifadeyi birden çok kez yürütür ve döngü değişkenini yöneten kodu kısaltır.

3 dönene kadar tekrar et

Döngü gövdesinin sonundaki koşulu test etmesi dışında bir while ifadesi gibi.

4 İç içe geçmiş döngüler

Bir veya daha fazla döngüyü diğerinin içinde, döngü için veya döngüye kadar tekrarlayabilirsiniz.

Döngü Kontrol İfadeleri

Döngü kontrol ifadeleri, yürütmeyi normal sırasından değiştirir. Yürütme bir kapsam bıraktığında, bu kapsamda oluşturulan tüm otomatik nesneler yok edilir.

Pascal aşağıdaki kontrol ifadelerini destekler. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.

Sr.No Kontrol İfadesi ve Açıklama
1 break ifadesi

Sonlandırır loop veya case ifadesi ve yürütmeyi döngü veya case ifadesinin hemen ardından ifadeye aktarır.

2 devam ifadesi

Döngünün vücudunun geri kalanını atlamasına ve yinelemeden önce durumunu hemen yeniden test etmesine neden olur.

3 git beyanı

Kontrolü etiketli ifadeye aktarır. Programınızda goto ifadesini kullanmanız önerilmez.

Alt programlar

Bir alt program, belirli bir görevi yerine getiren bir program birimi / modülüdür. Bu alt programlar, daha büyük programlar oluşturmak için birleştirilir. Bu temelde 'Modüler tasarım' olarak adlandırılır. Bir alt program, çağıran program olarak adlandırılan bir alt program / program tarafından çalıştırılabilir.

Pascal iki tür alt program sağlar -

  • Functions - bu alt programlar tek bir değer döndürür.

  • Procedures - bu alt programlar doğrudan bir değer döndürmez.

Fonksiyonlar

Bir functionbirlikte bir görevi yerine getiren bir grup ifadedir. Her Pascal programının, programın kendisi olan en az bir işlevi vardır ve en önemsiz programların tümü ek işlevleri tanımlayabilir.

Bir işlev declarationderleyiciye bir işlevin adı, dönüş türü ve parametreleri hakkında bilgi verir. Bir işlevdefinition işlevin gerçek gövdesini sağlar.

Pascal standart kitaplığı, programınızın çağırabileceği çok sayıda yerleşik işlev sağlar. Örneğin, işlevAppendStr() iki dizge ekler, fonksiyon New() dinamik olarak bellekleri değişkenlere ve daha birçok işleve tahsis eder.

Bir Fonksiyonun Tanımlanması

Pascal'da bir functionfunction anahtar sözcüğü kullanılarak tanımlanır. Bir fonksiyon tanımının genel biçimi aşağıdaki gibidir -

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

Pascal'daki bir fonksiyon tanımı bir fonksiyondan oluşur header, yerel declarations ve bir işlev body. İşlev başlığı, anahtar sözcük işlevinden ve birnameişleve verilir. İşte bir fonksiyonun tüm bölümleri -

  • Arguments- Bağımsız değişken (ler), çağıran program ile işlev tanımlayıcıları arasındaki bağlantıyı kurar ve ayrıca biçimsel parametreler olarak da adlandırılır. Parametre, yer tutucu gibidir. Bir işlev çağrıldığında, parametreye bir değer iletirsiniz. Bu değere gerçek parametre veya bağımsız değişken adı verilir. Parametre listesi, bir işlevin türü, sırası ve parametrelerinin sayısı ile ilgilidir. Bu tür biçimsel parametrelerin kullanımı isteğe bağlıdır. Bu parametreler standart veri tipine, kullanıcı tanımlı veri tipine veya alt aralık veri tipine sahip olabilir.

    İşlev deyiminde görünen biçimsel parametreler listesi, basit veya alt simgeli değişkenler, diziler veya yapılandırılmış değişkenler veya alt programlar olabilir.

  • Return Type- Tüm işlevler bir değer döndürmelidir, bu nedenle tüm işlevlere bir tür atanmalıdır. function-typeişlevin döndürdüğü değerin veri türüdür. Standart, kullanıcı tanımlı skaler veya alt aralık tipi olabilir, ancak yapılandırılmış tip olamaz.

  • Local declarations - Yerel bildirimler, yalnızca işlev gövdesine uygulanan etiketler, sabitler, değişkenler, işlevler ve prosedürler için bildirimlere atıfta bulunur.

  • Function Body- İşlev gövdesi, işlevin ne yaptığını tanımlayan bir dizi deyim içerir. Her zaman ayrılmış sözcüklerin başlangıcı ve bitişi arasına alınmalıdır. Tüm hesaplamaların yapıldığı bir işlevin parçasıdır. Türünde bir atama ifadesi olmalıdır -name := expression;işlev adına bir değer atayan işlev gövdesinde. Bu değer, işlev çalıştırıldığında döndürülür. Gövdedeki son ifade bir son ifade olmalıdır.

Aşağıda, bir fonksiyonun pascal olarak nasıl tanımlanacağını gösteren bir örnek verilmiştir -

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

İşlev Bildirimleri

Bir işlev declarationderleyiciye bir işlev adı ve işlevin nasıl çağrılacağını anlatır. Fonksiyonun gerçek gövdesi ayrı ayrı tanımlanabilir.

Bir işlev bildirimi aşağıdaki bölümlerden oluşur -

function name(argument(s): type1; argument(s): type2; ...): function_type;

Yukarıda tanımlanan max () fonksiyonu için, fonksiyon bildirimi aşağıdadır -

function max(num1, num2: integer): integer;

Bir kaynak dosyada bir işlev tanımladığınızda ve bu işlevi başka bir dosyada çağırdığınızda işlev bildirimi gereklidir. Böyle bir durumda, işlevi çağıran dosyanın en üstünde işlevi bildirmelisiniz.

Bir Fonksiyon Çağırma

Bir işlev oluştururken, işlevin ne yapması gerektiğine dair bir tanım verirsiniz. Bir işlevi kullanmak için, tanımlanan görevi gerçekleştirmek üzere o işlevi çağırmanız gerekir. Bir program bir işlevi çağırdığında, program kontrolü çağrılan işleve aktarılır. Çağrılan bir işlev tanımlanmış görevi yerine getirir ve return ifadesi yürütüldüğünde veya son bitiş ifadesine ulaşıldığında, program kontrolünü ana programa geri döndürür.

Bir işlevi çağırmak için, gerekli parametreleri işlev adıyla birlikte iletmeniz yeterlidir ve işlev bir değer döndürürse, döndürülen değeri saklayabilirsiniz. Aşağıda, kullanımı göstermek için basit bir örnek verilmiştir -

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Max value is : 200

Procedures tek bir değer döndürmek yerine bir grup sonuç elde etmeyi sağlayan alt programlardır.

Bir Prosedür Tanımlama

Pascal'da, bir prosedür kullanılarak tanımlanır procedureanahtar kelime. Bir prosedür tanımının genel biçimi aşağıdaki gibidir -

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Prosedür definition Pascal'da bir header, yerel declarations ve bir bodyprosedürün. Prosedür başlığı anahtar kelimeden oluşurprocedureve prosedüre verilen bir isim. İşte bir prosedürün tüm bölümleri -

  • Arguments- Argüman (lar), çağıran program ile prosedür tanımlayıcıları arasındaki bağlantıyı kurar ve ayrıca biçimsel parametreler olarak da adlandırılır. Prosedürlerde argümanların kuralları, fonksiyonlar için olanla aynıdır.

  • Local declarations - Yerel bildirimler, yalnızca prosedürün gövdesi için geçerli olan etiketler, sabitler, değişkenler, işlevler ve prosedürler için bildirimlere atıfta bulunur.

  • Procedure Body- Prosedür gövdesi, prosedürün ne yaptığını tanımlayan bir dizi ifadeler içerir. Her zaman ayrılmış sözcüklerin başlangıcı ve bitişi arasına alınmalıdır. Tüm hesaplamaların yapıldığı bir prosedürün parçasıdır.

Aşağıda findMin () adlı bir prosedürün kaynak kodu verilmiştir . Bu prosedür, 4 x, y, z ve m parametresini alır ve m adlı değişkendeki ilk üç değişken arasındaki minimum değerleri saklar. M değişkeni tarafından geçilirreference (geçen argümanları biraz sonra referans alarak tartışacağız) -

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

Prosedür Beyanları

Prosedür declarationderleyiciye bir prosedür adı ve prosedürün nasıl çağrılacağını anlatır. Prosedürün gerçek gövdesi ayrı ayrı tanımlanabilir.

Bir prosedür bildirimi aşağıdaki sözdizimine sahiptir -

procedure name(argument(s): type1, argument(s): type 2, ... );

Lütfen unutmayın name of the procedure is not associated with any type. Yukarıda tanımlanan prosedür için findMin () , aşağıdaki bildirimdir -

procedure findMin(x, y, z: integer; var m: integer);

Prosedürü Çağırma

Bir prosedür oluştururken, prosedürün ne yapması gerektiğine dair bir tanım verirsiniz. Prosedürü kullanmak için, tanımlanan görevi gerçekleştirmek için bu prosedürü çağırmanız gerekecektir. Bir program bir prosedürü çağırdığında, program kontrolü çağrılan prosedüre aktarılır. Çağrılan bir prosedür, tanımlanan görevi gerçekleştirir ve son bitiş ifadesine ulaşıldığında, kontrolü çağıran programa geri döndürür.

Bir prosedürü çağırmak için, aşağıda gösterildiği gibi prosedür adıyla birlikte gerekli parametreleri iletmeniz yeterlidir -

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter three numbers:
89 45 67
Minimum: 45

Yinelemeli Alt Programlar

Bir programın veya alt programın başka bir alt programı çağırabileceğini gördük. Bir alt program kendisini çağırdığında, buna özyinelemeli arama denir ve süreç özyineleme olarak bilinir.

Kavramı açıklamak için bir sayının faktöriyelini hesaplayalım. Bir sayının faktöriyeli n olarak tanımlanır -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

Aşağıdaki program kendini yinelemeli olarak arayarak belirli bir sayının faktöriyelini hesaplar.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter a number:
5
Factorial 5 is: 120

Aşağıda, oluşturan başka bir örnek yer almaktadır. Fibonacci Series kullanarak belirli bir sayı için recursive işlev -

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

0 1 1 2	3 5 8 13 21 34

Bir Alt Programın Argümanları

Bir alt program (function or procedure) argümanlar kullanmaktır, argümanların değerlerini kabul eden değişkenleri bildirmelidir. Bu değişkenlereformal parameters alt programın.

Biçimsel parametreler, alt program içindeki diğer yerel değişkenler gibi davranır ve alt programa girişte oluşturulur ve çıkışta yok edilir.

Bir alt programı çağırırken, argümanların alt programa aktarılmasının iki yolu vardır:

Sr.No Çağrı Tipi ve Açıklaması
1 Değere göre ara

Bu yöntem bir bağımsız değişkenin gerçek değerini alt programın biçimsel parametresine kopyalar. Bu durumda, alt program içindeki parametrede yapılan değişikliklerin bağımsız değişken üzerinde hiçbir etkisi yoktur.

2 Referansla arayın

Bu yöntem, bir argümanın adresini biçimsel parametreye kopyalar. Alt programın içinde adres, çağrıda kullanılan asıl argümana erişmek için kullanılır. Bu, parametrede yapılan değişikliklerin bağımsız değişkeni etkilediği anlamına gelir.

Pascal, varsayılan olarak call by valueargümanlar iletmek için. Genel olarak bu, bir alt program içindeki kodun, alt programı çağırmak için kullanılan argümanları değiştiremeyeceği anlamına gelir. 'Pascal - Fonksiyonlar' bölümünde kullandığımız örnek program, şunu kullanarak max () adlı işlevi çağırdıcall by value.

Burada sağlanan örnek program ( exProcedure ) ise findMin () prosedürünü kullanarakcall by reference.

Herhangi bir programlamadaki kapsam, programın tanımlanmış bir değişkenin var olabileceği ve bu değişkenin ötesine erişilemeyen bir bölgesidir. Değişkenlerin Pascal programlama dilinde bildirilebileceği üç yer vardır -

  • Yerel değişkenler olarak adlandırılan bir alt programın veya bloğun içinde

  • Global değişkenler olarak adlandırılan tüm alt programların dışında

  • Biçimsel parametreler olarak adlandırılan alt program parametrelerinin tanımında

Ne olduğunu açıklayalım local ve global değişkenler ve biçimsel parametreler.

Yerel Değişkenler

Bir alt program veya blok içinde bildirilen değişkenlere yerel değişkenler denir. Yalnızca bu alt programın veya kod bloğunun içindeki ifadeler tarafından kullanılabilirler. Yerel değişkenler, kendi alt programları dışında bilinmemektedir. Aşağıda yerel değişkenlerin kullanıldığı örnek verilmiştir. Burada, tüm a , b ve c değişkenleri exLocal adlı program için yereldir .

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

value of a = 10 b = 20 c = 30

Şimdi, programı biraz daha genişletelim, kendi a , b ve c değişkenlerine sahip olacak ve değerlerini doğrudan exLocal programından gösterecek display adında bir prosedür oluşturalım .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

Global Değişkenler

Global değişkenler, bir fonksiyonun dışında, genellikle programın üstünde tanımlanır. Global değişkenler, programınızın ömrü boyunca değerlerini koruyacak ve program için tanımlanan işlevlerden herhangi birinin içinden erişilebilir.

Bir globaldeğişkenine herhangi bir işlevle erişilebilir. Diğer bir deyişle, global bir değişken, bildiriminden sonra tüm programınız boyunca kullanılabilir. Aşağıdaki kullanan bir örnekglobal ve local değişkenler -

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

Prosedür görüntüsünün, ekrana göre global değişkenler ve kendi yerel değişkenleri olan a, b ve c değişkenlerine erişimi olduğunu lütfen unutmayın. Bir program yerel ve global değişkenler için aynı isme sahip olabilir, ancak bir fonksiyon içindeki yerel değişkenin değeri tercih edilir.

Önceki örneği biraz değiştirelim, şimdi prosedür görüntüsünün yerel değişkenleri a , b , c ile aynı adlara sahip -

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

Pascal'daki dizge aslında isteğe bağlı bir boyut belirtimine sahip bir karakter dizisidir. Karakterler sayısal, harfler, boş, özel karakterler veya hepsinin bir kombinasyonu olabilir. Extended Pascal, sisteme ve uygulamaya bağlı olarak çok sayıda dizi nesnesi sağlar. Programlarda kullanılan daha yaygın dizge türlerini tartışacağız.

Bir dizeyi birçok şekilde tanımlayabilirsiniz -

  • Character arrays - Bu, tek tırnak içine alınmış, sıfır veya daha fazla bayt boyutlu karakter dizisi olan bir karakter dizisidir.

  • String variables - Turbo Pascal'da tanımlandığı şekliyle String türü değişkeni.

  • Short strings - Boyut spesifikasyonuna sahip Dize türü değişkeni.

  • Null terminated strings - değişkeni pchar yazın.

  • AnsiStrings - Ansistringler, uzunluk sınırı olmayan dizelerdir.

Pascal yalnızca bir dize operatörü, dize birleştirme operatörü (+) sağlar.

Örnekler

Aşağıdaki program ilk dört tür dizeyi yazdırır. Bir sonraki örnekte AnsiStrings kullanacağız.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

Aşağıdaki örnek birkaç işlevi daha kullanıyor, bakalım -

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

Pascal String Fonksiyonları ve Prosedürleri

Pascal, dizeleri işleyen çok çeşitli işlevleri ve prosedürleri destekler. Bu alt programlar uygulama açısından farklılık gösterir. Burada, Free Pascal tarafından sağlanan çeşitli dizge işleyen alt programları listeliyoruz -

Sr.No. İşlev ve Amaç
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

İki dizeyi karşılaştırır

2

function AnsiCompareText(const S1: ; const S2:):Integer;

Büyük / küçük harfe duyarlı olmayan iki dizeyi karşılaştırır

3

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

Dizeden tırnakları kaldırır

4

function AnsiLastChar(const S:):PChar;

Dizenin son karakterini alır

5

function AnsiLowerCase(const s:):

Dizeyi tamamen küçük harfe dönüştürür

6

function AnsiQuotedStr(const S: ; Quote: Char):;

Bir dizeden alıntılar

7

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

Dizeleri büyük / küçük harfe duyarlı olarak karşılaştırır

8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

Büyük / küçük harf duyarlı dizeleri karşılaştırır

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Büyük / küçük harfe duyarlı dizelerin L karakterlerini karşılaştırır

10

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Büyük / küçük harf duyarlı dizelerin L karakterlerini karşılaştırır

11

function AnsiStrLastChar(Str: PChar):PChar;

Dizenin son karakterini alır

12

function AnsiStrLower(Str: PChar):PChar;

Dizeyi tamamen küçük harfe dönüştürür

13

function AnsiStrUpper(Str: PChar):PChar;

Dizeyi tamamen büyük harfe dönüştürür

14

function AnsiUpperCase(const s:):;

Dizeyi tamamen büyük harfe dönüştürür

15

procedure AppendStr(var Dest: ; const S:);

2 dize ekler

16

procedure AssignStr(var P: PString; const S:);

Yığın üzerine dizelerin değerini atar

17

function CompareStr(const S1: ; const S2:):Integer; overload;

İki dizeyi büyük / küçük harfe duyarlı olarak karşılaştırır

18

function CompareText(const S1: ; const S2:):Integer;

Büyük / küçük harfe duyarlı olmayan iki dizeyi karşılaştırır

19 procedure DisposeStr(S: PString); overload;

Dizeyi yığından kaldırır

20

procedure DisposeStr(S: PShortString); overload;

Dizeyi yığından kaldırır

21

function IsValidIdent( const Ident:):Boolean;

Dize geçerli bir pascal tanımlayıcı mı

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

Bir dizede karakterin son oluşumu

23

function LeftStr(const S: ; Count: Integer):;

Bir dizenin ilk N karakterini alır

24

function LoadStr(Ident: Integer):;

Kaynaklardan dizeyi yükler

25

function LowerCase(const s: ):; overload;

Dizeyi tamamen küçük harfe dönüştürür

26

function LowerCase(const V: variant ):; overload;

Dizeyi tamamen küçük harfe dönüştürür

27

function NewStr(const S:):PString; overload;

Yığın üzerine yeni dizge ayırır

28

function RightStr(const S: ; Count: Integer):;

Bir dizenin son N karakterini alır

29

function StrAlloc(Size: Cardinal):PChar;

Dize için bellek ayırır

30

function StrBufSize(Str: PChar):SizeUInt;

Bir dizge için bellek ayırır

31

procedure StrDispose(Str: PChar);

Dizeyi yığından kaldırır

32

function StrPas(Str: PChar):;

PChar'ı pascal dizeye dönüştürür

33

function StrPCopy(Dest: PChar; Source:):PChar;

Pascal dizesini kopyalar

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

Pascal dizesinin N baytını kopyalar

35

function UpperCase(const s:):;

Dizeyi tamamen büyük harfe dönüştürür

Pascal, programcıların sabitler, değişkenler, işlevler ve ifadeler gibi mantıksal varlıkları tanımlamasına, depolamasına ve değiştirmesine olanak tanıyan veri türü Boolean sağlar.

Boole değerleri temelde tamsayı türüdür. Boole türü değişkenlerin önceden tanımlanmış iki olası değeri vardırTrue ve False. Bir Boolean değerine çözümlenen ifadeler ayrıca bir Boolean türüne atanabilir.

Free Pascal ayrıca ByteBool, WordBool ve LongBooltürleri. Bunlar sırasıyla Byte, Word veya Longint türleridir.

False değeri, 0 (sıfır) ile eşdeğerdir ve sıfır olmayan herhangi bir değer, bir Boole değerine dönüştürülürken True olarak kabul edilir. True'nun bir Boole değeri, LongBool türünde bir değişkene atanması durumunda -1'e dönüştürülür.

Mantıksal operatörlerin and, or ve not Boolean veri türleri için tanımlanmıştır.

Boolean Veri Türlerinin Bildirimi

Boolean türünde bir değişken, var anahtar sözcüğü kullanılarak bildirilir.

var
boolean-identifier: boolean;

Örneğin,

var
choice: boolean;

Misal

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

Pascal programlama dili, dizi adı verilen ve aynı türden öğelerin sabit boyutlu sıralı bir koleksiyonunu depolayabilen bir veri yapısı sağlar. Bir dizi, bir veri koleksiyonunu depolamak için kullanılır, ancak bir diziyi aynı türden bir değişkenler koleksiyonu olarak düşünmek genellikle daha kullanışlıdır.

Sayı1, sayı2, ... ve sayı100 gibi tek tek değişkenleri bildirmek yerine, sayılar gibi bir dizi değişkeni bildirir ve temsil etmek için sayılar [1], sayılar [2] ve ..., sayılar [100] kullanırsınız bireysel değişkenler. Bir dizideki belirli bir öğeye bir dizinle erişilir.

Tüm diziler bitişik bellek konumlarından oluşur. En düşük adres ilk öğeye ve en yüksek adres son öğeye karşılık gelir.

Dizin 0'dan başlayan bir C stili dizisi istiyorsanız, dizini 1 yerine 0'dan başlatmanız gerektiğini lütfen unutmayın.

Dizileri Bildirme

Pascal'da bir dizi bildirmek için, bir programcı ya türü bildirebilir ve sonra bu dizinin değişkenlerini yaratabilir ya da doğrudan dizi değişkenini bildirebilir.

Tek boyutlu dizinin tür bildiriminin genel biçimi -

type
   array-identifier = array[index-type] of element-type;

Nerede,

  • array-identifier - dizi türünün adını belirtir.

  • index-type- dizinin alt simgesini belirtir; gerçek dışında herhangi bir skaler veri türü olabilir

  • element-type - depolanacak değer türlerini belirtir

Örneğin,

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

Şimdi, hız, 25'e kadar gerçek sayıyı tutmak için yeterli olan değişken bir vektör tipi dizisidir.

Diziyi 0 dizininden başlatmak için, bildirim -

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

Dizi Alt Simge Türleri

Pascal'da, bir dizi alt simge, gerçek dışında tamsayı, Boole, numaralandırılmış veya alt aralık gibi herhangi bir skaler tipte olabilir. Dizi alt simgelerinin de negatif değerleri olabilir.

Örneğin,

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

Alt simgenin karakter türünde olduğu başka bir örneği ele alalım -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

Alt simge, numaralandırılmış türde olabilir -

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

Dizileri Başlatma

Pascal'da diziler, belirli bir alt simge belirtilerek veya bir for-do döngüsü kullanılarak atama yoluyla başlatılır.

Örneğin -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

Dizi Öğelerine Erişim

Dizi adını indeksleyerek bir elemana erişilir. Bu, elemanın dizini dizinin isminden sonra köşeli parantez içine yerleştirilerek yapılır. Örneğin -

a: integer;
a: = alphabet['A'];

Yukarıdaki ifade, alfabe adlı diziden ilk öğeyi alacak ve değeri a değişkenine atayacaktır.

Aşağıda, yukarıda bahsedilen üç kavramın tamamını kullanacak bir örnek verilmiştir. bildirim, atama ve dizilere erişim -

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

Ayrıntılı Pascal Dizileri

Diziler Pascal için önemlidir ve çok daha fazla ayrıntıya ihtiyaç duymalıdır. Bir Pascal programcısı için açık olması gereken, dizi ile ilgili aşağıdaki birkaç önemli kavram vardır:

Sr.No Konsept ve Açıklama
1 Çok boyutlu diziler

Pascal, çok boyutlu dizileri destekler. Çok boyutlu dizinin en basit şekli iki boyutlu dizidir.

2 Dinamik dizi

Bu tür dizilerde başlangıç ​​uzunluğu sıfırdır. Dizinin gerçek uzunluğu standart olarak ayarlanmalıdırSetLength işlevi.

3 Paketlenmiş dizi

Bu diziler bit paketlidir, yani her karakter veya doğruluk değerleri, genellikle bir kelime (4 bayt veya daha fazla) olmak üzere bir depolama birimi kullanmak yerine ardışık baytlarda saklanır.

4 Dizileri alt programlara geçirme

Dizinin adını indeks olmadan belirterek, bir alt programa bir diziye bir işaretçi aktarabilirsiniz.

Pascal'daki işaretçileri öğrenmesi kolay ve eğlencelidir. Bazı Pascal programlama görevleri işaretçilerle daha kolay gerçekleştirilir ve dinamik bellek ayırma gibi diğer görevler işaretçiler kullanılmadan gerçekleştirilemez. Bu yüzden mükemmel bir Pascal programcısı olmak için işaretçileri öğrenmek gerekli hale geliyor. Bunları basit ve kolay adımlarla öğrenmeye başlayalım.

Bildiğiniz gibi, her değişken bir bellek konumudur ve her bellek konumu, bellekteki bir adresi belirten işaretçi değişkeninin adı kullanılarak erişilebilen tanımlanmış bir adresine sahiptir.

İşaretçiler Nelerdir?

Bir işaretçi, değeri başka bir değişkenin adresi, yani bellek konumunun doğrudan adresi olan dinamik bir değişkendir. Herhangi bir değişken veya sabit gibi, herhangi bir değişken adresini saklamak için kullanmadan önce bir işaretçi bildirmelisiniz. Bir işaretçi değişken bildiriminin genel şekli -

type
   ptr-identifier = ^base-variable-type;

İşaretçi türü, düzeltme sembolünün (^) yukarı okunun önüne temel tür eklenerek tanımlanır. Temel tür, veri öğelerinin türlerini tanımlar. Bir işaretçi değişkeni belirli türde olacak şekilde tanımlandığında, yalnızca o türdeki veri öğelerini işaret edebilir. Bir işaretçi türü tanımlandıktan sonra,var işaretçi değişkenlerini bildirmek için bildirim.

var
   p1, p2, ... : ptr-identifier;

Aşağıda bazı geçerli işaretçi bildirimleri verilmiştir -

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

İşaretçi değişkenlerinin referansı aynı düzeltme simgesi (^) kullanılarak kaldırılır. Örneğin, ilişkili değişken bir işaretçi tarafından sevk BioLRptr olduğu ^ BioLRptr . Şu şekilde erişilebilir -

rptr^ := 234.56;

Aşağıdaki örnek bu kavramı açıklayacaktır -

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

Pascal'da Bellek Adresi Yazdırma

Pascal'da, adres operatörünü (@) kullanarak bir değişkenin adresini bir işaretçi değişkenine atayabiliriz. Bu işaretçiyi veri öğesini işlemek ve ona erişmek için kullanıyoruz. Ancak, herhangi bir nedenle bellek adresinin kendisiyle çalışmamız gerekirse, onu bir sözcük türü değişkeninde saklamamız gerekir.

İptr işaretçisinde depolanan bellek adresini yazdırmak için yukarıdaki örneği genişletelim -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

NIL İşaretçiler

Bir atamak her zaman iyi bir uygulamadır. NILatanacak tam adresinizin olmaması durumunda bir işaretçi değişkenine değer. Bu, değişken bildirimi sırasında yapılır. Atanan bir işaretçiNILhiçbir yere işaret etmiyor. Aşağıdaki programı düşünün -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

The value of ptr is 0

Kontrol etmek için nil işaretçi aşağıdaki gibi bir if ifadesini kullanabilirsiniz -

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Ayrıntılı Pascal İşaretçileri

İşaretçilerin birçok ama kolay kavramları vardır ve Pascal programlaması için çok önemlidirler. Bir Pascal programcısı için açık olması gereken birkaç önemli işaretçi kavramı vardır:

Sr.No Konsept ve Açıklama
1 Pascal - İşaretçi aritmetiği

İşaretçilerde kullanılabilecek dört aritmetik operatör vardır: artırma, azaltma, +, -

2 Pascal - İşaretçiler dizisi

Bir dizi işaretçi tutacak diziler tanımlayabilirsiniz.

3 Pascal - Pointer to pointer

Pascal allows you to have pointer on a pointer and so on.

4 Passing pointers to subprograms in Pascal

Passing an argument by reference or by address both enable the passed argument to be changed in the calling subprogram by the called subprogram.

5 Return pointer from subprograms in Pascal

Pascal allows a subprogram to return a pointer.

Pascal arrays allow you to define type of variables that can hold several data items of the same kind but a record is another user-defined data type available in Pascal which allows you to combine data items of different kinds.

Records consist of different fields. Suppose you want to keep track of your books in a library, you might want to track the following attributes about each book −

  • Title
  • Author
  • Subject
  • Book ID

Defining a Record

To define a record type, you may use the type declaration statement. The record type is defined as −

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Here is the way you would declare the Book record −

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

The record variables are defined in the usual way as

var
   r1, r2, ... : record-name;

Alternatively, you can directly define a record type variable as −

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Accessing Fields of a Record

To access any field of a record, we use the member access operator (.). The member access operator is coded as a period between the record variable name and the field that we wish to access. Following is the example to explain usage of structure −

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

When the above code is compiled and executed, it produces the following result −

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Records as Subprogram Arguments

You can pass a record as a subprogram argument in very similar way as you pass any other variable or pointer. You would access the record fields in the similar way as you have accessed in the above example −

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

When the above code is compiled and executed, it produces the following result −

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Pointers to Records

You can define pointers to records in very similar way as you define pointer to any other variable as follows −

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Now, you can store the address of a record type variable in the above-defined pointer variable. To declare a variable of the created pointer type, you use the var keyword −

var
   r1, r2, ... : record-ptr;

Before using these pointers, you must create storage for a record-name type variable, which will be manipulated by these pointers.

new(r1);
new(r2);

To access the members of a record using a pointer to that record, you must use the ^. operator as follows −

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Finally, don't forget to dispose the used storage, when it is no longer in use −

dispose(r1);
dispose(r2);

Let us re-write the first example using a pointer to the Books record. Hope this will be easy for you to understand the concept −

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

When the above code is compiled and executed, it produces the following result −

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

The With Statement

We have discussed that the members of a record can be accessed using the member access operator (.). This way the name of the record variable has to be written every time. The With statement provides an alternative way to do that.

Look at the following code snippet taken from our first example −

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

The same assignment could be written using the With statement as −

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal supports a unique type of storage named variants. You can assign any simple type of values in a variant variable. The type of a value stored in a variant is only determined at runtime. Almost any simple type can be assigned to variants: ordinal types, string types, int64 types.

Structured types such as sets, records, arrays, files, objects and classes are not assignment-compatible with a variant. You can also assign a pointer to a variant.

Free Pascal supports variants.

Declaring a Variant

You can declare variant type like any other types using the var keyword. The syntax for declaring a variant type is −

var
   v: variant;

Now, this variant variable v can be assigned to almost all simple types including the enumerated types and vice versa.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Example

The following example would illustrate the concept −

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

When the above code is compiled and executed, it produces the following result −

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

A set is a collection of elements of same type. Pascal allows defining the set data type. The elements in a set are called its members. In mathematics, sets are represented by enclosing the members within braces{}. However, in Pascal, set elements are enclosed within square brackets [], which are referred as set constructor.

Defining Set Types and Variables

Pascal Set types are defined as

type
set-identifier = set of base type;

Variables of set type are defined as

var
s1, s2, ...: set-identifier;

or,

s1, s2...: set of base type;

Examples of some valid set type declaration are −

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

Set Operators

You can perform the following set operations on Pascal sets.

Sr.No Operations & Descriptions
1

Union

This joins two sets and gives a new set with members from both sets.

2

Difference

Gets the difference of two sets and gives a new set with elements not common to either set.

3

Intersection

Gets the intersection of two sets and gives a new set with elements common to both sets.

4

Inclusion

A set P is included in set Q, if all items in P are also in Q but not vice versa.

5

Symmetric difference

Gets the symmetric difference of two sets and gives a set of elements, which are in either of the sets and not in their intersection.

6

In

It checks membership.

Following table shows all the set operators supported by Free Pascal. Assume that S1 and S2 are two character sets, such that −

S1 := ['a', 'b', 'c'];

S2 := ['c', 'd', 'e'];

Operator Description Example
+ Union of two sets

S1 + S2 will give a set

['a', 'b', 'c', 'd', 'e']

- Difference of two sets

S1 - S2 will give a set

['a', 'b']

* Intersection of two sets

S1 * S2 will give a set

['c']

>< Symmetric difference of two sets S1 >< S2 will give a set ['a', 'b', 'd', 'e']
= Checks equality of two sets S1 = S2 will give the boolean value False
<> Checks non-equality of two sets S1 <> S2 will give the boolean value True
<= Contains (Checks if one set is a subset of the other) S1 <= S2 will give the boolean value False
Include Includes an element in the set; basically it is the Union of a set and an element of same base type

Include (S1, ['d']) will give a set

['a', 'b', 'c', 'd']

Exclude Excludes an element from a set; basically it is the Difference of a set and an element of same base type

Exclude (S2, ['d']) will give a set

['c', 'e']

In Checks set membership of an element in a set ['e'] in S2 gives the boolean value True

Example

The following example illustrates the use of some of these operators −

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

When the above code is compiled and executed, it produces the following result −

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal treats a file as a sequence of components, which must be of uniform type. A file's type is determined by the type of the components. File data type is defined as −

type
file-name = file of base-type;

Where, the base-type indicates the type of the components of the file. The base type could be anything like, integer, real, Boolean, enumerated, subrange, record, arrays and sets except another file type. Variables of a file type are created using the var declaration −

var
f1, f2,...: file-name;

Aşağıda, bazı dosya türlerini ve dosya değişkenlerini tanımlamaya ilişkin bazı örnekler verilmiştir -

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

Dosya Oluşturma ve Dosyaya Yazma

Öğrencilerin kayıtları için bir veri dosyası oluşturacak bir program yazalım. Students.dat adında bir dosya oluşturur ve bir öğrencinin verilerini içine yazar -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

Derlendiğinde ve çalıştırıldığında, program çalışma dizinine öğrenciler.dat adında bir dosya oluşturur . Dosyayı, John Smith'in verilerine bakmak için not defteri gibi bir metin düzenleyicisi kullanarak açabilirsiniz.

Dosyadan Okuma

Öğrenciler.dat adlı bir dosyaya yeni oluşturduk ve yazdık. Şimdi, öğrencinin verilerini dosyadan okuyacak bir program yazalım -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Name: John Smith
Address: United States of America
Batch Code: Computer Science

Alt Program Parametresi Olarak Dosyalar

Pascal, dosya değişkenlerinin standart ve kullanıcı tanımlı alt programlarda parametre olarak kullanılmasına izin verir. Aşağıdaki örnek bu kavramı göstermektedir. Program, rainfall.txt adlı bir dosya oluşturur ve bazı yağış verilerini depolar. Ardından dosyayı açar, verileri okur ve ortalama yağış miktarını hesaplar.

Lütfen bunu not al, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

Metin Dosyaları

Pascal'daki bir metin dosyası, her satırın bir satır sonu işaretçisi ile sonlandırıldığı karakter satırlarından oluşur. Bu tür dosyaları şu şekilde bildirebilir ve tanımlayabilirsiniz:

type
file-name = text;

Normal bir karakter dosyası ile bir metin dosyası arasındaki fark, bir metin dosyasının satırlara bölünmesidir, her biri özel bir satır sonu işaretçisi ile sonlandırılır ve sistem tarafından otomatik olarak eklenir. Aşağıdaki örnek, contact.txt adlı bir metin dosyası oluşturur ve ona yazar -

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Enter the file name:
contact.txt 
Completed writing

Dosyaya Ekleme

Bir dosyaya eklemek, zaten bazı verileri içeren mevcut bir dosyaya dosyanın üzerine yazmadan yazmak anlamına gelir. Aşağıdaki program bunu göstermektedir -

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Dosya İşleme İşlevleri

Free Pascal, dosya işleme için aşağıdaki işlevleri / prosedürleri sağlar -

Sr.No. Fonksiyon Adı ve Tanımı
1

procedure Append(var t: Text);

Ekleme modunda bir dosya açar

2

procedure Assign(out f: file; const Name:);

Bir dosyaya bir isim atar

3

procedure Assign(out f: file; p: PChar);

Bir dosyaya bir isim atar

4

procedure Assign(out f: file; c: Char);

Bir dosyaya bir isim atar

5

procedure Assign(out f: TypedFile; const Name:);

Bir dosyaya bir isim atar

6

procedure Assign(out f: TypedFile; p: PChar);

Bir dosyaya bir isim atar

7

procedure Assign(out f: TypedFile; c: Char);

Bir dosyaya bir isim atar

8

procedure Assign(out t: Text; const s:);

Bir dosyaya bir isim atar

9

procedure Assign(out t: Text; p: PChar);

Bir dosyaya bir isim atar

10

procedure Assign(out t: Text; c: Char);

Bir dosyaya bir isim atar

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

Bir dosyadaki verileri belleğe okur

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

Bir dosyadaki verileri belleğe okur

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Bir dosyadaki verileri belleğe okur

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

Bir dosyadaki verileri belleğe okur

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

Bir dosyadaki verileri belleğe okur

16

procedure BlockRead(var f: file; var Buf; count: Int64);

Bir dosyadaki verileri belleğe okur

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

Verileri bellekten bir dosyaya yazar

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

Verileri bellekten bir dosyaya yazar

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Verileri bellekten bir dosyaya yazar

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

Verileri bellekten bir dosyaya yazar

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

Verileri bellekten bir dosyaya yazar

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

Verileri bellekten bir dosyaya yazar

23

procedure Close(var f: file);

Bir dosyayı kapatır

24

procedure Close(var t: Text);

Bir dosyayı kapatır

25

function EOF(var f: file):Boolean;

Dosyanın sonunu kontrol eder

26

function EOF(var t: Text):Boolean;

Dosyanın sonunu kontrol eder

27

function EOF: Boolean;

Dosyanın sonunu kontrol eder

28

function EOLn(var t: Text):Boolean;

Hat sonu kontrolleri

29

function EOLn: Boolean;

Hat sonu kontrolleri

30

procedure Erase(var f: file);

Dosyayı diskten siler

31

procedure Erase(var t: Text);

Dosyayı diskten siler

32

function FilePos( var f: file):Int64;

Dosyadaki pozisyon

33

function FileSize(var f: file):Int64;

Dosya boyutu

34

procedure Flush(var t: Text);

Dosya arabelleklerini diske yazar

35

function IOResult: Word;

Son dosya GÇ işleminin sonucunu verir

36

procedure Read(var F: Text; Args: Arguments);

Dosyadan değişkene okur

37

procedure Read(Args: Arguments);

Dosyadan değişkene okur

38

procedure ReadLn(var F: Text; Args: Arguments);

Dosyadan değişkene okur ve sonraki satıra gider

39

procedure ReadLn(Args: Arguments);

Dosyadan değişkene okur ve sonraki satıra gider

40

procedure Rename(var f: file; const s:);

Diskteki dosyayı yeniden adlandırır

41

procedure Rename(var f: file; p: PChar);

Diskteki dosyayı yeniden adlandırır

42

procedure Rename(var f: file; c: Char);

Diskteki dosyayı yeniden adlandırır

43

procedure Rename(var t: Text; const s);

Diskteki dosyayı yeniden adlandırın

44

procedure Rename(var t: Text; p: PChar);

Diskteki dosyayı yeniden adlandırır

45

procedure Rename( var t: Text; c: Char);

Diskteki dosyayı yeniden adlandırır

46

procedure Reset(var f: file; l: LongInt);

Dosyayı okumak için açar

47

procedure Reset(var f: file);

Dosyayı okumak için açar

48

procedure Reset(var f: TypedFile);

Dosyayı okumak için açar

49

procedure Reset(var t: Text);

Dosyayı okumak için açar

50

procedure Rewrite(var f: file; l: LongInt);

Dosyayı yazmak için açar

51

procedure Rewrite(var f: file);

Dosyayı yazmak için açar

52

procedure Rewrite(var f: TypedFile);

Dosyayı yazmak için açar

53

procedure Rewrite(var t: Text);

Dosyayı yazmak için açar

54

procedure Seek(var f: file; Pos: Int64);

Dosya konumunu ayarlar

55

function SeekEOF(var t: Text):Boolean;

Dosya konumunu dosyanın sonuna ayarlar

56

function SeekEOF: Boolean;

Dosya konumunu dosyanın sonuna ayarlar

57

function SeekEOLn(var t: Text):Boolean;

Dosya konumunu satırın sonuna ayarlar

58

function SeekEOLn: Boolean;

Dosya konumunu satırın sonuna ayarlar

59

procedure SetTextBuf(var f: Text; var Buf);

Dosya arabelleğinin boyutunu belirler

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

Dosya arabelleğinin boyutunu belirler

61

procedure Truncate(var F: file);

Dosyayı konumunda kesin

62

procedure Write(Args: Arguments);

Değişkeni dosyaya yazar

63

procedure Write(var F: Text; Args: Arguments);

Değişkeni dosyaya yaz

64

procedure Writeln(Args: Arguments);

Değişkeni dosyaya yazar ve satırsonu ekler

65

procedure WriteLn(var F: Text; Args: Arguments);

Değişkeni dosyaya yazar ve satırsonu ekler

Bu bölüm, Pascal'da dinamik bellek yönetimini açıklamaktadır. Pascal programlama dili, bellek tahsisi ve yönetimi için çeşitli işlevler sağlar.

Belleği Dinamik Olarak Ayırma

Programlama yaparken, bir dizinin boyutunun farkındaysanız, o zaman kolaydır ve onu bir dizi olarak tanımlayabilirsiniz. Örneğin, herhangi bir kişinin adını saklamak için, en fazla 100 karakter gidebilir, böylece bir şeyi aşağıdaki gibi tanımlayabilirsiniz -

var
name: array[1..100] of char;

Ama şimdi, saklamanız gereken metnin uzunluğu hakkında hiçbir fikrinizin olmadığı, örneğin bir konu hakkında ayrıntılı bir açıklama saklamak istediğiniz bir durumu ele alalım. Burada, ne kadar bellek gerektiğini tanımlamadan dizgeye bir işaretçi tanımlamamız gerekiyor.

Pascal bir prosedür sağlar newişaretçi değişkenleri oluşturmak için.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Şimdi, daha sonra başvurulacak belirli sayıda bayt içeren bir işaretçi tanımlamanız gerekirse, getmem function veya the getmem aşağıdaki sözdizimine sahip yordam -

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Önceki örnekte, bir dizgeye bir işaretçi bildirdik. Bir dizenin maksimum değeri 255 bayttır. Bayt cinsinden gerçekten bu kadar alana veya daha büyük bir alana ihtiyacınız yoksa, getmem alt programı bunu belirlemenize izin verir. Getmem'i kullanarak önceki örneği yeniden yazalım -

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Böylece, tam kontrole sahip olursunuz ve dizilerden farklı olarak belleği ayırırken herhangi bir boyut değerini geçebilirsiniz, burada boyutu bir kez tanımladıktan sonra değiştirilemez.

Belleği Yeniden Boyutlandırma ve Serbest Bırakma

Programınız çıktığında, işletim sistemi programınız tarafından ayrılan tüm belleği otomatik olarak serbest bırakır, ancak artık belleğe ihtiyacınız kalmadığında iyi bir uygulama olarak bu belleği serbest bırakmalısınız.

Pascal prosedürü sağlar dispose yordamı kullanarak dinamik olarak oluşturulmuş bir değişkeni serbest bırakmak new. Kullanarak bellek ayırdıysanız getmem alt program, ardından alt programı kullanmanız gerekir freemembu hafızayı boşaltmak için. Freemem altprogramların sözdizimi şöyle -

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Alternatif olarak, ReAllocMem işlevini çağırarak ayrılmış bir bellek bloğunun boyutunu artırabilir veya azaltabilirsiniz . Yukarıdaki programı bir kez daha kontrol edelim ve ReAllocMem ve freemem alt programlarını kullanalım . ReAllocMem için sözdizimi aşağıdadır -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Aşağıda, ReAllocMem ve freemem alt programlarını kullanan bir örnek verilmiştir -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Bellek Yönetimi İşlevleri

Pascal, çeşitli veri yapılarının uygulanmasında ve Pascal'da düşük seviyeli programlamanın uygulanmasında kullanılan bir yığın bellek yönetimi işlevi sağlar. Bu işlevlerin çoğu uygulamaya bağlıdır. Free Pascal, bellek yönetimi için aşağıdaki işlevleri ve prosedürleri sağlar -

SN Fonksiyon Adı ve Tanımı
1

function Addr(X: TAnytype):Pointer;

Değişkenin adresini verir

2

function Assigned(P: Pointer):Boolean;

Bir işaretçinin geçerli olup olmadığını kontrol eder

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

Bayt başına 2 bellek tampon baytını karşılaştırır

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

Bayt başına 2 bellek tampon baytını karşılaştırır

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

Bayt başına 2 bellek tampon baytını karşılaştırır

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

Bayt başına 2 bellek tampon baytını karşılaştırır

7

function Cseg: Word;

Kod segmentini verir

8

procedure Dispose(P: Pointer);

Dinamik olarak ayrılmış belleği serbest bırakır

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Dinamik olarak ayrılmış belleği serbest bırakır

10

function Dseg: Word;

Veri segmentini verir

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Bellek bölgesini 8 bit desenle doldurur

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Hafıza bölgesini belirli karakterlerle doldurur

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Bellek bölgesini 32 bit desenle doldurur

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Bellek bölgesini 64 bit desenle doldurur

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Bellek bölgesini 16 bit desenle doldurur

16

procedure Freemem( p: pointer; Size: PtrUInt);

Ayrılan belleği serbest bırakır

17

procedure Freemem( p: pointer );

Ayrılan belleği serbest bırakır

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Yeni hafıza ayırır

19

procedure Getmem( out p: pointer);

Yeni hafıza ayırır

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Mevcut hafıza yöneticisini döndürür

21

function High( Arg: TypeOrVariable):TOrdinal;

Açık dizinin en yüksek dizinini veya numaralandırılmış olarak döndürür

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Bir bellek aralığında bayt büyüklüğündeki değeri bulur

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Bir bellek aralığında karakter boyutunda bir değer bulur

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Bir bellek aralığında DWord boyutlu (32 bit) değeri bulur

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Bir bellek aralığında QWord boyutlu değeri bulur

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Bir bellek aralığında kelime büyüklüğünde değer bulur

27

function IsMemoryManagerSet: Boolean;

Hafıza yöneticisi ayarlanmış mı

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Açık dizinin en düşük dizinini veya numaralandırılmış olarak verir

29

procedure Move( const source; var dest; count: SizeInt );

Verileri hafızadaki bir konumdan diğerine taşır

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Verileri ilk sıfır karakterine kadar taşır

31

procedure New( var P: Pointer);

Değişken için dinamik olarak bellek ayırın

32

procedure New( var P: Pointer; Cons: TProcedure);

Değişken için dinamik olarak bellek ayırır

33

function Ofs( var X ):LongInt;

Değişkenin ofsetini verir

34

function ptr( sel: LongInt; off: LongInt):farpointer;

İşaretçiye segment ve ofseti birleştirir

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Yığın üzerindeki bir bellek bloğunu yeniden boyutlandırır

36

function Seg( var X):LongInt;

İade segmenti

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Bir hafıza yöneticisi ayarlar

38

function Sptr: Pointer;

Mevcut yığın işaretçisini döndürür

39

function Sseg: Word;

Yığın segment kayıt değerini döndürür

Bir Pascal programı, birimler adı verilen modüllerden oluşabilir. Bir birim, değişkenlerden ve tür bildirimlerinden, ifadelerden, prosedürlerden vb. Oluşan bazı kod bloklarından oluşabilir. Pascal'da birçok yerleşik birim vardır ve Pascal, programcıların kullanılacak kendi birimlerini tanımlamasına ve yazmasına izin verir. daha sonra çeşitli programlarda.

Yerleşik Üniteleri Kullanma

Hem yerleşik birimler hem de kullanıcı tanımlı birimler, kullanım cümlesi tarafından bir programa dahil edilir. Varyantlar birimini Pascal - Varyantlar öğreticisinde zaten kullandık . Bu eğitimde, kullanıcı tanımlı birimlerin oluşturulması ve dahil edilmesi açıklanmaktadır. Ancak, önce yerleşik bir birimin nasıl ekleneceğini görelim.crt programınızda -

program myprog;
uses crt;

Aşağıdaki örnek, crt birim -

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

Pascal eğitiminin hemen başında kullandığımız programın aynısı, değişikliğin etkilerini bulmak için onu derleyin ve çalıştırın.

Bir Pascal Birimi Oluşturma ve Kullanma

Bir birim oluşturmak için, içinde saklamak istediğiniz modülleri veya alt programları yazmanız ve bir dosyaya kaydetmeniz gerekir. .pasuzantı. Bu dosyanın ilk satırı, anahtar kelime birimi ile başlamalı ve ardından birimin adı gelmelidir. Örneğin -

unit calculateArea;

Aşağıda, bir Pascal birimi oluşturmanın üç önemli adımı verilmiştir -

  • Dosyanın adı ve birimin adı tam olarak aynı olmalıdır. Böylece, calculateArea birimimiz calculateArea.pas adlı bir dosyaya kaydedilecektir .

  • Sonraki satır tek bir anahtar kelimeden oluşmalıdır interface. Bu satırdan sonra bu ünitede gelecek olan tüm fonksiyon ve prosedürler için beyanları yazacaksınız.

  • İşlev bildirimlerinden hemen sonra kelimesini yazın implementation, yine bir anahtar kelimedir. Anahtar kelime uygulamasını içeren satırdan sonra, tüm alt programların tanımını sağlayın.

Aşağıdaki program, calculateArea adlı birimi oluşturur -

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

Sonra, yukarıda tanımladığımız birimi kullanacak basit bir program yazalım -

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

Yazdığınız yazılımların çoğu, geçerli tarih ve saati döndüren bazı tarih işlevlerini uygulamaya ihtiyaç duyar. Tarihler, günlük yaşamın o kadar önemli bir parçası ki, onlarla düşünmeden çalışmak kolay hale geliyor. Pascal ayrıca tarih aritmetiği için tarihlerin işlenmesini kolaylaştıran güçlü araçlar sağlar. Ancak, bu işlevlerin gerçek adı ve çalışmaları farklı derleyiciler için farklıdır.

Güncel Tarih ve Saati Alma

Pascal'ın TimeToString işlevi, iki nokta üst üste (:) ile ayrılmış biçimde geçerli zamanı size verir. Aşağıdaki örnek, geçerli saatin nasıl alınacağını gösterir -

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Current time : 18:33:08

Date işlev şu anki tarihi döndürür TDateTimebiçim. TDateTime, bazı kod çözme ve biçimlendirme gerektiren bir çift değerdir. Aşağıdaki program, geçerli tarihi görüntülemek için programınızda nasıl kullanılacağını gösterir -

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

Şimdi işlevi geçerli tarih ve saati döndürür -

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal adlı basit bir zaman damgası yapısı sağlar TTimeStamp, aşağıdaki biçime sahip olan -

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

Çeşitli Tarih ve Saat İşlevleri

Free Pascal aşağıdaki tarih ve saat işlevlerini sağlar -

Sr.No. Fonksiyon Adı ve Tanımı
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

DateTime türünü dosya tarihine dönüştürür.

2

function DateTimeToStr( DateTime: TDateTime):;

DateTime'ın dize temsilini oluşturur

3

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

DateTime'ın dize temsilini oluşturur

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

DateTime'ın dize temsilini oluşturur

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

DateTime'ın dize temsilini oluşturur

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

DateTime'ı sistem saatine dönüştürür

7

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;DateTime'ı zaman damgasına dönüştürür

8

function DateToStr(Date: TDateTime):;

Tarihin dize gösterimini oluşturur

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

Tarihin dize gösterimini oluşturur

10

function Date: TDateTime;

Geçerli tarihi alır

11

function DayOfWeek(DateTime: TDateTime):Integer;

Haftanın gününü alır

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

DateTime kodunu yıl ay ve gün olarak çözer

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

DateTime kodunu saat, dakika ve saniye olarak çözer

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

DateTime için yılı, günü ve ayı kodlar

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

DateTime saat, dakika ve saniyeyi kodlar

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

DateTime'ın dize gösterimini döndürür

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

DateTime'ın dize gösterimini döndürür

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

Ayda 1 ekler

19

function IsLeapYear(Year: Word):Boolean;

Yılın artık yıl olup olmadığını belirler

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

Milisaniye sayısını zaman damgasına dönüştürür

21

function Now: TDateTime;

Geçerli tarih ve saati alır

22

function StrToDateTime(const S:):TDateTime;

Dizeyi DateTime'a dönüştürür

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

Dizeyi DateTime'a dönüştürür

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

Dizeyi DateTime'a dönüştürür

25

function StrToDate(const S: ShortString):TDateTime;

Dizeyi tarihe dönüştürür

26

function StrToDate(const S: Ansistring):TDateTime;

Dizeyi tarihe dönüştürür

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

Dizeyi tarihe dönüştürür

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

Dizeyi tarihe dönüştürür

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

Dizeyi tarihe dönüştürür

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

Dizeyi tarihe dönüştürür

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

Dizeyi tarihe dönüştürür

32

function StrToTime(const S: Shortstring):TDateTime;

Dizeyi zamana dönüştürür

33

function StrToTime(const S: Ansistring):TDateTime;

Dizeyi zamana dönüştürür

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

Dizeyi zamana dönüştürür

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

Dizeyi zamana dönüştürür

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

Dizeyi zamana dönüştürür

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

Dizeyi zamana dönüştürür

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

Sistem zamanını tarih saatine dönüştürür

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

Zaman damgasını DateTime'a dönüştürür

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

Zaman Damgasını milisaniye sayısına dönüştürür

41

function TimeToStr(Time: TDateTime):;

Zamanın dize gösterimini döndürür

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

Zamanın dize gösterimini döndürür

43

function Time: TDateTime;

Geçerli zamanı alın

Aşağıdaki örnek, yukarıdaki işlevlerden bazılarının kullanımını göstermektedir -

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

Yukarıdaki kod derlenip çalıştırıldığında aşağıdaki sonucu verdi:

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

Evrenimizin güneş, dünya, ay vb. Gibi farklı nesnelerden oluştuğunu hayal edebiliriz. Benzer şekilde, arabamızı tekerlek, direksiyon, dişli vb. Gibi farklı nesnelerden yapılmış hayal edebiliriz. Aynı şekilde, nesne tabanlı programlama konseptleri vardır. her şeyi bir nesne olarak varsayın ve farklı nesneler kullanarak bir yazılım gerçekleştirin. Pascal'da, gerçek dünya nesnesini uygulamak için kullanılan iki yapısal veri türü vardır -

  • Nesne türleri
  • Sınıf türleri

Nesneye Yönelik Kavramlar

Ayrıntıya girmeden önce, Nesne Tabanlı Pascal ile ilgili önemli Pascal terimlerini tanımlayalım.

  • Object- Nesne, kayıt gibi alanlar içeren özel bir kayıt türüdür; ancak, kayıtlardan farklı olarak nesneler, nesnenin parçası olarak prosedürler ve işlevler içerir. Bu prosedürler ve işlevler, nesnenin türüyle ilişkili yöntemlere işaret eder.

  • Class- Bir Sınıf, neredeyse bir Nesne ile aynı şekilde tanımlanır, ancak yaratılma şekillerinde bir fark vardır. Sınıf, bir programın Yığını üzerinde tahsis edilirken, Nesne Yığın üzerinde tahsis edilir. Nesnenin kendisine değil, nesneye bir göstericidir.

  • Instantiation of a class- Örnekleme, bu sınıf türünde bir değişken oluşturmak anlamına gelir. Bir sınıf yalnızca bir işaretçi olduğundan, sınıf türünden bir değişken bildirildiğinde, tüm nesne için değil, yalnızca işaretçi için ayrılmış bellek vardır. Yalnızca kurucularından biri kullanılarak somutlaştırıldığında, nesne için bellek ayrılır. Bir sınıfın örneklerine 'nesneler' de denir, ancak bunları Object Pascal Nesneleri ile karıştırmayın. Bu eğitimde, Pascal Nesneleri için 'Nesne' ve kavramsal nesne veya sınıf örneği için 'nesne' yazacağız.

  • Member Variables - Bunlar bir Sınıf veya Nesne içinde tanımlanan değişkenlerdir.

  • Member Functions - Bunlar, bir Sınıf veya Nesne içinde tanımlanan işlevler veya prosedürlerdir ve nesne verilerine erişmek için kullanılır.

  • Visibility of Members- Bir Nesnenin veya Sınıfın üyelerine alanlar da denir. Bu alanların farklı görünürlükleri vardır. Görünürlük, üyelerin erişilebilirliği, yani bu üyelerin tam olarak nerede erişilebilir olacağı anlamına gelir. Nesnelerin üç görünürlük düzeyi vardır: genel, özel ve korumalı. Sınıfların beş görünürlük türü vardır: genel, özel, kesinlikle özel, korumalı ve yayınlanmış. Görünürlüğü ayrıntılı olarak tartışacağız.

  • Inheritance- Bir Sınıf, bir üst Sınıfın mevcut işlevlerini miras alarak tanımlandığında, miras alındığı söylenir. Burada alt sınıf, bir üst sınıfın tüm veya birkaç üye işlevini ve değişkenini miras alır. Nesneler de miras alınabilir.

  • Parent Class- Başka bir Sınıf tarafından miras alınan bir Sınıf. Buna temel sınıf veya süper sınıf da denir.

  • Child Class- Başka bir sınıftan miras alan bir sınıf. Buna alt sınıf veya türetilmiş sınıf da denir.

  • Polymorphism- Bu, aynı işlevin farklı amaçlar için kullanılabileceği nesne yönelimli bir kavramdır. Örneğin, işlev adı aynı kalacaktır ancak farklı sayıda argüman alabilir ve farklı görevler yapabilir. Pascal sınıfları polimorfizmi uygular. Nesneler çok biçimlilik uygulamaz.

  • Overloading- Operatörlerin bazılarının veya tamamının argümanlarının türüne bağlı olarak farklı uygulamalara sahip olduğu bir polimorfizm türüdür. Benzer şekilde, farklı uygulamalarla işlevler de aşırı yüklenebilir. Pascal sınıfları aşırı yükleme uygular, ancak Nesneler bunu yapmaz.

  • Data Abstraction - Uygulama ayrıntılarının gizlendiği (soyutlandığı) herhangi bir veri temsili.

  • Encapsulation - Bir nesne oluşturmak için tüm verileri ve üye işlevlerini birlikte kapsüllediğimiz bir kavramı ifade eder.

  • Constructor - Bir sınıftan veya bir Nesneden bir nesne oluşumu olduğunda otomatik olarak çağrılacak özel bir işlev türünü ifade eder.

  • Destructor - Bir Nesne veya Sınıf silindiğinde veya kapsam dışına çıktığında otomatik olarak çağrılacak özel bir işlev türünü ifade eder.

Pascal Nesnelerini Tanımlama

Tür bildirimi kullanılarak bir nesne bildirilir. Bir nesne bildiriminin genel biçimi aşağıdaki gibidir -

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

İki tamsayı türü veri üyesine sahip bir Dikdörtgen Nesnesi tanımlayalım - length ve width ve bu veri üyelerini işlemek için bazı üye fonksiyonları ve dikdörtgeni çizmek için bir prosedür.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Nesnelerinizi oluşturduktan sonra, o nesneyle ilgili üye işlevleri çağırabileceksiniz. Bir üye fonksiyon sadece ilgili nesnenin üye değişkenini işleyebilecektir.

Aşağıdaki örnek, iki dikdörtgen nesne için uzunluk ve genişliklerin nasıl ayarlanacağını ve üye işlevlerini çağırarak nasıl çizileceğini gösterir.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Aşağıda, Pascal'da nesnelerin nasıl kullanılacağını gösteren eksiksiz bir örnek verilmiştir -

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Nesne Üyelerinin Görünürlüğü

Görünürlük, nesne üyelerinin erişilebilirliğini gösterir. Pascal nesne üyelerinin üç tür görünürlüğü vardır -

Sr.No Görünürlük ve Erişilebilirlik
1

Public

Üyeler, program birimi dışındaki diğer birimler tarafından kullanılabilir.

2

Private

Üyelere yalnızca mevcut birimde erişilebilir.

3

Protected

Üyeler, yalnızca üst nesneden gelen nesneler için kullanılabilir.

Varsayılan olarak, bir nesnenin alanları ve yöntemleri geneldir ve geçerli birimin dışına aktarılır.

Pascal Nesneleri için Oluşturucular ve Yıkıcılar -

Constructorsbir nesne oluşturulduğunda otomatik olarak çağrılan özel tür yöntemlerdir. Pascal'da bir anahtar kelime yapıcısı ile bir yöntem bildirerek bir kurucu oluşturursunuz. Geleneksel olarak, yöntem adı Init'tir, ancak kendi geçerli herhangi bir tanımlayıcınızı sağlayabilirsiniz. Yapıcı işlevine istediğiniz kadar argüman iletebilirsiniz.

Destructorsnesnenin yok edilmesi sırasında çağrılan yöntemlerdir. Yıkıcı yöntemler, yapıcılar tarafından oluşturulan herhangi bir bellek tahsisini yok eder.

Aşağıdaki örnek, nesne oluşturma sırasında dikdörtgenin uzunluğunu ve genişliğini başlatacak ve kapsam dışına çıktığında onu yok edecek Rectangle sınıfı için bir kurucu ve bir yıkıcı sağlayacaktır.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Pascal Nesneleri için Kalıtım

Pascal nesneleri isteğe bağlı olarak bir üst nesneden miras alabilir. Aşağıdaki program, Pascal Nesnelerindeki kalıtımı göstermektedir. Adlı başka bir nesne oluşturalımTableTop, Rectangle nesnesinden miras alır.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Dikkat edilmesi gereken önemli noktalar aşağıdadır:

  • Nesne Masa Dikdörtgen nesnesinin tüm üyelerini miras aldı.

  • TableTop'ta da bir çizim yöntemi var . Ne zaman beraberlik yöntemi kullanılarak denir TableTop nesnesi, masa en beraberlik yaþamageçirilir.

  • Adında örtük bir örnek var self nesnenin geçerli örneğini ifade eder.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Pascal Objects'in nesne yönelimli paradigmanın bazı özelliklerini sergilediğini gördünüz. Kapsülleme, veri gizleme ve kalıtım uygularlar, ancak aynı zamanda sınırlamaları da vardır. Örneğin, Pascal Nesneleri polimorfizmde yer almaz. Bu nedenle sınıflar, bir programda, özellikle GUI tabanlı yazılımda uygun nesne yönelimli davranışı uygulamak için yaygın olarak kullanılır.

Bir Sınıf, neredeyse bir Nesne ile aynı şekilde tanımlanır, ancak Nesnenin kendisinden ziyade bir Nesneye bir göstericidir. Teknik olarak bu, Sınıfın bir programın Yığına tahsis edildiği, Nesnenin ise Yığın üzerinde tahsis edildiği anlamına gelir. Başka bir deyişle, bir değişkeni nesne türü olarak bildirdiğinizde, yığın üzerinde nesnenin boyutu kadar yer kaplar, ancak sınıf türünden bir değişken bildirdiğinizde, her zaman bir işaretçinin boyutunu alır. yığın üzerinde. Gerçek sınıf verileri yığın üzerinde olacaktır.

Pascal Sınıflarını Tanımlama

Bir sınıf, tür bildirimi kullanılarak bir nesneyle aynı şekilde bildirilir. Bir sınıf bildiriminin genel şekli aşağıdaki gibidir -

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

Aşağıdaki önemli noktaları dikkate almaya değer -

  • Sınıf tanımları, programın yalnızca tür bildirimi bölümünde yer almalıdır.

  • Bir sınıf, class anahtar kelime.

  • Alanlar, sınıfın her bir örneğinde bulunan veri öğeleridir.

  • Yöntemler, bir sınıfın tanımı içinde bildirilir.

  • Adında önceden tanımlanmış bir kurucu var CreateRoot sınıfında. Her soyut sınıf ve her somut sınıf, Root'un soyundan gelir, bu nedenle tüm sınıfların en az bir kurucusu vardır.

  • Adında önceden tanımlanmış bir yıkıcı var DestroyRoot sınıfında. Her soyut sınıf ve her somut sınıf Root'un soyundan gelir, bu nedenle tüm sınıfların en az bir yıkıcısı vardır.

İki tamsayı türü veri üyesine sahip bir Rectangle sınıfı tanımlayalım - uzunluk ve genişlik ve bu veri üyelerini işlemek için bazı üye işlevleri ve dikdörtgeni çizmek için bir prosedür.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

Dikdörtgen sınıfının bir örneğini yaratacak ve dikdörtgeni çizecek eksiksiz bir program yazalım. Bu, Pascal Nesnelerini tartışırken kullandığımız örnekle aynıdır. Aşağıdaki istisnalar dışında her iki programın da neredeyse aynı olduğunu göreceksiniz -

  • Sınıfları kullanmak için {$ mode objfpc} direktifini eklemeniz gerekecek.

  • Yapıcıları kullanmak için {$ m +} direktifini eklemeniz gerekecek.

  • Sınıf somutlaştırması nesne somutlaştırmasından farklıdır. Yalnızca değişkeni bildirmek örnek için alan yaratmaz, oluşturucuyu bellek ayırmak için kullanırsınız.

İşte tam örnek -

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

Sınıf Üyelerinin Görünürlüğü

Görünürlük, sınıf üyelerinin erişilebilirliğini gösterir. Pascal sınıfı üyelerinin beş tür görünürlük vardır -

Sr.No Görünürlük ve Erişilebilirlik
1

Public

Bu üyelere her zaman erişilebilir.

2

Private

Bu üyelere yalnızca sınıf tanımını içeren modül veya birimden erişilebilir. Sınıf yöntemlerinin içinden veya dışından erişilebilirler.

3

Strict Private

Bu üyelere yalnızca sınıfın kendi yöntemlerinden erişilebilir. Aynı ünitedeki diğer sınıflar veya alt sınıflar bunlara erişemez.

4

Protected

Bu, özel ile aynıdır, ancak bu üyelere, diğer modüllerde uygulanmış olsalar bile alt türler tarafından erişilebilir.

5

Published

Bu, Genel ile aynıdır, ancak derleyici, {$ M +} durumundaysa, bu sınıfların otomatik akışı için gereken tür bilgilerini üretir. Yayınlanmış bir bölümde tanımlanan alanlar sınıf türünde olmalıdır.

Pascal Sınıfları için Oluşturucular ve Yıkıcılar

Yapıcılar, bir nesne oluşturulduğunda otomatik olarak çağrılan özel yöntemlerdir. Bu nedenle, birçok şeyi yapıcı işlevler aracılığıyla başlatarak bu davranıştan tam olarak yararlanıyoruz.

Pascal, bir yapıcı tanımlamak için create () adında özel bir işlev sağlar. Yapıcı işlevine istediğiniz kadar argüman iletebilirsiniz.

Aşağıdaki örnek, Books adında bir sınıf için bir kurucu oluşturacak ve nesne oluşturma sırasında kitap için fiyatı ve başlığı başlatacaktır.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Create adlı örtük kurucu gibi, sınıfta kullanılan tüm kaynakları serbest bırakabileceğiniz bir de yok etme örtük yıkıcı yöntemi vardır.

Miras

Pascal sınıf tanımları isteğe bağlı olarak bir üst sınıf tanımından miras alabilir. Sözdizimi aşağıdaki gibidir -

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

Aşağıdaki örnek, Books sınıfını devralan ve gereksinime göre daha fazla işlevsellik ekleyen bir roman sınıfı sağlar.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Aşağıdaki önemli noktaları dikkate almaya değer -

  • Books sınıfının üyeleri protected görünürlük.

  • Romanlar sınıfının iki kurucusu vardır, bu nedenle overload operatör, fonksiyon aşırı yüklemesi için kullanılır.

  • Books.Display prosedürü ilan edildi virtual, böylece Novels sınıfındaki aynı yöntem override o.

  • Novels.Create yapıcısı, temel sınıf yapıcısını kullanarak inherited anahtar kelime.

Arayüzler

Arayüzler, uygulayıcılara ortak bir işlev adı sağlamak için tanımlanır. Farklı uygulayıcılar bu arayüzleri gereksinimlerine göre uygulayabilir. Arayüzler, geliştiriciler tarafından uygulanan iskeletlerdir diyebilirsiniz. Aşağıda bir arayüz örneği verilmiştir -

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

Bir sınıf bir arabirim uyguladığında, arabirimin tüm yöntemlerini uygulaması gerektiğini lütfen unutmayın. Bir arabirim yöntemi uygulanmazsa, derleyici bir hata verecektir.

Soyut Sınıflar

Soyut bir sınıf, somutlaştırılamayan, yalnızca miras alınan bir sınıftır. Soyut bir sınıf, bunun gibi, sınıf tanımına sembol soyut kelimesi eklenerek belirtilir -

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

Soyut bir sınıftan miras alırken, ebeveynin sınıf bildiriminde soyut olarak işaretlenmiş tüm yöntemler çocuk tarafından tanımlanmalıdır; ayrıca bu yöntemler aynı görünürlükle tanımlanmalıdır.

Statik Anahtar Kelime

Sınıf üyelerini veya yöntemleri statik olarak bildirmek, sınıfın somutlaştırılmasına gerek kalmadan onları erişilebilir kılar. Statik olarak bildirilen bir üyeye, başlatılmış bir sınıf nesnesiyle erişilemez (ancak statik bir yöntem olabilir). Aşağıdaki örnek kavramı göstermektedir -

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

12
31
31
51
51

Statik üyeleri kullanmak için {$ static on} yönergesini kullanmalısınız.