Ücretsiz Full C Programlama Dili Öğren -4 | C Programlama Eğitimi

C PROGRAMLAMA DİLİ EĞİTİM ve ÖRNEKLER -3

C programlama dili birlikler nedir ? C programlama Dosya İşleme ve Veri Hiyerarşisi Nedir ? Veri Yapıları Nedir ? Bildiriler Nedir ?Bugün C programlama dili eğitim ve örnekler serisinin 4. yazısını sizlerle paylaşıyoruz.

Başlayalım.

C PROGRAMLAMA DİLİ EĞİTİMİ -3

BİRLİKLER : 

Birliklerde yapılar gibi türetilmiş veri tipleridir.Aynı depolama alanını kullanırlar.

Birliğin elemanı her tipte olabilir.Birlik içerisinde verinin uygun tipte kullanılmasını sağlamak programcının sorumluluğundadır.

Bir birlik ‘union’  anahtar kelimesi ile yapılarla aynı biçimde bildirilir.

Örnek : union kelimesi ile ;

Union sayi {

İnt x ;  double y;    };

Bit Operatörleri :

Her bit yalnızca 0 ya da 1 değerini alabilir.8 bit 1 byte’ı oluşturur.

Bit operatörleri şunlardır ;

And (&) , Or (|) , Exclusive Or (^),  Sola kaydırma (<<)  , Sağa kaydırma (>>) , Tümleyen (~)

And : İki operandın ikisinin de ilgili bitlerinde 1 varsa , sonuçtaki bitler 1 yapılır

Or : İki operandın ilgili bitlerinden en az biri 1 ise sonuçtaki bitler 1 yapılır

Exclusive or : iki operandın ilgili bitlerinden yalnızca biri 1 ise sonuçtaki bitler 1 yapılır

Sola Kaydırma : İlk operandın bitleri ikinci operandında belirtilen sayı kadar sola kaydırır.Sağdan itibaren 0 ile doldurur.

Sağa kaydırma : İlk operandındaki bitleri ikinci operandında belirtilen sayı kadar sağa kaydırır.Soldan itibaren yapılacak doldurma makine bağımlıdır.

Tümleyen : Tüm 0 bitleri  1 , tüm 1 bitleri 0 yapılır.

Bit Atama Operatörleri :

&=   And atama operatörü

|=   Or atama operatörü

^=  Exclusive Or atama operatörü

<<=  Sola kaydırma atama operatörü

>>=  Sağa kaydırma atama operatörü

Sayma Sabitleri :

Bir sayma , enum anahtar kelimesi ile tanıtılır ve tanıtıcılar ile temsil edilen tamsayı sabitlerinin kümesidir.

Bu sayma sabitleri , değerleri otomatik olarak belirlenen sembolik sabitlerdir.

‘Enum’ içindeki değerler aksi belirtilmedikçe 0 ile başlar ve 1 artırılır.

Örnek : enum aylar {OCA=1 , SUB , MAR , NIS , MAY , HAZ , TEM , AGU , EYL , EKI , KAS, ARA};

Burada ilk değer 1 yapıldığından , kalan değerler 1 arttırılarak 1-12 değerleri oluşturulur.

Saymada kullanılan tanıtıcılar özel olmalıdır.

Sayma sabitleri için yalnızca büyük harfler kullanmak program içinde bu sabitlerin daha belirgin hale gelmesini sağlar.

DOSYA İŞLEME :

Değişken ve diziler içinde depolanan veriler geçicidir ve program sonlandığında   kaybolurlar.

Dosyalar ise büyük miktarda veriyi kalıcı olarak tutmak için kullanılırlar.

Veri Hiyerarşisi :

Neticede bilgisayar tarafından işlenen tüm veriler , sıfır ve birlerin kombinasyonlarına indirgenirler.

Bilgisayarlar tarafından işlenen veri parçaları , bitlerden karakterlere , karakterlerden alanlara ve bu şekilde ilerleyerek daha büyük ve karmaşık bir hale geldikçe bir veri hiyerarşisi oluşturur.

Bir alandaki ilgili dosyaların topluluğuna genellikle veritabanı (database) denir.Veri tabanı oluşturmak ve veri tabanını yönetmek için kullanılan programlara veri tabanı yönetim sistemleri(data base management system) denir.

