decision theory handout #2 - yildiz.edu.trtuzkaya/tbb_ders_notlari/c_ders_notu_1.pdf(iii) yapay zeka...

21
1 Şubat 2009 9031150 - Temel Bilgisayar Bilimleri Ders Notu #1 Referans: 1. Deitel&Deitel, C: How to Program 2nd Edition, Prentice Hall, 1994. 2. Aslan, Kaan; A’DAN Z’YE C Kılavuzu, ISBN: 975-7092-12-06. Bugün: Genel Kavramlar C Programlamaya Giriş Unix tanıtımı, Data tipleri, Operatörler, Temel I/O (Input/Output – Girdi/Çıktı) 1. Yazılım Nedir? [Kaynak 2] Yazılım, programlamayı ve bu konuyla ilgili dokümantasyonları içeren genel bir terimdir. 1.2. Yazılımların Sınıflandırılması (Uygulama Alanlarına Göre) (i) Mesleki ve Ticari Yazılımlar İşleri kolaylaştırmak amaçlı yazılımlardır. Genellikle yapılan işler, veri yaratımı, işlenmesi, dosyalarda saklanmasıdır. İşlenen veri miktarı büyüktür. Ör: Muhasebe, adres/etiket/ stok kontrol, hasta takip vs. programları. (ii) Bilimsel ve Mühendislik Yazılımlar Bilimsel ve mühendislik problemlerin çözümünde kullanılan yazılımlardır. Yoğunlukla sayı ve sayı dizileri ile uğraşırlar. Matematiksel ve istatistiksel algoritmalar kullanılır. İşlenen veri miktarı küçüktür. Ör: Elektronik devre çözümü, simülasyon, kolon-kiriş hesaplamaları vs. programları. (iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır. Ör: Satranç oynayan programlar, uzman sistemler, doğal dilleri anlama programları. (iv) Görüntüsel Yazılımlar Görüntü işlemlerinin ve algoritmaların yoğun olduğu yazılımlardır. Yoğun olarak bilgisayarların grafik arabirimi kullanılır. Ör: Oyun, animasyon programları. (v) Sistem Yazılımları Bilgisayar donanımı ile arabirim oluşturan uygulama programlarına çeşitli yönlerden hizmet veren yazılımlardır. Uygulama programlarına nazaran daha düşük seviyede işlem yaparlar. Ör: İşletim sistemleri, derleyiciler, editörler, haberleşme programları. 1.3. Program Dillerinin Seviyelerine Göre Sınıflandırılması Seviye, bir programlama dilinin insan algılamasına olan yakınlığının bir ölçüsüdür.

Upload: others

Post on 01-Sep-2019

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

1

Şubat 2009

9031150 - Temel Bilgisayar Bilimleri Ders Notu #1

Referans: 1. Deitel&Deitel, C: How to Program 2nd Edition, Prentice Hall, 1994. 2. Aslan, Kaan; A’DAN Z’YE C Kılavuzu, ISBN: 975-7092-12-06. Bugün: Genel Kavramlar C Programlamaya Giriş

