İçeriğe geç

Kitaplar / Yöntem ile Programlamaya Giriş / Bölüm 7 — Metinler, listeler, sözlükler ve diziler

Bölüm 7 — Metinler, listeler, sözlükler ve diziler

Tek bir değer yerine bir değer topluluğu ile çalışmak için koleksiyonlar kullanılır. Bir kuralı en baştan akılda tutmakta yarar vardır: metinler 1’den, listeler 0’dan numaralanır. İlki Turbo Pascal geleneğidir, ikincisi ise modern dillerin alışkanlığıdır.

Metinler

Yöntem
program Metinler
değişken
  s: metin
  kelimeler: liste
  i: tamsayı
başla
  s := 'Yöntem dili'
  yaz('Uzunluk      : ' + Uzunluk(s), 1)
  yaz('İlk harf     : ' + s[1], 1)                // metinler 1'den başlar
  yaz('Son harf     : ' + s[Uzunluk(s)], 1)
  yaz('AltMetin     : ' + AltMetin(s, 8, 4), 1)
  yaz('Konum(''dil'') : ' + Konum('dil', s), 1)
  yaz('Büyük harf   : ' + s.BüyükHarf, 1)
  yaz('Değiştir     : ' + Değiştir(s, 'dili', 'programı'), 1)
  kelimeler := Ayır('elma,armut,kiraz', ',')
  yaz('Ayır         : ' + kelimeler, 1)
  yaz('Birleştir    : ' + Birleştir(kelimeler, ' + '), 1)
  yaz('Tersten      : ')
  Uzunluk(s)'den 1'e adımda 1 azalan her i için yaz(s[i])
  yaz('', 1)
bitir.
Çıktı
Uzunluk      : 11
İlk harf     : Y
Son harf     : i
AltMetin     : dili
Konum('dil') : 8
Büyük harf   : YÖNTEM DİLİ
Değiştir     : Yöntem programı
Ayır         : ['elma', 'armut', 'kiraz']
Birleştir    : elma + armut + kiraz
Tersten      : ilid metnöY

Metin işlevlerinin çoğu iki biçimde yazılabilir: BüyükHarf(s) ya da s.BüyükHarf. Hangisi size daha okunaklı geliyorsa onu kullanabilirsiniz.

Listeler

Yöntem
program Listeler
değişken
  notlar: liste
  n: herhangi
  toplam: ondalık
başla
  notlar := [72, 85, 90, 64]
  notlar.Ekle(78)                           // sona ekle
  yaz('Notlar     : ' + notlar, 1)
  yaz('İlk not    : ' + notlar[0], 1)       // listeler 0'dan başlar
  yaz('Not sayısı : ' + notlar.Uzunluk, 1)
  yaz('Sıralı     : ' + Sırala(notlar), 1)
  yaz('En yüksek  : ' + Maks(notlar), 1)
  toplam := 0
  notlar içindeki her n için toplam += n
  yaz('Ortalama   : ' + toplam / Uzunluk(notlar), 1)
  yaz('85 var mı? : ' + (85 içinde notlar), 1)
  yaz('1..5       : ' + [1..5], 1)
  notlar[0] := 100
  Sil(notlar, 1)
  yaz('Değişmiş   : ' + notlar, 1)
bitir.
Çıktı
Notlar     : [72, 85, 90, 64, 78]
İlk not    : 72
Not sayısı : 5
Sıralı     : [64, 72, 78, 85, 90]
En yüksek  : 90
Ortalama   : 77.8
85 var mı? : doğru
1..5       : [1, 2, 3, 4, 5]
Değişmiş   : [100, 90, 64, 78]

Sırala yeni, sıralı bir liste döndürür; asıl liste değişmez. Sil(notlar, 1) 1 numaralı elemanı (notlar[1]) çıkarır. [1..5] bir aralığı listeye çevirir.

Sözlükler

Sözlük, anahtar → değer çiftlerini saklar. Bir değere sıra numarasıyla değil, adıyla ulaşırsınız.

Yöntem
program Sözlükler
değişken
  başkent: sözlük
  ülke, şehir: herhangi
  sayım: sözlük
başla
  başkent := ['Türkiye': 'Ankara', 'Fransa': 'Paris', 'Japonya': 'Tokyo']
  başkent['Mısır'] := 'Kahire'               // yeni anahtar ekle
  yaz('Fransa''nın başkenti: ' + başkent['Fransa'], 1)
  yaz('Ülke sayısı: ' + Uzunluk(başkent), 1)
  başkent içindeki her ülke, şehir için
    yaz('  ' + ülke + ' -> ' + şehir, 1)
  yaz('İtalya kayıtlı mı? ' + ('İtalya' içinde başkent), 1)
  yaz('Varsayılanla al: ' + başkent.Al('İtalya', 'bilinmiyor'), 1)

  sayım := Say(Ayır('bir iki bir üç iki bir'))
  yaz('Sözcük sayıları: ' + sayım, 1)