C programlama dili eğitimleri

Dosya ve Akışlar (Stream) :

Program çalışmaya başladığında , üç dosya ve bu dosyalarla ilişkili akışlar ; standart giriş , standart çıkı ve standart hata otomatik olarak açılır.

FILE yapısını  (<stdio.h> içinde tanımlanmıştır) gösteren bir gösterici döndürür.Bu yapı ise açık dosya tablosu (open file table) adı verilen işletim sistemi dizisi için dizin gösteren bir dosya belirteci (file descriptor) içerir.

Her dizi elemanı da işletim sisteminin bir dosyayı yönetebilmesi için kullandığı dosya kontrol bloğunu (File Control Block) içerir.

Standart giriş / çıkış ve hata stdin , stdout , stderr göstericileri ile yönetilir.

Fgetc fonksiyonu , getchar fonksiyonu gibi fonksiyonlar dosyadan bir karakter okur.

Fputc fonksiyonu , argüman olarak yazdırılacak bir karakter ve karakterin yazdırılacağı dosyayı gösteren bir gösterici alır

Programda kullanıcıya her kayıt için çeşitli alanları doldurması ya da veri girişinin sonlandığını belirten dosya sonu belirteci girmesini söyleyen mesaj için ;

While (! feof (stdin))  kullanılabilir.

Feof satırı stdin’in belirttiği dosyanın dosya sonu belirtecinin elde edilip edilemediğine karar verir.

‘ w ’  : yazma modu (Yazma yapmak için bir dosya yarat)

‘ r ’  : okuma modu (Bir dosyayı okumak için aç)

‘ a ‘  : varolan dosyaya kayıtlar eklemek için dosyayı ekleme modunda açmak için gerekir.

‘ r+’ modu : dosyayı okumak ve yazmak için açar (Bir dosyayı güncellemek)

‘ w+’ modu : yazma ve okuma için bir dosyayı yaratır. (Güncelleme için bir dosya yarat)

‘ a+ ‘ modu : dosyayı okuma  ve yazma yapmak için açar ve önceki içerikler kaybolur (Güncelleme için)

Eğer dosyayı herhangi bir moda açarken bir hata oluşursa  fopen NULL  döndürür.

Not : Genel hatalardan birisi var olmayan bir dosyayı okuma yapmak için açmaktır.

Sıralı Erişimli Dosyadan Veri Okumak :

Sıralı erişimli bir dosyadan verileri geri elde etmek için , program okuma yapmaya dosyanın başından başlar ve istenen veri bulunana kadar sırayla tüm veriler okunur.

Rewind (cfPtr) ; gibi bir ifade programın dosya pozisyon göstericisini (okuma yazma işlemindeki bir sonraki byte numarasını belirtir).cfPtr ile gösterilen dosyanın başına (0. Byte’a) geri döndürmesini sağlar.

Rasgele Erişimli Dosyalar ;

Biçimlendirilmiş çıktı fonksiyonu fprintf ile oluşturulan kayıtlar aynı uzunlukta olmak zorunda değildir.Ancak rasgele erişimli bir dosyadaki tüm kayıtlar sabit uzunluğa sahiptirler.

Fwrite fonksiyonu , hafızada belirlenmiş bir konumdan aldığı belli sayıdaki byte’ı dosyaya aktarır.

Fread fonksiyonu dosya içinde dosya pozisyon göstericisi ile belirlenen konumdan aldığı belli sayıdaki byte’ı , belirlenen adresten başlayarak hafızaya aktarır.

Not : sizeof operatörü parantez içindeki nesnenin boyutunu byte olarak döndürür.sizeof operatörü işaretsiz bir tamsayı döndüren derleme zamanlı tekli bir operatördür.

Fseek fonksiyonunun prototipi ise , ANSI standartına göre ;

int fseek (FILE *stream , long int offset , int whence);

Burada offset , stream ile belirtilen dosyadaki whence konumundan itibaren byte sayısıdır.

Whence argümanı , dosyada aramanın başlayacağı konumu belirten SEEK_SET , SEEK_CUR , SEEK_END değerlerinden biridir.

SEEK_SET : aramanın dosyanın başından başlayacağını