Unix tanıtımı, Data tipleri, Operatörler, Temel I/O (Input/Output – Girdi/Çıktı) 1. Yazılım Nedir? [Kaynak 2] Yazılım, programlamayı ve bu konuyla ilgili dokümantasyonları içeren genel bir terimdir. 1.2. Yazılımların Sınıflandırılması (Uygulama Alanlarına Göre) (i) Mesleki ve Ticari Yazılımlar İşleri kolaylaştırmak amaçlı yazılımlardır. Genellikle yapılan işler, veri yaratımı, işlenmesi, dosyalarda saklanmasıdır. İşlenen veri miktarı büyüktür. Ör: Muhasebe, adres/etiket/ stok kontrol, hasta takip vs. programları. (ii) Bilimsel ve Mühendislik Yazılımlar Bilimsel ve mühendislik problemlerin çözümünde kullanılan yazılımlardır. Yoğunlukla sayı ve sayı dizileri ile uğraşırlar. Matematiksel ve istatistiksel algoritmalar kullanılır. İşlenen veri miktarı küçüktür. Ör: Elektronik devre çözümü, simülasyon, kolon-kiriş hesaplamaları vs. programları. (iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır. Ör: Satranç oynayan programlar, uzman sistemler, doğal dilleri anlama programları. (iv) Görüntüsel Yazılımlar Görüntü işlemlerinin ve algoritmaların yoğun olduğu yazılımlardır. Yoğun olarak bilgisayarların grafik arabirimi kullanılır. Ör: Oyun, animasyon programları. (v) Sistem Yazılımları Bilgisayar donanımı ile arabirim oluşturan uygulama programlarına çeşitli yönlerden hizmet veren yazılımlardır. Uygulama programlarına nazaran daha düşük seviyede işlem yaparlar. Ör: İşletim sistemleri, derleyiciler, editörler, haberleşme programları. 1.3. Program Dillerinin Seviyelerine Göre Sınıflandırılması Seviye, bir programlama dilinin insan algılamasına olan yakınlığının bir ölçüsüdür.

Page 2: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

2

Ör: Çok yüksek seviyeli bir dil olarak ele alınan DBASE ya da FOXPRO’da: SORT ON ADI TO SADI komutu ile bir veri tabanını ADI alanına göre sıraya dizilerek yeni bir SADI dosyası yaratılır.

İnsana en yakın

Bilgisayara en yakın

Çok Yüksek Seviyeli Programlama Dilleri ya daGörsel Diller (FOXPRO, PARADOX, ACCESS,VISUAL BASIC, IV. KUŞAK DİLLERİ)

Yüksek Seviyeli Programlama Dilleri (PASCAL,COBOL, FORTRAN, BASIC...)

Orta Seviyeli Programlama Dilleri (C , ADA)

Alçak Seviyeli Programlama Dilleri (SembolikMakine Dilleri)

Makine Dilleri (Bilgisayarın Doğal ÇalışmaDilleri)

Şekil: Bilgisayar Dillerinin Seviyelerine göre Sınıflandırılması (Kaynak [2])

1.3. Programlama Dillerinin Değerlendirilmesi (i) İfade Gücü (Expressivity) Algoritmayı tasarlayan kişinin niyetlerini açık bir biçimde yansıtabilme yeteneğidir. Ör: Bir matematik algoritması matematikte kullanılan sembol ve değişken isimlerini içermelidir. (ii) Veri Türleri ve Yapıları Çeşitli veri türlerini (tamsayı, gerçek sayı, karakter …) ve veri yapılarını (diziler, kayıtlar…) destekleme yeteneğidir. C ve PASCAL veri yapıları açısından oldukça zengindir. (iii) Giriş/Çıkış Kolaylığı Sıralı, indeksli ve rasgele dosyalara erişme, veritabanı kayıtlarını geri alma, güncelleştirme ve sorgulama yeteneğidir. DBASE, PARADOX vs. gibi veritabanı programlama dillerinin bu yeteneği oldukça üstündür. C bu kolaylığı çok fazla olmayan bir dildir. Özel kütüphanelerin kullanılması gereklidir. (iv) Taşınabilirlik (Portability) Bir programlama dilinde yazılmış kaynak kodun başka sistemlerde de sorunsuz derlenerek çalışabilmesi anlamına gelir. Yüksek seviyeli dillerin en önemli özelliklerinden birisi olan taşınabilirlik, ortak bir tasarımı ve standardizasyonu gerektirir. Taşınabilirlik kaynak kod için kullanılan bir terimdir. Seviye düştükçe azalmaktadır. Ör: BASIC derleyicisinde komutlar arasında büyük farklılıklar görebilirsiniz.

Page 3: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

3

(v) Altprogramlama Yeteneği (Modularity) Kaynak programların altprogramlara parçalanarak ayrılabilme özelliğidir. Altprogramlama kodu küçültür. Algılamayı kolaylaştırır. Test olanaklarını artırır. Kaynak kodun güncelleştirilebilirliğini ve yeniden kullanılabilirliğini artırır. (vi) Verimlilik Bir dilde yazıldıktan sonra derlenerek amaç koda dönüştürülmüş programların hızlı çalışabilmesidir. Dilin seviyesi ve genel yapısı da derleyicilerin verimlilikleri kadar etkili bir unsurdur. Ör: C programları verimli çalışır ve az yer kaplar. Küçüklük ile çalışma hızı arasında doğru bir orantı vardır. (vii) Okunabilirlik Okunabilirlik, kaynak kodun çabuk ve kuvvetli bir biçimde algılanabilmesi anlamına gelen bir terimdir. Okunabilirlik büyük ölçüde programlamacıya bağlıdır. İyi okunabilir bir kod yıllar sonra bile güncelleştirilmeye olanak sağlar. Yetkin bir C programcısıyla deneyimsiz bir C programcısını ayıran en önemli özelliklerden birisi okunabilirliktir. Bir C programcısının yetkinliği 10 satırlık bir kaynak koddan bile anlaşılabilir. (viii) Esneklik Programlama dilinin programcıyı kısıtlamaması anlamına gelir. Esnek bir dilde derleme hataları daha azdır. Örneğin C çok esnek bir dildir, karakter türüyle tamsayı türü birbirine atanabilir. Programcı bu özelliği kullanarak bundan algoritmik bir kazanç sağlayabilir. (ix) Öğrenme kolaylığı Her programlama dilini öğrenme zorluğu aynı değildir. FOXPRO ve BASIC gibi diller kolay öğrenilirken C zor ve zahmetlidir. (x) Genellik Programlama dilinin çok çeşitli uygulamalarda kullanılabilmesidir. Örneğin COBOL bilimsel veya mühendislik yazılımlarda tercih edilmez, CLIPPER yada FOXPRO bir veritabanı dilidir. PASCAL, BASIC ve C daha genel amaçlı dillerdir. (xi) Yapısallık Yapısal programlama bir programlama tekniğidir. Bloklar halinde yazım ön plandadır Program akışında atlamalar yapılması okunabilirliği ve algılamayı güçleştirdiği için istenmez. Yapısal programlamada altprogramlar önemli yer tutar. Modüler tasarım, ifade gücü, taşınabilirlik gibi özellikler de yapısal programlamayı desteklemektedir. (xii) Nesne Yönelimlilik C programlama dilinin nesne yönelimli programlama tekniğini destekleyen uygulamasına C++ denilmektedir. Nesne Yönelimli Programlama (Object-orientated programming) Nesne yönelimli diller aşağıdaki kavramları destekler:

Page 4: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

4

Kapsülleme (Encapsulation) – Kullanıcılara, çalışma şekillerini gizleyecek şekilde iyi tanımlanmış bir fonksiyonlar arayüzü sağlama yeteneğidir. Veri yapıları ve ilgili prosedürlerini birarada bulundurma yeteneğidir. Bu özellik veri ilişkili rutinlerin birarada tutulabilmesini sağlar. Büyük ölçekli organizasyonu basite indirger. Varolan nesnelerden yeni tip nesneler üretilebilmesini ve nesnelerin hiyerarşik olarak sınıflandırılabilmesini sağlar. Polymorphism (farklı nesnelerin farklı yollarla aynı mesaja cevap vermesi) olarak tanımlanabilir. Aynı şeyi bir çok farklı tip nesneye farklı rutinlerle yaptırmaktansa, tek bir rutin aynı işi görür. Ör: C++’ta + işlemcisi öyle yüklenebilir ki yeni sınıflarla da kullanılabilir. Nesne yönelimli bir dil kullanmak genellikle program birimlerinin gerçek hayat birimlerine daha benzer şekilde modellenebilmesi anlamına gelmektedir.

- karmaşıklık daha bölgesel hale gelmiştir. - kodun yeniden kullanımı daha basittir.

Sahte Kod (Pseudo Code) Sahte Kod (Pseudo Code) algortimanın özet bir görüntüsünü sağlar. Ör: Bir genetik algoritma pseudo-code:

i=0 Jenerasyon numarasını sıfıra eşitle

İlkpopülasyon P(0) Genellikle rassal bireylerden oluşan popülasyonu yarat

değerle P(0) Popülasyondaki her birey için uygunluk değerlerini hesapla

while (bitmeden) do Durdurma kriterini kontrol et (zaman, uygunluk vs.)

Başla i = i + 1 Jenerasyon sayısını artır P(i-1)den P(i) seç Yeniden üretim için bir alt popülasyon seç

gengeçişi P(i) Seçilmiş ebeveynlerin genlerini kombine et

mutasyon P(i) Mutasyonu gerçekleştir değerle P(i) Yeni uygunluk değerini hesapla

Bitir

Şekil: Bir Genetik Algoritma İçin Örnek Bir Pseudo Code 1.4. C Nasıl Bir Dildir? - Orta seviyeli bir dildir. - Algoritmik bir dildir. - Diğer diller arasında taşınabilirliği en fazla olanlardan biridir. - İfade gücü yüksek ve okunabilirlik özelliği kuvvetli bir dildir. - Çok esnektir. - Atomik bir dildir. - Güçlü bir dildir.

Page 5: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

5

- Verimli bir dildir. - Doğal bir dildir. - Eğitimi zor bir dildir. - Yapısal bir dildir. - C++ ile nesne yönelimlilik özelliğine sahip olmuştur. 2. Genel Kavramlar 2.1. İşletim Sistemi İşletim sistemi, bilgisayar donanımını yöneten, kullanıcıyla bilgisayar sistemi arasında ilişki kuran aşağı seviyeli bir sistem programıdır. Komutları yorumlamak ve çalıştırmak işletim sisteminin tek görevi değildir. Bir işletim sistemi işlevsel olarak “kabuk” ve “çekirdek” olmak üzere iki bölüme ayrılabilir:

ÇEKİRDEK(KERNEL)

KABUK(SHELL)

Şekil: İşlevsel Olarak Bir İşletim Sistemi

İşletim sisteminin donanımı yöneten kısmına çekirdek (kernel), kullanıcı ile arabirim oluşturan kısmına ise kabuk (shell) ya da komut yorumlayıcı denilmektedir. Çekirdek kısmının tasarımı kabuk kısmının tasarımından çok daha zordur. İşletim sistemleri birer kaynak yönetici olarak tanımlanabilir ve şu görevleri yerine getirirler: İşletim Sistemlerinin Görevleri 1. Kaynakları izleyerek onların ne durumda olduğunu belirler 2. Kimin, hangi kaynakları ne zaman, ne kadar süre ile kullanacağına karar verir. 3. Kaynakları belirlenen işlemler için tahsis eder. 4. İşlemler bitince kaynakları serbest bırakır. İşletim sistemlerinin yönetmekle görevli olduğu sistem kaynakları, Merkezi İşlem Birimi, Bellekler, Dosyalar ve Aygıtlardan oluşur. İşletim Sistemlerinin Yönettiği Sistem Kaynakları (i) Merkezi İşlem Birimi (CPU) Mikroişlemci olarak da biline bu birim bilgisayar sisteminin beynini oluşturmaktadır. Ör: Aynı anda birden fazla programın çalıştığı işletim sistemlerinde programların mikroişlemciye ne zaman ve ne kadar süre ile atanacağı gibi kararlar işletim sistemi tarafından verilir.

Page 6: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

6

(ii) Bellek (Memory) Programları belleğe yüklemek, çalışması bitince belleği boşaltmak vs. gibi işlemler de işletim sistemi tarafından yapılır. (iii) Dosya (File) Dosyalara erişim, dosyaların kontrolü ve yönetilmesi gibi işlemler, işletim sistemlerinin denetimi altındadır. (iv) Aygıt (Device) Disk, yazıcı gibi aygıtların kontrolünden de işletim sistemleri sorumludur. Ör: Çok kullanıcılı bir işletim sisteminde iki kişi aynı anda yazıcıdan çıktı almak istediğinde olası çatışma durumu işletim sistemi tarafından çözülmek zorundadır. İşletim sistemleri “çok işlemli (multi processing)” olup olmamalarına göre farklılık gösterirler. Çok işlemli sistemlerde birden fazla program aynı zaman diliminde çalışabilir. Ör: DOS tek işlemli bir işletim sistemidir. UNIX, WINDOWS, OS/2 gibi işletim sistemleri ise çok işlemlidir. 3. C Programlamaya Giriş C’nin Tarihçesi

Dilin erken tarihi

C'nin ilk gelişme safhaları 1969 ile 1973 arasında AT&T Bell Laboratuvarları'nda gerçekleşti. Dennis Ritchie'ye göre, en yaratıcı devre 1972 idi. Dilin pek çok özelliği "B" adlı bir dilden türediği için, yeni dile "C" adı verildi. "B" adının kökeni konusunda ise söylentiler değişik: Ken Thompson B'nin BCPL programlama dilinden türediğini söylemektedir, ancak Thompson eşi Bonnie'nin onuruna adını Bon koyduğu bir programlama dili de geliştirmiştir. 1973'e kadar C yeterince güçlü bir hale gelmiş ve ilk başta PDP-11/20 assembly dili ile yazılan UNIX'in çekirdeğinin büyük kısmı C ile yeniden yazılmıştı. Böylece UNIX, çekirdeği bir assembly dili ile yazılmayan ilk işletim sistemlerinden biri olmuştu.

K&R C

1978'de Ritchie ve Brian Kernighan The C Programming Language (C Programlama Dili) kitabının ilk baskısını yaptılar. C programcıları tarafından "K&R" olarak bilinen bu kitap, C dilinin gayriresmi standardı olarak kullanıldı. C'nin bu versiyonu bugün "K&R C" olarak adlandırılır.

ANSI C ve ISO C

1970'lerin sonunda C, en çok kullanılan mikrobilgisayar dili olarak BASIC'in önüne geçmeye başladı. 1980'lerde ise, IBM PC ile kullanılmak üzere benimsenmesiyle birlikte popülaritesi iyice artmaya başladı. Aynı zamanda, Bell Laboratuvarları'nda Bjarne Stroustrup ve iş arkadaşları C'ye nesneye yönelim eklemek üzere çalışmaya başlamışlardı. C bugün UNIX

Page 7: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

7

dünyasında en çok kullanılan dil olarak kalırken, Stroustrup'un geliştirip C++ adını verdiği dil Microsoft Windows işletim sisteminde en önemli dil oldu. 1983'te Amerikan Ulusal Standartlar Enstitüsü (ANSI) bir C standardı oluşturmak için bir kurul oluşturdu. Uzun ve yorucu bir çalışmadan sonra, bu kurul standardı 1989'da tamamladı ve standart ANSI X3.159-1989 "Programming Language C (C Programlama Dili)" olarak yayımlandı. Dilin bu versiyonu genellikle ANSI C olarak adlandırılır. 1990'da bu standart, küçük değişikliklerle Uluslararası Standartlar Örgütü (ISO) tarafından da benimsenip ISO/IEC 9899:1990 olarak yayımlandı. Bugün artık ANSI C neredeyse tüm derleyiciler tarafından desteklenmektedir. Günümüzde yazılmakta olan C programlarının çoğunluğu ANSI C standardına uygun olarak yazılmaktadır. C99 ANSI standartlaştırma işleminden sonra C dili uzun bir süre oldukça sabit kaldı, ancak C++ gelişmeyi sürdürdü. Buna bağlı olarak, 1990'ların sonunda ISO standardı güncellendi ve 1999'da ISO 9899:1999 olarak yayımlandı. 2000 yılının Mart'ında ise, "C99" olarak bilinen bu standart ANSI tarafından da benimsendi. Genel Bilgi

• Her bilgisayar direkt olarak yalnızca kendi makine dilini anlayabilir. • Makine dilleri genellikle sayı dizilerinden (0 ve 1e indirgenmiş) oluşur. • C UNIX işletim sisteminin geliştirme dili olarak bilinir. • C programları hemen hemen her bilgisayarda çalışacaktır. • ANSI (American National Standards Institute) tarafından 1989 yılında ANSI C

geliştirilmiştir. • Tüm C sistemleri : ortam, dil ve standart kütüphaneler olmak üzere 3 temel bölümden

oluşur. Kütüphane fonksiyonları C dilinin bir parçası değildir. Bu fonksiyonlar girdi/çıktı (input/output ya da I/O) ve/veya matematik hesaplamaları gerçekleştirirler.

• Bir C programının yürütülmesi için tipik olarak beş adım gerekir: yazım (edit) , önceden-işleme (prepocess), derleme (compile), yükleme (load) ve yürütüm (execute).

• Programcı programı bir editör aracılığıyla yazar ve gerekirse düzeltmeleri yapar. • Preprocessor (ön-işlemci) programa dahil olmayan gerekli programların bulunması ve

özel sembollerin program metni ile değiştirilmesini sağlar. • Derleyici (compiler) yazılan programı makine diline (nesne kodu) çevirir. • Linker (bağlayıcı) nesne kodu ile kodu yürütülebilir (executable) bir nesneye çevirmek

için kodda yer almayan fonksiyonlar arasında bağlantı kurar. • Yükleyici (loader) diskten yürütülebilir nesneyi alır ve hafızaya transfer eder. • Bilgisayar, CPUsunun kontrolü altında her seferinde bir komut olmak üzere programı

yürütür. 2.2. Çevirici Programlar Çevirici programlar, herhangi bir programlama dilinde yazılmış olan kaynak programı girdi olarak alan ve bunu işlevleri aynı olacak biçimde başka bir dile dönüştüren programlardır.

Page 8: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

8

Kaynak Program

Kaynak Dil

ÇEVİRİCİPROGRAM

Amaç Program

Amaç Dil

Kaynak ve amaç programları farklı programlama dilleridir. Bir çevirici programda kaynak programa ilişkin programlama diline kaynak dil, amaç programa ait dile amaç dil denilmektedir. 2.2. Derleyici Programlar Kaynak dili yüksek seviyeli bir dil, amaç dili alçak seviyeli bir dil (sembolik makine dili ya da makine dili) olan çevirici programlara derleyici denir. Uygulamada alçak seviyeli dil çoğunlukla makine dilidir.

Kaynak Program

Yüksek SeviyeliDil (C,PASCAL,COBOL)

ÇEVİRİCİPROGRAM

Amaç Program

Alçak Seviyeli Dil(MAKİNE DİLİ)

Derleyicilerin çıktısı olan amaç kodun işletim sistemine göre anlamı değişebilir. Örneğin 80X86 tabanlı mikroişlemcilerin kullandığı DOS, WINDOWS, UNIX işletim sistemlerinde derleme sonucunda oluşan amaç koda, yeniden yüklenebilen amaç kod denilmektedir. DOS işletim sisteminde “çalışabilir bir kod” üretmek için bağlayıcı (linker) denilen alçak seviyeli bir dönüştürücü programa ihtiyaç duyulmaktadır. Aşağıda, DOS işletim sisteminde bir C programının hangi aşamalardan geçerek çalışabilir bir kod haline getirileceği şekilsel olarak açıklanmaktadır.

.C

DERLEYİCİEDİTÖR

.OBJ

BAĞLAYICI

.EXE

Basit Bir C Programı C dili hakkında önemli bir çok özelliği gösteren basit bir program ile başlayalım. Bu program ekranda bir satırlık metin görüntüler. /* C dilinde ilk program */ /* Bu program bir satirlik metin goruntuler */ /* Programci: Dr. Umut R. Tuzkaya */

Page 9: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

9

/* Tarih: Subat 2008 */ #include <stdio.h> int main(void) { printf(“C dilinde ilk program!\n”); return 0; } Önemli Not: Kirmizi ile yazilan ifadeler olmaksızın da program çalışacaktır. Derste anlatılanları hatırlayın !!! Ekran Çıktısı: C dilinde ilk program! şeklinde olacaktır. /* */ arasında yazılan her metin program tarafından YORUM olarak değerlendirilecek ve okunmadan atlanacaktır. YORUM iyi programcılığın en önemli göstergelerinden biridir. Yorumlar aynı zamanda // olarak da yazılabilirler. Her C programı main() bloğu ile başlar. C programları bir ya da daha fazla sayıda fonksiyon içerir. main( ) bloğu bu fonksiyonların program inşa bloğudur. Sol küme parantez “{“ her fonksiyonun vücudunu (body) başlatır. Buna karşılık gelen sağ küme parantez } her fonksiyonu sona erdirir. Her sol paranteze bir sağ küme parantez karşılık gelmelidir. Bu parantezler ve aradaki program blok olarak adlandırılır. printf(“C dilinde ilk program!\n”); bilgisayarı bir aksiyona hazırlar ve ekrana tırnak içinde belirtilen karakterlerden oluşan bir dizi yazılmasını sağlar. Tüm satır printf, noktalı virgül ; ve printf argümanları da dahil olmak üzere ifade olarak adlandırılır. Her ifade noktalı virgül ile son bulmalıdır. Örnek kullanım şekli Ekranda yazılacak ifade printf("Element: Aluminyum"); Element: Aluminyum printf("Atom numarası = %d",13); Atom numarası = 13 printf("Yoğunluk = %f g/cm3",2.7); Yoğunluk = 2.7 g/cm3 printf("Erime noktası = %f derece",660.32); Erime noktası = 660.32 derece

Backslash (\) (kaçış karakteri) (escape character) olarak adlandırılır. Bu durumda kaçış karakteri printf komutunun sıra dışı bir davranışta bulunacağını söyler. Backslash’i gören printf bir sonraki karaktere bakar ve bir kaçış sıralaması (escape sequence) oluşturur. Kaçış sıralaması \n “yeni satır” (newline) anlamına gelmektedir. Tablo 1’de yaygın olarak kullanılan diğer kaçış sıralamaları gösterilmiştir.

Page 10: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

10

Tablo 1: Yaygın olarak kullanılan kaçış sıralamaları (Kaynak: Deitel&Deitel)

Kaçış Sıralaması Tanım \n Newline – Yeni Satır. Cursor’ı yeni satırın başına yerleştirir. \t Yatay tab. Cursor’ı bir sonraki tab konumuna getirir. \r Carriage return. Cursor’ı mevcut satırın başına getirir. \a Alert. Uyarı. Sistem zilini çaldırır. \\ Backslash. Bir printf ifadesi içinde backslash (\)görüntülenmesini sağlar. \” Çift tırnak. Bir printf ifadesi içinde çift tırnak (“) görüntülenmesini

sağlar. } (Sağ küme parantez) main’in sonuna gelindiğini haber verir. AKIŞ DİYAGRAMLARI Akış diyagramı programın oluşturulmasında kolaylık sağlar. Akış diyagramlarında kullanılan semboller ve anlamları aşağıda verilmiştir:

Başla/Son Akış diyagramının başlangıç ve bitiş yerlerini gösterir. Başlangıç simgesinden çıkış oku vardır. Bitiş simgesinde giriş oku vardır.

Giriş/Çıkış: Programa veri girişi ve programdan elde edilen sonuçların çıkış işlemlerini gösterir.

İşlem Aritmetik işlemler ve değişik atama işlemlerinin temsil edilmesi için kullanılır.

Karar Bir karar verme işlemini temsil eder.

Oklar Diyagramın akış yönünü ,yani her hangi bir adımdaki işlem tamamlandıktan sonra hangi adıma gidileceğini gösterir.

Örnek Akış Diyagramı:

Page 11: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

11

Bir fihrist oluşturma programı için gereken akış diyagramı aşağıdaki gibidir.

Page 12: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

12

BAŞLA

TABLORezervasyonu

MENÜ Göster

SEÇİM Al

Seçim =1

EGİRİŞYap

H

H

Seçim =2

EDÜZELTME

Yap

H

Seçim =3

ESİLME

Yap

H

Seçim =4

EEKLEME

Yap

H

Seçim =5

EARAMA

Yap

H

Seçim =6

ELİSTELEME

Yap

H

Seçim =7 E SON

Page 13: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

13

Önemli Not: Yazdığınız C programını her zaman iyi dokümante edin. Programın amacı, kim tarafından hangi tarihte yazıldığı, en son ne zaman değiştirildiği vs. gibi bilgileri dokümantasyonda gösterin. Hata Tanımları: Programlamada temel olarak iki çeşit hata vardır: Sentaks – Yazım hataları Semantik – Mantık hataları Yazım hataları: Compiler “derleyici” tarafından fark edilir. Dilin yanlış kullanımından meydana gelen hatalardır. Mantık hataları: Yazım hatalarından dolayı meydana gelmez. Programın tasarımını ile ilgili hatalardır. Bir C programı temel olarak 5 ana bölüme ayrılır:

1. # include (içer) ifadeleri (statements) 2. # define (tanımla) ifadeleri (statements) 3. global tanımlar 4. main fonksiyonu 5. alt_fonksiyonlar (subfunctions)

Her programın bir main fonksiyonu vardır. 1. # include ifadeleri Daha önce başkaları tarafından yazılmış rutinlere gönderme yapar. Bu rutinler input (girdi) , output (çıktı) kütüphaneleri (library), math (matematik) kütüphanesi vb. olabilir. Format: # include <kütüphane_adı.h> Ör: # include <math.h> Ör: double sqrt(double val);

double pow(double base, double exp);

# include <stdio.h> en yaygın olarak kullanılan kütüphanedir. Her C programına eklenir. Standart girdi/çıktı kütüphanesi anlamını taşır. Input/Output rutinleri bir donanım cihazı isteminde bulunur. Örneğin stdio.h kütüphanesinde tanımlı olan printf fonksiyonu donanımda bir çıktı mesajı oluşturur. 2. # define ifadeleri C kodlarında bir değerin bir kelime ile yer değiştirmesi amacı ile kullanılacaktır. Örneğin literatürde varolan ya da program için gerekli bir sabit yaratmak amacıyla kullanılır. Ör: # define PI 3.1415926

Page 14: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