bitir.
Çıktı
Fransa'nın başkenti: Paris
Ülke sayısı: 4
  Türkiye -> Ankara
  Fransa -> Paris
  Japonya -> Tokyo
  Mısır -> Kahire
İtalya kayıtlı mı? yanlış
Varsayılanla al: bilinmiyor
Sözcük sayıları: ['bir': 3, 'iki': 2, 'üç': 1]

Boyutu sabit listeler

Bazı veriler baştan belli sayıda elemandan oluşur: haftanın 7 günü, yılın 12 ayı. Böyle durumlarda listenin boyutunu Uzunluk ile sabitleyebilir ve elemanları istediğiniz sayıdan başlayarak numaralayabilirsiniz. sıcaklık.Uzunluk(7, 1) listeyi 7 elemanlı yapar ve ilk elemana 1 numarasını verir; sınır dışına çıkmak anında yakalanır.

Yöntem
program SabitListe
değişken
  sıcaklık: ondalık listesi
  gün: tamsayı
başla
  sıcaklık.Uzunluk(7, 1)
  1'den 7'ye kadar her gün için
    sıcaklık[gün] := 20 + gün * 1.5
  yaz(sıcaklık, 1)
  yaz('Sınırlar: ' + sıcaklık.Alt + '..' + sıcaklık.Üst, 1)
  sıcaklık[8] := 30
bitir.
Çıktı
[21.5, 23.0, 24.5, 26.0, 27.5, 29.0, 30.5]
Sınırlar: 1..7
Çalışma hatası [d5.y, satır 11] Liste dizini sınır dışı: 8 (geçerli 1..7)

Uzunluk çağrısının iki biçimi vardır:

Yazım Sonuç
L.Uzunluk(12) 12 elemanlı liste; numaralar 0’dan başlar (0..11)
L.Uzunluk(12, 1) 12 elemanlı liste; numaralar 1’den başlar (1..12)

Yeni elemanlar tipin başlangıç değeriyle dolar (sayılarda 0, metinlerde boş metin); listede önceden eleman varsa baştan itibaren korunur. Boyutu sabitlenen liste ile serbest liste arasındaki farkı akılda tutmakta yarar vardır:

Serbest liste Boyutu sabit liste
Bildirim notlar: tamsayı listesi sıcaklık: ondalık listesi, ardından sıcaklık.Uzunluk(7, 1)
Numaralar 0’dan başlar Sizin verdiğiniz sayıdan başlar (burada 1..7)
Sınırlar 0 ve Uzunluk(notlar) - 1 sıcaklık.Alt ve sıcaklık.Üst
Boyut Değişir: Ekle, Sil Sabittir; yalnızca yeni bir Uzunluk çağrısıyla değişir
Sona eklemek Ekle(notlar, 95) Eklenemez
Araya eklemek Ekle(notlar, 95, 1) (konum 1’e) Eklenemez
2 numaralı elemanı silmek notlar.Sil(2) Silinemez

Ekle iki biçimde kullanılır: Ekle(notlar, 95) elemanı sona ekler; Ekle(notlar, 95, 1) ise elemanı 1 numaralı konuma yerleştirir ve sonraki elemanları birer sıra kaydırır: önce eklenecek değer, sonra konum yazılır. Aynı işlemleri nokta ile de yazabilirsiniz: notlar.Ekle(95), notlar.Ekle(95, 1).

Bir elemanı silmenin üç yazımı vardır ve üçü de aynı işi yapar:

Yöntem
notlar.Sil(2)
notlar(2).Sil
notlar listesindeki 2. elemanı Sil

Üçü de 2 numaralı elemanı, yani notlar[2]’yi siler. Listede elemanlar 0’dan numaralandığı için bu, baştan üçüncü sıradaki elemandır. Konumu hesaplayarak vermek isterseniz cümle biçiminde ayraç kullanabilirsiniz: notlar listesindeki (i + 1). elemanı Sil. Sil çıkardığı elemanı döndürür; x := notlar.Sil(0) yazarak onu bir değişkene alabilirsiniz.

Boyutu sabitlenmiş bir listeye Ekle ya da Sil uygulamak hata verir. Boyutu değiştirmek isterseniz Uzunluk çağrısını yeni değerlerle yineleyebilir, serbest bir kopya gerekiyorsa liste(sıcaklık) yazabilirsiniz. Tip adlarında tamsayı dizisi ile tamsayı listesi aynı anlama gelir.