5 Aralık 2016 Pazartesi

4.İndeksli Dosyalar

Sıralı dosyalarda tüm kayıtların art arda gelmesi gerekiyordu. Bu soruna çözüm bulmak amacıyla doğrudan erişimli dosyalar kullanılır. Bu tür dosyalarda, her bir arama işlemi dosyanın başından itibaren yapılmaz. Belirlenen kayıtlara doğrudan erişilerek üzerinde işlem yapılır.
Doğrudan erişimli dosyaların en tanınmışı, indeksli dosyalar olarak bilinir. İndeksli dosyalar, veri dosyasından ayrı olarak bir indeks dosyasının oluşturulması ile birlikte hazırlanır.
Bir dosya için oluşturulan indeks; söz konusu dosyanın anahtarları ile bu anahtarların disk üzerinde bulunduğu adresi içerir.
Anahtar alan, erişimde kullanılmak üzere seçilen alan olarak değerlendirilir.
Örneğin; öğrenci dosyasında, öğrenci numarasını içeren alanının indeks alanı olarak tasarlandığını varsayalım. Herhangi bir öğrencinin bilgilerine ulaşmak söz konusu olduğunda; bu numara önce indeks üzerinde aranılarak bulunur ve söz konusu kayıta ilişkin adres bilgisi elde edilerek, bu adrese doğrudan erişilir.
Hatırlatma: İndeksli dosyalarda önce indeks dosyasından bir kayıt okunur. Bu kayıt veri dosyasının ilgili satırına ait adresi içerir. Bu adres ile ilgili kayıt satırına ulaşılır.


3.Sıralı Dosyalar


Klasik bilgisayar dosyaları birbirinden bağımsız; muhasebe, stok, pazarlama, üretim ve diğer uygulamalarda kullanılmak üzere hazırlanır. Bu dosyalar, sıralı ya da doğrudan erişim yöntemleri kullanılarak işlenir. Sıralı erişimde, dosyanın tüm kayıtları tek tek taranarak istenilen kayıtlara ulaşılır. Doğrudan erişim yönteminde ise, kayıtlar tek tek sırayla okutulmaz, istenilen kayıta doğrudan erişerek işlenir.
Sıralı dosyalar, bir başka deyişle ardışık dosyalar, içerdiği kayıtlara birinci kayıttan başlamak üzere sırayla erişim yapmak üzere tasarlanmış dosyalardır. Bu tür dosyaların kayıtlarına ardışık olarak erişilebilmesine karşılık, kayıtlar fiziksel olarak ardışık olmayabilir.
Sıralı dosyaların her bir kayıtına ardışık olarak erişilmesi bazı durumlarda yararlı olmasına rağmen, bazı uygulamalarda sorunlar yaratır.
Örneğin; okuldaki öğrencilerin tümü listelenecek ise, kayıtlara sırayla erişim söz konusudur. Bu durumda dosyanın sıralı olarak tasarlanmış olması sorun yaratmaz. Ancak sadece birkaç öğrencinin listelenmesi isteniliyorsa, tüm öğrencilerin okunarak böyle bir sonucun elde edilmesi uygun bir yöntem olmayacaktır. Söz konusu öğrencilere doğrudan erişilmesi en uygun yoldur.

2.Kayıt ve Alan

Dosyalar kendi içinde kayıtlara bölünmüştür. Örneğin bir sınıftaki öğrenci listesini göz önüne alalım. Bu liste çok sayıda veri içerebilir. O halde, listenin ana bellekte tutulması söz konusu olamaz. Ana bellekte tutulduğu takdirde, bilgisayarın kapatılması durumunda bu bilgiler yok olacaktır. O halde bu verilerin kalıcı bir ortamda, örneğin sabit disk üzerinde yer alması gerekecektir. Disk üzerinde tutulan bu bilgiler, yeni öğrenci eklendiğinde büyüyecek veya çıkarıldığında küçülecektir. Ayrıca zaman zaman içeriği değişecektir. Bu listedeki her bir öğrenci bilgisi bir mantıksal kayıt oluşturur. Her kayıt da farklı bilgiler içerebilir. Örneğin; öğrencinin adı, baba adı, doğduğu yer vb. gibi bilgileri içerebilir. Sayılan bu bilgilerin her birine alan (field) adını veriyoruz.

1.Klasik Dosya Yapıları