14

# define Kullanım Amaçları: 1. Kodun daha rahat okunmasını, dolayısıyla daha iyi dokümante edilmesini sağlar.

Ör: Area = PI * r * rj !!! Sabitleri değişkenlerden ayırmak için BÜYÜK HARF kullanılır. !!! Tüm yazılar boyuta hassastır. Diğer bir deyişle koddaki büyük harfler küçük harflerden farklı anlam taşır. AREA ≠ area

2. Değişiklerin koda daha rahat eklenmesini sağlar. Ör: Hız limitinin 60 km. olduğu bir şehirden 50 km olduğu bir şehre gidildiğinde, MAX.HIZ = 60 olarak tanımlanmış bir kodda yalnızca bu değerin değişmesi yeterli olacaktır. Aksi taktirde 60 geçen her yerde yeni rakam olan 50 değerinin yazılması gerekir. # define MAX.HIZ 60

3. GLOBAL değişkenlerin tanımlanmasını sağlar. Global değişkenler tüm fonksiyonlar tarafından görülen değişkenlerdir. Zayıf programlamacılık göstergesidir. Çok gerekli olmadığı taktirde kod yazıcı tarafından kullanılmamalıdır. 3. Main fonksiyonu Bir programın temel fonksiyonudur. Genel görünümü: Lokal tanımlar - local definitions Lokal değişkenler – local variables Kod ifadelerini – code statements şeklindedir. “Lokal” yalnızca kullanıldığı fonksiyon tarafından ihtiyaç duyulan ve kullanılan anlamındadır. 4. Alt fonksiyonlar (subfunctions) Main fonksiyon tarafından çağırılan küçük kod parçalarıdır. Genel görünümü: Lokal tanımlar – local definitions Lokal değişkenler – local variables Kod ifadelerini – code statements şeklindedir.