SEEK_CUR : aramanın dosyadaki o anda bulunulan konumdan başlayacağını

SEEK_END : aramanın dosya sonundan başlayacağını belirtir

Bu üç sembolik <stdio.h> öncü dosyasında tanımlanmıştır.

VERİ YAPILARI :

Dinamik Hafıza Tahsisi :

Dinamik veri yapıları yaratmak ve yönetmek için dinamik hafıza tahsisi yapmak gerekir.

Malloc ve free fonksiyonları ile sizeof operatörü , dinamik hafıza tahsisi için gereklidir.

Malloc fonksiyonu ; tahsis edilecek byte sayısını argüman olarak alır ve tahsis edilen alanı gösteren void* tipte bir gösterici döndürür.

Malloc fonksiyonu normalde sizeof operatörü ile kullanılır.

Örnek  :   yeniPtr = malloc (sizeof (struct dugum)) ifadesi ‘struct dugum’ tipindeki yapının boyutunu byte olarak hesaplar.

Free fonksiyonu tahsis edilen alanı serbest bırakır.(Hafıza sisteme geri döndürülür , böylece ileride yeniden tahsis edilebilir.)Malloc çağrısı dinamik olarak tahsis edilen hafıza alanını serbest bırakmak içindir.

Bağlı Listeler :

Bir bağlı liste , düğüm adı verilen ve gösterici bağları sayesinde birleştirilmiş kendine dönüşlü yapıların doğrusal bir birlikteliğidir.

Yığınlar :

Bir yığın , bağlı listelerin kısıtlanmış bir çeşididir.Yeni düğümler yığına yalnızca en üstten eklenir ve düğümler yığının yalnızca en üstünden çıkartılabilir.Bu sebeple yığınlar son giren ilk çıkar (LIFO last in – first out) veri yapıları olarak adlandırılır.Burada kullanılan temel fonksiyonlar ;

Push ve pop fonksiyonlarıdır.

Push fonksiyonu ; yeni bir düğüm yaratır ve yığının üstüne yerleştirir.

Pop fonksiyonu ; yığının üstündeki düğümü çıkartır , çıkartılan bu düğüm için tahsis edilmiş olan hafızayı serbest bırakır ve çıkartılmış değeri döndürür.

Yığınlar bir fonksiyonun her çağrısında yaratılan otomatik değişkenler için bir alan içerir.

Sıralar :

Sıralar , oldukça yaygın bir veri yapısıdır.Bu veri yapısında ilk giren ilk çıkar (FIFO First in First out) veri yapısı mantığı kullanılır.

Ekleme çıkarma işlemleri sirayaGir ve siradanCik olarak bilinir.

Ağaçlar :

Bağlı listeler , yığınlar ve sıralar doğrusal veri yapılarıdır.Bir ağaç , doğrusal olmayan iki boyutlu ve özel amaçlı bir veri yapısıdır.

Ağaç düğümleri iki ya da daha fazla bağ içerebilir.

Kök düğüm (root node) ağaçtaki ilk düğümdür

Kökteki her bağ bir çocuğu (child) belirtir

İlk sol çocuk , sol ağaççıktaki (subtree) ilk düğümdür ve sağ çocuk sağ ağaççıktaki ilk düğümdür.

Bu düğümün çocuklarına kardeşler (siblings) denir.

Çocukları olmayan düğüme, yaprak düğüm (leaf node) denir.

C ÖNİŞLEMCİSİ :

Bütün önişlemci komutları ‘ # ‘ ile başlar.

#INCLUDE Önişlemci Komutu :

Bu komut belirlenen dosyanın kopyasının , komutun bulunduğu yere eklenmesini sağlar.

İki şekilde kullanılır ;   #include <dosyaismi>     ve #include “dosyaismi”

İkisi arasındaki fark , önişlemcinin dahil edilecek dosyayı aradığı konumdur.Eğer dosya ismi tırnak içinde ise , önişlemci dosyayı aranan dosya eklendikten sonra derlenecek dosyanın bulunduğu dizin içinde arar.

Eğer ‘ <  > ‘ içinde ise , bu yöntem standart kütüphane öncü dosyalarını eklemek için kullanılır.

#include komutu stdio.h ve stdlib.h gibi öncü dosyaları eklemek için kullanılır.

