TEMEL ALGORİTMA VE C PROGRAMLAMA DİLİ KURS NOTLARI – I BAZI TEMEL KAVRAMLAR: Bilgisayar temel olarak iki kısımdan oluşur

: 1) Donanım ( Hardware) : Bilgisayarın elektronik kısmı ve yapısına verilen isimdir. 2) Yazılım (Software) : Yazılım, programlama ve programlamayla ilgili konuların geneline verilen isimdir. Yazılım denince ilk olarak aklımıza programlama dilleri, bu diller kullanılarak yazılmış kaynak programlar ve çeşitli amaçlar için oluşturulmuş dosyalar gelir. Algoritma : Bir probleme getirilen kesin çözümdür. YAZILIMIN SINIFLANDIRILMASI Yazılım birçok alt başlığa ayrılabilmektedir. En temel olarak yazılımı iki başlık altında inceleyebiliriz. 1) Sistem Yazılımları (System Software): Bilgisayar donanımı ile ara yüz oluşturan, uygulama programlarına çeşitli yönlerden hizmet veren temel yazılımlardır. İşletim sistemi, derleyiciler, debug programları sistem yazılımlarına örnek verilebilir. 2) Uygulama Yazılımları (Application Software) : Yapılacak işi kolaylaştırmak amacıyla yazılmış programlardır. word, Excel, winamp, media player gibi yazılımlar uygulama yazılımlarıdır. PROGRAMLAMA DİLLERİNİN SINIFLANDIRILMASI Programlama dilleri genellikle iki bakımdan sınıflandırılır. 1) Seviyelerine Göre: Seviye (level), bir dilin insan algılayışına yakınlığının bir ölçüsüdür. Yüksek seviyeli diller kolay öğrenilen dillerdir. Alçak seviyeli diller daha zor öğrenilen, bilgisayarın çalışmasına yakın dillerdir. • • • • • • • Çok Yüksek Seviyeli Diller * Visual Basic, SQL, Script dilleri, görsel düzeyde iş yapabilen diller. Yüksek Seviyeli Diller * Fortran, basic, cobol, pascal Orta seviyeli diller * C, ADA Alçak seviyeli Diller

• •

* Sembolik makine dili (assembly language) Saf makine dili (sadece 0 ve 1 lerden oluşmaktadır)

2) Uygulama Alanlarına Gore: Mühendislik ve bilimsel dilleri (fortran, C), veri tabani dilleri(oracle, sql server, Access, dbase), yapay zeka dilleri(LISP) genel amaçlı diller(C, C++, pascal, java), sistem programlama dilleri(C ) gibi bir sınıflandırılma yapılabilir. PROGRAMLAMA DİLLERİNİN DEĞERLENDİRİLMESİ 1) Taşınabilirlik (portability) Bir programlama dilinde yazılmış kaynak kodun başka sistemlerde de sorunsuz derlenerek çalıştırılabilmesine taşınabilirlik denir. Taşınabilirlik standardizasyon anlamına da gelir. 2) Esneklik (flexibility) Programlama dilinin programcıyı kısıtlamaması anlamına gelmektedir. Bu serbestlikten bilinçli bir kullanıcı fayda sağlayabilir. 3) Verimlilik (efficiency) Bir programlama dilinde yazılmış bir programın hızlı çalışması anlamındadır. 4) Öğrenme kolaylılığı (pedagogy) Bazı programlama dilleri kısa zamanda kolaylıkla öğrenilip bu dilleri kullanarak ürün oluşturulabilecek düzeye gelmek kısa zaman almaktadır. Her dil için bu söz konusu değildir, örneğin c öğrenilmesi ve öğretilmesi zor bir dildir. C DİLİNİN ÖZELİKLERİ
• • • • • •

Orta seviyeli bir programlama dilidir. Verimli bir dildir. Esnektir ama zor öğrenilir. Bilimsel ve mühendislik işlemlerde kullanılır. Genel amaçlı bir dildir. En belirgin özelliği sistem programlama dilidir.

C’ den önce sistem programları assembly dillerle yazılıyordu. C dilinin sistem programlarının yazılmasında hemen hemen alternatifsiz olduğunu söyleyebiliriz. Bugün cep telefonlarından, uçaklara kadar her yerde C kodları çalışmaktadır. Örneğin Boing uçaklarında 100.000 satırdan fazla C kodu çalıştığı bilinmektedir.