Page 15: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

15

Değişken (variable) yaratımı: (memory allocation) – hafıza ayırma Örneğin bir dairenin alanını hesaplamak için yarıçapını ( r ) bilmemiz gerekir. Yarıçapı girdiğimizde depolamamızı ve ihtiyacımız olduğunda kullanmamızı sağlar. Bir değişken yaratmak için aşağıdaki adımlar izlenir:

1. Mantıklı bir değişken ismi belirlenir. 2. Değişkenin tipi belirlenir. Temel olarak 3 adet değişken tipi vardır:

- Tamsayı (… -1, 0, 1, 2, 3…) - Gerçek sayı (3.14, 2.57 vb.) - Karakter (ASCII karakter setinin herhangi bir elemanı) Bakınız Tablo 1.

ASCII (American Standard Code for Information Interchange) karakter setinde toplam 256 (0-255) adet karakter vardır. Biz bunların 256/2 = 128 tanesi ile ilgileneceğiz. Bu karakterlerin yaklaşık olarak 90 tanesi ekranda görüntülenebilir. NOT: ASCII karakterlerinde 0 tamsayı 0’a, 48, harf 0’a karşılık gelir. Buna göre: putchar(48); ifadesi ekrana 0 görüntülerken putchar(0); Hiçbirşey görüntülemez. Bu karakterlerin herbiri ikilik düzene çevrilerek 8 bitlik alanlarda tutulur.

