|
|
 |
| C Programlama Dersleri |
 |
| Programlama Dersleri » C Programlama Dersleri |
| Dosya adı : | C Programlama Dersleri |
| Boyut : | 82 KB |
| Dil : | Türkçe |
| Eklenme tarihi : | 08/06/2008 13:50:11 |
| Hit : | 147 |
| Puan : |  |
| Açıklama : | C Ders Notları
Mayıs 2001
Öğr. Gör. H. Turgut Uyar
Önsöz
Bu notlar henüz tamamlanmamıştır.
Notların hazırlanmasında anlatımı kolaylaştırması açısından C++ dilinin getirdiği bazı yeniliklerden yararlanılmıştır. Örnek programlar verildikleri şekliyle standart C derleyicileri tarafından derlenmeyebilirler; bu programların standart C dilinde yazılmış karşılıkları Ek E'de verilmiştir.
İçindekiler
1 Programlamaya Giri s
1.1 Yap sal Programlama
1.2 Soyutlama
1.3 Program Geli stirme A samalar
1.4 Derleme / Yorumlama
1.5 Kitapl klar
1.6 Standartlar
1.7 Derleme A samalar
2 C Diline Giri s
2.1 Temel Özellikler
2.2 Degi skenler
2.3 Degi sken Tan mlama
2.4 Veri Tipleri
2.5 Giri s / Ç k s
2.6 Deyimler
2.7 Atama
2.8 Aritmetik İslemler
2.8.1 Tip Zorlama
2.8.2 İslemli Atama
2.8.3 Art rma / Azaltma
2.8.4 Öncelik S ras
2.9 Degi smezler
2.10 Makrolar
3 Ak s Denetimi
3.1 Rastgele Say lar
3.2 Ko sul Deyimleri
3.2.1 Kar s la st rma İslemleri
3.2.2 Mant ksal İslemler
3.3 Seçim
3.4 Sayaç Denetiminde Yineleme
3.5 Çoklu Kar s la st rma
3.6 Ko sul Denetiminde Yineleme
3.7 Ko sullu İsleç
3.8 Bo s Döngüler
3.9 Sonsuz Döngüler
3.10 \.Içiçe Döngüler
4 Diziler
4.1 Tek Boyutlu Diziler
4.2 Çok Boyutlu Diziler
4.3 Ba svurular
5 Katarlar
6 Fonksiyonlar
6.1 Fonksiyonun Bildirimi
6.2 Fonksiyonun Tan m
6.3 Parametre Aktar m
6.4 Tan m Bölgesi
6.5 Seçerek S ralama
6.6 Aktar lan Parametrede Degi siklik
6.7 Dizilerin Fonksiyonlara Aktar m
6.8 Ana Fonksiyona Parametre Aktar m
6.8.1 Ç k s Parametreleri
6.8.2 Hata \.Iletileri
6.8.3 Giri s Parametreleri
7 \.Ileri Veri Tipleri
7.1 Tiplere Yeni \.Isim Verme
7.2 Yap lar
7.3 Birlikler
7.4 Numaraland rma
8 İsaretçiler
8.1 İsaretçi Tipinden Degi skenler
8.2 Bellek Yönetimi
8.3 İsaretçi - Dizi \.Ili skisi
8.4 Parametre Aktar m
9 Projeler
A C ile C++ Aras ndaki Farklar
B Ayr nt
C Kitapl klar
C.1 Matematik
C.2 Katar
D Uygulamalar
E Örnek Programlar n C Dili Kar s l klar
F Unix'de Program Geli stirme
Chapter 1
Programlamaya Giriş
Bir problemi bilgisayar yardımıyla çözmek için öncelikle problemi bilgisayarda işlemeyi sağlayan bir model kurulur. Daha sonra da bu model üzerinde çözüme adım adım hangi işlemlerin yapılmasıyla ulaşılacağı belirlenir. Bu işlem sırasına algoritma adı verilir. Program ise bu algoritmanın bir programlama dili kullanılarak gerçeklenmiş biçimidir. Yani algoritma dilden bağımsızdır, program ise dile bağımlıdır.
Algoritmaların iki temel özelliği vardır:
1. İyi tanımlanmışlardır: Her adımda ne yapılacağı bellidir. Böylelikle bilgisayar ile gerçeklenebilirler.
2. Sonludurlar: Sonlu sayıda adımda ya çözümü bulurlar ya da bulamadıklarını bildirirler, sonsuza kadar çalışmazlar.
Örnek:
Bir sayı dizisindeki en büyük elemanı (maksimumu) bulan algoritma.
1. Dizinin ilk elemanını maksimum olarak seç.
2. Dizide başka eleman varsa 3. adıma git, yoksa dur.
3. Bir sonraki eleman maksimumdan büyükse bu elemanı maksimum yap.
4. 2. adıma dön.
Algoritmaları göstermek için sıkça kullanılan yöntemlerden biri akış çizenekleridir. Akış çizeneklerinde şu simgeler kullanılır:
• Kutu: Bir işlemi gösterir. Kutunun içine işlemi anlatan bir deyim yazılır.
• Ok: Akış yönünü belirtir. Algoritmanın bir sonraki adımının hangisi olduğunu gösterir.
• Eşkenar dörtgen: Karar noktalarını gösterir. İçine yazılan sorunun yanıtının doğru ya da yanlış olmasına göre farklı bir yöne gidilmesini sağlar.
• Algoritmanın tamamı belirtilmişse akış çizeneği yuvarlak içinde bir ``start'' sözcüğüyle başlar ve yuvarlak içinde bir ``stop'' sözcüğüyle biter.
Yukarıda verilen algoritma örneğinin akış çizeneği Şekil 1.1'de görüldüğü gibidir.
Şekil 1.1: Akış çizeneği örneği.
Bazen bir algoritmanın tamamı değil, yalnızca ilgilenilen bir parçası belirtilmek istenebilir. Bu durumda çizenek boş bir yuvarlak ile başlar ve boş bir yuvarlak ile sona erer. Akış çizeneğinin büyümesi ve topluca görülmesinin zorlaşması durumunda akış çizeneği parçalarının başındaki ve sonundaki yuvarlakların içine etiketler yazarak hangi parçanın hangi parçaya nereden bağlandığı belirtilebilir.
1.1 Yapısal Programlama
Program tasarlamada nasıl bir yol izlemenin daha verimli olacağı konusundaki araştırmalar programcılığın ilk günlerinden beri sürmektedir. Küçük çaplı projelerde fazla sorun olmasa da, projenin çapı büyüdükçe ve programı geliştiren insanların sayısı arttıkça hem programın geliştirilmesi hem de geliştirilmiş bir programın bakımının yapılması (düzeltmeler, eklemeler, değişiklikler) zorlaşır. Yapısal programlama, program tasarımı üzerine geliştirilmiş yaklaşımlardan biridir. Programların yapıtaşlarını ve bunların birbirleriyle ilişkilerini düzenleyen kurallardan oluşur.
Yapısal programlamanın temel yapıtaşına blok adı verilir. Blok, birbiriyle ilişkili komutların oluşturduğu gruptur. Her program birbirlerine çeşitli şekillerde bağlanmış bloklardan oluşur. Blokları bağlamanın üç yolu vardır:
Sıra
Bu yapı, blokların yukarıdan aşağıya doğru yazıldıkları sırayla yürütülmeleri anlamına gelir. Sıra yapısının akışı Şekil 1.2'de çizildiği gibidir.
Şekil 1.2: Sıra yapısının akış çizeneği.
Seçim
Bu yapı, bir koşulun doğru olup olmamasına göre yürütülecek bloğun seçilmesidir. Yani koşul doğruysa bir blok, yanlışsa başka bir blok yürütülür (Şekil 1.3). İki bloktan herhangi biri boş olabilir, yani sözgelimi ``koşul doğruysa şu bloğu yürüt, yanlışsa hiçbir şey yapma'' şeklinde bir yapı kurulabilir.
Şekil 1.3: Seçim yapısının akış çizeneği.
Yineleme
Bu yapı, belirli bir koşul sağlandığı sürece (ya da sağlanana kadar) bir bloğun yinelenmesidir. Akış çizeneğinde (Şekil 1.4) bu yapı için özel bir simge kullanılmayacak, koşul ve eylem simgeleri ile gösterilecektir1.
Şekil 1.4: Yineleme yapısının akış çizeneği.
Bu yapıların ortak bir özelliği, hepsinin bir giriş ve bir çıkışlarının olmasıdır. Böylelikle bir bloğun çıkışı öbür bloğun girişine bağlanabilir; başka bir deyişle, bloklar ardarda eklenebilir. Ayrıca, bir bloğun içinde başka bir blok yer alabilir.
1.2 Soyutlama
Yapısal programlamanın temel kavramlarından biri de soyutlama (abstraction) kavramıdır. Soyutlama, programın yapacağı işin daha küçük ve birbirinden olabildiğince bağımsız alt-işlere bölünmesidir. Alt-işler de, benzer şekilde, yapacaklarını alt-alt-işlere bölebilirler. Bu tip tasarıma yukarıdan aşağıya (top-down) tasarım adı verilir2.
Her iş bir yordam (C dilindeki adıyla fonksiyon) tarafından gerçeklenir. Ana-yordamın görevi, alt-işleri gerçekleyen yordamları başlatmak ve bunların arasındaki eşgüdümü sağlamaktır. Bir üst-yordam kullandığı alt-yordamların nasıl çalıştıklarıyla değil, yalnızca sonuçlarıyla ilgilenir.
Yordamlar olabildiğince genel amaçlı yazılmalıdır. Sözgelimi bir yordamın işi ``BİL102CE dersini alan öğrencilerin yılsonu sınav notlarının en büyüğünü bul'' şeklinde tanımlanabilir. Oysa işi ``herhangi bir dizinin en büyüğünü bulmak'' olarak tanımlanan bir yordam olsa ve bu yordam kullanılırken hangi dizinin en büyüğünün bulunmasının istendiği belirtilse daha yararlı olur. Bu durumda hangi dizi üzerinde işlem yapılacağı bilgisi yordamın giriş parametresi (ya da argümanı) olur. Yordam çalışması sonucu ürettiği değeri çıkış parametresi olarak döndürür. Örnekteki yordam kullanılırken giriş parametresi olarak ``BİL102CE dersini alan öğrencilerin yılsonu sınavı notları'' belirtilirse sınavda alınan en yüksek not, ``Los Angeles Lakers basketbol takımının oyuncularının boyları'' belirtilirse bu takımın en uzun boylu oyuncusunun boyu çıkış parametresi olur.
Soyutlamanın kazandırdıkları şöyle özetlenebilir:
• Bir işi gerçekleyen yordam yazılırken, kullandığı alt-yordamların ayrıntılarıyla uğraşılmaz; alt-yordamın doğru çalıştığı varsayılarak yordamın kendi işine yoğunlaşılabilir. Böylelikle büyük ve çözülmesi zor olan bir sorunla uğraşmak yerine, her biri küçük ve çözülebilir sorunlarla uğraşılır ve bunlar daha sonra biraraya getirilir.
• Programın bakımı kolaylaşır. Alt-yordamların çalışmaları birbirlerinden bağımsız olduğundan bir alt-yordamda bir değişiklik yapıldığında bunu kullanan üst-yordam (üst-yordamla olan etkileşim değişmediği sürece) değişiklikten etkilenmez.
Örnek
İki sayının en küçük ortak katı bulunmak isteniyor olsun. Bu ana iş şu şekilde alt işlere bölünebilir:
1. Birinci sayıyı asal çarpanlarına ayır.
2. İkinci sayıyı asal çarpanlarına ayır.
3. Sayıların çarpanlarını kaynaştırarak en küçük ortak katın asal çarpanlarını bul.
4. Bir önceki adımda belirlediğin asal çarpanlardan en küçük ortak katı hesapla.
Sayıların 6468 ve 945 oldukları varsayılırsa:
1. 6468=2*2*3*7*7*11=22*3*72*11
2. 945=3*3*3*5*7=33*5*7
3. 22*33*5*72*11
4. 291060
1. ve 2. adımlar için herhangi bir sayıyı asal çarpanlarına ayıran bir yordam yazılabilir ve asal çarpanlarına ayrılacak sayı bu yordama parametre olarak yollanabilir. Herhangi bir sayının asal çarpanlarına ayrılması için kullanılabilecek bir algoritma Şekil 1.5'de verilmiştir. Bu algoritmada x asal çarpanlarına ayrılacak sayıyı, f ise çarpan olup olmadığı o anda sınanmakta olan asal sayıyı, p de sıradaki çarpanın kuvvetini gösterir. 945 sayısını örnek olarak alırsak:
1. Sınanacak ilk asal sayı 2 .
2. 945 > 1 olduğu için 2a adımına git.
a. 945 mod 2 0 olduğu için ( 2 sayısı 945 sayısını bölmediği için) 2 bir çarpan değildir.
b. 2 'den bir sonraki asal sayıyı bul ( 3 ).
3. 945 > 1 olduğu için 3a adımına git.
a. 945 mod 3=0 olduğu için 3 bir çarpandır. Kuvveti şimdilik 0 olsun.
i. 945 mod 3=0 olduğu için 3 çarpanının kuvvetini 1 artır ( 1 oldu). Sayıyı 3 'e böl ( 315 oldu).
ii. 315 mod 3=0 olduğu için 3 çarpanının kuvvetini 1 artır ( 2 oldu). Sayıyı 3 'e böl ( 105 oldu).
iii. 105 mod 3=0 olduğu için 3 çarpanının kuvvetini 1 artır ( 3 oldu). Sayıyı 3 'e böl ( 35 oldu).
iv. 35 mod 3 0 olduğu için daha fazla 3 çarpanı yoktur.
b. 3 'den bir sonraki asal sayıyı bul ( 5 ).
4. 35 > 1 olduğu için 4a adımına git.
a. 35 mod 5=0 olduğu için 5 bir çarpandır. Kuvveti şimdilik 0 olsun.
i. 35 mod 5=0 olduğu için 5 çarpanının kuvvetini 1 artır ( 1 oldu). Sayıyı 5 'e böl ( 7 oldu).
ii. 7 mod 5 0 olduğu için daha fazla 5 çarpanı yoktur.
b. 5 'den bir sonraki asal sayıyı bul ( 7 ).
5. 7 > 1 olduğu için 5a adımına git.
a. 7 mod 7=0 olduğu için 7 bir çarpandır. Kuvveti şimdilik 0 olsun.
i. 7 mod 7=0 olduğu için 7 çarpanının kuvvetini 1 artır ( 1 oldu). Sayıyı 7 'ye böl ( 1 oldu).
ii. 1 mod 7 0 olduğu için daha fazla 7 çarpanı yoktur.
b. 7 'den bir sonraki asal sayıyı bul ( 11 ).
6. 1 > 1 olmadığı için dur.
Şekil 1.5: Bir sayıyı asal çarpanlarına ayırma algoritması.
Bu algoritmadaki bir sonraki asal sayıyı bulma işi de asal çarpanlarına ayırma işinin bir alt-işi olarak düşünülerek bir başka yordama bırakılabilir. Bu yordam kendisine parametre olarak gönderilen sayıdan bir sonraki asal sayıyı bularak sonucu geri yollayacaktır.
Ana işin 3. adımındaki kaynaştırma işini yapacak yordamın algoritması geliştirilirken, asal çarpanlarına ayırma yordamının çalışma şekli nedeniyle çarpanların küçükten büyüğe doğru sıralı oldukları varsayılabilir. Bu varsayım altında kaynaştırmayı yapacak algoritma Şekil 1.6'de verilmiştir.
Şekil 1.6: Asal çarpanlar dizilerini kaynaştırma algoritması.
Bu algoritma her iki çarpan sırasında da eleman bulunduğu sürece yapılacakları göstermektedir. Bir sayının çarpanları bittiğinde diğerinin çarpanları henüz bitmemişse o sayının kalan çarpanları da sonuç çarpanlarına eklenmelidir. Örneğimizden devam edersek:
Birinci dizi: 22*3*72*11 , ikinci dizi: 33*5*7 .
1. 22 ile 33 'ü karşılaştır. 2 daha küçük olduğu için 22 en küçük ortak katın bir çarpanıdır. Birinci dizinin sonraki elemanına geç ( 3 ).
2. 3 ile 33 'ü karşılaştır. Tabanlar aynı oldukları için kuvveti daha büyük olanı seç. 33 en küçük ortak katın bir çarpanıdır. Her iki dizinin de sonraki elemanlarına geç.
3. 72 ile 5 'i karşılaştır. 5 daha küçük olduğu için 5 en küçük ortak katın bir çarpanıdır. İkinci dizinin bir sonraki elemanına geç.
4. 72 ile 7 'yi karşılaştır. Tabanlar aynı oldukları için kuvveti daha büyük olanı seç. 72 en küçük ortak katın bir çarpanıdır. Her iki dizinin de sonraki elemanlarına geç.
5. İkinci dizi bitmiş olduğu için birinci dizide kalan bütün elemanları kuvvetleriyle birlikte al.
Örnek
İki sayının en küçük ortak katının alabileceği en küçük değer, bu iki sayıdan büyük olanıdır. Sözgelimi, 16 ile 64 'ün en küçük ortak katı 64 'tür. Alabileceği en büyük değer ise bu iki sayının çarpımıdır. Bunun için bu iki sayının aralarında asal olmaları, yani en büyük ortak bölenlerinin 1 olması gerekir. Sözgelimi, 21 ile 10 sayılarının en küçük ortak katı 210 'dur. Bu özellikler gözönüne alınarak iki sayının en küçük ortak katını bulmak üzere şöyle bir algoritma da geliştirilebilir:
1. İki sayıdan küçük olanına min , büyük olanına max adını ver.
2. Çarpana 1 değerini ver.
3. max*carpan , min 'in bir tam katıysa 5. adıma, değilse 4. adıma git.
4. Çarpanı 1 artır ve 3. adıma git.
5. En küçük ortak kat max*carpan sayısıdır.
Bu algoritma sayılardan birinin katlarını hesaplayıp bu değerin diğer sayının da katı olup olmadığının sınanmasına dayanmaktadır. Büyük olan sayının katlarının denenmesi, deneme sayısının azaltılmasını sağlayacağından daha etkin olur. 6468 ve 945 sayılarının en küçük ortak katını bulurken 6468 'in katları denenir: 6468,12936,19404,,284592,291060 .
|
 |
|
|
|
|