Bilgisayarların ilk ortaya çıktığından bu yana hem donanım hem de yazılım alanında pek çok değişim ortaya çıkmıştır. Doğal olarak, bu değişim, kuruluşların ve kişilerin gereksinimlerine daha iyi cevap verebilmek amacıyla ortaya çıkmaktadır.
Bilişim teknolojilerindeki gelişme ile birlikte çoğu kuruluşta eskiye oranla çok daha fazla veri üretilmeye başlanmıştır. Söz konusu veriler, kuruluşların normal günlük işlemlerinde kullanıldığı gibi üst düzey karar vericiler tarafından da yoğun biçimde talep edilmektedir. Özellikle üst düzey yöneticilerin, yönetimsel anlamda doğru kararlar alabilmeleri için ham verilerden türemiş iyi bilgilere ihtiyacı vardır.
Kuruluşlar kendi bünyesindeki tüm verileri bilgisayar ortamına aktarmaya başladıklarından, bunun sonucu olarak  geleneksel veri saklama ve işleme tekniklerinin artık yetersiz kaldığı gözlemlenmiştir. Bu noktada veritabanı kavramı devreye girmiştir. Veri, bir veritabanında depolandığında etkin bir biçimde yönetilmektedir. Veritabanları, bilgisayar dosya sistemlerinden geliştirilmiştir. Bu noktada dosya sistemi özelliklerinin anlaşılması önemlidir. En basit anlamda veri, işlenmemiş ham bilgilerdir. Bilgi, verinin belli bir anlam ifade edecek şekilde düzenlenmiş halidir.
Hem donanım hem de yazılım alanında pek çok değişim ortaya çıkmıştır. Bu değişim, kuruluşların ve kişilerin gereksinimlerine daha iyi cevap verebilmek amacıyla ortaya çıkmaktadır.
Pek çok kuruluşta eskiye oranla çok daha fazla veri üretildiğinden, geleneksel veri saklama ve işleme tekniklerinin yetersiz kaldığı gözlemlenmiştir.
Veri saklama birimlerinde depolanan veri topluluklarına “dosya” (file) denir.

Kuruluşların muhasebe, satış, üretim, stok ve diğer tüm faaliyetlerinde üretilen veri hem güncel işlerin yürütülmesi hem de yöneticilere alacağı kararlarda destek sağlamak üzere, belirli yapılarda ayrı dosyalar biçiminde depolanabilir. Bu söylediğimiz geleneksel, yani klasik dosya sistemlerini kullanan kuruluşlar için geçerlidir. Veritabanı sistemlerinde ise veriler daha farklı biçimde, tablolar biçiminde tanımlanır.
Aşağıda basit bir klasik dosya sistemi görülmektedir.




21 Kasım 2016 Pazartesi

Örnek-3: Komut Satırından Girilen 2 Sayının Toplamı



Ya da Windows işletim sistemi için DOS komutu satırına geçilir ve ilgili exe uygulaması bulunarak aşağıdaki gibi program çalıştırılabilir:









Örnek-2: n Tane Sayının En Küçüğünü Bulan Fonksiyon

Öyle bir fonksiyon yazalım ki istediğimiz kadar sayıyı fonksiyona girdi (argüman) olarak verebilelim ve geriye değer olarak bu sayılardan en küçüğünü dönsün.


main() Fonksiyonuna Parametre Aktarımı
Ana programa yani main() fonksiyonuna parametre aktarımı, derlenmiş (çalıştırılabilir) bir program komut satırından (işletim sistemi ortamından) çalıştırılacağı zaman yapılır.
Parametre aktarımı, programın adı yazılıp bir boşluk bırakıldıktan hemen sonra yapılır.
Parametreler, komut satırından sayısal olarak girilse bile program içinde karakter topluluğu (string) olarak gelir.
Bu durumda, bu ifadeleri sayısal değerlere çeviren (atoi(), atol(), atof() gibi) fonksiyonlar kullanılır.


          int main(arguman_sayısı, arguman_vektörü)
          int  arguman_sayısı;
          char *arguman_vektörü[];
          {
    …..
             if(arguman_sayısı < ...){
                printf("Eksik parametre !\n");
                exit(1);
             }
             if(arguman_sayısı > ...){
                printf("Cok fazla parametre !\n");
                exit(1);
             }
             .
             ... arguman_vektörü[0] ... /* 1. eleman program adı  */
             ... arguman_vektörü[1] ... /* 2. eleman 1. parametre */
           }

Örnek-1: n Tane Sayının Toplamı