***Bit veya ikil, bilişimde kullanılan en küçük bilgi birimidir. Evet/Hayır, 0/1, açık/kapalı, var/yok, doğru/yanlış gibi düşünülebilecek birbirine karşıt iki durumu belirtmekte kullanılır.

Kök olarak ikili basamak (veya başka bir görüşe göre ikili birim) anlamlarına gelen 'binary digit' (veya 'binary unit') kelimelerinin kısaltılmasından gelir. Birçok platformda 1 byte 8 bit bulundurur.

***Bayt, elektronik ve bilgisayar bilimlerinde 8 bitlik dizilim boyunca 1 veya 0 değerlerini bünyesine alan ve kaydedilen bilgilerin türünden bağımsız bir bellek ölçüm birimdir. Bir Bayt, Latin abecesini baz alan 8-bitlik bir kodlamada herhangi bir harfi temsil eder.

8 bit = 1 Bayt

Bayt, Bitten sonraki ikinci en küçük sayısal bilgisayar birimidir. Bir Bayt, 0 ile 255 arasındaki değeri veya diğer anlamda 256 şalter durumunu temsil etmektedir. Yani 2 üssü 8'dir. Onluk düzende 167'nin ikilik düzende dizilimi şöyledir: 10100111.

28 bit'in onluk sayı değeri 255 olup, 0 ile birlikte, 256 şalter durumunu gösterir. Eğer somut sonuç 2 üzeri 10'u geçiyorsa o zaman sayının sonundaki rakamlar silinip onun yerine kısaltmalar eklenir. Örneğin, (www.wikipedia.com)

Page 16: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

16

• 1 Kilobayt = 1 KB = 1.024 Bayt • 1 Megabayt = 1 MB = 1.048.576 Bayt • 1 Gigabayt = 1 GB = 1.073.741.824 Bayt • 1 Terabayt = 1 TB = 1.099.511.627.776 Bayt

