Konu Anlatımı
Dizgi İşlemleri ve Karakterler
Ad, soyad, okul numarası, e-posta adresi veya bir cihaz seri numarası gibi bilgiler tek tek sayı değil, karakterlerden oluşan dizgi olarak saklanır. Kullanıcıdan gelen her bilgi önce metin olarak okunur, sonra sayıya çevrilir. Bu yüzden değişkenler ve veri tipleri konusunu öğrenirken karakter dizisi tipini de mutlaka tanımak gerekir.
Bu derste ne öğreneceğiz?
Bu konuda bir dizgi değişkeninin nasıl tanımlandığını, kaç karakterden oluştuğunu ve karakterlerine sıra numarasıyla nasıl erişildiğini göreceğiz. Birleştirme, dilimleme, arama ve büyük küçük harf dönüşümü işlemlerini gerçek örneklerle uygulayacağız. Ayrıca karakter kod değerlerinin mantığını, dizgiden sayıya dönüşümde neden hata yapıldığını ve metin karşılaştırmasının hangi düzende gerçekleştiğini inceleyeceğiz.
Ön bilgi
Ön bilgi olarak değişken ve veri tipi kavramını bilmek gerekir. Değişken, bellekte bir değeri saklayan isimlendirilmiş alandır; veri tipi ise o alanda hangi türden bilgi tutulacağını belirler. Sayısal tiplerden farklı olarak dizgi tipi birden çok karakteri bir arada tutar ve içindeki karakterlere sıra numarasıyla tek tek ulaşılır.
İkinci ön bilgi döngü ve koşul yapılarıdır. Bir dizginin karakterlerini sırayla gezmek, bir harfin kaç kez geçtiğini bulmak ya da tersten yazdırmak gibi işlemler döngü olmadan yapılamaz. Aynı biçimde karakter sıra numarasının geçerli olup olmadığını denetlemek koşul ifadesi gerektirir.
Dizgi nedir, karakter nedir?
Dizgi, birbirini izleyen karakterlerden oluşan ve kendine ait uzunluğu olan veri tipidir. Karakter; harf, rakam, noktalama işareti veya boşluk olabilir. Her karakterin dizgi içinde bir sıra numarası vardır ve bu numaralar ilk karakter için sıfırdan başlayarak art arda gelir. Bu yüzden beş karakterlik bir dizginin son karakterinin sıra numarası dörttür.
Dizginin uzunluğu metin olarak yazılmış olsa bile bilgisayar tarafında bir sayı olarak saklanır. Uzunluk bilgisi döngü yazarken çok işe yarar: sıra numarası uzunluktan küçük olduğu sürece işlem yapılır. Dizgi değişkenine hiçbir değer atanmamışsa onun da bir uzunluğu vardır ve o uzunluk sıfırdır; bu yüzden boş dizgi ile henüz değer verilmemiş dizgi aynı davranışı gösterir.
Dizgi oluşturma ve birleştirme
Dizgi tek tırnak ya da çift tırnak arasında yazılır. Tırnakların arasında hiçbir şey yoksa dizgi boştur. Tırnak kullanmanın amacı, birden çok karakterden oluşan metnin sayıdan ayırt edilmesidir. Tırnak kullanılmadığında bir dizgi ile bir sayı aynı satırda görünür ve karşılaştırma sonucu beklenmedik çıkar.
Birleştirme işlemi iki dizgiyi uç uca ekler. Üç ya da daha fazla dizgiyi birleştirmek için işlemi art arda kullanmak gerekir. Birleştirme sırasında araya ayraç konulacaksa boşluk ya da ayraç karakteri unutulmamalıdır; aksi hâlde ad ve soyad yerine adsoyad gibi tek parça bir metin oluşur. Birleştirme sonucu her zaman yeni bir dizgidir, ilk iki dizginin içeriği değişmez.
Uzunluk, sıra numarası ve karakter erişimi
Dizginin uzunluğu doğrudan okunabilen bir özelliktir; karakterleri tek tek saymak gerekmez. Buna karşılık tek bir karaktere erişmek için sıra numarası kullanılır. Karakter üzerinde aritmetik yapılamaz, ancak karakterin kod değeri karşılaştırılabilir. Örneğin büyük harfli harflerin kodları 65 ile 90 arasında, küçük harflerin kodları ise 97 ile 122 arasında sıralanmıştır.
Sıra numarası sıfırdan başladığı için sık yapılan hata, birinci karakteri sıfır yerine bir kabul etmektir. Bu yanlış kabulde son karakterin sıra numarasına erişilemez ve ya da son karakterden bir önceki karakter okunur. Döngü koşulunu uzunluğa göre kurmak bu hatayı yapısal olarak engeller.
Dilimleme işlemi
Dilimleme, dizginin belirli bir bölümünü ayırarak yeni bir dizgi oluşturur. Dilimin başlangıç sırası ile bitiş sırası verilir; başlangıç sırası dilime dâhildir, bitiş sırası dâhil değildir. Bu aralık kuralı ezberlenmelidir, çünkü bir karakter eksik almak en sık yapılan hatadır. Sıra numarası uzunluğa eşitse o karakter artık yoktur.
Dilimleme aynı zamanda bir metin parçasını ayıklama işinde kullanılır: bir etiketin ön ekini, bir alan kodu ya da bir alan adının uzantısı ayrı dizgi olarak alınır. Dilimlenen parça bağımsız bir dizgi olduğundan üzerinde ayrıca işlem yapılabilir ve yeni bir dizgiye birleştirilebilir.
Arama ve konum bulma
Dizgi üzerinde arama, hedef karakterin ya da parçanın dizgi içindeki sıra numarasını verir. Aranan parça bulunamazsa sonuç eksi bir değer olarak döner. Bu nedenle bulunamadı durumu sıfır değerle karıştırılmamalıdır; sıfır geçerli bir sıra numarasıdır ve dizginin ilk karakterini gösterir. Doğru bir program, eksi bir sonucu özel olarak ele almalıdır.
Bir karakterin dizgide kaç kez geçtiğini bulmak için dizgi taranır: sıra numarası sıfırdan başlar, uzunluğa ulaşılana kadar her karakter hedefle karşılaştırılır ve eşitlik sağlanan her adımda sayaç bir artırılır. Aynı tarama yöntemi, bir dizginin tersten yazılışıyla kendisinin aynı olup olmadığını belirleyen palindrom denetiminde de kullanılır.
Harf sayma ve sıklık bulma
Bir dizgide her karakterin kaç kez geçtiğini tutan bir sayaç dizisi kurulabilir. Bu dizinin uzunluğu harf sayısı kadar olmalıdır. Tarama bittiğinde sayaç dizisinin en büyük elemanı, dizgide en sık geçen karakterin sayısını verir. Bu yöntem sözcük analizi, anagram bulma ve metin istatistiği gibi işlerde kullanılır.
Sayılan değer daha sonra yüzdeye çevrilebilir. Yüzde, geçen karakter sayısının dizgi uzunluğuna bölünüp yüz ile çarpılmasıyla bulunur. Burada bölme işlemi tam sayı bölmesi olarak yapılır ve kalan kısım atılır; yüzdeye çevirme gerekiyorsa işlem ondalıklı olarak yapılmalıdır.
Karakter kodları ve büyük küçük harf
Her karakterin sayısal bir kod değeri vardır ve bu değerler bir tablo hâlinde sıralıdır. Büyük harfler küçük harflerden önce gelir; aynı harfin büyük ve küçük biçimi arasındaki kod farkı sabittir. Bu fark bilinirse küçük harfi büyük harfe çevirmek, kod değerinden bu sabit farkı çıkararak yapılır veya tam tersi toplanarak yapılır.
Harf olup olmadığını anlamak için kodu harf aralıklarında aramak yeterlidir. Rakam, noktalama işareti ve boşluk gibi karakterlerin kodları bu aralıkların dışında kalır. Bu denetim, kullanıcıdan gelen veriyi sayıya çevirmeden önce doğrulamak için kullanılır ve hatalı verinin programa girmesini engeller.
Dizgiden sayıya ve sayıdan dizgiye dönüşüm
Kullanıcı bir sayı yazdığında o bilgi karakterlerden oluşan bir dizgi olarak okunur. Sayısal değere dönüştürülürken rakam karakterleri sırayla toplanır: soldaki ilk karakter en büyük basamağı, sondaki karakter en küçük basamağı belirler. Bu işlemde tam sayı bölmesi yapılır, ondalık ayracından sonraki kısım kullanılmaz.
Ters yönde dönüşümde sayısal değer basamaklarına ayrılır ve her basamak için karakter üretilir. Basamak sayısı azaldıkça sayının büyüklüğü de değişir. Bu iki yönlü dönüşümün de doğru çalışması, veri tipi dönüşümlerinin neden ayrı bir konu olarak ele alındığını gösterir.
Basit örnek
Adı «Mert» olan bir öğrencinin dizgisi düşünülsün. Dizginin uzunluğu dörttür ve sıra numaraları sıfırdan üçe kadar sıralanır. Dördüncü sıra numarasındaki karakter «t» harfidir. Dizginin ilk üç karakteri alınarak «Mer» elde edilir, kalan iki karakter alınarak «rt» elde edilir. Her iki işlemde de uzunluktan küçük bir sıra numarası kullanılmıştır.
Aynı dizgide büyük harfe çevirme uygulanırsa sonuç «MERT» olur. Dönüşüm sonrası uzunluk değişmez, yalnızca karakter kodları değişir. Dizginin birleştirilmesiyle «Mert Kaya» gibi iki parçalı bir ad soyad metni de oluşturulabilir; ayraç olarak bir boşluk kullanılmalıdır.
İleri örnek
Bir okulun öğrenci listesinde etiketler «SIRA-NO» biçiminde saklanmaktadır. Her etiketin sıra numarası kısmı sabit uzunlukta olduğundan, dizginin belirli bir dilimi alınarak yalnızca sıra numarası okunabilir. Örneğin etiketin ilk dört karakteri okutucu kodu, sonraki bölümü ise kayıt sırasıdır.
Bu senaryoda üç işlem arka arkaya yapılır: önce dizgi oluşturulur, sonra dilimleme ile kayıt sırası ayrılır, en sonda ise elde edilen parça tam sayıya çevrilerek ortalama hesabında kullanılır. Her adımda uzunluk denetimi yapılmalıdır; beklenen uzunluktan farklı bir uzunluk geliyorsa etiket hatalı demektir ve o kayıt atlanır.
Adım adım çözülmüş örnek
Görev: «mühendislik» dizgisindeki «i» harfinin kaç kez geçtiğini bulmak. Çözüm: Adım 1: Dizginin uzunluğu ölçülür ve on bir karakter olduğu görülür. Adım 2: Sıra numarası sıfırdan başlar ve hedef karakter «i» olarak seçilir. Adım 3: Her adımda ilgili karakter hedefle karşılaştırılır; eşitlik varsa sayaç bir artırılır. Adım 4: On bir adım sonunda sayaç ikiye ulaşır.
Sayım elle doğrulandığında karakterler sırayla m, ü, h, e, n, d, i, s, l, i, k olur. «i» harfi yedinci ve onuncu sıra numaralarında yer alır. Bu iki konumun sıra numarası toplamı on yedi eder ve bu değer doğru bir çapraz denetmedir. Döngünün sıra numarasını bir yerine sıfırdan başlatmamak, elde edilecek sonucun bu iki konumu kaçırmasına yol açardı.
Kavram karşılaştırma tablosu
| Kavram | Ne zaman kullanılır | Sonuç türü | Sık karıştırılan konu |
|---|
| Dizgi | Metin saklanırken | Karakterlerden oluşan bütün | Sayı tipiyle karıştırılmamalı |
| Uzunluk | Döngü sınırı belirlenirken | Tek sayı | Son sıra numarası sanılmamalı |
| Sıra numarası | Tek karaktere erişirken | Konum bilgisi | Bir yerine sıfırdan başlar |
| Birleştirme | Parçaları tek metin yaparken | Yeni bir dizgi | Araya ayraç eklemeyi unutmak |
| Dilimleme | Metnin bir bölümü alınırken | Daha kısa dizgi | Bitiş sırasının dâhil olduğunu sanmak |
| Arama sonucu | Hedefin konumu bulunurken | Sıra numarası veya eksi değer | Eksi bir değeri sıfır saymak |
| Karakter kodu | Harf bulunurken | Tek sayı | Kodu harfin kendisi sanmak |
| Palindrom denetimi | Metnin tersi kendisiyle karşılaştırılırken | Doğru veya yanlış | Yalnızca ilk yarıyı kontrol etmek |
Sık Yapılan Hatalar
- Hata: Karakter sıra numaralarını bir yerine sıfırdan başlatmak. Doğrusu: İlk karakterin sıra numarası sıfırdır; buna göre döngü sınırı uzunluğa eşitlenir.
- Hata: Arama sonucu eksi bir çıktığında onu sıfır kabul etmek. Doğrusu: Sıfır geçerli bir konumdur; bulunamadı durumu ayrıca denetlenmelidir.
- Hata: Dilimlemede bitiş sırasını da almak. Doğrusu: Başlangıç dâhil, bitiş dâhil değildir.
- Hata: Birleştirirken araya boşluk ya da ayraç koymamak. Doğrusu: Ayrılması gereken parçaların arasına ayraç dizgisi eklenir.
- Hata: Bir karakteri harf sanıp doğrudan karşılaştırmak. Doğrusu: Karakterin kod değeri harf aralığında aranır.
- Hata: Dizi elemanı sayısını dizgi uzunluğu sanmak. Doğrusu: Uzunluk, içindeki karakter adedidir.
- Hata: Ondalıklı sayıyı tam sayıya çevirirken kalan kısmı görmezden gelmek. Doğrusu: Tam sayı bölmesinde kesirli kısım atılır; bu davranış bilinçlidir.
- Hata: Karşılaştırmada büyük harfli metni küçük harfli metinle aynı saymak. Doğrusu: Karşılaştırma öncesinde harfler tek biçime dönüştürülür.
Özet
Dizgi, karakterlerden oluşan ve kendine ait uzunluğu olan bir veri tipidir. Karakterler sıfırdan başlayan sıra numaralarıyla adreslenir; son karakterin sıra numarası uzunluktan bir eksiktir. Birleştirme yeni bir dizgi üretir, dilimleme başlangıcı dâhil bitişi dâhil olmayan bir aralık alır. Arama başarısızlığını eksi değer bildirir, bu yüzden sıfır ile karıştırılmamalıdır. Karakter kod değerleri harf aralıklarını denetlemeye yarar ve büyük küçük harf dönüşümünde kullanılır. Dizgiden sayıya geçişte tam sayı bölmesi yapıldığı için kesirli kısım atılır.
Kendini dene
Kendin dene bölümünde bir alışkanlık ödevi olarak kendi adını soyadını içeren bir dizgi oluştur, uzunluğunu ölç, üçüncü karakterini yaz ve dizginin ilk dört karakterini dilimle. Ardından aynı dizgide kendi adının geçtiği konumu bul ve kaç kez geçtiğini say. Son olarak bu dizgiyi bir sayıya çevirmeye çalışırken ne olduğunu gözlemle. Puanlama notu: doğru çalışan bir program, uzunluk denetimini de içermeli ve bulunamadı durumunu sıfırdan ayırmalıdır.