Alt programlar: prosedürler ve işlevler - 1


Bir alt program , programın bir adı olan ve kendi ayrı görevini çözen ayrı bir parçasıdır. Alt program, ana programın başında bulunur ve adı belirtilerek ana programdan başlatılabilir (çağırılabilir)

Alt programların kullanımı, programda aynı kodu farklı yerlere yazmanız gerektiğinde kod tekrarını önlemenizi sağlar. 
Bir programa içe aktarılan kitaplıklar (örneğin, matematik kitaplığı matematik), zaten birisi tarafından derlenmiş olan alt programlardan oluşur. Programcıların hangi algoritmaları uyguladıklarını düşünmelerine gerek yoktur, sadece tam olarak ne yaptıklarını düşünerek onları uygularlar. Bu büyük bir zaman tasarrufu. Daha önce başkası tarafından yazılmış bir algoritma yazmaya gerek yoktur.

Her rutin yalnızca tek bir şey yapmalıdır:  ya sadece bir şey hesaplayın, ya da bazı verilerin çıktısını alın ya da başka bir şey yapın. 

İki tür alt program vardır - prosedürler ve işlevler

Alt programlar, sonucu belirli bir biçimde ekrana yazdırmak gibi bazı eylemleri gerçekleştirir (basit bir örnek olarak, writeln() ifadesi yazdırılan standart bir alt programdır. ekran bilgileri)

İşlev alt programları, ana programda kullanabileceğimiz bir sonuç döndürür (sayı, karakter dizisi vb.).

Basit bir prosedür yazmaya çalışalım:
Ekranda "Error" dizesini görüntülememiz gerektiğini varsayalım. kullanıcının hatası nedeniyle kodda bir hata oluşabileceği her defasında (örneğin, yanlış veri girdiğinde)
Bu, ifadeyi yazarak yapılabilir.
writeln('Hata');
Ve şimdi programda birçok yere böyle bir satırın eklenmesi gerektiğini hayal edin. Tabii ki, her yere yazabilirsiniz. Ancak bu çözümün iki dezavantajı vardır.
1) bu dizi hafızada birçok kez saklanacak
2) Hata durumunda çıktıyı değiştirmek istiyorsak bu satırı program boyunca değiştirmek zorunda kalacağız ki bu oldukça elverişsizdir

Bu gibi durumlarda prosedürlere ihtiyaç vardır.
Prosedürü olan bir program şöyle görünebilir:
...
ad alanı std kullanarak;

prosedür printError(); // prosedür açıklaması
başlamak
    writeln('Hata'); // prosedür gövdesi - prosedürün yürüteceği komutlar
son;

// ana program
başlangıç;
...
  yazıcı hatası(); // yürütme prosedürünü başlat. Sadece yürütmek istediğimiz prosedürün adını belirtiyoruz.
...
  yazıcı hatası();
...
son.

Prosedür, procedure kelimesiyle başlar. Prosedür adından sonra, prosedürün yürütülmesinin bağlı olduğu değişkenleri ve türlerini gösteren parantezler yazılır. Örneğin:

var a, b, cevap: tamsayı;
prosedür Sum(a, b: tamsayı);
başla
    cevap := a + b;
bitiş;

Bir prosedürde yürütülen tüm ifadeler girintilidir. 

Prosedürler ana programdan önce yazılır

Bir prosedürü yürütmek için, ana programda onu ismiyle çağırmanız ve parantez yazmayı unutmayın!
Bir programdaki bir prosedürü istediğiniz sayıda çağırabilirsiniz.

Şimdi bir kullanıcının yaptığı hataya karşılık olarak ne tür bir hata yaptığına bağlı olarak farklı mesajlar göstermemiz gerektiğini düşünelim.
Bu durumda, her hata için kendi prosedürünüzü yazabilirsiniz:  
prosedür printErrorZero();
başlamak
    writeln('Hata. Sıfıra bölme!');
son;

prosedür printErrorInput();
başlamak
    writeln('Girişte hata!');
son;

Ya daha birçok olası hata varsa? Bu çözüm bize uymayacak!
Hangi hata mesajını göstereceğini söyleyerek prosedürü nasıl kontrol edeceğimizi öğrenmemiz gerekiyor.
Bunun için prosedür adından sonra parantez içinde yazacağımız parametrelere ihtiyacımız var.
prosedür printError(s: string);
başlamak
    yaz(lar);
bitiş;
Bu prosedürde s, prosedürü kontrol etmenizi sağlayan özel bir değişken olan bir parametredir.
parametresi, alt programın nasıl çalıştığını belirleyen bir değişkendir. Parametre adları, alt program başlığında noktalı virgüllerle ayrılmış olarak listelenir. Parametreden sonra, iki nokta üst üste ardından parametrenin türü gelir.