#DEFINE Önişlemci Komutu :

#define komutu ,sembolik sabitler ve makrolar yaratır.Örnek :

#define tanıtıcı yer değiştirme_metni

Örnek : #define PI 3.14159 ; Bu komutla PI sembolik sabiti ile karşılaşılan heryerde PI , 3.14159 nümerik sabiti ile değiştirilir.

Define Önişlemci Komutu : Makrolar

Bir makro , #define önişlemci komutu içinde tanımlanmış bir işlemdir.

Örnek olarak bir çemberin alanı içinde tek argümanlı bir makro ele alalım :

#define CEMBER_ALANI  (x)   ( (PI) * (x) * (x) )

Sembolik sabit ve makroların geçerliliğini sonlandırmak için #undef önişlemci komutu kullanılır.

#undef komutu bir sembolik sabiti ya da makro ismini tanımsız hale getirir.

Not :    #define  getchar ()  getc ( stdin )

Getchar’ın makro tanımı , getc fonksiyonunu standart girişten bir karakter almak için kullanmaktadır.

Stdio.h içerisindeki putchar fonksiyonu ve ctype.h içindeki karakter işleme fonksiyonları sıklıkla makro olarakta uygulanır.

Koşullu Derleme  :

Koşullu derleme , programcının önişlemci komutlarının çalışmasını ve program kodunun derlenmesini kontrol edebilmesini sağlar.

Koşullu önişlemci oluşturmak , if seçim yapısına oldukça benzer.

Örnek :     #if !defined  (NULL)   #define NULL0    #endif

Bu komutlar NULL’un tanımlı olup olmadığına karar vermektedir.

#ifdef kısaltması = # if defined

#ifndef kısaltması = #if ! defined

Programcı programda kodun derlenmemesi için ;

#if

Derlenmesi engellenen kod

#endif    kullanabilirler.

Not : Çok kısımlı bir koşullu önişlemci oluşumu , #elif ve #else komutları kullanılarak denenebilir.

#ERROR ve #PRAGMA  Önişlemci Komutları :

#error komutu olan #error atomlar ; komutta belirlenen atomları içeren mesajları , uygulama-bağımlı olarak yazdırır.Atomlar  , boşluklarla birbirinden ayrılmış karakter serileridir.

#pragma komutu olan #pragma atomlar ; uygulama-bağımlı bir işlem gerçekleştirir.Uygulama tarafından tanınamayan bir pragma ihmal edilir.

# ve ## Operatörleri :

# ve ## önişlemci operatörleri , standart C içinde mevcuttur.

# operatörü , bir yerdeğiştirme metni atomunun , tırnak içine alınmış bir string haline dönüştürülmesini sağlar.

# operatörü , makro içinde argümanlarla kullanılmak zorundadır çünkü # operatörünün operandı makro içindeki bir argümanı belirtir.

## operatörü ise , iki atomu birleştirir.

#define ATOMEKLE(x,y)  x##y

Satır Numaraları :

#line önişlemci komutu , kendinden sonra gelen tüm kaynak kod satırlarının ,belirlenen tamsayı sabitinin değerinden başlanarak numaralandırılmasını sağlar.

#line 100 ; komutundan sonraki kaynak satırı , 100’den başlayarak numaralandırılır.

#line komutu içinde bir dosya ismi yer alabilir . Örnek : #line 100 ‘’file1.c’’

ÖNCEDEN TANIMLANMIŞ SEMBOLİK SABİTLER :

__LINE __     : Kullanılan kaynak kodun satır numarası

__FILE__       : Kaynak kodun varsayılan ismi

__DATE__     : Kaynak kodun derlendiği tarihtir

__TIME__      : Kaynak dosyanın derlendiği zamandır

BİLDİRİLER (Assertions) :

Assert makrosu , (assert.h öncü dosyası içinde tanımlanmıştır) bir deyimin değerini test eder.

Eğer deyimin değeri 0 ise assert bir hata mesajı yazdırır ve abort fonksiyonunu programı sonlandırması için çağırır.

NDEBUG sembolik sabiti ise , ondan sonraki bildirileri ihmal eder.

#define NDEBUG kullanılarak , tüm bildirileri elle silmek yerine otomatik olarak geçersiz kılmak mümkün olur.