Öyle bir fonksiyon yazalım ki istediğimiz kadar sayıyı fonksiyona girdi (argüman) olarak verebilelim ve sonucunda bu sayıları toplasın.
Kaç sayı olacak? – 3 sayı? – 5 sayı ?
Normalde bu bilgi önemli mi?
Cevap: Evet
Ancak Esnek argümanlı fonksiyon ile argüman sayısı önemsiz hale gelecek.



Esnek Argümanlı Fonksiyonlar ve main() Fonksiyonuna Parametre Aktarımı

Aşağıdaki gibi üçüncü dereceden bir polinomu ele alalım:

P(x) = a + bx + cx2 + dx3

a, b, c, d katsayıları gerçel sayı sabitleridir.

x ise gerçel sayı türündeki bir değişkendir.

Bu polinomu temsil eden basit bir fonksiyonu nasıl tanımlarız?


P(x) = a + bx + cx2 + dx3

float p(float x, float a, float b, float c, float d)
{
    float p = a + b*x + c*x*x + d*x*x*x;
    return p;
}



Buna göre, x = 1.7'de,
        P(x) = 1 - 2x
değerini hesaplamak için bu fonksiyon aşağıdaki gibi çağırılmalıdır:

    sonuc = p(1.7, 1.0, -2.0, 0.0, 0.0);

Burada, kullanılmayan katsayılar için 0.0 değeri mutlaka fonksiyona geçirilmelidir.


Kullanılmayan argümanlar geçirilmeden de fonksiyonu çağırmak mümkündür.

C Programlama dili, kullanıcılarına argümanları esnek olarak geçirme imkanı verir.

Bunun anlamı, belli kurallar sağlandığında, p() fonksiyonunun aşağıdaki gibi çağrılabilmesidir:

           /*  x    a     b */
    sonuc = p(1.7, 1.0, -2.0);



Esnek argümanlar için 2 temel kural vardır:
Esnek argüman kullanımı isteğe bağlıdır.
Esnek argümanları oluşturan küme ardışık olarak listeye eklenmelidir.
Bu türden argümanlar, aşağıdaki gibi, fonksiyonun parametre listesi kısmında ... (3 nokta) ile belirtilir.

      double p(double x, int n, ...)
      {

      }



Esnek argümanlı fonksiyon tanımlaması yapabilmek için stdarg.h kütüphanesinde üç tane makro fonksiyon tanımlanmıştır.

İki Kelimeyi Birleştiren C Programı

Soru-3: Kullanıcı tarafından klavyeden girilen iki kelimeyi birleştiren bir C programı yazınız. İki kelimeyi birleştirmek için aşağıdaki fonksiyon prototipini dikkate alınız.

void KelimeBirlestir (char c1[], char c2[])



Bir Sayının Üssünü Hesaplayan C Programı

Soru-2:Aşağıdaki fonksiyon prototipini kullanarak bir sayının üssünü hesaplayan C programını yazınız. Sayının kendisi ve üssü klavyeden girilecektir.

int us (int sayi, int ussu)



İç İçe Toplam Seri Hesaplama





Örnek-7: Dizinin Fonksiyonda Kullanılması


Örnek-6: Yinelemeli Fonksiyon Kullanarak Yapılan Faktöriyel Hesabı


Örnek-5: void Fonksiyon Örneği


Örnek-4: Fonksiyon geri değer dönüşü ve prototip kullanımı


Örnek-3: İç içe birden fazla fonksiyon çağırımı


Örnek-2: Fonksiyon Çağırımı ve Kod Akışı


Örnek-1: İki Sayının Toplamı

Fonksiyon tipi:         int
Fonksiyon adı:         topla
Parametreler:         x ve y
Geri dönüş değeri:        x+y



Tavsiyeler

Birden fazla fonksiyon kullanılan programlarda, main fonksiyonu programın esas görevini yerine getiren fonksiyonların çağırıcısı olarak kullanılmalıdır.
Her fonksiyon, iyi olarak tanımlanmış tek bir işi yapacak şekilde sınırlandırılmalıdır ve fonksiyon ismi, fonksiyonun görevini etkili bir biçimde açıklamalıdır. Bu, özetlemeyi ve yazılımın yeniden kullanılabilirliğini sağlatır.
Eğer fonksiyonun görevini açıklayacak etkili bir isim bulamıyorsanız muhtemelen yazdığınız fonksiyon birden fazla görevi yerine getirmeye çalışmaktadır. Bu tarzda fonksiyonları daha küçük fonksiyonlara bölmek en iyi yoldur.
Bir fonksiyon genellikle bir sayfadan daha uzun olmamalıdır. Küçük fonksiyonlar yazılımın yeniden kullanılabilmesini sağlatır.
Programlar, küçük fonksiyonların bir araya getirilmesiyle yazılmalıdır. Bu, programların daha kolay yazılması, değiştirilmesi ve hatalarının giderilmesini sağlar.
Çok fazla sayıda parametreye ihtiyaç duyan fonksiyonlar birden fazla görevi yerine getiriyor olabilir. Böyle fonksiyonları ayrı görevleri gerçekleştiren daha küçük fonksiyonlara bölmek gerekir. Fonksiyonun başlığı mümkünse bir satıra sığmalıdır.