C algoritmik bir dildir. C de program yazmak için yalnızca dilin syntax ve semantik yapısını bilmek yetmez. Genel bir algoritma bilgisi de gerekir. C doğal bir dildir. Bilgisayar sistemi ile uyum içindedir. C PROGRAMLAMA DİLİNİN TARİHİ 1970 yılında AT&T Bell Laboratuarında Unix işletim sisteminin geliştirilmesi sırasında tasarlanmıştır. AT&T 1969 yılında MULTIX adlı işletim sistemini geliştirmekteydi. Ken Thompson , bu projeden çekilerek yeni bir işletim sistemi yazma projesini başlatmıştır. Adı kelime oyunuyla Unix koyulmuştur. Proje grubunda Dennis Ritchie, Brian Kernighan vardı. Unix ‘ in ilk versiyonu DEC PDF makinelerine sembolik makine dilinde yazılmıştır. Yazılımı kolaylaştırmak için, Ken Thompson’in B adlı yorumlayıcısı kullanılmıştır.B tam olarak bir programlama dili değildir. Dennis Ritchie B dilini geliştirerek C dilini oluşturmuştur. 1973 yılında Unix sistemi C ile tekrar yazılmıştır. Unix bir araştırma konusu olduğu için pek çok araştırma kurumuna, kodları bedava dağıtılmıştır. Böylece C programlama dilinin adi duyulmuş ve yayılmıştır. C programlama dili, son yıllarda bilgisayarların da yaygınlaşmasıyla kullanımı artmış ve en çok kullanılan dil haline gelmiştir. İşletim Sistemi: İşletim sistemi, bilgisayar donanımını yöneten ve kaynakları organize eden en temel sistem programlarıdır. Derleyiciler: Derleyiciler, bir programlama dilinde yazılmış kaynak kodu saf makina diline çeviren programlardır.
Bir C programının çalıştırılma süreci:

Dos ve Windows sistemlerinde bir programın çalıştırılabilmesi için onun çalıştırılabilir dosya formatına uygun bir yapıda olması gerekir. Bu sistemlerde .exe uzantısı bu formatı temsil etmektedir. .exe uzantılı dosyalar, komut satırından ismi yazılarak ya da fare ile çift tıklanarak çalıştırılabilirler. Derleyicilerin çıktıları çalıştırılabilir dosya değil, ismine amaç (object) dosya denilen bir dosyadır. Bu amaç dosyanın, Dos ve Windows sistemlerindeki uzantısı .obj, biçimindedir. Oluşturulan amaç dosyalar, bağlayıcı (linker) denilen programlarla çalıştırılabilir duruma getirilmektedir. Yani, bağlayıcılar, Dos ve Windows sistemlerinde .obj dosyasını girdi olarak alıp .exe üretmektedirler. Kaynak Dosya  Derleyici  .obj  Linker  .exe

DERLEYİCİ HATA MESAJLARI Derleyici, bir kaynak kodu derlerken bazı mesajlar iletebilmektedir. Bu mesajlar üçe ayrılır. 1) Uyarılar (Warnings) :