UNIX ve DOS Sistemlerinde GİRİŞ/ÇIKIŞI Yeniden Yönlendirmek :

$ , Unix komut satır başlangıcını belirtir.

$ toplam<giriş

Girişi değiştirmenin ikinci yolu ise piping’dir.Bir pipe (|) , bir programın çıktısının diğer programın çıktısının diğer programın girişi olarak kullanılmasını sağlar.

Rasgele programının toplam programında giriş olarak kullanılması için ;

$ rasgele | toplam    şeklinde bir komut kullanılır

Uzunluğu Değişebilen Argüman Listeleri :

Stdarg.h’ın makroları ve tanımlamaları ;

Va_list        : va_start , va_arg ve va_end makrolarının ihtiyaç duyduğu bilgiyi tutmak için uygun bir tiptir.Değişken uzunlukta argüman listesindeki argümanlara erişmek için va_list tipinde bir nesne bildirilmelidir.

Va_start    : Değişken uzunlukta bir argüman listesindeki argümanlara erişmeden önce çağrılan bir makrodur.

Va_arg       : Değişken uzunlukta argüman listesi içindeki bir sonraki argümanın tipi ve değerinde bir deyime genişleyen bir makrodur.

Va_end      : Değişken uzunluktaki argüman listesi va_start ile belirlenmiş bir fonksiyondan , normal geri dönüş yapılmasını sağlayan bir makrodur.

Exit ve Atexit İle Program Sonlandırma :

Atexit fonksiyonu , argüman olarak fonksiyonu gösteren fonksiyon ismini bir gösterici alır.

Exit fonksiyonu bir argüman alır.

Dosyalar Üzerinde Notlar :

Standart kütüphane “wb+” modunda geçici bir dosya açan tmpfile fonksiyonunu sunar.

Rb   : ikili dosyayı okumak için aç

Wb  :  Yazmak için ikili bir dosya yarat.Önceki dosyanın içeriğini siler

Ab   :  Ekle , ikili bir dosyayı okumak için ya da dosyanın sonuna yazma yapmak için aç

Rb+  :  ikili bir dosyayı güncellemek için aç

Wb+  : Güncellemek için ikili bir dosya yarat

Ab+  : Ekle , İkili bir dosyayı güncellemek için aç ya da yarat.

Sinyal İşleme :

SIGABRT :  Programın normal olmayan şekilde sonlanması

SIGFPE  : Hatalı bir aritmetik işlem , örneğin sıfıra bölme ya da taşma ile sonuçlanacak bir işlem

SIGILL : İllegal emrin tespiti

SIGINT  : Etkileşimli sinyalin alınması

SIGSEGV  : Depolamaya geçersiz erişim

SIGTERM : Programı sonlandırma isteği

Dinamik Hafıza Tahsisi : Calloc ve Realloc Fonksiyonları :

Prototip : void *calloc (size_t nmemb , size_t size);

Bu prototip iki argüman alır , eleman sayısı (nmemb) ve her elemanın boyutu (size)

Malloc ile Calloc arasındaki temel fark ; calloc fonksiyonunun tahsis ettiği hafızayı temizlemesi ancak malloc’un temizlememesidir.

Realloc fonksiyonu kendinden önce malloc , calloc ya da realloc çağrılarak tahsis edilmiş nesnenin boyutunu değiştirir.

Not : C , tamsayı ve ondalıklı sayı sabitlerinin tiplerinin belirlenmesi için sonekler kullanılmasına izin vermektedir.

Tamsayı sonekleri unsigned bir tamsayı için u ya da U , long tamsayılar için I yada L ve unsigned long tamsayı için ul , lu , UL ya da LU olarak belirlenmiştir.Eğer bir tamsayı sabitine sonek eklenmişse , tipi o büyüklükteki bir değeri tutabilecek ilk tip olarak belirlenir.

C PROGRAMLAMA DİLİ EĞİTİM ve ÖRNEKLER -2 SONUÇ :

Bugünki yazımızda C programlama dili eğitim ve örnekler yazı dizinin 4. yazısını sizlerle paylaştık.Umuyorum faydalı birtakım bilgiler edinmişsinizdir.

İyi Çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.