Tablo 1 – ASCII Tablosu (http://www.asciitable.com)

Dec: Decimal system (onluk sistem) Hx: Hexadecimal system (onaltılık sistem) Oct: Octal system (sekizlik sistem) Spacebar’ın yaptığı boşluk Kod 32 no’lu karakter Enter ile alt satıra geçme Kod 13 no’lu karakter A’nın karşılığı Kod 65 no’lu karakter a’nın karşılığı Kod 97 no’lu karakter

Tablo 2 – Genişletilmiş ASCII Tablosu (http://www.asciitable.com)

Page 17: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

17

Bilgisayarda yalnızca tamsayılar depolanabilir. Bu nedenle örneğin 2.71 gerçek sayısı 271 -2 şeklinde depolanabilmektedir. Girdi/Çıktı (Input/Output) Emirleri En yaygın olarak kullanılan çıktı komutu printf iadesidir. Diğer yaygın bir komut olan putchar tek bir ASCII karakteri görüntüler. • putchar Kullanımı:

• putchar(‘m’); DOĞRU • putchar(“m”); YAZIM HATASI !!! - YANLIŞ • putchar(“uzun bir hece dizisi kabul edilir”);

DOĞRU

• Önceden char harf; olarak tanımlanmış ise putchar(harf); DOĞRU

• putchar(‘\n’); DOĞRU ama harf n anlamına gelmemektedir. \n özel bir karakterdir ve alt satıra geçilmesini sağlar.

Page 18: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

18

• printf İki çeşit kullanımı vardır: 1. Belirli bir ifadeyi görüntülemek için:

• printf(“Merhaba dunya”); printf(“Nasilsin ?”); Ekran çıktısı: Merhaba dunyaNasilsin ? Şeklinde olacaktır.

Merhaba dunya Nasilsin ? Şeklindeki ekran çıktısı için:

• printf(“Merhaba dunya\n”); printf(“Nasilsin ?”); YA DA

• printf(“Merhaba dunya”); printf(“\nNasilsin ?”); kullanılmalıdır.

2. Belirli bir değişkenin değerini –sonuç, değişken vb.- görüntülemek için: Kullanım şekli: printf(format string, argüman listesi); Ör: Alan değişkeninin önceden tanımlandığını varsayarsak: printf(“Cevap %f bulunmustur”, alan); Ekran çıktısı: Cevap 62.7 bulunmustur Format string tipleri (conversion specifiers – değiştirme belirleyicileri): %f gerçek sayılar (floats) %i tamsayılar (integers) %c karakterler (characters) %s karakter dizileri (strings) %l uzun tamsayı (long integer) %d çift tamsayı (decimal integer) %u işaretsiz tamsayı (unsigned integer) Ör: a = 5, b = 7, c = 12 olsun.

Page 19: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

19

printf(“%d + %d = %d \n”,a,b,c); Ekran çıktısı: 5 + 7 = 12

Tablo 4: C Aritmetik Operatörleri

C operasyonu Aritmetik işlemci Matematiksel gösterim

C ifadesi

Toplama + f + 7 f + 7 Çıkarma - p - c p – c Çarpma * bm b*m Bölme / x/y x/y Modül % r mod s r % s

Tablo 5: C İşlem sırası

Öncelik Sırası C operasyonu C operasyonu 1 ( ) Parantez içindeki işlemler 2 *, / veya % Çarpma, Bölme ve Modül 3 + veya - Toplama ve Çıkarma

Tablo 6: Eşitlik ve İlişki İşlemcileri

Eşitlik veya İlişki İşlemcisi

C Eşitlik veya İlişki İşlemcisi Örnek C ifadesinin anlamı

Eşitlik İşlemcileri = == x == y x y’ye eşit ≠ != x != y x y’ye eşit değil İlişki işlemcisi > > x > y x y’den büyük < < x < y x y’den küçük ≥ >= x >= y x y’den büyük veya eşit ≤ <= x <= y x y’den küçük veya eşit

C Dilinde Basit Bir Toplama Programı /* Toplama programi */ # include <stdio.h> main() { int tamsayi1, tamsayi2, top; /* bildirim */ printf(“Ilk tamsayiyi girin\n”); /* uyari */ scanf(“%d”,&tamsayi1); /* bir tamsayi oku */ printf(“Ikinci tamsayiyi girin\n”); /* uyari */ scanf(“%d”,&tamsayi2); /* bir tamsayi oku */ top = tamsayi1 + tamsayi2; /* top atamasi */ printf(“Toplam %d\n”, top); /* top goruntule */

Page 20: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

20

return 0; } Ekran çıktısı: Ilk tamsayiyi girin 45 Ikinci tamsayiyi girin 72 Toplam 117 Daha önce de belirtildiği gibi her program yürütüme bir main ile başlar. { main fonksiyonunu başlatırken, karşılık gelen } fonksiyonu sonlandırır. int tamsayi1, tamsayi2, top; /* bildirim */ satırı bir bildirimdir (deklerasyon - decleration). tamsayi1, tamsayi2, top değişken adlarıdır. Bu bildirim ile değişkenlerin int tipinde değerler alacağı bildirilmiştir. Tüm değişkenler programda kullanılmadan önce main bloğunun başlangıç küme parantezinin takibinde bir ad ve data tipi ile tanımlanmalıdır. printf(“Ilk tamsayiyi girin\n”); /* uyari */ satırı, kullanıcıyı bir sayı girmesi konusunda uyardığından uyarı (prompt) adını taşır. scanf(“%d”,&tamsayi1); /* bir tamsayi oku */ satırı kullanıcıdan bir değer almak amacıyla scanf komutunu kullanır. scanf fonksiyonu genellikle klavyeden data girişlerinde kullanılır. scanf’in iki adet argümanı vardır. İlk argüman format kontrol karakter dizisi, kullanıcı tarafından girilecek datanın tipini belirler. İfadedeki %d (decimal integer) girilecek sayının tamsayı olduğunu göstermektedir. (% aynı \ gibi kaçış karakteri olarak kullanılmaktadır). İkinci argüman bir ampersand (ve) (&) işareti ile başlar. & işlemcisine adres operatörü ya da adres işlemcisi denir. &yı takiben bir değişken bulunmalıdır. Değişken ismi ile birleştiğinde &, scanf’e tamsayı1 değerinin nerede depolandığını söyler. scanf birkaç istisnai durum dışında her zaman & ile kullanılır. Atama ifadesi: top = tamsayi1 + tamsayi2; /* top atamasi */ tamsayi1 ve tamsayi2 değişkenlerinin değerlerini toplar. Tüm matematik, eşitlik ve ilişki işlemleri soldan sağa doğru ilişkilendirilirken atama (=) işlemi sağdan sola yapılır. printf(“Toplam %d\n”, top); /* top goruntule */ ekrana tamsayı top değerini yazdırır. scanf ve printf’teki conversion specifier’ların aynı olduğuna dikkat edin. Bu durum genellikle doğrudur. return 0;

Page 21: Decision Theory Handout #2 - yildiz.edu.trtuzkaya/TBB_Ders_Notlari/C_Ders_Notu_1.pdf(iii) Yapay Zeka Yazılımları İnsan davranışını taklit etmeyi amaçlayan yazılımlardır

21

ifadesi programın yürütüldüğü (execute) işletim sistemi ortamına 0 değerini geçirir. Bu programın başarı ile yürütülmüş olduğunu gösterir. } main fonksiyonunun sonuna erişildiğini haber verir.