Derleme işlemini engellemeyecek derecede olan, programcının yaptığı olası mantık hatalarına dikkat çekmek için verilen mesajlardır. Böyle bir durumda kod başarıyla derlenir. 2) Gerçek Hatalar (errors) : Derleyicinin, dilin kurallarına aykırı bir durumla karşılaştığı zaman verdiği hata mesajlarıdır. Tek bir gerçek hata (error) olması durumunda dahi kodun derlenme işlemi başarıyla bitirilemeyecektir. 3) Ölümcül Hatalar (Fatal Errors) : Bu hatayla karşılaşılması durumunda, kodun derleme süreci dahi sonlandırılır. Bu hatalar genellikle sistemdeki sorunlar yüzünden oluşmaktadır. Sayı Sistemleri: Günlük yaşamda 10’luk sistemi kullanırız. 10’luk sistemde sayıyı oluşturan her bir basamak 10’un kuvveti ile çarpılır: 123  3 * 100 + 2 * 101 + 1 * 102 gibi. 10’luk sistemde sayıları oluşturmak için 10 sembol kullanılmaktadır. Sayıların elektriksel olarak ifade edilebilmesi için 2’lik sistem çok daha uygun bir sistemdir. Bu nedenle, bugünkü bilgisayar sistemleri tamamen 2’lik sistemde çalışmaktadır. 2’lik sistemde sayıları oluşturmak için iki sembol vardır: 0 ve 1. 2’lik sistemdeki bir sayıyı 10’luk sisteme çevirmek için her bir basamak ikinin kuvvetleri ile çarpılır. 10’luk sistemin her bir basamağına digit, 2’lik sistemin her bir basamağına bit denilmektedir. Bellekte tüm bilgiler bit yığınları biçiminde bulunmaktadır. 8 bit’e 1 Byte denilmektedir. Bilgisayar birimlerinde kilo, 1000 katı değil 1024 katı anlamına gelir. (210) O halde 1 KB eşittir 1024 byte’tır. Mega’da kilonun 1024 katıdır. O halde bir MB 1024 * 1024 byte’tır. 1 GB’ta 1024 MB’tır. 10’luk sistemdeki bir sayıyı 2’lik sisteme çevirmek için 10’luk sayıyı 2’ye bölüp kalanlarını tersten yazabiliriz. TAMSAYILARIN İKİLİK SİSTEMDE İFADE EDİLMESİ: Bir byte’ın tüm permütasyonlarının sayıyı 256’dır. Tüm değerlerin pozitif olduğu varsayımı ile 1 byte içine yazılabilecek en büyük değer 255’tir. Programlama dillerindeki değişkenler, n byte yani n * 8 bit yer kaplarlar ve bunların içerisine sayılar hep 2’lik sistemde yerleştirilir.

2’lik sistemdeki bir tamsayı, iki biçimde yorumlanabilmektedir. 1. İşaretsiz Sistem 2. İşaretli Sistem İşaretsiz sistemde sayı negatif olamaz. Bu nedenle, bir işaret bilgisinin saklanmasına da gerek yoktur. Bir sayı 2’lik sistemde işaretsiz olarak yorumlanacaksa düz bir biçimde her basamak ikinin kuvvetleri ile çarpılarak sonuç elde edilir. İşaretli sayıları 2’lik sistemde ifade edebilmek için üç yöntem denenmiştir. Bugün kullanılan yöntem, “İkiye tümleyen yöntemi” denilen yöntemdir. Burada ilk iki yöntemden bahsetmeyeceğiz. İkiye Tümleyen Yöntemi: Bugünkü bilgisayar sistemlerinde bu yöntem kullanılmaktadır. Bu yöntemde de en soldaki bit işaret bitidir. Bu bit 0 ise sayı pozitif, 1 ise negatiftir. Fakat negatif ve pozitif sayılar birbirlerinin ikiye tümleyenidirler. Yani pozitif n’in ikiye tümleyeni n’in negatifidir. Bir sayının ikiye tümleyeni, bire tümleyenine bir ekleyerek bulunmaktadır. Örn1: Sayı = 0110 1100 Bire tümleyeni = 1001 0011 İkiye tümleyeni = 1001 0100 Sayının ikiye tümleyeninin ikiye tümleyeni sayının kendisine eşittir. Örn2: Sayı = Bire tümleyeni = İkiye tümleyeni = 1110 1010 0001 0101 0001 0110

İkiye tümleyenini bulmanın pratik yöntemi şöyledir: Sayının sağından soluna doğru ilk 1’i görene kadar (ilk 1 dahil) aynısı yazılarak ilerlenir. Sonra 1’ler 0, 0’lar 1 yapılarak (sayı tersten yazılarak) devam edilir: Sayı = 1010 1100 İkiye tümleyeni = 0101 0100 İki özel sayı vardır ki, onların ikiye tümleyeni yine kendisine eşittir. Birincisi tüm bitleri 0 olan sayı, ikincisi en soldaki biti 1, diğer bütün bitleri 0 olan sayıdır. İkiye tümleyen sisteminde tek bir sıfır vardır. O da, tüm bitleri sıfır olan sayıdır. Bu sistemde, pozitif bir sayı yazılmak istenirse, en soldaki bit sıfır yapılır, geri kalan bitler normal olarak yazılır. Fakat, negatif bir sayı yazılmak istenirse önce onun pozitif hali yazılır, sonra ikiye tümleyeni alınır. Örn: -10 yazmak için önce +10 yazılır: 0000 1010.