Şimdi prosedürü çağırırken, prosedürümüzdeki parametreye (değişken s) atanacak gerçek değeri parantez içinde belirtmeniz gerekir.
printError('Hata! Sıfıra bölme!');
Bu değere argüman denir.
Argüman alt program çağrıldığında ona iletilen parametre değeridir.
Bir bağımsız değişken yalnızca sabit bir değer değil, aynı zamanda bir değişken veya aritmetik bir ifade olabilir.

Yalnızca alt programda kullanılacak olan ek değişkenlerin kullanılması genellikle gereklidir. Bu tür değişkenler yerel (veya yerel) olarak adlandırılır ve yalnızca oluşturuldukları alt program içinde değiştirilebilir.
 
Yerel değişken kapsamı, içinde bildirildiği işlev veya prosedürdür

Böylece, bir değişkenin kapsamını (kapsamını) yalnızca gerçekten ihtiyaç duyulduğu alt programla sınırlandırmak mümkündür. Programlamada bu tekniğe kapsülleme  - bir değişkenin dışarıdan değiştirilmesini engellemek.

Programın herhangi bir yerinde (herhangi bir alt programda) görülebilecek bir değişken bildirmek gerekirse, bu tür değişkenler tüm alt programların dışında bildirilir (aşağıdaki tablodan program 3'e bakın)
Bu tür değişkenlere global denir.

Üç programı analiz edin: değeri görüntülenecektir. değeri görüntülenir.

1) Bu programda i değişkeni yereldir. Yerel bir değişken, bir alt program içinde bildirilir 2) Burada ana programda i değişkeni olsa bile (değeri 7 olan), değeri 5 olan yeni bir i yerel değişkeni oluşturulacaktır. 
Bu programı çalıştırdığınızda ekranda 75
3) Bu programın bir genel değişkeni i vardır. Değeri bir alt program içinde ve ana program içinde değiştirilebilir
Prosedür i global değişkeni ile çalışacak ve ona 2'ye eşit yeni bir değer atanacaktır. Ekranda 2
prosedür testi();
var i: tamsayı;
başla
    ben := 5;
    writeln(i);
bitiş;
var i: tamsayı;

prosedür testi();
var i: tamsayı;
başla
    ben := 5;
    writeln(i);
bitiş;

başla
    ben := 7;
    yaz(i);
    deneme();
bitiş.
var i: tamsayı;

prosedür testi();
başla
    ben := 2;
bitiş;

başla
    deneme();
    writeln(i);
bitiş.
Sorun: iki değişkenin değerlerini değiştiren bir prosedür yazın.
Bu görevin özelliği, çağıran program tarafından bilinmek için prosedürde yapılan değişikliklere ihtiyaç duymamızdır.

Prosedürü şöyle yazmaya çalışalım:

var x, y: tamsayı;
prosedür Swap(a, b: tamsayı); // prosedür parametrelerinin böyle bir açıklaması ile,
var c: tamsayı;
başla // bağımsız değişkenlerin (x ve y) değerlerini kopyalar
                      // a ve b değişkenleri, x ve y ile ilgili olmayan bağımsız değişkenlerdir
c := bir;
bir := b;
b := c;
son;

başlamak
  x := 1;
  y := 2;
  Değiştir(x, y); //x ve y değişkenlerinin (argümanlar) değerleri a ve b parametrelerine kopyalanır
  writeln('x = ', x, ', y = ', y); // x=1, y=2
son.
Bu programı çalıştırırsanız x ve y değişkenlerinin değerlerinin değişmediğini görebilirsiniz. Parametrelerin bağımsız değişkenlerin değerlerini değiştirmesi için verileri başvuruya göre iletmeyi kullanmalısınız.Bunu yapmak için, veri türünün adından sonra alt programın başlığına var  kelimesini koymalısınız
prosedür Swap(var a, b: integer);   // şimdi a ve b değişkenleri bellekteki x ve y değişkenlerinin adreslerini alıyor
var c: tamsayı; 
başlamak
c := bir;
bir := b;
b := c;
son;
Kullanım: Bir bağımsız değişkeni referans olarak iletirseniz, prosedür çağrılırken bu yerde yalnızca değişken adı (bir sayı ve bir aritmetik ifade DEĞİL) bulunabilir!< br />
Şunun gibi bir prosedür ÇAĞRILAMAYIN:
Swap(x, 4);
Swap(5+x, y);