Dizilerin Fonksiyonlarda Kullanılması

Diziler de sıradan değişkenler gibi bir fonksiyona parametre olarak aktarılabilirler.
Fakat, aktarma kuralı biraz farklıdır.

Her zaman dizinin yanında
boyutunun da bilinmesi gereklidir !!!

Yineleme mi Tekrar mı?

Tekrar ve yinelemenin ikisi de döngü içerir.
Tekrar özellikle döngü yapısını kullanırken, yineleme döngüyü fonksiyon çağrılarının tekrarında kullanır.
Tekrar ve yinelemenin ikisi de bir sonlandırma testi içerirler.
Yineleme temel bir durumla karşılaşıldığında, tekrar ise döngü devam koşulu yanlış hale geldiğinde sona erer.
Yineleme bir çok negatif özelliğe sahiptir.
Yineleme, mekanizmayı sürekli çağırarak fonksiyon çağrılarının artmasına sebep olur. Bu, işlemci zamanı ve hafızada fazladan yük demektir.
Her yineleme çağrısı, fonksiyonun başka bir kopyasının oluşmasına sebep olur, bu da hafızayı fazladan işgal etmek demektir.
Tekrar, fonksiyonların sürekli olarak çağrılması ve fazladan hafıza kullanılması engellenir.
Yinelemeli olarak çözülen her problem tekrarlı bir biçimde çözülebilir. Yineleme yaklaşımı genelde problemi daha iyi yansıttığı ve daha kolay anlaşılan ve hataları kolay ayıklanan programlar yazılmasını sağlattığı için, tekrar yaklaşımına göre tercih edilebilir.
Yinelemeli çözümleri seçmenin başka bir sebebi de tekrarlı çözümün kolaylıkla bulunamayışıdır.

Fonksiyonların Yinelemesi – Kendi Kendilerini Çağırması (Recursive Function)

Bazı problem tipleri için fonksiyonların kendi kendilerini çağırması kullanışlı olabilir.
Bir yineleme fonksiyonu (recursive function), kendi kendini doğrudan ya da bir başka fonksiyon içinden çağıran fonksiyondur.
Yineleme fonksiyonu, bir problemi çözmek için çağrılır.
Bu fonksiyon, yalnızca en basit durumu ya da temel durum olarak adlandırılan durumu nasıl çözeceğini bilmektedir.
Eğer fonksiyon temel bir durumla çağrılırsa,  fonksiyon bir sonuç geri döndürür.

Yinelemeyi mümkün kılmak için sonraki parça orijinal probleme benzemelidir, fakat orijinal problemin daha basit ya da daha küçük bir versiyonu olmalıdır.
Yineleme için verilebilecek en güzel örnek popüler bir matematik konusu olan Negatif olmayan bir n tamsayısının faktöriyelinin hesaplanmasıdır.
Örnek:
5!=5*4*3*2*1
5!=5*(4*3*2*1)
5!=5*(4!)

Fonksiyon Kullanım Hataları

Fonksiyon tanımlamalarında geri dönüş değerini unutmak.
Geri dönüş tipi void olarak bildirilmiş bir fonksiyonun bir değer geri döndürmesi bir yazım hatasıdır.
Aynı tipte fonksiyon parametrelerini double x, double y yerine double x, y olarak bildirmek. double x, y biçiminde parametre bildirmek, y parametresinin tipinin int olmasına sebep olur. Çünkü belirtilmeyen parametre tipi otomatik olarak int tipinde varsayılır.
Parametre listesini yazdığımız parantezlerin dışına noktalı virgül koymak yazım hatasıdır.
Bir fonksiyon parametresini daha sonradan fonksiyon içinde yerel bir değişken olarak kullanmak bir yazım hatasıdır.
Bir fonksiyon içinde başka bir fonksiyon tanımlamak yazım hatasıdır.
Fonksiyon prototipinin sonuna noktalı virgül koymamak bir yazım hatasıdır.