Bu sayının ikiye tümleyeni alınır: 1111 0110  -10 eder. Bu sistemde, +n ile – n toplandığında net sıfır elde edilmektedir. Bu sistemde -1, 1111 1111’dir. Çünkü +1, 0000 0001’dir. İkiye tümleyeni ise 1111 1111’dir. Bu sistemde, verilen bir sayının kaç olduğu nasıl bulunabilir: Önce sayının işaret bitine bakılır. İşaret biti 0 ise sayı pozitiftir ve normal olarak hesaplanır. İşaret biti 1 ise sayı negatiftir, ikiye tümleyeni alınır. Pozitif bitinden faydalanarak değeri bulunur. Örn. 1111 1100  İkiye tümleyeni  0000 0100  +4  İşaret biti 1  -4 İkiye tümleyen sisteminde 1 byte içerisinde yazılabilecek en büyük pozitif sayı +127’dir. (0111 1111  + 127) Bu sistemdeki en küçük negatif sayıyı bulmak için önce en büyük pozitif sayının ikiye tümleyenini alıyoruz: 0111 1111  +127 1000 0001  -127 Bu sayıdan 1 çıkartırsak 1000 0000 sayısını elde ederiz. Toplam 256 dizilim olduğuna göre, bunun bir tanesi 0’a ayrıldığına göre, geriye kalan 255 dizilim, eşit sayıda pozitif ve negatif dizilim oluşturmaz. Yani, bir tanesinden 128, diğerinden 127 tane olmak zorundadır. İşte en soldaki biti bir, diğer bitleri 0 olan bu sayı en küçük negatif sayı kabul edilmektedir: 0111 1111  +127 1000 0000  -128 Yukarıdaki örnekler hep 1 byte üzerinde verilmiştir. 2 byte içerisindeki en büyük sayı +32767’dir  0111 1111 1111 1111; -32768  1000 0000 0000 0000; İŞARETLİ VE İŞARETSİZ SİSTEMLER: C’de her tür, belirli uzunlukta byte yer kaplamaktadır. Her tamsayı türünün işaretli ve işaretsiz versiyonları vardır. İşaretsiz bir türe ilişkin bir türün içindeki birler ve sıfırlar her zaman pozitif olarak yorumlanmaktadırlar. Yani yukarıda gördüğümüz ikiye tümleyen yöntemi kullanılmamaktadır. Halbuki, işaretli bir türe ilişkin bir değişkenin içerisindeki birler ve sıfırlar, ikiye tümleyen yöntemine göre yorumlanmaktadır. İkiye tümleyen sisteminde, en büyük pozitif sayıya bir toplandığında en küçük negatif sayı elde edilmektedir. Yani sayı ekseni şöyledir: 0  +max  -max  0  …

KARAKTERLERİN İKİLİK SİSTEMDE İFADE EDİLMESİ: Karakterleri temsil edebilmek için bir dönüştürme tablosu kullanılmaktadır. Yani, aslında, bütün karakterler birer sayı gibi bellekte tutulmaktadırlar. Karakterleri kodlamak için yoğun olarak 1 byte’lık dönüştürme tabloları kullanılmaktadır. 1 byte’lık dönüştürme tablosunda toplam 256 satır vardır. Bu tablolar, her 1 byte’lık dizilimin hangi karakter görüntüsüne karşılık geleceğini belirtmektedir. En yaygın kullanılan dönüştürme tablosu ASCII’dir. (American Standart Code Information Interchange) ASCII tablosunun ilk 128 elemanı standart olarak belirlenmiştir. İkinci 128’lik kısım standart değildir. Farklı ülkeler kendi karakterlerini bu bölgeye yerleştirmişlerdir.

HAZIRLAYANLAR Ahmet TEKYILDIZ (ahmet.tekyildiz@gmail.com) Gökhan KOÇ (gokhankoch@gmail.com) Çağlar YILDIZ (yldz_caglar@yahoo.com.tr) KAYNAKLAR 1) 2) 3) 4) Kaan Aslan – A’dan Z’ye C kılavuzu Kaan Aslan – C ders Notlari Necati Ergin – C Ders Notlari Brian Kernighan, Dennis Ritchie – The C programming language (2. edition)

Sign up to vote on this title
UsefulNot useful