263
İçindekilerC Dili ile Programlama 1 .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok sınırlı sayıda işlem gerçekleştirmekteydiler. Bu işlemler, depolama ve çok sayıda işlemi ardarda yapma gibi bir hesap makinasında yapılabilecek işlemlerden biraz daha ileri seviyedeydi. Komut sayısı 50’yi geçmeyen 6502, 6802, 8080, Z-80 gibi işlemciler bunlara örnek verilebilir. Hızın düşük olması, bellek yetersizliği, işlem sayısının azlığı bilgisayarın kullanım alanını oldukça sınırlıyordu. Çünkü bu işlemcilerle basit bir hesaplamayı yapabilmek için hem işlemcinin mimarisini, hem de işlemcide kullanılan makine kodunu bilmek gerekiyordu. Makine koduyla programlama basit olmadığı gibi, basit bir işlem için sayfalar dolusu kodlama gerektiriyordu. Bu durum, rekabet halinde olan Intel ve Motorola firmalarını işlemcilerin mimarilerini geliştirmeye, hızlarını artırmaya ve işleyebileceği komut setini daha kullanışlı hale getirmeye itmiştir. Bu amaçla donanım olarak işlemci mimarileri geliştirilip hızları artırılmaya çalışılırken, yazılım olarak da makine kodlarına sembolik bir dil (Assembly Dili) karşılık getirilmiştir. Geliştirilen bu sembolik dil programcıyı komutların makine kodunu bilmekten kurtarsa da program yapabilmek için programcının halen daha donanımı bilmesi gerekiyordu. Bunun yanında, bu dilde programlama yine oldukça uzun sürmekteydi. Daha sonraları, programcıya çok kolaylık sağlayabilecek ve konuşma diline yakın hazır komutların bulunduğu ALGOL, PL/I, FORTRAN, COBOL gibi programlama dilleri, işlemci mimarilerine paralele olarak geliştirilmiştir. Geliştirilen bu dillerde program yazmak için işlemci mimarisini bilmek, sembolik dildeki komutların zor olan kullanımını bilmek gerekmemekteydi. Programcı donanımdan uzaklaştığı için yeni kullanılan bu diller yüksek seviyeli dil , daha önce kullanılan sembolik dil de alçak seviyeli dil olarak nitelendirilmiştir. Yüksek seviyeli dillerde kodlama oldukça kısalmıştır. Çünkü alçak düzeyli dillerde kullanılan ve sayfalar dolusu komutlardan oluşan bazı rutin işlemler, yüksek seviyeli dillerde tek bir komut şeklindedir. Örneğin, yüksek seviyeli bir dildeki “x=5+3” gibi bir toplama işlemi Assembly dilinde, MOV AX,05 ; AX kaydedicisinde 5 sayısını sakla MOV BX,03 ; BX kaydedicisinde 3 sayısını sakla ADD AX,BX ; AX ile BX’i topla ve sonucu yine AX’te sakla şeklinde olmaktadır. Benzer şekilde ekranda x,y koordinatına konumlandırma işlemi, yüksek seviyeli dillerde tek komutla (örneğin “gotoxy(x,y)”) yapılırken, aynı işlem Assembly dilinde , MOV AH,02 MOV BH,00 ; 0 numaralı sayfa MOV DL,00 ; x sütun no MOV DH,00 ; y satir no INT 10H

1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

  • Upload
    others

  • View
    16

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

1

.1 PROGRAMLAMAYA GİRİŞ

1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok sınırlı sayıda işlem gerçekleştirmekteydiler. Bu işlemler, depolama ve çok sayıda işlemi ardarda yapma gibi bir hesap makinasında yapılabilecek işlemlerden biraz daha ileri seviyedeydi. Komut sayısı 50’yi geçmeyen 6502, 6802, 8080, Z-80 gibi işlemciler bunlara örnek verilebilir.

Hızın düşük olması, bellek yetersizliği, işlem sayısının azlığı bilgisayarın kullanım alanını oldukça sınırlıyordu. Çünkü bu işlemcilerle basit bir hesaplamayı yapabilmek için hem işlemcinin mimarisini, hem de işlemcide kullanılan makine kodunu bilmek gerekiyordu. Makine koduyla programlama basit olmadığı gibi, basit bir işlem için sayfalar dolusu kodlama gerektiriyordu. Bu durum, rekabet halinde olan Intel ve Motorola firmalarını işlemcilerin mimarilerini geliştirmeye, hızlarını artırmaya ve işleyebileceği komut setini daha kullanışlı hale getirmeye itmiştir. Bu amaçla donanım olarak işlemci mimarileri geliştirilip hızları artırılmaya çalışılırken, yazılım olarak da makine kodlarına sembolik bir dil (Assembly Dili) karşılık getirilmiştir. Geliştirilen bu sembolik dil programcıyı komutların makine kodunu bilmekten kurtarsa da program yapabilmek için programcının halen daha donanımı bilmesi gerekiyordu. Bunun yanında, bu dilde programlama yine oldukça uzun sürmekteydi.

Daha sonraları, programcıya çok kolaylık sağlayabilecek ve konuşma diline yakın hazır komutların bulunduğu ALGOL, PL/I, FORTRAN, COBOL gibi programlama dilleri, işlemci mimarilerine paralele olarak geliştirilmiştir. Geliştirilen bu dillerde program yazmak için işlemci mimarisini bilmek, sembolik dildeki komutların zor olan kullanımını bilmek gerekmemekteydi. Programcı donanımdan uzaklaştığı için yeni kullanılan bu diller yüksek seviyeli dil , daha önce kullanılan sembolik dil de alçak seviyeli dil olarak nitelendirilmiştir.

Yüksek seviyeli dillerde kodlama oldukça kısalmıştır. Çünkü alçak düzeyli dillerde kullanılan ve sayfalar dolusu komutlardan oluşan bazı rutin işlemler, yüksek seviyeli dillerde tek bir komut şeklindedir. Örneğin, yüksek seviyeli bir dildeki “x=5+3” gibi bir toplama işlemi Assembly dilinde,

MOV AX,05 ; AX kaydedicisinde 5 sayısını sakla MOV BX,03 ; BX kaydedicisinde 3 sayısını sakla ADD AX,BX ; AX ile BX’i topla ve sonucu yine AX’te sakla

şeklinde olmaktadır. Benzer şekilde ekranda x,y koordinatına konumlandırma işlemi, yüksek seviyeli dillerde tek komutla (örneğin “gotoxy(x,y)”) yapılırken, aynı işlem Assembly dilinde ,

MOV AH,02 MOV BH,00 ; 0 numaralı sayfa MOV DL,00 ; x sütun no MOV DH,00 ; y satir no INT 10H

Page 2: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

2

şeklinde olmaktadır. Mühendislikte yaygın bir şekilde kullanılan FORTRAN programlama diline paralel olarak BASIC, PASCAL gibi programlama dilleri de geliştirilmiştir. BASIC programlama dilinde FORTRAN’da bulunmayan bazı çizim komutları, daha kullanışlı string fonksiyonları ve basit olarak yapılabilecek temel dosya işlemleri yer almıştır. PASCAL dili ile grafik arabirimi, standart fonksiyon ve prosedür kütüphanesi, satıriçi (inline) yazılabilecek Assembly dili komutları ile programlama biraz daha ileri seviyeye taşınmıştır. Buna rağmen uzun yıllar mühendislikte FORTRAN programlama dili kullanılmaya devam edilmiştir. Bunun sebebi, ilk kullanılan bu programlama dilinde mühendislikteki çoğu problemin programlarının yazılmış olmasıdır.

1970’li yılların başında, UNIX işletim sistemini geliştirmek amacıyla yeni bir programlama dili olan C programlama dili geliştirilmiştir. Bu dil, bir işletim sistemi oluşturmak için geliştirildiğinden, bilgisayar donanımına yakın ve doğrudan kontrol edilebilir nitelikte ve oldukça hızlıdır. Dolayısıyla programcıya donanımı daha esnek kullanabilme avantajı sağlamaktadır. Bu sebeple C programlama dili orta seviyeli dil sınıfındadır. C programlama dili, bu yapısının sonucunda 1990’lı yıllardan beri endüstride en yaygın kullanılan dil olma özelliği taşımaktadır.

Programlama dillerinin bu gelişim süreci bu haliyle de kalmayıp nesneye yönelik programlama(NYP) ve görsel(Visual) programlama dilleri olarak devam etmiştir.

C programlama dilinin nesneye yönelik versiyonu C++, görsel programlamaya yönelik versiyonu da Visual C olarak geliştirilmiştir.

BASIC programlama dili için Visual BASIC, PASCAL programlama dili için de DELPHI görsel programlama dilleri geliştirilmiştir. Benzer gelişmeyi veri tabanı dillerinde de görebiliriz.

1.2 PROGRAM TASARIMI Bir program yazılırken bazı adımların takip edilmesi gerekir. Bu adımalar şöyle sıralanabilir:

1. Problemi Tanımlama 2. Çıkış Formatını Tasarlama 3. Programı Mantıksal Bloklara Ayırma 4. Mantıksal Blokları Akış Şemasına Dökme 5. Programın Kodlanması 6. Derleme 7. Bölüm bölüm Test Etme 8. Bölümleri Birleştirme 9. Programın Tümünü Test Etme

Genelde çok basit ve kısa programlar için programcılar bu adımları pratik bir şekilde zihninde canlandırarak doğrudan kodlamaya geçerler. Örneğin ekrana sadece “merhaba” yazdıran bir program yapmak isteseydik doğrudan kodlamaya geçmek hiç de zor olmayacaktı.

Programın kodlanmasından önce problem çözümünün algoritması ve akış diyagramı belirlenmelidir.

Page 3: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

3

2 ALGORİTMALAR ve AKIŞ DİYAGRAMLARI Algoritma, verilen bir problemin çözüm yönteminin belirlenmesi için bütün detaylarının ortaya konulduğu ve adım adım izlenmesi gereken taslaktır. Akış diyagramları ise bu taslağın standart sembollerle çizilmesidir. Örnek olarak, telefon açmak isteyen bir kişinin sırasıyla izlemesi gereken adımları düşünürsek algoritmamız,

1. Ahizeyi kaldır 2. Çevir sesi bekle

a) Çevir sesi yoksa adım5’e git b) Çevir sesi varsa numarayı çevir

3. Karşı tarafta çalıyor mu? a) Çalmıyorsa ahizeyi kapat ve adım1’e git b) Çalıyorsa karşı tarafın cevap vermesini bekle, karşı taraf cevap vermezse adım5’e git

4. Konuşmayı yap 5. Ahizeyi kapat

şeklinde geliştirilebilir. Aslında insanlar bütün bu adımları önceden düşünmeden telefonla görüşme işlemi yaparlar. Çünkü insanların her adımda karar verebilme yetenekleri vardır. Aynı yeteneği bilgisayara kazandırabilmemiz için programlama ile algoritmada belirlenen bütün detaylarda nasıl hareket edilmesi gerektiğini bilgisayara vermemiz gerekir.

İyi bir algoritmada bilgisayarın kararsız kalacağı hiçbir belirsizliğin olmaması gerekir. Algoritmada problemin en hızlı çözümünün belirlenmesi gerekir. Algoritma hazırlanırken kodlamada karşılaşılacak zorluklar da giderilmelidir.

Tüm bu noktalara dikkat edilerek hazırlanmış algoritmaya uygun olarak akış diyagramı çizilir. Bir akış diyagramında bulunabilecek standart semboller şöyledir:

Bilgi Girisi Islemler Karsilastirma

Yazdirma Basla veya Son DöngüAlt Program

Çagirma

Bağlantı

Page 4: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

4

Yukarıda algoritması verilmiş telefon etme probleminin akış diyagramını çizersek:

Başla

Ahizeyi kaldır

Çevir sesi varmı?

Numarayı çevir

Evet

Karşı tarafçalıyormu?

Cevap verildi mi?

Evet

Konuşmayı yap

Evet

Ahizeyi kapat

Son

Hayır

Ahizeyi kapat

Hayır

Hayır

Page 5: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

5

Örnek: Kullanıcının gireceği 2 sayının yerlerini değiştirmeye yarayan programın akış şeması:

Başla

A,B

takas=AA=B

B=takas

A,B

Son

Kullanıcı A ve B değişkenlerinin temsil ettiği iki sayı giriyor.

A ve B değişkenlerinin temsil ettiği iki sayının yer değiştirilmesi için “takas” adında üçüncü bir değişken kullanılıyor.

Ve yeni değerler yazdırılıyor. Örnek: Kullanıcının gireceği iki sayıdan önce küçük olanı, sonra da büyük olanı yazdıran programın akış diyagramı:

Page 6: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

6

Başla

A,B

A<B ?

hayır

A>B ?

hayır

A=B

Evet

Evet

B,A

A,B

Son

Kullanıcı A,B değişkenlerinin temsil ettiği iki sayıyı giriyor ve A<B karşılaştırma işlemiyle A’nın B’den küçük olup olmadığı test ediliyor. A<B ise önce A sonra B yazdırılıyor. A<B değilse B<A testi yapılıyor. Eğer B<A ise önce B, sonra A yazdırılıyor. B<A değilse A=B dir. Örnek: Yarıçapı r ve yüksekliği h olan bir koninin hacmini bularak h=0 olması halini kontrol eden, çıkışta r,h ve hacim değerlerini yazdıran programın akış diyagramı:

Page 7: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

7

Başla

girişr,h

r=0 veyah=0 mı?

hayır

v=1/3 . r2 h

çıkışr,h,v

Son

evet

Örnek: Kullanıcının gireceği 10 sayının ortalamasını alan programın akış diyagramı:

Page 8: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

8

Başla

toplam=0i=1

dizi[i]

i=i+1

i >10 ?

evet

toplam=toplam+dizi[i]

i = i + 1

i = 1

i >10 ?

evet

ortalama=toplam/10

ortalama

Son

hayır

hayır

Page 9: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

9

Örnek: 1 den 10 a kadar olan sayıların toplamını bulan programın akış diyagramı:

Başla

toplam=0i = 1

toplam=toplam+ii = i + 1

i > 10

evet

toplam

Son

hayır

Örnek: ax2+bx+c=0 denkleminin köklerini bulacak ve katsayılar ile bulunan kök değerlerini yazdıracak programın akış diyagramı: Program a,b,c değerlerini okuyup hesapları yaptıktan sonra durmayacak ve yeni bir a,b,c değerlerini okuyarak kökleri bulacak şekilde hazırlanacaktır. Ayrıca kökler gerçek değilse “kökler sanaldır” şeklinde yazdıracak.

Page 10: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

10

Başla

GirişA,B,C

Disk=B2-4AC

Disk < 0

evet

A,B,C sanalkök

hayır D=Disk

x1=(-B-D)/2A

x2=(-B+D)/2A

A,B,Cx1,x2

Son

Page 11: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

11

Bölüm Sonu Alıştırmaları 1. (-1)3+(-2) 3+...+(-10) 3 toplamını bulacak akış diyagramını çiziniz. 2. Bir sayım bölgesinde yapılan nüfus sayımı sonuçları DATA deyimi ile verilmiştir.

Her satır bir şahsın yaş ve cinsiyet kodları ile beraber ilave bazı bilgiler ihtiva etmektedir.

Cinsiyet kodu: 0 Kadın, 1 Erkek Yaş kodu : 1 ile 25 ve altında 2 ile 50 ve altında 3 ile 75 ve altında 4 ile 100 ve altında Bilgileri okuyup, yaşları 75 ve altında olan erkeklerin, yaşları 25 ve altında olan kadınların sayısını bulup yazdıracak programın akış diyagramını;

a) Sayım bölgesinde 100.000 kişi olduğuna göre, b) Sayım sonucunu bilmediğimize göre,

çiziniz.

3. Bilinen bir kesikli fonksiyonun verilen bir x değerine göre hesaplanması

istenmektedir. Fonksiyon şöyle tanımlanmıştır.

x< 0.5 Y = 0 0.5 ≤ x < 10 Y = 1 10 ≤ x < 20 Y = 5 + 3x + x3 20 ≤ x Y = -x2 + 3 sin x

Bu hesaplamanın yapılabilmesi için gereken programın akış diyagramını çiziniz.

4.

1 ))1((1

11)(

nn

n

nx

x

xxf

serisinin toplamını bulup yazdıracak programın akış diyagramı (75 terim için) çiziniz.

5. Verilen x değerini okutarak, aşağıdaki seriye göre Y değerini hesaplayıp

yazdıracak programın akış diyagramını çiziniz.

xk

xCosxxf

k

kk

,)!2(

)1()(

0

2

10-8 doğrulukta ve çeşitli x değerleri için işlem yapılacaktır. 6. 2500 elemanlı bir veri grubunun her satırında bir tamsayı bulunmaktadır. Bu

sayılardan, a) Sıfır olanların sayısını, b) Tek olanların sayısını,

Page 12: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

12

c) Çift olanların sayısını, d)Tek olanların ortalamasını,

bulup yazdıracak bir programın akış diyagramını çiziniz. 7. Çarpma işlemi yapmadan, verilen iki tamsayının çarpımını yapan algoritmanın

akış diyagramını çiziniz.

8. Pozitif bir tamsayıyı asal çarpanlarına ayıracak ve çarpanlarını yazdıracak algoritmanın akış diyagramını çiziniz.

9. On tabanında verilen bir tamsayıyı iki tabanına dönüştüren algoritmanın akış

diyagramını çiziniz. 10. Verilen bir tamsayı dizisini küçükten büyüğe sıralayıp yazdıran programın akış

diyagramını çiziniz.

11.

m

j

n

i

ji11

. iki kat toplamını hesaplayan programın akış diyagramını çiziniz.

12. m elemanlı A kümesiyle, n elemanlı B kümesinin bileşim kümesini (kesişim

kümesini) bulduran programın akış diyagramını çiziniz. 13. Şekildeki doğruların denklemleri;

d1 : 3x + 2y – 6 = 0 d1 : x - 2y + 4 = 0

olduğuna göre, koordinatları verilen bir noktanın şeklin hangi bölgesine düştüğünü belirleyen bir programın akış diyagramını çiziniz. (Yol gösterme: Bir noktanın bir doğruya uzaklık formülünden yararlanınız.)

14. Düzlemde bir noktanın koordinatlarını okuduktan sonra bu noktanın düzlemdeki yerini bir mesajla bildirecek programın akış diyagramını çiziniz.

15. 1 den 100 e kadar asal sayıları hesaplayacak programın akış diyagramını çiziniz.

16. kCjbaB

kCjbaA

222

111

1

1

vektörleri veriliyor.

BxA vektörel çarpımını,

BxA skaler çarpımını, Vektörler arasındaki açının Cos’ünü hesaplayan programın akış diyagramını çiziniz.

17. N elemanlı reel sayılar kümesinin elemanlarını okuyup, küçükten büyüğe ve

büyükten küçüğe doğru sıralayıp yazdıracak programın akış diyagramını çiziniz.

Page 13: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

13

18. A ve B gibi iki sayının en büyük ortak bölenini (EBOB) bulan programın akış şemasını çiziniz.

19. Bir sayı dizisinin son rakamlarına göre sıralamasını yapan programın akış

diyagramını çiziniz.

20. On tabanlı bir sayıyı, iki tabanlı sayı sisteminde yazdıran programın akış diyagramını çiziniz.

21. N adet öğrencisi bulunan sınıftaki her öğrenci için aşağıdaki bilgiler karşılarında

belirtilen değişken adları ile verilmiştir: Öğrencinin adı soyadı: AS Numarası: NO Vize notu: V Final notu: F

Her öğrencinin bir dersten sınıf geçme notu final sınav notunun 0.4 ü, proje notunun 0.15 i ve vize notunun 0.45 i toplamından oluşmaktadır. Buna göre; her bir öğrencinin giriş bilgilerini okuyup (geçme notu alt sınırı 50 olduğunda) geçen öğrencilerin numaralarını, ad ve soyadlarını, sınıf geçme notlarını, kalan öğrencilerin de sayısını bulduracak programın akış şemasını çiziniz.

22. Bir araştırma için 5 tane görevliye anket çalışması yaptırılıyor. Görevlilerin doldurttukları anket için kendilerine; A anket sayısı olmak üzere;

1 ≤ A ≤ 50 olduğunda, anket başına 50 TL 51≤ A ≤ 100 olduğunda, anket başına 70 TL 101≤ A ≤ 250 olduğunda, anket başına 85 TL 251≤ A olduğunda, anket başına 95 TL ödenecektir. Görevlilerin doldurttukları anketler için kendilerine ödenecek olan para miktarını bulduran programın akış şemasını çiziniz.

23. A ve B gibi iki sayı kümesinin ortak olan elemanları ile ortak olan elemanları ile ortak olmayan elemanlardan oluşan ve bileşim kümesi adı verilen kümeyi bulduran programın akış şemasını çiziniz.

24. A ve X in değerlerini okuduktan sonra,

)1)...(1(

)1(.....)2)(1()1(

1

32

NAAA

X

AAA

X

AA

X

A

XT

N

N

toplamını, verilen M terim sayısı için bulduran programın akış şemasını çiziniz.

25. Bir topograf dörtgen şeklindeki bir tarlanın a,b kenarlarının uzunlukları ile A,B,C

açılarını ölçebilmiştir. Bir hesaplayıcıya bu bilgileri okuttuktan sonra; dörtgenin herhangi dörtgen, yamuk, paralelkenar, eşkenar dörtgen, dikdörtgen veya karemi olduğunu belirleyip türünü yazdıran programın akış şemasını çiziniz.

Page 14: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

14

26. Bankaya %52 den 100000 TL yatırılıyor. Her 3 ayda bir faizin %60 ı çekiliyor. Kaç yıl sonra paramızın 200.000 TL veya 200.000 TL den daha fazla olabileceğini bulduran programın akış şemasını çiziniz.

27. A adlı bir cümleyi okuduktan sonra içindeki üç harflik kelimelerin sayısını

bulduran bir programın akış şemasını çiziniz. 28. Beş basamaklı bir tamsayıyı okuduktan sonra hane notasyonu ile her bir

basamağındaki rakamları bulup yazdıracak bir programın akış şemasını çiziniz. 29. Bir sınıftaki öğrencilerin yaşları 13 ile 15 arasında değişmektedir. Her yaş

grubundan kaç öğrencinin olduğunu bulduran programın akış şemasını çiziniz.

Page 15: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

15

3 C PROGRAMLAMA DİLİNE GİRİŞ

3.1 C DİLİNİN YAPISI

C programlama dilinde bir program yazılırken genellikle yukarıdaki gibi bir yapıya uyulmaktadır. İlkönce # ile başlayan derleyici ön bildirileri, sonra global tanımlamalar, sonra fonksiyon tanımlamaları ve en son da ana blok yer alır. Derleyici Önbildirileri: # ile başlayan satırlar derleyici önbildirisi olarak bilinir. “#include” ile başlayan önbildirilerde program içinde kullanılacak standart fonksiyonların bağlı bulunduğu dosyalar C kütüphanesinden programa ekleneceği belirtilir.

“#define” ile başlayan önbildirilerde ise sabit ve makro tanımı yapılır. Makrolar, fonksiyonlardan farklı olarak program içinde çağrıldıkları her yere kod olarak kopyalanırlar. Derleyici, fonksiyonlarda olduğu gibi fonksiyonun bulunduğu yere dallanıp geri dönmek zorunda kalmaz. Genellikle kısa kod ile yazabilecek tekrarlanan rutin işlemler için makro tercih edilir. Çünkü kısa koda sahip işlemlerde makro daha hızlıdır. Makroların fonksiyonlara göre dezavantajları, bellekte programda çağrıldıkları kadar yer kaplamalarıdır. Fonksiyonlar ise ne kadar çağrılırsa çağrılsınlar aynı miktarda yer kaplarlar.

Sabitlerin tanımlanış şekli ve kullanımı da makrolar gibidir. Farklı olarak sabitlere parametre verilmez. Doğrudan sabitin alacağı değer yazılır. Program içinde sabit isminin geçtiği her yere değeri kopyalanır. Programcılar, programın okunmasını kolaylaştırmak ve değişken isimleriyle karışmasını önlemek için sabit ve makro isimlerini büyük harflerle tanımlarlar.

Page 16: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

16

Global Değişken Tanımlama Bloğu: Program içinde kullanılacak global değişkenler bu blokta tanımlanır. Bu değişkenler için bellekten tahsis edilen yerler program süresince geçerlidir. Değişkenler tanımlanırken değişken isimlerinde Türkçe karakter ve özel işaretler (noktalama işaretleri, aritmetik operatörler v.s.) kullanılamaz. Genellikle küçük harflerle yazılırlar. Değişken isimleri en fazla 32 karakterden oluşur. Fonksiyon Tanımlama Bloğu: Belli bir işlevi yerine getiren ve tekrar tekrar kullanılabilecek program parçaları fonksiyon olarak bu blokta tanımlanır. Diğer dillerde olduğu gibi farklı altprogram yapıları yoktur. Örneğin PASCAL programlama dilinde function ve procedure gibi iki farklı altprogram yapısı vardır. C programlama dilinde ana program dahil tüm altprogramlar function yapısındadır. Ana Blok(Gövde): Programda tanımlanacak esas işlemler bu blokta yer alır. Bu kısım, programın gövdesini oluşturur. Diğer bloklardaki tanımlamalar, bu blokta gerçekleştirilecek işlemler için yapılan tanımlamalardır. Derleyici, programı yürütmeye bu bloktan başlar.

Turbo C editörüne geçilerek aşağıdaki satırlar yazıldığında ve (Ctrl+F9)’a basılarak çalıştırıldığında programın çıktısı şöyle olur:

Merhaba!

Bu çıktının görülebilmesi için program çalıştırıldıktan sonra Alt+F5 ‘e basılmalıdır.

// Bu program ekrana “merhaba” yazdırır

#include<stdio.h>

void main()

{

printf(“Merhaba!”);

}

Açıklama:

// ile başlayan ilk satır açıklama satırıdır. C programlama dilinde açıklama satırı olarak // veya /*... */ kullanılır. // tek bir satırın, /*...*/ ise bir bloğun açıklama satırı olmasını sağlar.

“#include<stdio.h>” cümlesi:

Page 17: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

17

Giriş/Çıkış fonksiyonlarının kullanılabilmesi için bu fonksiyonların bağlı olduğu stdio.h kütüphanesi programa eklenmiştir. Programda kullanılan printf() fonksiyonu bir çıkış fonksiyonudur ve stdio.h kütüphanesinde tanımlıdır. printf() fonksiyonun programda kullanılabilmesi için tanımlanmış olduğu kütüphanenin C derleyicisine önceden bildirilmesi gerekir. “#include<stdio.h>” cümlesi ile C derleyicisine, stdio.h kütüphanesinde tanımlı olan fonksiyonların programda kullanılacağı ve dolayısıyla bu kütüphanenin programa dahil edileceği bildirilmiştir.

“void main() {...}” cümleleri:

C programlama dilinde ana fonksiyon (gövde),

main()

{

ana blok;

}

şeklindedir. Yani ana blok main() sözcüğü ile başlar ve “{“ ile “}” arasına alınır. main() sözcüğünün solundaki void sözcüğü ise main() ana fonksiyonunun geriye bir değer döndürmeyeceğini belirtir.

“printf(“Merhaba!”);“ cümlesi:

Bu cümlede printf fonksiyonu ile ekrana “Merhaba!” yazdırılır.

Örnek Program:

İki sayıyı toplayarak sonucu ekrana yazdıran program:

/*========================

Bu program, toplama işlemi yapar

========================*/

1.... #include<stdio.h>

2.... int a,b,c;

3.... void main()

4.... {

5.... a=3;

6.... b=7;

7.... c=a+b;

8.... printf(“Toplam Sonucu:%d”,c);

9.... }

Page 18: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

18

Turbo C editörüne geçilerek yukarıdaki satırlar yazılıp çalıştırıldığında(Ctrl+F9) aşağıdaki çıktı elde edilir. Bu çıktıyı görebilmek için yine alt+F5 tuşlarına basmak gerekir.

Toplam Sonucu:10

Bir C programı yazıldıktan sonra ilk önce Alt+F9 ile program derlenir. Daha sonra Ctrl+F9 ile çalıştırılır. Eğer direk Ctrl+F9’a basılırsa program hemen çalıştırılır ve çok hızlı bir şekilde editöre geri döner. Kullanıcı ekranında programın verdiği sonucu görebilmemiz için Alt+F5’e basmamız gerekir.

Açıklama:

1.Satır:

Bu ifade ile stdio.h kütüphanesi programa dahil ediliyor.

2.Satır:

“int a,b,c;” cümlesi ile a,b ve c simgeleriyle temsil edilebilecek ve tamsayı değerler tutulabilecek bellek bölgelerinin tahsis edilmesi sağlanmıştır. Bu bellek bölgelerini içerisine birşeyler koyulabilecek kaplar şeklinde düşünebiliriz:

a b c

3,4 ve 9. Satırlar:

Hatırladığımız gibi bir C programının gövdesini “main(){ ... }” bloğu oluşturmaktadır.

5. Satır:

a ile temsil edilen bellek bölgesine 3 sayısı koyuluyor:

a b c

3

Page 19: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

19

6.Satır:

b ile temsil edilen bellek bölgesine 7 sayısı koyuluyor:

a b c

7.Satır:

a+b’ nin değeri c ile temsil edilen belek bölgesine koyuluyor:

a b c

8.Satır:

“printf(“Toplam Sonucu:%d”, c);” ifadesi ile ekrana,

Toplam Sonucu:10

yazdırılır. Dikkat edilirse “Toplam Sonucu” ifadesi olduğu gibi ekrana çıkmıştır. Fakat “%d” ifadesi yerine, c ile temsil edilen bellek bölgesinin değeri yazılmıştır:

10

printf(“Toplam Sonucu:%d” , c );

3.2 C DİLİNİN BAZI ÖZELLİKLERİ C programlama dilinde derleyici önbildirileri # ile başlar.

Örnek: #include<stdio.h> #include<conio.h> #define A 100 #define PI 3.14 #define KARE(x) (x*x) ....................

3

3

7

7

10

Page 20: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

20

C programlama dilinde, kullanılacak değişkenlerin önceden tanımlanması gerekir.

Örnek:

.......... int c,a,b; ......... main() { .......... c=a*b; .......... }

C dilinde anaprogram main() sözcüğü ile başlar. C dilinde açıklama satırı olarak // ve /*...*/ kullanılır. // tek bir satırı, /*...*/ ise bir ya da daha çok satırı açıklama satır yapar. Derleyici, açıklama satırlarını programın icrası sırasında gözardı eder.

Örnek:

/* Bu program 2 sayının toplamını hesaplar */ #include<stdio.h> .............. main() { .............. c=a+b; // iki sayı toplandı }

C dilinde bloklar {...} ile belirtilir: Örnek:

........ main() { //Ana blok başlangıcı ......... { //Blok başlangıcı ......... } //Blok bitişi .......... } //Ana blok bitişi

Page 21: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

21

C dilinde devam satırı “\” karakteridir. Program yazarken, satır sonuna gelindiğinde ya da satırın daha fazla uzaması istenmediğinde devam karakteri kullanılarak bir alt satırdan devam edilebilir.

Örnek:

............... printf(“C Programlama \ dili”); ...............

Anahtar kelimelerin hepsi küçük harfle yazılır. C dilinde büyük-küçük harf ayrımı vardır. ”a” ile “A” karakterleri C dilinde farklı şeylerdir. Örneğin, “int Ahmet;” ve “int ahmet;” tanımlamalarıyla iki farklı değişken tanımlamış oluruz. C programlama dilinde komut cümlelerinin sonuna ; gelmektedir.

Page 22: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

22

Bölüm Sonu Alıştırmaları 1. C programlama dilinin yapısını blok halinde veriniz. 2. “include” ve “define” deyimlerinin görevi nedir? 3. Bir programın çalışması hangi bloktan başlar? 4. Bir ifadenin derleyici önbildirisi olduğunu nereden anlarız? 5. C programlama dilinde ana blok(gövde) hangi sözcükle başlar? 6. C programlama dilinde // ve /* ... */ işaretleri ne işe yarar?Farkları nedir? 7. Bir programlama dilinde anahtar kelime ne demektir? 8. C programlama dilinde bir cümlenin bittiğini programcı olarak derleyiciye nasıl

belirtiriz?

Page 23: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

23

4 DEĞİŞKENLER VE SABİTLER C programlama yapısını hatırlarsak derleyici, işlemleri belli bir sırada yürütür. Buna göre, değişkenlerin kullanılmalarından önce tanımlamaların yapılması gerekir. Örneğin iki sayının toplatılması istendiğinde “c=a+b;” gibi bir cümlenin programda kullanılması gerekecektir. Ancak, bu cümleden daha önce a,b ve c’nin ne olduğunun c derleyicisine bildirilmesi (tanımlanması) gerekir. a,b ve c ifadelerinin ne oldukları ve ne kadar yer kaplayacakları bu ifadelerin tipleriyle bildirilir. Örneğin a,b ve c’nin birer tamsayıyı tutabilecek bellek bölgeleri olduğu, derleyiciye int(integer) tip önekiyle bildirilir. Örnek:

#include<stdio.h> int a,b,c; main() { c=a+b; }

4.1 C Programlama Dilinde Tanımlı Standart Veri Tipleri C programlama dilinde tanımlı olan standart veri tipleri Tablo 4.1’de verilmiştir.

TİP UZUNLUK SINIR unsigned char 8 bit(1 byte) 0 – 255 char 8 bit(1 byte) -128 – 127 enum 16 bit(2 byte) -32768 – 32767 unsigned int 16 bit(2 byte) 0 – 65535 short int 16 bit(2 byte) -32768 – 32767 int 16 bit(2 byte) -32768 – 32767 unsigned long 32 bit(4 byte) 0 - 4.294.967.295 long 32 bit(4 byte) -2.147.483.648 - 2.147.483.647 float 32 bit(4 byte) 3,4* 10 –38 - 3,4* 10+38 double 64 bit(8 byte) 1,7*10-308 – 1,7*10+308 long double 80 bit(10 byte) 3,4*10-4932 – 1,1*10+4092

Tablo 4.1

C dilinde bu bilgiler float.h ve limits.h isimli iki ayrı kütüphanede tutulur. Örnek Tanımlamalar:

int a,b,c; float bolum; char kar; char isim[10]; unsigned int d; long int kup; double us;

Page 24: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

24

Yukarıdaki değişken tanımlama bloğuna göre derleyici, bellekte aşağıdaki şekilde yer ayıracaktır:

: a 2 byte

b 2 byte c 2 byte :

bolum 4 byte :

kar 1 byte :

İsim[10] 10 byte :

d 2 byte :

kup 4 byte :

us 8 byte :

Bellek

Page 25: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

25

Örnek:

1 ...... #include<stdio.h> 2 ...... #include<conio.h> 3 ...... int a,b,c; 4 ...... void main() 5 ...... { 6 ...... clrscr(); 7 ...... a=10; 8 ...... b=5; 9 ...... c=a-b; 10...... printf(“c=%d\n”,c); 11...... a=c; 12...... c=a+b; 13...... printf(“c=%d\n”,c); 14...... getch(); 15...... }

Program çıktısı:

C=5 C=10

Açıklama: 1,2. Satır:

Standart giriş/çıkış(i/o) ve konsol giriş/çıkış fonksiyonlarının kullanılabilmesi için sırasıyla stdio.h ve conio.h kütüphaneleri programa ekleniyor. 3.satır:

“int a,b,c;” cümlesi ile bellekte a,b ve c simgeleriyle temsil edilebilecek 3 tamsayı için 2’şer byte’lık yer ayrılmıştır.

: :

a 2 byte

: b 2 byte

:

c 2 byte

: :

Page 26: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

26

4,5 ve 15. satır: C dilinde ana fonksiyonun,

main() { ana blok; }

şeklinde olduğu artık biliniyor. void kelimesi ise ana fonksiyonun geriye bir değer döndürmeyeceğini belirtiyor. 6.satır:

clrscr()-clear screen fonksiyonu ekranı temizlemeye yarar. 7.satır:

“a=10;” ifadesinden sonra belleğin durumu şöyle olur:

: :

a10

2 byte

: b 2 byte

:

c 2 byte

: :

8.satır: “b=5;” ifadesinden sonra belleğin durumu şöyledir:

: :

a10

2 byte

: b

5 2 byte

: c 2 byte

: :

Page 27: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

27

9.satır:

“c=a-b;” ifadesinden sonra belleğin durumu şöyledir:

: :

a10

2 byte

: b

5 2 byte

: c

5 2 byte

: :

10.satır:

Bellekteki c bölgesinin değeri ekrana yazılır ve “\n” ile imleç bir alt satıra konumlanır:

C=5

11.satır: “a=c;” ile bellekteki a bölgesine c bölgesindeki değer aktarılır:

: :

a5

2 byte

: b

5 2 byte

: c

5 2 byte

: :

Page 28: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

28

12.satır:

“c=a+b;” ile bellekteki c bölgesine a+b toplamının değeri aktarılır:

: :

a5

2 byte

: b

5 2 byte

: c

10 2 byte

: :

13.satır:

Bellekteki c bölgesinin yeni değeri ekrana yazılır:

C=5 C=10

14.satır:

getch() fonksiyonu ile kullanıcının bir tuşa basması beklenir. Bu sayede kullanıcı ekranı hemen kaybolmamış olur.

4.1.1 Statik Değişkenler:

Bu tip değişkenler tanımlandığı andan itibaren bellekte gösterilirler. Statik değişken ile ayrılan bellek bölgesi ancak program bittiği zaman serbest bırakılır. Bütün fonksiyonlar statiktir. Statik değişkenler tanımlandıklarında sıfır ilk değerini alırlar. Eğer değişken işaretçi(pointer) ise ilk değeri NULL olur.

4.1.2 Dinamik Değişkenler:

Bu tip değişkenler programın icrası(çalışması) sırasında oluşturulurlar. Bunlar için heap bellek bölgesi kullanılır. C dilinde malloc(), calloc() v.b. komutlarla bu tip değişkenler oluşturulurlar. Dinamik değişkenler kullanıldığı an bunlar için bir heap bellek adresi ayrılır. Program bitmeden önce herhangi bir anda bu adresleri serbest bırakma işlemi mutlaka yapılmalıdır. Konuyla ilgili detaylı bilgi Pointerlar ve Dinamik Bellek Kullanımı konularında verilmiştir.

Page 29: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

29

4.1.3 Lokal ve Global Değişkenler:

Herhangi bir program bloğu içinde tanımlanan değişkenler o blok içinde geçerlidir. Programın bütününde geçerli değildir. Bu tür değişkenlere lokal değişkenler denir. Programın bütününde geçerli olan değişkenler ise global değişken olarak adlandırılır. Programda ana fonksiyondan( main() ) önce tanımlanırlar. Global olarak tanımladığımız değişkenleri programın içinde kullanabileceğimiz gibi tanımladığımız fonksiyonların içinde de aynı isimleriyle kullanabiliriz. Örnek tanımlar:

#include<... > int a,b; // global değişkenler void main() { // ana blok başlangıcı int c,d; // lokal değişkenler ...... { // 1. blok başlangıcı int e,f,h; // lokal değişkenler } // 1. blok bitişi ...... { // 2. blok başlangıcı int g,h,e; // lokal değişkenler } // 2. blok bitişi ...... } //ana blok bitişi

Örnek:

#include<stdio.h> #include<conio.h> void main() { int i=3; clrscr(); { // blok başlangıcı int i=4; printf(“i değişkeninin blok içindeki değeri %d ‘tür \n”, i); } // blok bitişi printf(“i değişkeninin blok dışındaki değeri %d ‘tür” , i); getch(); }

Page 30: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

30

Programın Çıktısı:

i değişkeninin blok içindeki değeri 4 ‘tür i değişkeninin blok dışındaki değeri 3’ tür

Açıklama: Programda i değişkeni iki farklı yerde tanımlanmıştır. Bloğa girilmeden önce i’nin değeri 3’tür. Bloğa girildiğinde i’nin yeni bir tanımıyla karşılaşılır. Bu tanımdan sonra blok içerisinde i’ye 4 atandığı için bloktan çıkılıncaya kadar i’nin değeri 4’tür. Bloktan çıkılınca i’nin değeri yine eski değeri olan 3 olur.

Şekil 3.1 Şekil 3.1’de taralı bölge, i’nin 3 değerinin geçerli olduğu blok dışı bölgesidir. Taralı olmayan bölge ise i’nin 4 değerine sahip olduğu blok içi bölgesidir.

4.1.4 Sabitler Program içinde kullanılacak sabit değerler #define derleyici ön bildirim deyimiyle, programda kullanılmadan önce verilirler. Örnek tanım ve kullanım:

#define pi 3.14 float alan; int r; void main() { ............ alan=pi * r * r; ............ }

Yukarıda, “#define pi 3.14” deyimiyle “pi” adında bir sabit tanımlanmıştır. Bunun anlamı, programda pi görülen yere 3.14 değerinin geleceğidir(alan=3.14*r*r).

i=3

blok dışı

i=4 blok içi

Page 31: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

31

Bölüm Sonu Alıştırmaları 1. Veri tipi nedir? 2. C programlama dilindeki veri tipleri ve özellikleri nelerdir? 3. Aşağıdaki programda yapılan hataları bularak düzeltiniz(ipucu:Toplam 3 hata)

#include<stdio.h> #define a 3 int z,y; void main() { clrscr(); z=6; y=a x=y/z; printf(“y/z=%f”, x); getch(); }

4. Aşağıdaki programın çıktısı ne olur?

#include<stdio.h> #include<conio.h> int a,b=1; void main() { a=3; printf(“a=%d b=%d\n”,a,b); { a=b*2; int b=2; printf(“a=%d b=%d\n”,a,b); a=5; } printf(“a=%d b=%d\n”,a,b); getch(); }

5. Bir sabit tanımlamanın ne gibi faydaları olabilir?

Page 32: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok
Page 33: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

33

5 GİRİŞ/ÇIKIŞ FONKSİYONLARI Bilgisayarda giriş dışarıdan (klavye, mouse, barkod okuyucu, disket v.s. ) bilgi alma işlemine karşılık gelir. Çıkış ise ekran, yazıcı, manyetik teyp, disk v.b. aygıtlara bilgi gönderme işlemine karşılık gelir.

C programlama dilinde ekrana bilgi çıkışı için printf() fonksiyonu kullanılır. Klavyeden bilgi girişi için de scanf() fonksiyonu kullanılır.

5.1 printf() fonksiyonu printf() fonksiyonu bir işlemin sonucunu, bir değişkenin değerini ya da bir stringi(karakter grubunu) ekrana yazdırmak için kullanılır. printf() fonksiyonunun yapısı şöyledir:

printf(“çıkış biçimi karakterleri”, değerler listesi);

Örnek kullanım:

printf(“\n Verilen Sayıların Enbüyüğü %d’dir”, enb);

A-Çıkış Biçimi Karakterleri: Bu kısım çift tırnak(“) ile başlar ve çift tırnak ile biter. Çıkış biçimi karakterleri 3 gruptan oluşur: Açıklama Karakterleri: Olduğu gibi ekrana çıkarlar. Yukarıdaki örnek kullanımda yer

alan açıklama karakterleri şunlardır: Verilen Sayıların Enbüyüğü

‘dir Çıkış Biçiminin Belirtildiği Karakterler: Bunlar, değerler listesi kısmında belirtilen

değişkenlerin değerlerini alarak ekrana çıkarlar. “%” ile başlayan bu ifadeler, ekrana çıkacak olan değerin veri tipini belirtir. Tablo 4.1’de çıkış biçimi karakterleri verilmiştir.

Örneğimizdeki “%d” ifadesi bu gruba girer ve kendi yerine ekrana çıkacak olan değerin bir tamsayı olacağını belirtmektedir. Ekrana “%d” yerine, “enb” değişkeninin değeri çıkar. enb değişkeninin değerinin daha önce 15 olarak belirlendiğini kabul edelim. Bu durumda “%d” yerine ekrana 15 çıkar:

15 enb=15; printf(“\n Verilen Sayıların Enbüyüğü %d’dir” , enb);

Page 34: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

34

Yukarıdaki ifadenin ekran çıktısı şöyledir:

Verilen Sayıların Enbüyüğü 15’dir

Çıkış biçiminin belirtildiği karakterler, bir printf() fonksiyonunda 1’den fazla olabilir. Bunun yanısıra değerler kısmında da aynı sayıda işlem ya da değişken bulunmalıdır. Böyle bir ifadede, değerler listesi kısmında bulunan değişken ya da işlemlerden ilkinin değeri “%” ile başlayan ifadelerden ilkinin yerine, ikinci değişken ya da işlemin değeri, “%” ile başlayan ifadelerden ikincisinin yerine yazılır ve bu şekilde devam eder. Örnek:

enb=15; 15 enk=2; printf(“Verilen Sayılardan Enbüyüğü %d, Enküçüğü de %d’dir”, enb, enk); 2

Bu ifadenin ekran çıktısı şöyle olur:

Verilen Sayıların Enbüyüğü 15, Enküçüğü de 2’dir

%d : İşaretli tamsayı %i : İşaretli tamsayı %u : İşaretsiz tamsayı %f : Ondalıklı sayı %ld : Uzun tamsayı %lf : Double(Uzun ondalıklı sayı) %c : Tek karakter %s : String(Karakter grubu) %x : Hexadecimel sayı %e : Üstel(exponansiyel) ondalıklı sayı

Tablo 4.1 – Çıkış Bçimi Karakterleri

Page 35: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

35

Escape Düzeni Karakterleri: Bu ifadeler “\” ile başlar ve imlecin değişik şekillerde konumlanması, bazı özel karakterleri bastırma gibi etkileri vardır. İlk örnekteki “\n” ifadesi ile imlecin bir alt satıra konumlanması sağlanmıştır. Tablo 4.2’de escape düzeni karakterlri verilmiştir. Örnek Kullanımlar:

printf(“Adı Soyadı: Ahmet Yılmaz\n”); printf(“Adı Soyadı:\n Ahmet Yılmaz”);

Yukarıdaki gibi iki printf() cümlesi ardarda icra edildiğinde aşağıdaki çıktıyı verir:

Adı Soyadı: Ahmet Yılmaz Adı Soyadı: Ahmet Yılmaz

Açıklama:

Birinci printf() fonksiyonundaki “\n” ifadesi, ikinci printf() fonksiyonundakilerin bir alt satırdan itibaren yazılmasını sağlıyor. İkinci printf() fonksiyonundaki “\n” ifadesi ise kendisinden sonra gelen “Ahmet Yılmaz” stringinin bir alt satırdan itibaren yazılmasını sağlıyor.

\n (new line) : Kursörü bir alt satıra geçirir \r (carriage return) : Kursörü satır başına getirir \b (back space) : Kursörü bir kolon sola çeker \a (bell) : Bip sesi verir \t (horizontal tab) : Belli aralıklarla kursörü kaydırır \\ : Sadece \ karakteri koyar \‘ : Sadece ‘ karakteri koyar \“ : Sadce “ karakteri koyar \? : Sadece ? karakteri koyar \0 : NULL karakteri

Tablo 4.2 - Escape Düzeni Karakterleri

B-Değerler Listesi: Değerleri ekrana çıkacak olan değişken ya da işlemlerin listesidir. Birden fazla olduğunda birbirlerinden virgülle ayrılırlar. Bu listedeki değerler, çıkış biçiminin belirtildiği karakterlerin( “%” ile başlayan ifadeler ) yerlerine yazılırlar.

Page 36: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

36

Örnek:

1.....#include<stdio.h> 2.....#include<conio.h> 3..... void main() 4..... { 5..... int x=10; 6..... printf(“%d’un karesi %d’dür \n” ,x, x*x); 7..... getch(); 8..... }

Programın çıktısı:

10’un karesi 100’dür

Açıklama: 1ve 2. satırlar:

stdio.h ve conio.h kütüphaneleri programa ekleniyor. 3,4 ve 8. satırlar:

Programın ana bloğunu oluşturan satırlardır. 5. satır:

“int x=5;” cümlesi ile, x ile temsil edilen ve tamsayı saklanabilen bir bellek bölgesi ayrılarak bu bölgeye 5 değeri koyuluyor. 6. satır:

10

printf(“%d’un karesi %d’dür \n”, x, x*x);

100

Cümlesi ile ekrana “10 un karesi 100’dür” yazılacaktır. İlk “%d” nin yerine x’in değeri, ikinci “%d’nin” yerine x*x ’in değeri yazılır. Ardından “\n” ile bir alt satıra geçilir. 7.satır:

getch() ile kullanıcının bir tuşa basması beklenir. Kullanıcı bir tuşa basınca Turbo C editörüne dönülür.

Page 37: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

37

Örnek:

1..... #include<stdio.h> 2..... #include<conio.h> 3..... void main() 4..... { 5..... clrscr(); 6..... printf(“\nMerhaba\b”); 7..... printf(“Merhaba\b”); 8..... printf(“\aMerhaba\r”); 9..... printf(“MERHABA\n”); 10... getch(); 11... }

Programın Çıktısı:

(bir satır atlandı) MERHABAerhabMerhaba _

Açıklama: 6.satır:

“\n” ile önce bir alt satıra geçilerek “Merhaba” yazılır. Daha sonra “\b” ile imlec bir sütun sola kaydırılır(imlec a harfinin altında):

Merhaba

7.satır:

İmlecin bulunduğu pozisyondan itibaren “Merhaba” yazılır(a harfi siliniyor) ve yine “\b” etkisiyle imlec bir sütun sola kaydırılır:

MerhabMerhaba

Page 38: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

38

8.satır:

Önce “\a” ile bip sesi çıkar. Sonra, imlecin bulunduğu pozisyondan itibaren “Merhaba” yazılır. İmlec “\r” harfinin etkisiyle satırın başına konumlanır:

MerhabMerhabMerhaba

9.satır:

İmlecin bulunduğu konumdan(satır başından) itibaren “MERHABA” yazılır ve bir alt satıra geçilir:

---------------- MERHABAerhabMerhaba _

5.2 scanf() fonksiyonu Değişkenlerin temsil ettiği alanlara değer okutmak amacıyla kullanılır. scanf() fonksiyonunun yapısı şöyledir:

scanf(“giriş formatı karakterleri”, adresler listesi);

Giriş formatı karakterleri, değer okutulacak alanın tipini belirten karakterlerden oluşur. printf() fonksiyonunda çıkış için kullandığımız ve “%” ile başlayan karakterler scanf() fonksiyonunda giriş için kullanılır. Örnek kullanım:

............... int sayi; ............... scanf(“%d”, &sayi); ...............

Örnekte, “&sayi” adresiyle belirtilen bellek bölgesine integer(tamsayı) tipinde bir değer okutulacağı belirtilmektedir.

Adresler listesi, bilgi girişinin yapılacağı bellek bölgelerinin adreslerinin listesidir. Bu bellek bölgelerinin adreslerinin belirtilmesi için, kendilerini temsil eden değişken isimlerinin başına adres operatörü(&) getirilir. Yukarıdaki örnekte tamsayı tipinde değerlerin tutulduğu bir bellek bölgesi “sayi” ile temsil edilmektedir. Bu bölgenin adresinin belirtilmesi

Page 39: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

39

için başına “&” getirilerek “&sayi” ifadesi kullanılır. Karakter türü değişkenlerin kendileri zaten bir adres olduğu için “&” operatörüne gerek yoktur. Fakat nümerik değişkenlerin başına mutlaka “&” operatörü koyulmalıdır.

Yukarıdaki örnekte, “int sayi;” cümlesi ile, sayi simgesiyle temsil edilen ve tamsayıların tutulabildiği bir bellek bölgesi ayrılmıştır. Bu bölgenin adresi derleyici tarafından bilinmektedir. scanf() fonksiyonu içinde “&sayi” ifadesi kullanıldığında ise derleyiciye, “&sayi” adresiyle belirtilen bellek bölgesine tamsayı tipinde bilgi girişi olacağı bildirilmiş olur. Örnek:

scanf(“%s”, isim);

Burada karakter türünde bir değer okutulacağı için “&” operatörüne gerek yoktur. Bu komut cümlesinde kullanıcı, bir string ifade girecek ve bu gireceği string, “isim” ile temsil edilen bellek bölgesine yerleştirilecek. Örnek:

1..... #include<stdio.h> 2..... #include<conio.h> 3..... int sayi; 4..... void main() 5..... { 6..... clrscr(); 7..... printf(“Bir sayi giriniz:”); 8..... scanf(“%d”,&sayi); 8..... printf(“Girdiğiniz sayi %d’dir”,sayi); 9..... getch(); 10... }

Programın çıktısı:

Bir sayı giriniz: 25 Girdiğiniz sayi 25’dir

Açıklama: 3.satır: “int sayi;” cümlesi ile bellekte tamsayı tipinde bir yer ayrılmıştır. Bu bellek bölgesi “sayi” simgesi ile temsil edilmektedir:

Page 40: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

40

: sayi

2 byte

:

7.satır: Bu satır ile ekran şunlar çıkar:

Bir sayi giriniz:

8.satır: Kullanıcıdan bir tamsayı girmesi beklenir. Kullanıcı tamsayıyı yazıp enter tuşuna bastığı zaman bu tamsayı, bellekte kendisi için ayrılan bölgeye yerleştirilir. Bu işlem, klavyeden veri okutma işlemidir.

Bir sayi giriniz: 25

Bu satırdan sonraki bellek görüntüsü şöyledir:

: sayi

25 2 byte

:

9.satır:

printf(“Girdiğiniz sayı %d’dir”, sayi);

25

ifadesinden sonra ekran çıktısı şu şekilde olur:

Bir sayi giriniz: 25 Girdiğiniz sayı 25’tir

Page 41: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

41

Örnek:

1..... #include<stdio.h> 2..... #include<conio.h> 3..... int bolunen,bolen; 4..... float bolum; 5..... void main() 6..... { 7..... clrscr(); 8..... printf(“sayi1:”); 9..... scanf(“%d”,&bolunen); 10... printf(“sayi2:”); 11... scanf(“%d”,&bolen); 12... bolum=bolunen / bolen; 13... printf(“sonuc=%f”,bolum); 14... getch(); 15... }

Programın örnek çıktısı:

sayi1: 8 sayi2: 2 sonuc: 4.000000

Açıklama: 3 ve 4.satırlar: Bellekte “bolunen” ve “bolen” simgeleriyle temsil edilen 2’şer byte’lık 2 tamsayı bölgesi, “bolum” simgesiyle temsil edilen 4 byte’lık ondalıklı sayı saklanabilen bir bellek bölgesi ayrılmıştır.

: bolen

2 byte

: bolunen

2 byte

: bolum

4 byte

:

Page 42: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

42

8.satır: Ekrana “sayi1:” yazdırır.

sayi1:

9.satır: Kullanıcıdan bir tamsayı girmesi beklenir. Başka bir deyişle tamsayı bir değer okutulur.

sayi1: 8

9.satırdan sonra bellek görünümü şöyle olur:

:

bolen

2 byte

: bolunen

8 2 byte

: bolum

4 byte

: 10.satır: Bu satır ile ekrana “sayi2:” yazılır.

sayi1: 8 sayi2:

Page 43: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

43

11.satır: Bir tamsayı değer daha okutulur. Bu tamsayı değer, “bolen” simgesiyle temsil edilen bellek bölgesine yerleşir.

sayi1: 8 sayi2: 2

Bu satırın icrasından sonra bellek görüntüsü şöyle olur:

: bolen

2 2 byte

: Bolunen

8 2 byte

: Bolum

4 byte

:

12.satır: bolum=bolunen/bolen işlemi yapılarak sonuc “bolum” simgesiyle temsil edilen bellek bölgesine yazılır.

: Bolen

2 2 byte

: Bolunen

8 2 byte

: Bolum

4.0

4 byte

:

Page 44: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

44

Bölüm Sonu Alıştırmaları 1. Kullanıcıdan a,b,c,d adlarında integer değişkenlere değer okutarak bu değerlerin

toplamını bulan ve sonucu ekrana yazdıran bir program yazınız. 2. Aşağıdaki programın örnek bir çıktısını veriniz

#include<stdio.h> #include<conio.h> int a,b,c; void main() { clrscr(); printf(“Bir sayi giriniz:”); scanf(“%d” ,&a); printf(“İkinci bir sayi giriniz:”); scanf(“%d” ,&b); printf(“a=%d\tb=%d\n” ,a,b); c=a; a=b; b=c; printf(“a=%d\tb=%d” ,a,b); getch(); }

Page 45: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

45

6 OPERATÖRLER C programlama dilinde tanımlı operatörler Tablo 6.1, Tablo 6.2, Tablo 6.3, Tablo 6.4 ve Tablo 6.5’te verilmiştir. Aritmetiksel operatörler:

Operatör Anlamı İşlenen Tipi Sonucun Tipi Örnek + Toplama Nümerik Nümerik x=y+z; - Çıkarma Nümerik Nümerik x=y-z; * Çarpma Nümerik Nümerik x=y*z; / Bölme Nümerik Nümerik x=y/z;

% Modül Nümerik Nümerik y=78; z=5;

x=y%z; //x=3

++ Bir artırma Nümerik Nümerik x=1;

x++; //x=2

-- Bir eksiltme Nümerik Nümerik x=2;

x--; //x=1 Tablo 6.1 Aritmetiksel Operatörler

Karşılaştırma Operatörleri:

Operatör Anlamı İşlenen Tipi Sonucun Tipi Örnek < Küçüktür C’de tanımlı

standart tipler ve özel tipler

boolean a=5; b=3; (a<b); // 0 (false-yanlış)Testin sonucu doğru(true) olursa 1 değerine karşılık getirilir. Yanlış (false) olursa 0 değerine karşılık getirilir.

<= Küçükeşit C’de tanımlı standart tipler ve özel tipler

boolean a=’A’; b=’B’; (a<=b); // 1 (true-doğru)

> Büyüktür C’de tanımlı standart tipler ve özel tipler

boolean a=5; b=15; (a>b); // 0

>= Büyükeşit C’de tanımlı standart tipler ve özel tipler

boolean “ahmet” >= “ali” ; //0 Not: ilk harflerin ASCII kodları eşit olduğu için 2. harflere bakılır.

== Eşitlik C’de tanımlı standart tipler ve özel tipler

boolean “ahmet” == “Ahmet”; //0 Not: C dilinde büyük-küçük harf ayrımı vardır. ‘a’ ile ‘A’, C dilinde farklı şeylerdir.

!= Eşitdeğil C’de tanımlı standart tipler ve özel tipler

boolean “ahmet” != ”Ahmet” ; //1

Tablo 6.2 Karşılaştırma Operatörleri

Page 46: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

46

Mantıksal Operatörler:

Operatör Anlamı İşlenen Tipi Sonucun Tipi Örnek

! NOT (değil) işlemiBoolean (true(1),false(0))

Boolean a=5; b=3; !(a>b); //0

&& AND(ve) işlemi Boolean Boolean

a=5; b=3; c=2; (a>b) && (a>c); //1

|| OR (veya) işlemi Boolean Boolean

a=5; b=3; c=2; (a>b) || (a>c); //0

Tablo 6.3 Mantıksal Operatörler

Bit Düzeyinde operatörler:

Operatör Anlamı İşlenen Tipi

Sonucun Tipi

Örnek

~ 1’e tümleyen

İnteger tipler

İnteger tipler

a=0x000F; // a=0000000000001111 b=~a; // b=1111111111110000

<< Sola öteleme

İnteger tipler

İnteger tipler

a=0x000F; // a=0000000000001111 b=a<<4; // b=0000000001110000

>> Sağa öteleme

İnteger tipler

İnteger tipler

a=0x00F0; // a=0000000011110000 b=a>>4; //b=00000000000001111

& Bit düzeyinde AND

İnteger tipler

İnteger tipler

a=0x000F;// a=0000000000001111 b=0x00F0;// b=0000000011110000 c=a&b; // c=0000000000000000

| Bit düzeyinde OR

İnteger tipler

İnteger tipler

a=0x000F;// a=0000000000001111 b=0x00F0;// b=0000000011110000 c=a|b; // c=0000000011111111

^ Bit düzeyinde XOR

İnteger tipler

İnteger tipler

a=0x00FF;// a=0000000011111111 b=0x000F;// b=0000000000001111 c=a^b; // c=0000000011110000

Tablo 6.4 Bit Düzeyinde Operatörler

Sıkıştırılmış operatörler: Operatör Anlamı İşlenen Tipi Sonucun Tipi Örnek

+= Sıkıştırılmış toplama Nümerik Nümerik x+=y; // x=x+y; -= Sıkıştırılmış çıkarma Nümerik Nümerik x-=y; // x=x-y; *= Sıkıştırılmış çarpma Nümerik Nümerik x*=y; // x=x*y; /= Sıkıştırılmış bölme Nümerik Nümerik x/=y; // x=x/y;

%= Sıkıştırılmış modül alma

Nümerik Nümerik x%=y; // x=x%y;

Page 47: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

47

<<= Sıkıştırılmış sola öteleme

integer tipler integer tipler x<<=3; // x=x<<3;

>>= Sıkıştırılmış sağa öt. İnteger tipler integer tipler x>>=3; // x=x>>3; &= Sıkıştırılmış

AND işlemi integer tipler integer tipler x&=1; // x=x&1;

^= Sıkıştırılmış XOR işlemi

integer tipler integer tipler x^=2; // x=x^2;

|= Sıkıştırılmış OR

integer tipler integer tipler x|=0x000F;// x=x | 0x000F;

Tablo 6.5 Sıkıştırılmış operatörler

Diğer Operatörler: ( ) : Fonksiyon çağırma ve alt cümleler [ ] : Dizi elemanları -> : İşaretçi(pointer) yapısı . : Yapı(Structure) elemanı - : Sayı işareti negatif + : Sayı işareti pozitif * : İçerik operatörü & : Adres operatörü sizeof : Büyüklük operatörü ?: : 3’lü Koşul operatörü , : Ayırıcı karakter

6.1 İşlem Öncelikleri Karmaşık C dili cümlelerinde işlemler öncelik sırasına göre yapılır. Örneğin, 5+3*5 gibi bir işlemin sonucu önce ‘+’ operatörü uygulandığında 40, önce ‘*’ operatörü kullanıldığında ise 20 çıkmaktadır. C dilinde buna benzer durumlarda işlemlerin hangi öncelik sırasına göre gerçekleştirileceği belirlenmiş durumdadır. Tablo 6.6’da işlem öncelikleri verilmiştir.

C dilinin tanımlı işlemleri komutlarından daha fazladır. İşlemlerin kullanımında hatalardan sakınmak için güçlü öncelikler ya da hiyerarşi istenir.

1.Seviye (Öncelik sırası soldan sağadır)

++ Önce bir artırma

-- Önce bir eksiltme

() Fonksiyon çağırma ve alt cümleler

[] Dizi elemanları

-> İşaretçi yapısı

. Yapı elemanları

Bunların hepsi aynı ve en yüksek önceliğe sahiptir. Parantezler ise normalde olduğu gibi hepsinin üzerinde bir önceliğe sahiptir.

Page 48: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

48

2.Seviye (Öncelik sırası sağdan sola doğrudur)

! NOT

~ 1’e tümleyen

- Negatif

+ Pozitif

(type) Tip belirleme

* İşaretçinin tersi işlem

& Adres operatörü

Sizeof Büyüklük

3.Seviye (Öncelik sırası soldan sağa doğrudur)

* Çarpma

/ Bölme

% Modül alma

4.Seviye (Öncelik sırası soldan sağa doğrudur)

+ Toplama

- Çıkarma

5.Seviye (Öncelik sırası soldan sağa doğrudur)

<< Sola bit öteleme

>> Sağa bit öteleme

6.Seviye (Öncelik sırası soldan sağa doğrudur)

< Küçüktür

<= Küçükeşit

> Büyüktür

>= Büyükeşit

7.Seviye (Öncelik sırası soldan sağa doğrudur)

== Eşitlik testi

!= Eşit değil testi

8.Seviye (Öncelik sırası soldan sağa doğrudur)

& Bit düzeyinde AND

9.Seviye (Öncelik sırası soldan sağa doğrudur)

^ Bit düzeyinde XOR

10.Seviye (Öncelik sırası soldan sağa doğrudur)

| Bit düzeyinde OR

Page 49: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

49

11.Seviye (Öncelik sırası soldan sağa doğrudur)

&& Mantıksal AND

12.Seviye (Öncelik sırası soldan sağa doğrudur)

|| Mantıksal OR

13.Seviye (Öncelik sırası sağdan sola doğrudur)

?: 3’lü koşul

14.Seviye (Öncelik sırası sağdan sola doğrudur)

= Atama

+= Sıkıştırılmış toplama

-= Sıkıştırılmış çıkarma

*= Sıkıştırılmış çarpma

/= Sıkıştırılmış bölme

%= Sıkıştırılmış modül alma

<<= Sıkıştırılmış sola bit öteleme

>>= Sıkıştırılmış sağa bit öteleme

&= Sıkıştırılmış bit düzeyinde AND

^= Sıkıştırılmış bit düzeyinde XOR

|= Sıkıştırılmış bit düzeyinde OR

15.Seviye (Öncelik sırası soldan sağa doğrudur)

, Ayırıcı virgül

++ ve -- Sonradan bir artırma ve sonradan bir eksiltme

Tablo 6.6 İşlem Öncelikleri

6.2 Birbiriyle İlişkili Operatörler

6.2.1 Atama İşlemi

C dilinde atama işlemi doğrudan = operatörüyle yapılır.

6.2.2 Çoklu Atama

a=b=c=d=100; Atamalar sağdan sola doğru olduğu için bu şekilde yazdığımız zaman, önce d değişkeni 100 değerini alıyor, daha sonra sırayla diğer değişkenlere aynı değer sağdan sola doğru atanıyor. X=y=5*z-2;

Page 50: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

50

Aritmetik işlemler atamadan daha yüksek önceliğe sahip olduğundan, önce aritmetik işlem yapılır, daha sonra sırayla y ve x değerlerine atanır. Aksi taktirde x ve y’nin ikisinin de 5 değerini alması gerekiyordu.

6.2.3 Sıkıştırılmış Atama

x=x*3; ifadesi benzer şekilde C dilinde geçerlidir fakat bunu sıkıştırılmış formda da yazabiliriz: x*=3; Benzer şekilde “toplam=toplam-3;” ifadesini de “toplam-=3;” şeklinde yazabiliriz.

6.2.4 Karşılaştırma Operatörleri

Karşılaştırma operatörlerinin hepsi aynıdır. Sadece “<>” (eşit değil) operatörü yerine C’de “!=” operatörü kullanılır. “=” karşılaştırmadaki sorguya karşılık da C’de “==” operatörü kullanılır.

6.2.5 Boolean Tip C dilinde boolean tipi yoktur. Eğer karşılaştırmadaki önerme TRUE ise sonuc 1 değerini, FALSE ise sonuc 0 değerini alır. Not: Sıfır her zaman FALSE , 1 de TRUE değerine karşılık gelir.

6.2.6 Boolean Atamalar ve Birbirleriyle İlişkili Operatörler

x=3; y=4; z=x>y; /* z=0 */ z=x<y; /* z=1 */ Büyüklük sorgusu daha yüksek önceliğe sahip olduğundan, önce sorgu yapılır ve sonucu z değişkenine aktarılır. Z’ye aktarılan değer, karşılaştırmanın sonucu olan 1(TRUE) ya da 0(FALSE) değeridir.

X=3; y=4; z=y > ++x;

işlemi sonucunda z=0 olacaktır. Çünkü x+1, y değerinden daha küçük değildir. Burada “++”(önce bir artırma) işlemi 1. seviyede, “>” de 14. seviyede olduğu için önce x’in değeri bir artırılır, daha sonra karşılaştırma işlemi yapılır. Dolayısıyla, “4>4” testi yapılmış olduğu için sonuç yanlış, yani 0’dır.

Page 51: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

51

Örnek: #include<stdio.h> #include<conio.h> int x,y,z; void main() { printf(“y=”); scanf(“%d”,&y); printf(“z=”); scanf(“%d”,&z); y>z ? x=y-z : x=z-y; printf(“Girdiğiniz sayıların farkı %d’dir”,x); y>z ? x=y%z : x=z%y; printf(“\nSayıların birbirine bölümünden kalan %d’dir”,x); x=z<<1; printf(“\n%d’nin 2 katı %d’dir”,z,x); x=z>>1; printf(“\nd’nin yarısı %d’dir”,z,x); x=z&y; printf(“\n %d ile %d’nin AND işlemi sonucu %d’dir”,z,y,x); getch(); }

Örnek program çıktısı:

y=257 z=264 Girdiğiniz sayıların farkı 7’dir Sayıların birbirine bölümünden kalan 7’dir 264’ün 2 katı 528’dir 264’ün yarısı 132’dir 264 ile 257’nin AND işlemi sonucu 256’dır

Açıklama: “y>z ? x=y-z : x=z-y” ifadesi, eğer y z’den büyük ise x=y-z, değilse x=z-y işlemini gerçekleştirir. Örnek çıktıya göre z=264>y=257 olduğu için x=z-y=264-257=7’dir. Bunun sonucunda “Girdiğiniz sayıların farkı 7’dir” mesajı verilir. “y>z ? x=y%z : x=z%y” ifadesi, eğer y z’den büyük ise x=y%z(y’nin z’ye bölümünden kalanı x’e ata), değilse x=z%y işlemini gerçekleştirir. Örnek çıktıya göre z=264>y=257 olduğu için x=z%y=264%257=7’dir. Bunun sonucunda “Sayıların birbirine bölümünden kalan 7’dir” mesajı verilir. “x=z<<1” ifadesi, z sayısının 1 bit sola kaydırılarak sonucun x’e atanması işlemini gerçekleştirir. Örnek çıktıda z=264’tür ve 1 bit sola kaydırılması sonucunda z=512 olmuştur. Bunun sonucunda “264’ün 2 katı 528’dir” mesajı verilir. Çünkü bir sayıyı 1 bit sola kaydırmak bir sayıyı 2 ile çarpmak demektir.

0 1 0 0 0 0 1 0 0 0 (264)

Page 52: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

52

z<<1 işleminden sonra,

1 0 0 0 0 1 0 0 0 0 (528)

durumuna gelecektir. “x=z>>1” ifadesi, z sayısının 1 bit sağa kaydırılarak sonucun x’e atanması işlemini gerçekleştirir. Örnek çıktıda z=264’tür ve 1 bit sağa kaydırılması sonucunda z=132 olmuştur. Bunun sonucunda “264’ün yarısı 132’dir” mesajı verilir. Çünkü bir sayıyı 1 bit sağa kaydırmak bir sayıyı 2’ye bölmek demektir.

0 1 0 0 0 0 1 0 0 0 (264)

z>>1 işleminden sonra,

0 0 1 0 0 0 0 1 0 0

(132) durumuna gelecektir. “x=z&y” ifadesiyle, z ile y’nin bitlerinin birebir AND işlemine tabi tutularak sonucun x’e atanması gerçekleştirilir. Örnek çıktıda z=264 ve y=257’dir. Bunların birebir AND işlemine tabi tutulması ile sonuç 256 olmaktadır. Bunun sonucunda “264 ile 257’nin AND işlemi sonucu 256’dir” mesajı verilir

1 0 0 0 0 0 0 0 1 z(257)

1 0 0 0 0 1 0 0 0

y(264)

z&y işleminden sonra,

1 0 0 0 0 0 0 0 0 z&y(256)

durumuna gelecektir. Örnek:

#include<stdio.h> #include<conio.h> int x,y; void main() { printf(“x=”); scanf(“%d”,&x); printf(“y=”); scanf(“%d”,&y);

Page 53: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

53

x+=1; y - =1; printf(“\n x=%d”,x); printf(“\t y=%d”,y); ++x+=1; y- =y--; printf(“\n x=%d”,x); printf(“\t y=%d”,y); getch(); }

Örnek program çıktısı:

x=10 y=20 x=11 y=19 x=13 y=-1

Açıklama: “x+=1” ifadesi ile “x=x+1” ifadesi aynı şeydir ve örnekte 10 olarak girilmiş olan x değeri 1 artarak 11 olmuştur. “y-=1” ifadesi ise “y=y-1” ifadesi ile aynıdır ve 20 olarak girilmiş y değeri bu ifade sonucunda 19 olmuştur. Bu değerler ekrana “x=11 y=19” şeklinde,

printf(“\n x=%d”,x); printf(“\t y=%d”,y);

ifadeleri ile yazdırılmıştır. “++x+=1” ifadesinde “++(önce arttır)” operatörü, “+=” operatörüne karşı işlem önceliğine sahiptir. Dolayısıyla bu ifadede ilk işlem ++x işlemidir ve bunun sonucunda x’in değeri 12 olur(yukarıda x zaten 11 olmuştu). Ardından x+=1 işlemi yapılır ve sonucunda x’in değeri 13 olur. (Not: ++x+=1 ifadesi ++x=++x+1 ifadesi ile eşdeğerdir) Adım1: ++x ve x=12 Adım2: x+=1 ve x=13 “y- =y--“ ifadesinde ise “- =” operatörü, “- -(sonra arttır)” operatörüne göreişlem önceliğine sahiptir. Dolayısıyla bu ifadede ilk işlem “y- =y” işlemidir(y=y-y) ve bunun sonucunda y=0 dır. Ardından “y--“ işlemi yapılmakta ve y’nin değeri 1 azaltılarak –1 olmaktadır. (Not: y-=y- - ifadesi y=y-y- - ifadesi ile eşdeğerdir) Bu iki ifadenin ardından,

printf(“\n x=%d”,x); printf(“\t y=%d”,y);

ifadeleriyle yeni x ve y değerleri ekrana “x=13 y=-1” şeklinde yazdırılmaktadır. Örnek:

#include<stdio.h> #include<conio.h> int y,x,z;

Page 54: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

54

void main() { clrscr(); y=4; x=3; z=y>++x; printf(“z=%d”,z); y=4; x=3; z=y>x++; printf(“\nz=%d”,z); getch(); }

Program çıktısı:

z=0 z=1

Açıklama: “z=y>++x” ifadesinde işlem önceliği “++(önce arttır)” operatöründedir ve ++x’ten sonra x=4 olur. Ardından > operatörü işletilecektir. Burada y>4 işlemi gerçekleştirilir. Bu işlemin sonucu aslında y ile 4’ün karşılaştırılmasından ibarettir. Eğer y 4’ten büyükse üretilen değer 1(dogru yani TRUE), büyük değilse üretilen değer 0(yanlış yani FALSE)’dır. y’nin değeri de 4 olduğu için 4>4 işleminin sonucu 0(sıfır)’dır. Bu sonuç z değişkenine atanarak “printf(“z=%d”,z);“ ifadesiyle ekrana yazdırılmaktadır. y=4; x=3; ile tekrar y ile x aynı değerleri alır. “z=y>x++” ifadesinde ise işlem önceliği en düşük operatör “++(sonra arttır)” olduğu için ilkönce y>x işlemi yapılır. y=4 > x=3 işleminde y x’ten büyük olduğu için bu karşılaştırmanın sonucu 1 olur. Dolayısıyla z=1 değerini alır. z=1 değerini aldıktan sonra “x++” işlemi gerçekleşir; fakat bu işlemin sonucu artık z’yi etkilemeyeceğinden, z=1 olarak kalır. Ardından “printf(“z=%d”,z);” ifadesiyle z değeri ekrana yazdırılır.

Page 55: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

55

Bölüm Sonu Alıştırmaları 1. Aşağıdaki programın çıktısı nedir?

#include<stdio.h> #include<conio.h> int x,y,z; void main() { clrscr(); x= -20; y=15; z= -(x+y)+y; printf(“%d %d %d\n” ,x,y,z); x= -x; y= -x; z= -y; printf(“%d %d %d” ,x,y,z); getch(); }

2. Bir işçinin aylık harcamaları; 50 ekmek, 2 kg et, 20 kutu yoğurt, 5 paket çay, 2 kg

şeker şeklindedir. Bu harcamaları, o ayki birim fiyatları okutarak hesaplayan programı yazınız.

3. Yarıçapı verilen bir dairenin çevresini ve alanını bulan programı yazınız(=3.14). 4. Onluk sistemdeki 7 sayısını ikilik sistemdeki karşılığını bularak ekrana yazdıran

programı döngü kullanmadan yapınız. 5. Aşağıdaki programın çıktısını veriniz.

#include<stdio.h> #include<conio.h> int x=3, z=5; void main() { clrscr(); ++z=x>z++; printf(“z=%d\n”, z); z=++x>>1; printf(“z=%d\n”, z); z=x%++z; printf(“z=%d\n”, z); z+=x*z-x+z; printf(“z=%d”, z); getch(); }

Page 56: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

56

Page 57: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

57

7 KONTROL CÜMLELERİ

7.1 ŞART CÜMLELERİ

7.1.1 IF Şart Cümlesi

Yazım şekli:

if (şart ifadesi) { blok; }

Şart ifadesine bakılır. Eğer şart ifadesi sonucu doğru(TRUE=1) ise blok icra edilir. Şart ifadesinin sonucu yanlış (FALSE=0) ise blok icra edilmeden if cümlesinin sonundan programa devam edilir.

Şart ifadesi parantez içerisine alınmalıdır. Blok, birden fazla cümleden oluşuyor ise blok işareti ( {...} ) içine alınmalıdır. Eğer blok, tek cümleden oluşuyorsa blok işareti kullanılmayabilir. Örnek:

1.....#include<stdio.h> 2.....#include<conio.h> 3.....int yas; 4.....void main() 5.....{ 6..... clrscr(); 7..... printf(“Yasınızı Giriniz:”); 8..... scanf(“%d”,&yas); 9..... if (yas<=5) 10... printf(“Bebeksiniz!”); 11... if (yas>5) 12... printf(“Bebek değilsiniz!”); 13... getch(); 14...}

Örnek program çıktıları:

Yaşınızı Giriniz: 4 Bebeksiniz!

Page 58: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

58

Yaşınızı Giriniz: 18 Bebek değilsiniz!

Açıklama: Programda her iki if cümlesinde de bloklar tek cümleden oluştukları için blok işareti içine alınmamıştır.

8. satırdaki scanf() cümlesiyle, integer tanımlanmış “yas” değişkenine alınan değer, ilkönce 9. satırdaki if cümlesiyle kontrol edilmektedir. Bu değer 5 ya da daha küçük ise 10. satırdaki printf() cümlesi icra edilecek ve ekrana “Bebeksiniz!” mesajı gelecek ve 11. satıra geçilecektir. Eğer değer 5’ten büyükse direk 11. satıra geçilecek ve yeni bir if cümlesiyle tekrar kontrol edilecektir. Eğer “yas” değişkeninin değeri 5’ten büyük ise 12. satır ile ekrana “Bebek değilsiniz!” mesajı yazılacaktır. Ve 13. satırdan devam edilecektir. Eğer “yas” değişkeninin değeri 5’ten küçükeşit değilse 12. satır icra edilmeden 13. satıra geçilecektir. Örnek: Bir önceki örneğin 9,10,11 ve 12. satırları değiştirilirse,

1.....#include<stdio.h> 2.....#include<conio.h> 3.....int yas; 4.....void main() 5.....{ 6..... clrscr(); 7..... printf(“Yasınızı Giriniz:”); 8..... scanf(“%d”,&yas); 9..... if (yas>40) 10... { 11... printf(“Yaslanıyorsunuz!”); 12... if (yas>60) 13... printf(“\nHatta yaslısınız!”); 14... } 15... getch(); 16...}

Örnek program çıktıları:

Yaşınızı Giriniz: 45 Yaslanıyorsunuz!

Yaşınızı Giriniz: 65 Yaslanıyorsunuz! Hatta yaslısınız!

Page 59: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

59

Açıklama: 9.satırdaki if bloğu içinde 1’den fazla cümle blok içinde olduğu için 10 ve 14. satırdaki blok işaretiyle blok içine alınmıştır. 9. satırdaki if cümlesiyle yaş değeri kontrol ediliyor. Eğer yas 40’tan büyükse 11. satırdaki printf() cümlesiyle “Yaslanıyorsunuz!” mesajı verilecektir ve 12. satıra geçilecektir. Eğer yas 40’tan küçükse doğrudan if bloğunun sonu olan 15. satıra geçilecektir.

12.satırda “yas” değişkeninin değeri 60’dan büyükse 13. satırdaki printf() cümlesi ile bir alt satıra geçilerek ekrana “Hatta yaslısınız!” mesajı verilecektir ve 15. satırdan devam edilecektir. Örnek:

: : if(10==10==10) : :

ifadesinin sonucu false(0) olacaktır. Çünkü “==” sorgusu soldan sağa doğru çalışır. Soldaki “10==10” sorgusunun sonucu true(1) olacaktır. Bu durumda 2. sorgu da “1==10” olacağından sonuc false(0) olacaktır.

7.1.2 IF-ELSE Şart Cümlesi Yazım Şekli:

if (şart ifadesi) { blok1; } else { blok2; }

Cümlede şart ifaesine bakılır. Eğer doğru ise blok1 icra edilir. Eğer yanlış ise blok2 icra edilir. Her 2 durumdan sonra da if-else cümlesinin sonuna gidilir. Burada da bloklar 1’den fazla cümleden oluşuyorsa blok işaretleri kullanılır. Örnek:

Page 60: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

60

1.......#include<stdio.h> 2.......#include<conio.h> 3.......int yas; 4.......void main() 5.......{ 6.......clrscr(); 7.......printf(“Yasınızı Giriniz:”); 8.......scanf(“%d”,&yas); 9.....if (yas>0) 10.... if (yas<6) 11........ printf(“Bebeksiniz”); 12.... else 13........ if (yas<14) 14........ printf(“Cocuksunuz”); 15........ else 16........ if (yas<24) 17........ printf(“Gençsiniz”); 18........ else 19........ if (yas<40) 20........ printf(“Olgunsunuz”); 21........ else 22........ if (yas<60) 23........ printf(“Yaslanıyorsunuz”); 24........ else 25........ printf(“Yaslısınız”); 26....else 27.... printf(“Yası yanlıs girdiniz”); 28....getch(); 29....}

Program Çıktısı:

Yaşınızı Giriniz: 30 Olgunsunuz

Yaşınızı Giriniz: 70 Yaslısınız

Yaşınızı Giriniz: 0 Yası yanlıs girdiniz

Page 61: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

61

Açıklama: 9. satırdaki if kontrol cümlesi “yaş” değerinin doğru girilip girilmediğini kontrol etmektedir. Eğer pozitif bir değer girilmişse programa devam edilecektir. Negatif değer girilmişse 25. satırdaki else ifadesiyle 26. satırdaki printf() cümlesiyle kullanıcıya değeri yanlış girdiği mesajı verilerek 27. satıra geçilecektir. Eğer pozitif değer girilmişse 10. satır ile 24. satırın arasına içiçe if-else kontrol cümleleriyle sağlanan şarta ait blok icra edilerek 27. satırdan devam edilecektir. Örnek: Seçenekli 4 işlem problemi. Kullanıcı, gireceği iki sayı için (+,-,*,/) işlemlerinden birini belirleyerek sonucu ekranda görmektedir:

#include<stdio.h> #include<conio.h> #include<stdlib.h> float x,y,sonuc; char islem; void main() { clrscr(); printf(“ilk sayıyı giriniz:”); scanf(“%f”,&x); printf(“ikinci sayıyı giriniz:”); scanf(“%f”,&y); printf(“islemi giriniz(+,-,/,*):\n”); islem=getch(); if (islem == ‘+’) sonuc=x+y; else if (islem == ’-‘) sonuc=x-y; else if (islem == ‘/’) sonuc=x/y; else if (islem == ‘*’) sonuc=x*y; else { printf(“islemi yanlıs girdiniz!”); exit(0); } printf(“%c isleminin sonucu:%.2f”,islem,sonuc); getch(); }

Program çıktısı:

Page 62: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

62

ilk sayıyı giriniz:22 ikinci sayıyı giriniz: 7 islemi giriniz(+, -, /, *): + isleminin sonucu: 3.14

Açıklama: Programda, kullanıcıdan iki sayı ve ardından, bu sayılar arasında yapılacak 4 işlemden herhangi birinin girilmesi beklenmektedir. Kullanıcının seçimine göre iki sayı arasında işlem yapılmakta ve sonuç ekrana verilmektedir. Kullanıcının seçtiği işlemin kontrolü, if-else blokları ile yapılmaktadır.

Burada islemin kullanıcı tarafından girilmesini sağlayan cümle “islem=getch();” cümlesidir. Daha önce getch() fonksiyonu, program bitiminde kullanıcı bir tuşa basana kadar beklenerek programın çıktısının görülmesini sağlamak için kullanılmıştı. Bu sayede Alt+F5’e basılarak kullanıcı ekranına bakma zahmeti ortadan kalkmış oluyordu. Basılan tusun ne olduğu önemli değildi. Ama bu programda getch() fonksiyonundan daha farklı bir şekilde faydalanılmıştır. Bu programda getch() fonksiyonu sayesinde basılan tuşun değeri bir degişkende saklanılabilmiştir. “islem=getch();” cümlesi icra edilirken, kullanıcının bir tuşa basması beklenir ve kullanıcı bir tusa bastığında bu tuşun değeri, char tipinde olan “islem“ değişkenine atama operatörüyle(“=”) aktarılır. Böylece dışarıdan bir karakter okutulmuş olur.

İşlemin sonucunu ekrana çıkartan printf() cümlesinde kullanılan “%.2f” deki “.2” nin anlamı şudur: ekrana ondalıklı olarak yazılacak sonucun virgülden sonraki kısmı 2 haneli olacaktır. Dikkat edilirse sonuç “3.14” dür. Eğer direk “%f” kullanılsaydı sonuc, 3.142857 şeklinde yazılacaktı. Eğer “%.4f” kullanılsaydı sonuc, 3.1428 şeklinde olacaktı.

7.1.3 Üçlü Koşul İfadesi (?:) Yazım Şekli:

(Şart_ifadesi)?(cümle1):(Cümle2);

Şart ifadesine bakılır. Sonuç doğru(true) ise cümle1 doğru değilse(false) cümle2 icra edilir. Örnek:

:

if (a>b) deger=10; else deger=25;

:

:

(a>b)?(deger=10):(deger=25); :

Page 63: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

63

Örnek:

: (deger=a>b)?(10):(25);

:

a>b karşılaştırmasına göre sonuç doğru(true) ise “deger” 10’a eşit olacaktır. Değilse 25’e eşit olacaktır. C derleyicisi bu kullanıma müsade etmektedir. Ancak böyle yazılmış bir programın okunması oldukça güçtür. Bu nedenle pek fazla tercih edilmemektedir. Örnek:

#include<stdio.h> #include<conio.h> void main() { int sicaklik,ayar=20; clrscr(); printf(“Termostat 20 dereceye göre ayarlanacaktır”); printf(“\nŞu anki sıcaklık degerini girin[0-1000]:”); scanf(“%d”,&sicaklik); printf(“Sıcaklık %s \n”,(sicaklik> ayar)?(”Normalin üstünde”) :(”Normal”)); getch(); }

Program Çıktısı:

Termostat 20 dereceye göre ayarlanacaktır Şu anki sıcaklık degerini girin[0-1000]: 26 Sıcaklık Normalin üstünde

7.1.4 SWITCH Deyimi Yazım Şekli:

switch (kontrol ifadesi) { case deger1: blok1; break; case deger2: blok2; break;

Page 64: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

64

: :

case degerN: blokN;break; default: blok; }

Kontrol ifadesinin sonucuna bakılır. Bu ifade sonucunun değeri case’lerle verilen değerlerden hangisine eşit olursa o case’e ait blok icra edilir ve break komutuyla switch cümlesinin sonuna atlanır. Hiç biri bu eşitliği sağlamazsa default ile verilen blok icra edilir. Eğer break’ler kullanılmazsa değeri sağlasa da sağlamasa da bütün case’lere uğranılır ve değeri sağlayan ilk case’den itibaren diğer tüm case’lerin blokları icra edilir. default ifadesi isteğe bağlıdır. Bir switch deyiminde default ifadesi kullanılmayabilir. Kontrol cümlesinde elde edilecek değerin tipinin char veya int olması gerekmektedir.

#include<stdio.h> #include<conio.h> #define BEEP printf(“\aBEEP\n”); int beepsayisi; void main() { clrscr(); printf(“1 ile 5 arasında bir sayı giriniz:”); scanf(“%d”,&beepsayisi); switch(beepsayisi) { case 5:BEEP; case 4:BEEP; case 3:BEEP; case 2:BEEP; case 1:BEEP; } getch(); }

Program Çıktısı:

1 ile 5 arasında bir sayı girin:3 BEEP BEEP BEEP

Açıklama:

Page 65: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

65

case cümlelerinde break kullanılmadığı için, 1 ile 5 arasında hangi sayı girilirse o sayıya ait case’den itibaren tek “BEEP” makrosundan oluşan bütün bloklar icra edilir. break komutları kullanılsaydı, 1 ile 5 arasında girilecek sayıyı sağlayan case’deki “BEEP” makrosu icra edilir ve switch terk edilirdi. Örnek:

#include<stdio.h> #include<conio.h> float x,y; char islem; void main() { clrscr(); printf(“ilk sayıyı giriniz:”); scanf(“%f”,&x); printf(“ikinci sayıyı giriniz:”); scanf(“%f”,&y); printf(“işlemi giriniz[+,-,/,*]:\n”); islem=getch(); switch(islem) { case ‘+’ : printf(“Toplam:%.3f”,x+y);break; case ‘-‘ : printf(“Fark:%.3f”,x-y);break; case ‘/’ : printf(“Bölüm:%.3f”,x/y);break; case ‘*’ : printf(“Carpım:%.3f”,x*y);break; default : printf(“Yanlış Giriş’”); } getch(); }

Program Çıktısı:

İlk sayıyı giriniz: 10 İkinci sayıyı giriniz: 20 İşlemi giriniz[+,-,/,*]: + Toplam:30.00

Page 66: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

66

Konu Sonu Alıştırmalar 1. Dışarıdan okutulacak 2 tamsayıyı karşılaştırıp küçük olanı ekrana yazdıran programı,

a) “if” cümlesi kullanarak, b) Üçlü koşul ifadesi kullanarak,

yazınız. 2. Dışarıdan okutulacak 3 tamsayıdan önce büyük olanı, sonra orta değere sahip olanı ve sonra da küçük olanı,

a) Alt alta, b) Yan yana ve aralarında “tab” bırakılarak,

yazdıran programı her “if” cümlesinde sadece bir karşılaştırma yaparak yazınız. 3. İkinci sorudaki programı serbest olarak yazınız. 4. Sayfa 10’da akış diyagramı verilen ve 2. dereceden denklem köklerini bulduran problemin programını,

a) “if” deyimi, b) Üçlü koşul ifadesi, c) “switch” deyimi,

kullanarak yazınız. 5. Numarası verilen ayın adını Türkçe olarak ekrana yazdıracak programı,

a) “if” cümlesi, b) “switch” deyimi,

kullanarak yazınız. 6.

1. Kayıt 2. Listeleme 3. Düzeltme 4. Silme 5. Çıkış Seçiminiz[1-5]? :

Yukarıda verilen menüyü hazırlayınız. İlk 4 seçimde ekrana “Henüz hazır değil” mesajı yazdırılacaktır. 5 seçilirse hiçbir şey yazılmadan programdan çıkılacaktır. 7. Klavyeden basılan tuşun ASCII kod karşılığını ekrana yazdıran programı yazınız.

Page 67: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

67

8. Klavyeden basılan tuşun sayı, büyük harf, küçük harf veya özel işaret( ?, : . ={}[] v.s.) olup olmadığını bulan ve ekrana yazdıran programı yapın. 9. 100’lük not sistemine göre klavyeden okutulan notların harflik sisteme göre karşılığını ekrana yazdıran programı yazınız.

A: 84-100 B: 65-83 C: 50-64 D: 0-49

10.

1.İstanbul 2.Alaska 3.Singapur 4.Londra 5.Brasilia 6.Meksico City Gidilecek yeri seçiniz[1-6]:

Yukarıda verilen merkezlerin Greenwich’e göre saat farkları,

İstanbul: +2.00 Singapur: -9.00 Londra: 0.00 Brasilia: -3.00 Meksico City: -6.00

şeklinde verilmiştir. Buna göre İstanbuldan hareket edecek bir yolcu, seçeceği merkeze göre saatini + veya – nasıl ayarlamalıdır?

Page 68: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

68

7.2 DÖNGÜ CÜMLELERİ

7.2.1 While Döngüsü Yazım şekli:

while(şart ifadesi) { blok; }

Şart ifadesi TRUE(1) olduğu sürece blok tekrar takrar icra edilir. Şart ifadesi FALSE(0) olduğu zaman döngünün dışına çıkılır. Döngüden etkilenecek blok, {...} işaretleri arasına alınır. Blok tek cümle ise blok işaretleri kullanılmayabilir. Örnek:

#include<stdio.h> #include<conio.h> int i=1,toplam=0; void main() { clrscr(); while(i<=10) { toplam=toplam+i; i++; } printf(“\n1’den 10’a kadar olan sayıların toplamı=%d”,toplam); getch(); }

Program çıktısı:

1’den 10’a kadar olan sayıların toplamı=55

Açıklama:

1 ilk değeriyle “while” döngüsüne girecek olan “i” değişkeni (i<=10) şartıyla test edilmektedir. Şart sağlandığı sürece iki cümleden oluşan ve {...} arasına alınmış olan blok, tekrar tekrar icra edilecektir. Şartın bozulması için bloğa “i++;” cümlesi eklenmiştir.

Page 69: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

69

“i++;” cümlesiyle her bir tekrarda i’nin değeri 1 artırılacaktır. “i” değişkeni son olarak 11 değerini aldığı zaman şart bozularak ve döngüden çıkılacaktır. Her bir tekrarda “toplam=toplam+i;” cümlesiyle toplam değişkenine i değişkeninin değeri eklendiği için döngüden çıkıldığı zaman toplam değişkenindeki değer 55 olacaktır. Adımlar i toplam İlk değer 1 0 1 0 + 1 1.adım 2 1................ toplam=toplam + i; 3 1 + 2 2.adım 3 3.........................................................toplam=toplam + i; 3.adım 4 6 4.adım 5 10 5.adım 6 15 6.adım 7 21 7.adım 8 28 8.adım 9 36 9.adım 10 45 10.adım 11 55 Atama cümleleri(=) sağdan sola doğru işletilir. Önce eşitliğin sağ tarafı hesaplanır. Daha sonra eşitliğin sol tarafıyla bellekte gösterilen yere atanır. Örneğin ilk adımda, i ve toplam değişkenleriyle bellekten ayrılan yerlerden değerler alınarak toplanır ve sonuç toplam değişkeniyle bellekte gösterilen yere yazılır.

İlk değerlerle bellek: “int i=1,toplam=0;” cümlesiyle ilk değerler verilmiştir:

toplam 0

i 1

1.adım: İlk adımda,

toplam = toplam+i; i++;

satırlarının icrasından sonra bellek görünümü,

toplam 1

i 2

şeklindedir.

Page 70: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

70

Bu adımdan önce “toplam” değişkeninin ilk değeri 0, “i” değişkeninin değeri 1 olarak verilmişti. Bu adımda ise “toplam=toplam + i;” cümlesi ile önce “toplam+i” ifadesi hesaplanmış ve bu ifadenin sonucu “toplam” değişkeninde saklanmıştır. Dolayısıyla 0 ile 1 toplanarak sonuç 1 bulunmuş ve “toplam” değişkenine atanmıştır. Ardından, “i++;” cümlesi ile bir artırılarak i değişkeninin değeri 2 olmuştur. 2.adım: İkinci adımda,

toplam = toplam+i; i++;

satırlarının icrasından sonra bellek görünümü,

toplam 3

i 3

şeklindedir. Diğer adımlar da bu şekilde devam ederek son adımda aşağıdaki bellek görüntüsüne ulaşılmaktadır:

toplam 55

i 11

Örnek:

#include<stdio.h> #include<conio.h> char devam=’E’; int not,i=0; float ort,toplam=0; void main() { clrscr(); while(devam==’E’ || devam==’e’) { i++; printf(“%d. Notu giriniz:”,i); scanf(“%d”,&not); toplam+=not; printf(“Devam mı(E/H)?:\n”); devam=getch(); }

Page 71: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

71

ort=toplam/i; printf(“%d kişilik sınıfın not ortalaması:%.2f”,i,ort); getch(); }

Örnek program çıktısı:

1.notu girin: 50 Devam mı(E/H)?:E 2.notu girin: 60 Devam mı(E/H)?:E 3.notu girin: 58 Devam mı(E/H)?:H 3 kişilik sınıfın not ortalaması: 56.00

Açıklama: Kullanıcının gireceği not sayısı while döngüsündeki “devam“ değişkeniyle kontrol edilmektedir. Böylece kullanıcı, döngüden çıkmadan istediği kadar not girebilmektedir. Kullanıcı, notların bittiğine karar verdiği an “Devam mı(E/H)?” sorusuna ‘H’ cevabını verecektir ve “devam” değişkeninin alacağı bu değer(‘H’) şartı bozduğundan, döngüden çıkılacaktır. Döngüden çıktıktan sonra ortalama hesaplanarak ekrana yazdırılmaktadır. Örnek:

1 ))1((1

11)(

nn

n

nx

x

xxf

serisinin toplamını bulup yazdıracak programı yazınız. (x değeri dışarıdan okutulacak ve serinin sadece ilk 75 terimi alınacak)

#include<stdio.h> #include<conio.h> #include<math.h> int n=0; float x,terim,top=0; float pay,payda; void main() { clrscr();

Page 72: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

72

printf(“x değerini giriniz:”); scanf(“%f”,&x); terim=1+(1/(x+1)); top=top+terim; while(n<=75) { n++; pay=pow(x,n); payda=pow(x+n+1,n); terim=pay/payda; top=top+terim; } printf(“x=%.2f”,x); printf(“\nf(%.2f)=%f”,x,top); getch(); }

Program çıktısı:

x değerini giriniz:0.1 x=0.10 f(0.10)=1.957765

7.2.2 Do-While Döngüsü Yazım şekli:

do{ blok; } while(şart ifadesi);

Blok 1 defa icra edilir ve while ile verilen şart ifadesine bakılır. Şart ifadesi yanlış ise çıkılır, doğru ise blok tekrar tekrar icra edilir. while döngüsünden farkı, şarta bakılmadan bloğun en az bir kez icra edilmesidir. Şart, bloğun icrasından sonra kontrol edilmektedir. Bunun dışında çalışma şekli while döngüsü ile aynıdır. Örnek:

#include<stdio.h> #include<conio.h> char devam; int not,i=0; float ort,toplam=0;

Page 73: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

73

float pay,payda; void main() { clrscr(); do{ i++; printf(“%d. notu giriniz:”,i); scanf(“%d”,&not); toplam+=not; printf(“devam mı(E/H)?:\n”); devam=getch(); }while(devam==’E’ || devam==’e’); ort=toplam/i; printf(“%d kişilik sınıfın ortalaması:%.2f”,i,ort); getch(); }

Örnek program çıktısı:

1. notu giriniz:55 devam mi(E/H)?:e 2. notu giriniz:64 devam mi(E/H)?:e 3.notu giriniz:35 devam mi(E/H)?:h 3 kişilik sınıfın ortalamasi:51.33

Açıklama:

Aynı örnek daha önce while ile yapılmıştı. Orada, “devam” değişkenine şartın “TRUE(1)” olmasını sağlayacak bir ilk değer vererek döngüye girmek zorunda kalmıştık. Ancak, yukarıdaki örnekte de görüleceği gibi do-while döngüsünde şarta bakılmadan direk döngüye girilir ve blok en az bir kez icra edilir. Bu sebeple do-while döngüsüne girmek için ilk değer vermek gerekmemektedir. Örnek: Aşağıdaki gibi 1-4 arası bir sayı girildiğinde o seçime ait mesajın verildiği, 5 girildiğinde menü programından çıkmayı sağlayacak programı yazın. Örneğin 3 girildiğinde ekrana “Düzeltme henüz tamamlanmadı!” mesajı verilecektir.

1.Bilgi girişi 2.Listeleme 3.Düzeltme 4.Silme 5.Çıkış Seçiminiz[1-5]? :

Page 74: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

74

#include<stdio.h> #include<conio.h> #define DOGRU 1 #define YANLIS 0 short int devam,sec;

void main() { do{ clrscr(); devam=DOGRU; printf(“1.Bilgi Girişi”); printf(“\n\n2.Listeleme”); printf(“\n\n3.Düzeltme”); printf(“\n\n4.Silme”); printf(“\n\n5.Çıkış”); printf(“\nSeçiminiz[1-5]:”);scanf(“%d”,&sec); switch(sec) { case 1: printf(“\nBilgi girişi henüz tamamlanmadı!”); break; case 2: printf(“\nListeleme henüz tamamlanmadı!”); break; case 3: printf(“\nDüzeltme henüz tamamlanmadı!”); break; case 4: printf(“\nSilme henüz tamamlanmadı!”); break; case 5: devam=YANLIS; printf(“cikis icin ”); break; default: printf(“Lütfen 1-5 arası değer giriniz!”); } printf(“\nBir tuşa basınız!”); getch();

}while(devam); }

Örnek program çıktısı:

1.Bilgi girişi 2.Listeleme 3.Düzeltme 4.Silme 5.Çıkış Seçiminiz[1-5]? :4 Silme henüz tamamlanmadı!

Bir tuşa basınız!

Page 75: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

75

Açıklama: Menü programlarında isteğe bağlı olarak çıkışı sağlayabilmek için menüye genellikle çıkış kısmı eklenir. Çıkış işlemi seçilmedikçe tekrar tekrar menüde istenilen seçenek işletilebilir. Bu tekrarı sağlayabilmek için genellikle do-while yapısı kullanılır. Yukarıdaki örnekte de bu amaçla kullanılan do-while döngüsünden ancak çıkış bölümünde devam değişkenine sıfır atayarak çıkabiliriz. Aksi durumda “devam” değişkeni 1 değerini alacaktır(“devam=DOGRU;”) ve sürekli döngüde kalacaktır. “devam” değişkenine sıfırın atanması, 5. case’deki “devam=YANLIS;” ile gerçekleşmektedir.

NOT: “while(devam);” ifadesi “while(devam!=0);” ifadesinin eşdeğeridir.

7.2.3 For Döngüsü Yazım şekli:,

for(deyim1;şart ifadesi;deyim2) { blok; }

deyim1 icra edilir ve şart ifadesine bakılır. Şart ifadesi doğru ise blok icra edilir. Daha sonra deyim2 icra edilerek tekrar şart ifadesine bakılır. Eğer şart ifadesi doğru(1) ise tekrar blok ve deyim2 icra edilir. Şart ifadesi yanlış sonuç verene kadar bu şekilde devam edilir. for döngüsünün işleyişini, aşağıdaki akış diyagramıyla açıklayabiliriz:

Basla

deyim1

Sart dogru mu?

Blok

deyim2

SonEVET

HAYIR

Page 76: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

76

Örnek: 1’den 10’a kadar olan tamsayıları ekrana yazdıran program:

1.....#include<stdio.h> 2.....#include<conio.h> 3..... int i; 4..... void main() 5..... { 6..... clrscr(); 7..... for(i=1;i<=10;i++) 8..... printf(“%d\n”,i); 9..... getch();

10.....}

Program çıktısı:

1 2 3 : 10

Açıklama:

for(i=1; i<=10 ;i++) deyim1 deyim2 şart ifadesi İlk olarak deyim1 icra edilerek “i” değişkenine 1 atanır. Sonra “i<=10” şart ifadesi kontrol edilir. Doğru(1) olduğu için 8. satırdaki printf() cümlesi ile “i” değişkeninin değeri ekrana yazılır. Ardından deyim2 icra edilerek “i” değişkeninin değeri bir artırılır. Tekrar şart ifadesine bakılır. Doğru olduğu için 8. satırdaki printf() ile “i” değişkeninin yeni değeri ekrana yazdırılır. “i” değişkeninin değeri 1 artırılır. Şart ifadesi bozuluncaya kadar, yani “i” değişkeninin değeri 10’dan büyük oluncaya kadar devam edilir. Eğer 10’dan 1’e doğru sayıları yazdırmak istersek 7.satırdaki for döngüsünü aşağıdaki şekilde değiştirmemiz yeterli olacaktır:

: for(i=10; i>=1; i--);

:

NOT: “i>=1” yerine sadece “i” yazılabilir. Sadece “i” yazılması, i’nin sıfır olması durumunda döngü dışına çıkılacağı anlamına gelir.

Page 77: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

77

Örnek: ASCII kod tablosundaki karakterleri ekrana her bir satıra 16 karakter gelecek şekilde yazdıran program:

1.....#include<stdio.h> 2.....#include<conio.h> 3..... int i; 4..... void main() 5..... { 6..... clrscr(); 7..... for(i=0;i<=255;i++) 8..... if (i%16) 9..... printf(“%c”,i);

10..... else 11..... printf(“\n%c”,i); 12..... getch(); 13..... }

Açıklama: 7. satırdaki for döngüsüyle, i=0’dan 255’e kadar birer birer artırılarak ASCII kod karşılıkları printf() cümlesindeki “%c” ifadesiyle ekrana yazdırılmaktadır. Örneğin i=65 olduğu zaman i değişkeni “%c” formatıyla ekrana yazdırıldığında ekranda “A” karakteri gözükecektir. Bu tablonun her satıra 16 karakter gelecek şekilde yazdırılması için 8. satırda if cümlesi kullanılmıştır. if cümlesiyle verilen “(i%16)” şartı, i değişkeni 16 ve 16’nın katları olduğu zaman sıfır, yani yanlış(false0) sonuç verecektir(i mod16 0). Dolayısıyla 11. satırdaki printf() cümlesindeki “\n” ile karakter yazılmadan önce 1 satır atlatılması sağlanacaktır. Bunun dışındaki durumlarda doğru(true1) sonucu çıkacaktır ve sadece karakter ekrana yazılarak döngüye devam edilecektir. Alt satıra geçilmeyecektir. Örnek: 1’den N’e kadar(en fazla 100) olan tek sayıların toplamını bulduran programı for döngüsü kullanarak aşağıdaki gibi yazabiliriz:

#include<stdio.h> #include<conio.h> int i,n,tektop=0; void main() { do{ clrscr(); printf(“N değerini giriniz:” );scanf(“%d”,&n); }while(!(n>0 || n<=100));

Page 78: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

78

for(i=1;i<=n;i=i+2) tektop=tektop+i; printf(“1’den %d’ye kadar olan tek sayıların \ntoplamı %d’dir”,n,tektop); getch(); }

Örnek program çıktısı:

N değerini giriniz:20 1’den 20’ye kadar olan tek sayıların toplamı 100’dir

Açıklama: Yukarıdaki örnekte, tek sayıların toplamı istendiği için i’nin ilk değeri 1 alınıp, daha sonra ikişer ikişer artırılarak sadece tek sayıların işleme alınması sağlanmıştır. Dolayısıyla i’nin değeri 1,3,5,7,......,19 (n=20 için) şeklinde artacaktır. Örnek: i=0 ve j=20 ilk değerleriyle başlanarak, her defasında i’nin değeri bir arttırılıp, j’nin de bir azaltılarak ekrana yazdırılacaktır. i=j olduğu zaman döngüden çıkılacaktır.

#include<stdio.h> #include<conio.h> int i,j; void main() { clrscr(); printf(“i \t j” ); for(i=0,j=20;i!=j;i++,j--) printf(“\n%d \t %d“,i,j); getch(); }

Program çıktısı:

i j 0 20 1 19 2 18 : : : : 10 10

Page 79: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

79

Açıklama: Bu örnekte de görüldüğü gibi for döngüsü içinde deyim1 ve deyim2 birden fazla cümleden oluşabilmektedir. Başlangıç değeri olarak deyim1’de aynı anda i=0 ve j=20 ataması yapılmıştır. Deyim2 ile de her adımda “i++” ile i’nin değeri bir artırılmış, “j--“ ile de j’nin değeri bir azaltılmıştır. Döngüdeki tekrar, “i!=j” (i eşit değil j) şartıyla sağlanmıştır. i, j’ye eşit olmadığı sürece döngü devam edecek ve “i=j” olduğunda döngüden çıkılacaktır. Örnek: y= ab üs hesabını yapan program:

#include<stdio.h> #include<conio.h> int i,b,a; long y=1; void main() { clrscr(); printf(“üssü giriniz:” ); scanf(“%d”,&b); printf(“tabanı giriniz:”); scanf(“%d”,&a); for(i=0;i<b;i++) y=y*a; printf(“%d’nin %d. kuvveti %ld’dir“,a,b,y); getch(); }

Örnek program çıktısı:

Üssü giriniz: 3 Tabanı giriniz: 2 2’nin 3. kuvveti 8’dir.

7.2.4 Break, Continue ve Goto deyimleri Break: Daha önce switch cümlesiyle de verilen bu komut döngü cümlelerinde de döngüyü sonlandırmak için kullanılır. Döngü içerisinde bu komuta rastlanırsa döngü terkedilir. Continue: Herhangi bir döngü cümlesinde kullanılabilir. Döngü içerisinde bu komuta rastlandığı yerden blok sonuna doğrudan atlanır ve döngüye devam edilir.

NOT: break deyiminde döngü terkedilir. continue’da ise döngü terkedilmez, döngüye devam edilir.

Page 80: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

80

7.2.5 Goto Yazım şekli:

goto etiket;

goto cümlesiyle programın içinde bulunduğumuz konumdan ileri veya geri herhangi bir farklı konuma atlayabiliriz. Programcı açısından okunurluğu ve takibi zorlaştırdığı için pek fazla kullanılmaz. Şart ve döngü komutları itinalı kullanıldığında bu cümleye ihtiyaç duyulmamaktadır. Örnek: 1-100 arasındaki asal sayıları bulduran program:

#include<stdio.h> #include<conio.h> #include<math.h> int karekok,i,j,tamam,sayı=0; void main() { clrscr(); for(i=2;i<=100;i++) { karekok=sqrt(i); tamam=0; for(j=2;j<=karekok;j++) { if(!(i%j)) { tamam=1; break; } } if(!(tamam)) { printf(“%d\t”,i); sayı++; } } printf(“\n [1-100] arasında toplam %d adet asal sayı var”,sayi ); getch(); }

Page 81: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

81

Program çıktısı:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 [1-100] arasında toplam 25 adet asal sayı var.

Açıklama: Asal sayıyı bulma kuralı: Bir sayı, kareköküne kadar olan tamsayılara bölünmüyorsa daha sonraki sayılara da bölünmez. Bu özelliğe sahip sayı asal sayıdır. Örneğin 17 sayısının karekökü yaklaşık 4’tür. 17 sayısı, 4’e kadar olan sayılara bölünemediği için 4’ten sonraki sayılara da bölünmez. Dolayısıyla 17 asal sayıdır.

Programda bu amaçla içiçe 2 döngü kullanılmıştır. Dıştaki döngü, 2 ile 100 arasındaki sayıları taramaktadır. İçteki ikinci döngü ise 2 ile o anki sayının karekökü arasındaki sayıları taramaktadır. Ancak içteki döngüyle tarama yapılırken sayının bölünebildiği herhangi bir değere rastlanınca döngüye devam etmek anlamsız olacağından, break ile içteki döngüye son verilmiştir. İçteki döngü tamamlanıp dış döngüye çıkıldığında “tamam” değişkeninin değeri halen 0 ise “i” değişken değerinin hiçbir sayıya bölünmediği anlaşılmıştır. Bu durumda “i” değişken değerinin asal sayı olduğu kabul edilerek ekrana yazdırılmıştır. ”sayı” değişkeni ile de asal sayıların sayısı belirlenmiştir. Örnek:

#include<stdio.h> #include<conio.h> int fin,but; char cevap; void main() { clrscr(); do{ printf(“\nfinal:”); scanf(“%d”,&fin); if (fin>=50) { printf(“Geçti!”); printf(“\nDevam mı(E/H)?:”); cevap=getch(); if(cevap==’e’ || cevap ==’E’) continue; else break; }

Page 82: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

82

printf(butunleme:”); scanf(“%d”,&but); fin=(fin+but)/2; if(fin>=50) printf(“Geçti!”); else printf(“Kaldı!”); printf(“Devam mı(E/H)?:); cevap=getch(); }while(cevap==’e’ || cevap ==’E’); }

Örnek program çıktısı:

final:55 Geçti! Devam mı(E/H)?:E final:47 butunleme:62 Gecti! Devamm mı(E/H)?:H

Örnek:

#include<stdio.h> #include<conio.h> int not; void main() { clrscr(); tekrar: printf(“Not giriniz:”); scanf(“%d”,&not); if(not<0 || not>100) { printf(“Yanlış giriş!\n”); goto tekrar; } printf(“Notunuz:%d”,not); getch(); }

Page 83: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

83

Örnek program çıktıları:

Not giriniz: 75 Notunuz:75

Not giriniz: 101 Yanlış giriş! Not giriniz:50 Notunuz:50

Page 84: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

84

Konu Sonu Alıştırmaları 1. Girilen bir sayının asal çarpanlarını bulan ve ekrana yazan programı yazınız.

2. Dışarıdan okutulan bir sayının sondan kaç basamağının sıfır olduğunu bulan programı yazınız.

3. Ekranda aşağıdaki şekillerde görüntü oluşturabilecek programları yazınız.

* * * * * * * * * * * * * * * * * * * * * * * * * (a)

* * * * * * * * * * * * * * * (b)

* * *

* * * * * * *

* * * * * (c)

4. Çarpım operatörü kullanmadan verilen iki sayıyı çarpan programı yazınız.

5. Onluk tabanda verilen 2 basamaklı bir sayıyı ikilik tabana çeviren programı yazınız.

6.

12

1........

9

1

7

1

5

1

3

11

n

Yukarıdaki işlemin sonucunu bulan programı yazınız.

7.

n

i

if0

2 , 50n

f değerini hesaplayan programı yazınız.

8. Verilen bir tamsayının(0<n<20) faktöriyelini hesaplayan programı yazınız.

Page 85: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

85

8 DİZİLER

C programlama dilinde tanımlı standart tiplerden herhangi birine ait 1’den fazla eleman grubu için bellekte yer ayrılması istenildiği zaman bu iki şekilde yapılabilir: Daha önce öğrenilen değişken isimleri ve tipleriyle yer ayırma: Bunun için her

bir elemana ayrı bir değişken ismi verilmesi gerekir. Örneğin 20 elemanlı bir tamsayı grubu düşünülürse, 20 değişik değişken ismi vermek ve programlama yaparken bunları sürekli hafızada tutmak oldukça zordur. Eğer bu boyut yüzlerce veya binlerce olursa ne kadar büyük bir karmaşıklığın sözkonusu olacağı tahmin edilebilir.

20 kişilik bir sınıftaki öğrencilerin numaraları program içinde kullanılmak istenseydi, her bir elemana bir değişken adı verilmesi gerekirdi:

int ogr1,ogr2,ogr3,......,ogr20;

Aynı tipteki veri grubu diziler ile tek bir dizi ismi ile belirtilebilir: Veri grubunun

her bir elemanına ise o elemana ait indis ile ulaşılabilir. Örneğin, yukarıda belirtilen 20 kişilik sınıf şu şekilde tanımlanabilir: int ogrencino[20]; Burada ilk öğrenci ogrencino[0], ikinci ogrencino[1],.........,yirminci ogrencino[19] şeklinde indisler yardımıyla temsil edilmektedir. Matematikte de kullanılan bu yapının programlama dilinde doğrudan kullanılması, programcıya çok büyük avantajlar sağlayacaktır. Verilen örnekteki gibi diziler tek boyutlu olabileceği gibi 1’den fazla boyuta da sahip olabilir. Örneğin matris tanımı yapılabilmesi için iki boyutlu bir dizi tanımlanması yeterlidir.

8.1.1 C programlama dilinde dizi tanımı

Tek boyutlu dizi tanımı:

tip dizi_adı[eleman sayısı];

tip:

C’de tanımlı standart tiplerden herhangi biridir.

dizi_adı:

Daha önce değişken adı için verdiğimiz kurallar bunun için de geçerlidir.

eleman sayısı:

Oluşturulacak grubun eleman sayısıdır. Eleman sayısı köşeli parantez içinde belirtilmelidir.

Page 86: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

86

Örnek:

char a[10];

: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

:

8.1.2 Dizinin özellikleri

Elemanların yerleri indis değerleriyle belirlenir: Eleman sayısı, indisin alacağı en büyük değeri de belirlemektedir. Ancak C’de indis değeri sıfırdan başladığı için eleman sayısının bir eksiği, indisin alacağı en büyük değerdir. Örneğin yukarıdaki gibi 10 elemanlı bir karakter dizisinde dizinin ilk elemanına 0(sıfır) indisi ile “a[0]” şeklinde, 2. elemanına 1 indisi ile “a[1]” şeklinde, 10. ve son elemanına ise 9 indisi ile a[9] şeklinde erişilebilir. Dizinin herhangi bir elemanıyla işlem yapılacağı zaman bu indislerden faydalanılır. Örnek Kullanım:

: a[0]=’A’; printf(“%c”,a[4]); :

Dizinin ilk elemanına dizinin adıyla da erişilebilir: Çünkü dizinin adı doğrudan sıfır indisli ilk elemanın adresini göstermektedir. Örneğin “a” dizisi ismiyle yazdırılmak istenirse sadece a[0] elemanını yazacaktır:

printf(“%c”, *a);

cümlesi ekrana sadece a[0] elemanını yazdırır. “ * ” operatörü “a” adresinin içeriğini belirtir.Aynı cümle,

printf(“%c”,a[0]);

Page 87: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

87

şeklinde de ifade edilebilir. Dizi indisleri köşeli parantez içinde belirtilmelidir.

Dizinin elemanları bellekte ardışık bellek hücrelerine yerleştirilirler: Yani adres

ardışık bir şekilde arttırıldığında sırayla dizinin elemanlarına ulaşılabilir. Örneğin, *a dizinin 0 indisli elemanı, *(a+1) dizinin 1 indisli elemanı, : : *(a+9) dizinin 9 indisli son elemanı, gösterecektir. Dizilere ilk değerler tanımlama sırasında verilebilir:

Örneğin,

int ogrencino[10]={101,102,103,104,105,106,107,108,109,110};

şeklinde tanımlama yapılabilir. Bu durumda elemanların bellekteki yerleşimleri aşağıdaki gibi olur:

: ogrencino[0] 101 ogrencino[1] 102 ogrencino[2] 103 ogrencino[3] 104 ogrencino[4] 105 ogrencino[5] 106 ogrencino[6] 107 ogrencino[7] 108 ogrencino[8] 109 ogrencino[9] 110

: Bu şekilde ilk değer ataması yapılarak belirtilen dizi tanımlamalarında eleman sayısını belirtmeye gerek yoktur. Örneğin, yukarıdaki tanımlama,

int ogrencino[]={101,102,103,104,105,106,107,108,109,110};

şeklinde de yapılabilir. Dizileri çok boyutlu da tanımlayabiliriz: Örneğin, 2x2 cinsinden ve tamsayı

değerlerinden oluşan bir kare matris tanımı için, int matris[2][2];

Page 88: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

88

ifadesi kullanılabilir. İlk boyut, matrisin satır sayısını, ikinci boyut ise matrisin sütun sayısını belirtmektedir. Matris elemanlarına ulaşılabilmesi için aynı şekilde sırayla satır indisi ve sütun indisi kullanılması gerekir. Örneğin, 1 2 3 4 gibi bir matris,

int a[2][2]={{1 , 2} , {3 , 4}}; a[0][0] a[0][1] a[1][0] a[1][1] şeklinde tanımlanabilir. Ancak bilinmektedir ki dizinin elemanları, çok boyutlu da olsa bellekte ardışık olarak yer alacaktır. Dolayısıyla satırlar arasındaki blok işaretleri kullanılmayabilir. Yani yukarıdaki tanımlama, int a[2][2]={1,2,3,4}; şeklinde de yapılabilir. Örnek: 10 elemanlı bir tamsayı diziye dışarıdan değer okutma ve dizinin elemanlarını ters sırada ekrana yazdıran program:

#include<stdio.h> #include<conio.h> int i,a[10]; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i); scanf(“%d”,&a[i]); } printf(“Girilen dizi elemanları:\n”); for( ;i--; ) printf(“dizi[%d]:%d \t”,i,a[i]); getch(); }

Page 89: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

89

Program çıktısı:

Dizi elemanlarını giriniz: dizi[0]:1 dizi[1]:2 : dizi[9]:10 girilen dizi elemanları: dizi[9]:10 dizi[8]:9 dizi[7]:8 dizi[6]:7 dizi[5]:6 dizi[4]:5 dizi[3]:4 dizi[2]:3 dizi[1]:2 dizi[0]:1

Açıklama: İlk for döngüsünde ilk i değişkenine sıfırdan başlayarak dizinin indislerini gösterecek şekilde 9’a kadar değerler verilmektedir. Her bir değeri için printf() ve scanf() cümleleriyle ekrana hangi eleman olduğunu da göstererek dizi elemanları okutulmaktadır. Bu amaçla “&a[i]” ifadesi kullanılmıştır. i değişkeni sırayla [0-9] değerlerini alacaktır.

İkinci for döngüsüyle, dizi elemanları indis değeri 9’dan sıfıra azalacak şekilde ekrana tab ile yazdırılmaktadır.

“for( ; i-- ; )” cümlesinde deyim1 ve deyim2 ifadeleri kullanılmamıştır. Kontrol ifadesi olarak i’ nin kendisinin sıfır olup olmadığına bakılmıştır. Bu arada geri sayımı gerçekleştirmek için i’ nin değeri her defasında bir azaltılmıştır. Döngü 10 defa işletilmiştir. İndis değeri 9’dan sıfıra doğru azalarak yazdırılmıştır.

NOT: “for( ; i-- ; )” ifadesi, “for( ; (i--)!=0 ; )” le eşdeğerdir.

Örnek:

10 elemanlı bir diziyi okutarak, elemanlarının toplamını ve ortalamasını bulduran program:

#include<stdio.h> #include<conio.h> int i,a[10],toplam=0; float ort; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i);

Page 90: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

90

scanf(“%d”,&a[i]); } for(i=0;i<=9;i++) toplam+=a[i]; ort=toplam/i; printf(“Toplam:%d”,toplam); printf(“\n Ortalama:%.2f”,ort); getch(); }

Örnek program çıktısı:

Dizi elemanlarını giriniz: 10 15 20 25 20 30 40 35 10 45 Toplam:250 Ortalama:25.00

Örnek: 10 elemanlı bir tamsayı dizinin elemanları dışarıdan okutuluyor. Okutulacak başka bir değeri bu dizi içinde arayıp bulan ve konumunu ekrana yazdıran program:

#include<stdio.h> #include<conio.h> int i,a[10],sayi; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i); scanf(“%d”,&a[i]); } printf(“Aranılacak değer:”);

Page 91: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

91

scanf(“%d”,&sayi); for(i=0;i<=9;i++) if (a[i]==sayi) { printf(“%d sayısı dizinin %d indisli elemanıdır”,sayi,i); break; } getch(); }

Örnek program çıktısı:

Dizi elemanlarını giriniz: dizi[0]:12 dizi[1]:14 dizi[2]:23 dizi[3]:22 dizi[4]:32 dizi[5]:45 dizi[6]:33 dizi[7]:35 dizi[8]:54 dizi[9]:38 Aranılacak Değer:33 33 sayısı dizinin 6 indisli elemanıdır.

Örnek: 10 elemanlı dışarıdan girilen tamsayı bir dizideki elemanlardan yine dışarıdan okutulacak bir limit değerden küçük olanların sayısını bulduran program:

Page 92: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

92

#include<stdio.h> #include<conio.h> int i,a[10],l,adet=0; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i); scanf(“%d”,&a[i]); } printf(“Limit:”); scanf(“%d”,&l); for(i=0;i<=9;i++) adet+=(a[i]<l); printf(“%d’den küçük sayılar %d tanedir”,l,adet); getch(); }

Örnek program çıktısı:

Dizi elemanlarını giriniz: dizi[0]:12 dizi[1]:14 dizi[2]:23 dizi[3]:22 dizi[4]:32 dizi[5]:45 dizi[6]:33 dizi[7]:35 dizi[8]:54 dizi[9]:38 Limit:40 40’dan küçük sayılar 8 tanedir

Örnek: Elemanları dışarıdan okutulan 10 tamsayıdan oluşan bir dizinin en küçük ve en büyük elemanını bulduran program:

#include<stdio.h> #include<conio.h> int i,enk,enb;

Page 93: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

93

int a[10]; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i); scanf(“%d”,&a[i]); } enk=enb=a[0]; for(i=0;i<=9;i++) { if(a[i]<enk) enk=a[i]; if(a[i]>enb) enb=a[i]; } printf(“En büyük eleman %d”,enb); printf(“\nEn küçük eleman %d”,enk); getch(); }

Örnek program çıktısı:

Dizi elemanlarını giriniz: 12 14 23 22 32 45 33 35 54 38 En büyük eleman 54 En küçük eleman 12

Örnek: Dışarıdan okutulan 10 elemanlı bir tamsayı dizisini küçükten büyüğe doğru sıralayan program:

Page 94: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

94

#include<stdio.h> #include<conio.h> int i,,j,a[10],tampon; void main() { clrscr(); printf(“Dizi elemanlarını giriniz:\n”); for(i=0;i<=9;i++) { printf(“dizi[%d]:”,i); scanf(“%d”,&a[i]); } for(i=0; i<9; i++) for(j=i+1;j<10;j++) if(a[i]>a[j]) { tampon=a[i]; a[i] = a[j]; a[j] = tampon; } printf(“\nSıralı Dizi:\n”); for(i=0;i<=9;i++) printf(“%d\t”,a[i]); getch(); }

Örnek program çıktısı:

Dizi elemanlarını giriniz: 12 14 23 22 32 45 33 35 54 38 Sıralı Dizi: 12 14 22 23 32 33 35 38 45 54

Örnek:

Page 95: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

95

n ve m boyutları dışarıdan okutulan nxm boyutundaki matrisin elemanlarını okutarak alan ve ekrana yazdıran program(n ve m en fazla 50 olacak):

#include<stdio.h> #include<conio.h> int matris[50][50]; int i,j,n,m; void main() { clrscr(); printf(“Matris boyutlarını giriniz:\n”); do{ printf(“n=”); scanf(“%d”,&n); printf(“m=”); scanf(“%d”,&m); }while(!(n>0 && m>0 && n<=50 && m<=50));

printf(“Matris elemanlarını giriniz:\n”); for(i=0;i<n;i++) for(j=0;j<m;j++) { printf(“matris[%d][%d]=”,i, j); scanf(“%d”,&matris[i][j]); } printf(“Matrisi yazdırmak için herhangi bir tuşa basınız...”); getch(); clrscr(); for(i=0;i<n;i++) { for(j=0;j<m;j++) printf(“%d ”,matris[i][j]); printf(“\n”); } getch(); }

Örnek program çıktısı:

Matris boyutlarını giriniz: n=2 m=2 Matris elemanlarını giriniz: matris[0][0]:1 matris[0][1]:2 matris[1][0]:3 matris[1][1]:4

Page 96: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

96

Matrisi yazdırmak için herhangi bir tuşa basınız... 1 2 3 4

Örnek: a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 a22 a23 + b21 b22 b23 = c11 c12 c13 a31 a32 a33 b31 b32 b33 c11 c12 c13 Ekranda yukarıdaki şekilde a ve b matrislerini okutup toplayan ve sonucu c matrisiyle ekrana yazdıran program:

#include<stdio.h> #include<conio.h> int a[3][3], b[3][3], c[3][3]; int i,j,sat,sut; void main() { clrscr(); printf(“a ve b matrislerini giriniz:\n”); for(i=0;i<=2;i++) { sat=i+2; for(j=0;j<=2;j++) { sut=j*5+6; gotoxy(sut,sat); scanf(“%d”,&a[i][j]); } } sat=i/2 +2; sut+=3; gotoxy(sut,sat); printf(“+”); for(i=0;i<=2;i++) { sat=i+2; for(j=0;j<=2;j++) { sut=j*5+22; gotoxy(sut,sat); scanf(“%d”,&b[i][j]); } } sat=i/2+2;

Page 97: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

97

sut+=3; for(i=0;i<=2;i++) for(j=0;j<=2;j++) c[i][j]=a[i][j]+b[i][j]; gotoxy(sut,sat); printf(“=”); for(i=0;i<=2;i++) { sat=i+2; for(j=0;j<=2;j++) { sut=j*5+38; gotoxy(sut,sat); printf(“%d”,c[i][j]); } } getch(); }

Program çıktısı:

a ve b matrislerini giriniz:

1 1 1 2 2 2 3 3 3 1 1 1 + 2 2 2 = 3 3 3 1 1 1 2 2 2 3 3 3

Örnek: 5x5 boyutunda bir birim matris oluşturan ve ekrana yazdıran program:

#include<stdio.h> #include<conio.h> int a[5][5]; int i, j; void main() { clrscr(); for(i=0;i<=4;i++) for(j=0;j<=4;j++) if(i==j) a[i][j]=1;

Page 98: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

98

else a[i][j]=0; clrscr(); for(i=0;i<=4;i++) for(j=0;j<=4;j++) { gotoxy(j*5+5,i+2); printf(“%d”,a[i][j]); } getch(); }

Program çıktısı:

1 0 0 0 0 0 1 0 0 0 0 0 1 0 0

0 0 0 1 0 0 0 0 0 1

Örnek: 5x5 boyutunda alt üçgen matris oluşturan program:

#include<stdio.h> #include<conio.h> int a[5][5]; int i, j; void main() { clrscr(); for(i=0;i<=4;i++) for(j=0;j<=4;j++) if(i>=j) a[i][j]=1; else a[i][j]=0; clrscr(); for(i=0;i<=4;i++) for(j=0;j<=4;j++) { gotoxy(j*5+5,i+2); printf(“%d”,a[i][j]);

Page 99: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

99

} getch(); }

Program çıktısı:

1 0 0 0 0 1 1 0 0 0 1 1 1 0 0

1 1 1 1 0 1 1 1 1 1

Örnek: 3x3 boyutunda a ve b matrislerini dışarıdan okutarak c=a*b matrisini hesaplatıp yazan program:

#include<stdio.h> #include<conio.h> int a[3][3], b[3][3], c[3][3]; int i, j,k; void main() { clrscr(); printf(“a matrisini giriniz:\n”); for(i=0;i<3;i++) for(j=0;j<3;j++) { printf(“a[%d][%d]=”,i,j); scanf(“%d”,&a[i][j]); } printf(“b matrisini giriniz:\n”); for(i=0;i<3;i++) for(j=0;j<3;j++) { printf(“b[%d][%d]=”,i,j); scanf(“%d”,&b[i][j]); } printf(“a ve b matrislerinin çarpımları için bir tuşa basınız...”); getch(); for(i=0;i<3;i++)

Page 100: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

100

for(j=0;j<3;j++) for(k=0;k<3;k++) c[i][j]+=a[i][k]*b[k][i] ; printf(“\n”); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf(“c[%d][%d]=%d”,i, j, c[i][j]); printf(“\n”); } getch(); }

Program çıktısı:

a matrisini giriniz: a[0][0]=1 a[0][1]=1 a[0][2]=1 a[1][0]=1 a[1][1]=1 a[1][2]=1 a[2][0]=1 a[2][1]=1 a[2][2]=1 b matrisini giriniz: b[0][0]=1 b[0][1]=0 b[0][2]=0 b[1][0]=0 b[1][1]=1 b[1][2]=0 b[2][0]=0 b[2][1]=0 b[2][2]=1 a ve b matrisinin çarpımı için bir tuşa basınız...

c[0][0]=1 c[0][1]=1 c[0][2]=1 c[1][0]=1 c[1][1]=1 c[1][2]=1 c[2][0]=1 c[2][1]=1 c[2][2]=1

Page 101: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

101

8.2 KARAKTER DİZİLERİ(STRINGLER) C programlama dilinde ayrıca bir string tipi olmadığından, string ifadeler ancak char tipindeki diziler ile belirtilebilir. char tipiyle ASCII kod tablosundaki karakterlerden herhangi biri gösterilebilir. 1’den fazla karakter, ancak dizi tanımı kullanarak verilebilir. Örneğin “Ahmet”, 1’den fazla karakterden oluştuğu için bir stringtir. Bu, ancak bir karakter dizisiyle ifade edilebilir. ‘A’ ifadesi tek karakter olduğu için doğrudan char tipli bir değişkenle dizi kullanmadan gösterilebilir.

String ifadeler çift tırnak, karakter ifadeler ise tek tırnak içine alınarak belirtilir.

8.2.1 String Tanımlama Stringleri iki farklı şekilde tanımlayabiliriz: Karakter dizileri şeklinde tanımlama

char string_ismi[N];

N:

Karakter sayısı

String_ismi:

Herhangi bir değişken adı Örnek Tanımlama:

char adi[10]=”Ahmet”; tanımlaması sonucu bellek görüntüsü şu şekildedir:

: adi[0] ‘A’ adi[1] ‘h’ adi[2] ‘m’ adi[3] ‘e’ adi[4] ‘t’ adi[5] ‘\0’ adi[6] adi[7] adi[8] adi[9]

:

Page 102: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

102

Pointer kullanarak tanımlama

char *string_ismi;

string_ismi:

Herhangi bir değişken adi Bu tanımlamada boyut kullanılmaz. Boş bellek bölgesinden faydalanıldığı için belleğin kalan miktarının hepsi kullanılabilir. ”string_ismi” ile dizinin bellekteki ilk elemanının adresine işaret edilir. Örnek Kullanım:

: char *adi; : adi=”ahmet”; :

: adi[0] ‘A’ adi[1] ‘h’ adi[2] ‘m’ adi[3] ‘e’ adi[4] ‘t’

‘\0’ :

Bu şekilde boyutsuz dizi tanımlaması da yapmamız mümkündür. Bellek haritasında da görüldüğü gibi diziler pointer ile tanımlansa da dizi elemanlarına indislerle ulaşabiliriz.

Page 103: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

103

NOT: Karakter dizisi şeklinde tanımlanan string değişkene “=” atama cümlesiyle değer aktarılamaz. Bunun için string.h kütüphanesinde bulunan strcpy() fonksiyonu kullanılmalıdır. Ancak,

char adi[10]=”ahmet”;

ifadesinde olduğu gibi tanımlama esnasında ilk değer olarak verilebilir.

Örnek: : char ad[10]; : ad=”ahmet”; // yanlış : strcpy(ad,”ahmet”); // doğru :

Pointer ile yapılan tanımlamalarda ise “=” atama cümlesi olduğu gibi kullanılabilir: Örnek:

: char *ad; : ad=”ahmet”; // doğru :

Örnek:

#include<stdio.h> #include<conio.h> #include<string.h> char isim[10],isimsoyisim[25]; char *soyisim=” Halıcı”; void main() { clrscr(); printf(“isim:”);scanf(“%s”,isim); strcpy(isimsoyisim,isim); printf(“%s”,isimsoyisim); strcat(isimsoyisim,soyisim); printf(“\n%s”,isimsoyisim); getch(); }

Page 104: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

104

Program çıktısı:

isim:Mehmet Mehmet Mehmet Halıcı

Açıklama: Programda isim değişkenine bir string okutuluyor. Daha sonra “strcpy(isimsoyisim, isim);” cümlesiyle isimsoyisim string değişkenine isim değişkeninin içeriği kopyalanıyor. Bilindiği gibi karakter dizisi şeklinde tanımlanmış string değişkenlere, “=” operatörü ile atama yapılamaz. Bu tür atamalar için string.h kütüphanesinde tanımlı olan strcpy() fonksiyonundan faydalanılır.

İçeriği isim değişkeni ile aynı olan isimsoyisim değişkeni printf() cümlesi ile ekrana yazdırılıyor. Ardından “strcat(isimsoyisim,soyisim);” cümlesi ile isimsoyisim değişkeninin sonuna soyisim değişkeninin içeriği ekleniyor. Daha sonra isimsoyisim değişkeninin yeni değeri printf() fonksiyonu ile ekrana yazdırılıyor. char isim[10],isimsoyisim[25];

isim 0 1 2 3 4 5 6 7 8 9

isimsoyisim 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

char *soyisim=”Halıcı”;

soyisim 0 1 2 3 4 5 6 7 ‘ ’ ‘H’ ‘a’ ‘l’ ‘ı’ ‘c’ ‘ı’ ‘\0’

scanf(“%s”,isim); // Kullanıcının “Mehmet” girdiği kabul ediliyor

isim 0 1 2 3 4 5 6 7 8 9‘M’ ‘e’ ‘h’ ‘m’ ‘e’ ‘t’ ‘\0’

Page 105: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

105

strcpy(isimsoyisim,isim);

isimsoyisim 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24‘M’ ‘e’ ‘h’ ‘m’ ‘e’ ‘t’ ‘\0’ strcat(isimsoyisim,soyisim);

isimsoyisim 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24‘M’ ‘e’ ‘h’ ‘m’ ‘e’ ‘t’ ‘’ ‘H’ ‘a’ ‘l’ ‘ı’ ‘c’ ‘ı’ ‘\0’

NOT: ‘\0’ karakteri, stringlerin sonlandığını bildiren sonlandırma karakteridir.

8.2.2 String Dizileri

Daha önce stringleri karakter dizisi olarak tanımlamıştık. Stringlerden oluşan bir diziyi 2 boyutlu karakter dizisi şeklinde tanımlamamız gerekir. Bu boyutlardan ilki eleman sayısını(string sayısını), ikincisi ise stringlerin uzunluğunu(karakter sayılarını) gösterecektir. Örnek tanımlama: 20 kişilik bir isim listesi tutulması istenirse tanımlama şu şekilde yapılmalıdır:

char isimlist[20][10];

10:

İsimlerdeki karakter sayısı 20:

İsim sayısı isimlist:

String değişken

Page 106: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

106

Örnek:

#include<stdio.h> #include<conio.h> char isimlist[5][15]; int i; void main() { clrscr(); printf(“İsim listesini giriniz:\n”); for(i=0 ; i<5 ; i++) { printf(“isim[%d]:”,i); scanf(“%s”,isimlist[i]); } printf(“isimleri görmek için bir tuşa basınız:\n”); getch(); for(i=0 ; i<5 ; i++) printf(“%s\t”,isimlist[i]); getch(); }

Örnek program çıktısı:

İsim listesini giriniz: isim[0]:ahmet isim[1]:ali isim[2]:hasan isim[3]:ismail isim[4]:veli isimleri görmek için bir tuşa basınız... ahmet ali hasan ismail veli

Açıklama: Yukarıdaki örnekte hem karakter uzunluğu, hem de eleman sayısı “char isimlist[5][15];” tanımlamasında sınırlandırılmıştır. Bu sınırlandırma, derleyicinin bellekten kullanılacak alandan daha fazla yer ayrılmasına sebep olmuştur. Yukarıdaki tanımlamada, statik olarak bellekten 5x15=75 byte’lık yer istenecektir. Derleyici, 75 byte’lık bu bellek bölgesini programın sonuna kadar ayıracaktır. Fakat çoğu zaman bu bellek bölgesinin tamamı kullanılmaz. Dolayısıyla kullanılmayan bellek bölgeleri boşuna işgal edilmiş olacaktır.

Page 107: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

107

Bunun yanında 15 karakterle sınırlanılan isim uzunluğu programın çalışması esnasında yeterli olmayabilir. Buna rağmen derleyici girilecek isimleri 15 karakterle sınırlayacaktır.

Bu durumun getireceği iki sakıncalı durum vardır:

Yazılan stringin 15 karakterinden sonrası görülemeyecek.

Stringten sonra boşluk karakteri göremeyeceği için string sonunu algılayamadığından ikinci stringi 16. karakterden itibaren ilk stringe ekleyecektir. Boşluk karakterine rastlayıncaya kadar bu durum devam edecektir.

Örneğin, yukarıdaki programda isimlerden herhangi biri 15 karakterden fazla girilirse programda,

isim[0]:Abdurrahman_Çelebi isim[1]:Ahmet isim[2]:Ali : isimleri görmek için bir tuşa basınız... Abdurrahman_ÇelAhmet Ahmet Ali

çıktısı görülür. 15. karakter olan l karakterinden sonra hemen 2. isim(Ahmet) geleceği için, dizinin ilk elemanı yazdırılmak istendiğinde, stringin sonunu gösteren boşluk karakteri görülmeyeceğinden dolayı 2. ismi(Ahmet) 16. karakterden itibaren yazar. Yani sonlandırma karakteri görünceye kadar ilk string olarak kabul eder ve “Abdurrahman_ÇelAhmet” olarak ekrana çıkarır: 2. eleman 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24A b d u r r a h m a n _ Ç e l A h m e t ‘\0’ A l i ‘\0’ Sonlandırma karakterine kadar yazdırılan ilk kısım 3. eleman Sonlandırma Karakteri Yukarıdaki tüm dezavantajlardan kurtulmanın yolu, string dizisini tanımlarken bir boyutu serbest bırakmaktır. Stringin karakter sayısını gösteren boyut, pointer yapısı kullanılarak serbest bırakılabilir. Bu, hem bellek bölgesini ihtiyaç duyulan kadar kullanmayı sağlayacaktır, hem de değişen uzunlukta string girilmesini sağlayacaktır.

Yukarıdaki örnekte yapılan tanım aşağıdaki şekilde pointer kullanılarak değiştirilebilir:

char *isimlist[5];

Bu şekilde yapılan tanımlamada isimlist[0], isimlist[1].... isimlist[4] elemanlarının karakter sayıları sınırlı değildir ve bilgi girilmedikçe yer ayrılmaz. Bu 5 elemanın her biri birer pointer’dır( *isimlist[0], *isimlist[1].... *isimlist[4] ). Bir önceki tanımlamada ise elemanların

Page 108: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

108

karakter sayıları 15 ile sınırlıydı ve her biri için 15’er byte’lık yer program sonuna kadar ayrılıyordu.

8.3 POINTER(GÖSTERİCİ) Veri Tipi Pointer tipi veriler bellek gözü adresi gösteren değerlerden oluşur. Bu tür veriler ile, kullanılan bilgisayarın bütün belleğine doğrudan erişim sağlanabilir. Bu yapının kullanılmasındaki amaç, kullanılan bilgisayarın boş bellek alanlarından yararlanabilmek, daha hızlı erişim ve daha hızlı işlem yapabilmektir. Doğrudan adresin kendisi ile çalışıldığı için bilgisayarın donanımına rahat bir şekilde ulaşma imkanı verilmektedir.

Değişken isimleri belli bir bilginin bellek adresini temsil ederler. Adresin kendisini taşımazlar. Örneğin, “int x;” tanımlaması ile bellekte adresi ”&x” olan bir tamsayı değer için 2 byte’lık yer ayrılır:

int x;

: &y x’in

içeriği 2 byte

: long y;

: &y y’in

içeriği 4 byte

:

Değişkenlerin bellekteki yerlerine, yani adreslerine adres operatörü(&) kullanmadan daha rahat erişebilmek ve daha rahat işlem yapabilmek için bu adreslerin kendisini tutan pointer değişkenler tanımlayabiliriz. Pointer tanımlaması için “ * “ operatörü kullanılır.

Örneğin,

int *q;

ifadesi ile q pointer değişkeni tanımlanmıştır. Bu değişkenin gösterdiği bellek gözlerinde 2-byte tamsayı tutulabileceği belirtilmiştir. Buradaki q değişkeni yukarıda verilen x değişkeninden farklı olarak adres bilgisi tutar. Dolayısıyla x ile gösterilen bilgiye q pointer’ı ile ulaşabilmek için,

q=&x;

ataması yapılmalıdır. Bu tanımlamanın sonucunda aşağıdaki gibi bir ilişki ortaya çıkar:

: (&x)168 x’in içeriği

: :

q &x(168) :

Page 109: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

109

Değişik tiplerde de pointer tanımlanabilir: long *t; char *ch; double *db; float *fl; long double *ldb; Örneğin, “char *ch; “ tanımında,

* : pointer operatörü, ch : pointer değişkeni, char : tip ismidir

Burada ch pointer değişkeni bellekte char tipi için ayrılmış 1 byte’lık bellek gözünün adresini taşıyacaktır. Örnek:

1.....#include<stdio.h> 2.....#include<conio.h> 3..... char c=’B’; 4..... char d; 5..... char *p; 6..... void main() 7..... { 8..... clrscr(); 9..... p=&c; 10.... printf(“%c\n”, *p); 11.... d=*p; 12.... printf(“%c”,d); 13.... getch(); 14.... }

Program çıktısı:

B B

Açıklama: 6.satıra gelindiğinde 3,4 ve 5. satırlarda yapılan tanımlamalardan dolayı bellek görüntüsü aşağıdaki şekildedir:

Page 110: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

110

: 168(&c) ‘B’ 1 byte &c=168, c=’B’

: 796(&d) 1 byte &d=796, d=?

: 800(&p) 4 byte &p=800, p=?, *p=?

: (adres tutuyor,adres 4 byte)

9.satırın icrasından sonra bellek görüntüsü: p=&c;

: 168 ‘B’ 1 byte &c=168, c=’B’

: 796 1 byte &d=796, d=?

: 800 168 4 byte &p=800, p=168, *p=’B’ : (adres tutuyor,

adres 4 byte)

10.satır ile “p” pointer’ının taşıdığı 168 adresinin içeriği olan ‘B’ karakteri ekrana yazdırılacaktır. 11. satırın icrasından sonra bellek görüntüsü: d=*p;

: 168 ‘B’ 1 byte &c=168, c=’B’

: 796 ‘B’ 1 byte &d=796, d=’B’

: 800 168 4 byte &p=800, p=168, *p=’B’ : (adres tutuyor,

adres 4 byte)

Buradaki “d=*p;” ifadesi, “d=c;” ifadesinin aynısıdır. Çünkü “*p” ile c’nin içeriği

belirtilmektedir. Örnek:

#include<stdio.h> #include<conio.h> int x=10,y=20,z[3]; int *p; void main() { clrscr(); printf(“\nx’in değeri:x=%d”, x); printf(“\nx’in adresi:&x=%d”,&x); p=&x; printf(“\n p=&x p=%d, *p=%d”, p,*p);

Page 111: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

111

y=*p; printf(“\n y=*p y=%d”,y); *p=0; printf(“\n *p=0 x=%d”,x); printf(“\n z dizisi ilk elemanı adresi:&z[0]=%d”,&z[0]); p=&z[0]; // ya da p=z; çünkü z ≡ &z[0] dir printf(“\np=&z[0] p=%d”,p); *p=30; printf(“\n *p=30 z[0]=%d”,z[0]); getch(); }

Program çıktısı:

x’in değeri: x=10 x’in adresi: &x=148 p=&x p=148, *p=10 y=*p y=10 *p=0 x=0 z dizisi ilk elemanı adresi:&z[0]=176 p=&z[0] p=176 *p=30 z=30

Açıklama:

int x=10,y=20,z[3]; int *p; tanımlamalarından sonraki bellek görüntüsü:

: 148(&x) 10 2 byte &x=148, x=10

: 164(&y) 20 2 byte &y=164, y=20

: 176(&z[0]) 2 byte &z[0]=176, z[0]=? 178(&z[1]) 2 byte &z[1]=178, z[1]=? 180(&z[2]) 2 byte &z[2]=180, z[2]=?

: 324(&p) 4 byte &p=324, p=?, *p=?

:

Page 112: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

112

“p=&x;” satırının icrasından sonraki bellek görüntüsü:

:

148 10 2 byte &x=148, x=10 :

164 20 2 byte &y=164, y=20 :

176 2 byte &z[0]=176, z[0]=? 178 2 byte &z[1]=178, z[1]=? 180 2 byte &z[2]=180, z[2]=?

: 324 148 4 byte &p=324, p=148, *p=10

: “y=*p;” satırının icrasından sonra bellek görüntüsü:

: 148 10 2 byte &x=148, x=10

: 164 10 2 byte &y=164, y=10

: 176 2 byte &z[0]=176, z[0]=? 178 2 byte &z[1]=178, z[1]=? 180 2 byte &z[2]=180, z[2]=?

: 324 148 4 byte &p=324, p=148, *p=10

:

“y=*p;” cümlesi “y=x;” ifadesi ile aynı anlamdadır. Çünkü “*p”, x’in ta kendisidir. “*p=0;” satırının icrasından sonra bellek görüntüsü:

:

148 0 2 byte &x=148, x=0 :

164 10 2 byte &y=164, y=10 :

176 2 byte &z[0]=176, z[0]=? 178 2 byte &z[1]=178, z[1]=? 180 2 byte &z[2]=180, z[2]=?

: 324 148 4 byte &p=324, p=148, *p=0

: “*p=0;” cümlesi ile “x=0;” cümlesi aynı işlevdedir.

Page 113: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

113

“p=&z[0];” cümlesinden sonra bellek görüntüsü:

: 148 0 2 byte &x=148, x=0

: 164 10 2 byte &y=164, y=10

: 176 2 byte &z[0]=176, z[0]=? 178 2 byte &z[1]=178, z[1]=? 180 2 byte &z[2]=180, z[2]=?

: 324 176 4 byte &p=324, p=176, *p=?

:

Artık p pointer’ı z[0]’ı gösteriyor.

“*p=30;” satırından sonra bellek görüntüsü:

: 148 0 2 byte &x=148, x=0

: 164 10 2 byte &y=164, y=10

: 176 30 2 byte &z[0]=176, z[0]=30 178 2 byte &z[1]=178, z[1]=? 180 2 byte &z[2]=180, z[2]=?

: 324 176 4 byte &p=324, p=176, *p=30

: “*p=30;” cümlesi “z[0]=30;” ile aynı işleve sahiptir.

8.3.1 Pointer Aritmetiği Pointer değişkenler doğrudan adres tuttuğu için bu adresler üzerinde yapacağımız işlemler işaret ettiği verinin tipine bağlıdır. Eğer “char *p;” gibi bir karaktere pointer değişkeni var ise “p++;” cümlesi ile p pointerıyla işaret edilen bellek gözünün 1 byte ilerisine işaret edilmiş olunur. Aynı işlem “int *q;” gibi tamsayıya pointer değişkeni için yapılmış olsaydı(q++), q ile işaret edilen bellek gözünün 2 byte ilerisine işaret edilmiş olunacaktı. Bunun sebebi, ilk verinin karakter(1 byte), ikinci verinin ise integer(2 byte) olmasıdır. Örnek:

#include<stdio.h> #include<conio.h> char *a=NULL; int *t=NULL;

Page 114: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

114

double *d=NULL; void main() { clrscr(); printf(“a=%d”, a); printf(“\nt=%d”, t); printf(“\nd=%d”, d); a++; t++; d++; printf(“\na=%d”,a); printf(“\nt=%d”, t); printf(“\nd=%d”, d); getch(); }

Program Çıktısı:

a=0 t=0 d=0 a=1 t=2 d=8

Örnek: 10 elemanlı bir diziye 0-9 arasındaki sayılar sırayla atanmak isteniyor. Bunu, dizi ismi ve pointer aritmetiği kullanarak farklı şekillerde yapabiliriz.

1.....#include<stdio.h> 2.....#include<conio.h> 3..... int b[10],*p; 4..... void main() 5.....{ 6..... clrscr(); 7..... for(i=0;i<10;i++) 8..... b[i]=i; 9..... for(i=0;i<10;i++) 10..... printf(“b[%d]=%d\t”,i,b[i]); 11..... getch(); 12.....}

Page 115: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

115

Program Çıktısı:

b[0]=0 b[1]=2 b[3]=3 b[4]=4 b[5]=5 b[6]=6 b[7]=7 b[8]=8 b[9]=9

Açıklama: 7 ve 8. satırların icrasından sonra bellek görüntüsü:

: b[0] 0 b[1] 1 b[2] 2

: 3 : 4 : 5 : 6 : 7 : 8

b[9] 9 :

7 ve 8. satırlar aşağıdaki şekillerde değiştirilirse de programın çıktısında herhangi bir değişme olmayacaktır:

1.

: 7..... for(i=0,p=b; i<10; i++,p++) 8..... *p=i;

: 2.

: 7..... for(i=0,p=b; i<10; i++) 8..... *(p+i)=i;

: 3.

: 7..... for(i=0; i<10; i++) 8..... *(b+i)=i;

:

Page 116: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

116

1 ve 2 için bellek görüntüsü: :

p 0 *(p+0) p+1 1 *(p+1) p+2 2 *(p+2) p+3 3 *(p+3)

: 4 *(p+4) : 5 *(p+5) : 6 *(p+6) : 7 *(p+7) : 8 *(p+8)

p+9 9 *(p+9) :

3 için bellek görüntüsü:

: b→b[0] 0 *(b+0)

b[1] 1 *(b+1) : 2 *(b+2) : 3 *(b+3) : 4 *(b+4) : 5 *(b+5) : 6 *(b+6) : 7 *(b+7) : 8 *(b+8)

b[9] 9 *(b+9) :

NOT: b, statik olarak dizinin başlangıç adresini gösterdiğinden, “b++;” gibi bir ifade kullanılamaz. Yani b’nin değeri değiştirilemez. Bunun yerine “ *(b+i)” ifadesinin kullanılması gerekir. Bunun yanında pointer olarak tanımlanmış değişkenlere “++” operatörünü kullanabiliriz. “p++;” gibi.

Örnek:

#include<stdio.h> #include<conio.h> int x,y; int *px, *py, *pt; void main() { clrscr(); x=3; y=6; px=&x; py=&y; printf(“x ve y’nin değeri %d ve %d’dir”,x,y); printf(“\nx ve y’nin dolaylı değeri %d ve %d’dir”,*px,*py); pt=py; py=px;

Page 117: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

117

px=pt; printf(“\nx ve y’nin değeri %d ve %d’dir”,x,y); printf(“\nx ve y’nin dolaylı değeri %d ve %d’dir”,*px,*py); getch(); }

Program Çıktısı:

x ve y’nin değeri 3 ve 6 ‘dir x ve y’nin dolaylı değeri 3 ve 6 ‘dir x ve y’nin değeri 3 ve 6 ‘dir x ve y’nin dolaylı değeri 6 ve 3 ‘dir

Açıklama:

:

100→&x 3 102→&y 6

::

: :

&px 100 &py 102

:

pt=py; py=px; px=pt;

satırlarından sonra bellek görüntüsü:

: 100→&x 3 102→&y 6

::

: :

&px 102 &py 100

:

8.4 Dinamik Bellek Kullanımı C derleyicisi, bir c programı çalıştırılmaya başladığı andan itibaren program sonuna kadar belleği kendi kullanacağı şekilde segmentlere ayırır. Bu segmentlere ayırma işlemi aşağıdaki gibi olur:

Code Segment Data Segment Stack Segment Extra Segment Heap

Page 118: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

118

Assembly dilinde program yapan programcılar bu segmentleri kendileri tanımlamak zorundadırlar. Yüksek düzeyli diller, bellek kullanımını daha sınırlı bir şekilde programcıya bırakırlar. Code Segment: Program kodunun yerleştirildiği bellek bölgesidir. Çalıştırmak üzere yazdığımız programın kaynak kodu(source code) bu bölgede bulunur. Data Segment: Statik olarak tanımlı değişkenlere(global değişkenler) bu bellek bölgesinde yer ayrılır. Ve program boyunca değişkenlere ayrılan bu yer, başka amaçlar için kullanılamaz. Stack Segment: Programın akışına göre gerek bloklar içindeki ek tanımlamalar, gerekse de çağrılan fonksiyonların geri dönüş adresleri bu bellek bölgesini kullanır. Dinamiktir ve program içerisinde aynı yer farklı amaçlar için kullanılabilir. Extra Segment: Büyük yer kaplayabilecek statik değişkenler tanımlandığında, data segmentte yer kalmayabilir. Bu tür durumlarda extra segment kullanılır. Heap Bellek Alanı: Derleyici, yukarıda verdiğimiz dört ayrı segment için bellekten başlangıç ve bitiş adresleri alır. Bu adreslerden herhangi birinde taşma olduğu zaman bellek yetmezliği hatası verilir. Bunun dışında kalan ve derleyicinin kullanmadığı bellek bölgesi, heap alanı olarak adlandırılır. Bu alanı programcı, pointer yapısı kullanarak değerlendirebilir. Bu, programcıya hızlı işlem yapma ve ek bir bellek alanı sağlar. Programcı, bu bellek bölgesinden program içinde dinamik olarak farklı zamanlarda yer isteyip tekrar iade edebilir. Yani aynı bellek bölgesini programın sonuna gelmeden kullanabilir. Boyutunun önceden kestirilemeyeceği veriler için bu bellek bölgesi aşılmamak kaydıyla boyut belirtilmeden veriler tanımlanıp kullanılabilir.

Derleyiciye heap alanından yer ayırma isteği, stdlib.h kütüphanesinde bulunan bazı fonksiyonlar aracılığıyla söylenebilir. Bunlardan en fazla kullanılanları, malloc() ve calloc() fonksiyonlarıdır. İstenilen bu bellek bölgelerini serbest bırakmak amacıyla free() fonksiyonu kullanılmalıdır..

8.4.1 malloc() fonksiyonu Yazım şekli:

pointer(adres)=(tip_ismi *)malloc(ayrılacak alan büyüklüğü);

malloc() fonksiyonu, verilen büyüklük değeri kadar ayrılacak bellek alanına bir adres istemektedir. Derleyici, heap alanının durumuna göre bir pointer(adres) geri gönderecektir. Bu adreste tutulacak verinin tipi, (tip_ismi *) ile belirtilmektedir. Yeterli alan ayrılamadığı taktirde geriye NULL döndürülür.

8.4.2 calloc() fonksiyonu Yazım şekli:

pointer(adres)=(tip_ismi *)calloc(eleman_sayısı,eleman büyüklüğü);

Page 119: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

119

Kullanım amacı malloc() fonksiyonu ile aynıdır. malloc() fonksiyonundan farkı, önceden kaç eleman için yer ayrılacağının belirtilmesidir. malloc() fonksiyonuyla, ilk etapta tek bir elemana yer için adres istenir. calloc() fonksiyonuyla eleman sayısı da verilmektedir. Yeterli alan ayrılamadığı taktirde geriye NULL döndürülür.

NOT: Bellekten ayrılacak yerin büyüklüğü her zaman byte olarak

düşünülmelidir. calloc() fonksiyonu ile ayrılan yer sıfırlanır, ama malloc() fonksiyonuyla

ayrılan yer sıfırlanmaz.

8.4.3 free() fonksiyonu

Dinamik olarak malloc() ve calloc() fonksiyonlarıyla heap bellek alanından alınan adresler, kullanımı bitince tekrar serbest bırakılmalıdır. Derleyicinin bu bellek bölgesini tekrar kullanabilmesi için bu işlem şarttır. Serbest bırakılmayan bellek bölgeleri miktarı artınca bellek yetmezliği problemi çıkacaktır.

Dinamik olarak malloc() ve calloc() ile ayrılan yerler free() fonksiyonu ile serbest bırakılır. Yazım şekli:

free(pointer_değişken);

Örnek:

#include<stdio.h> #include<conio.h> #include<stdlib.h> int *p1; char *c1; void main() { clrscr(); p1=(int *)malloc(sizeof(int)); printf(“Bir tamsayı giriniz:”); scanf(“%d”,p1); printf(“sayi1=”, *p1); free(p1); c1=(char *) calloc(10,sizeof(char)); printf(“İsminizi giriniz:”); scanf(“%s”,c1); printf(“isim=%s”, *c1); free(c1); getch(); }

Page 120: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

120

Program Çıktısı:

Bir tamsayı giriniz: 5 Sayi=5 İsminizi giriniz: ahmet İsim=ahmet

Açıklama: Programda p1 adında tamsayıları gösteren ve c1 adında da karakterleri gösteren iki pointer tanımlanmıştır. “p1=(int *)malloc(sizeof(int));” cümlesi ile, bellekte sizeof(int) kadar (2 byte) yer ayrılmış ve bu yerin başlangıç adresinin p1 pointer değişkeni tarafından gösterilmesi sağlanmıştır. Ardından, bu bölgeye p1 pointer değişkeni yardımıyla girilen bir tamsayı, yine p1 pointer değişkeni yardımıyla ekranda görüntülenmiştir ve “free(p1);” cümlesiyle ayrılan bölge serbest bırakılmıştır. Daha sonra aynı işlemler c1 pointer değişkeni için de gerçekleştirilmiştir. Ancak burada malloc() fonksiyonu yerine “calloc()” fonksiyonu kullanılmıştır. “c1=(char *) calloc(10,sizeof(char));” cümlesiyle, bellekte 10 tane sizeof(char) kadar (10 tane birer byte=10 byte) yer ayrılmış ve bu yerin başlangıç adresinin de c1 pointer değişkeni tarafından gösterilmesi sağlanmıştır. Ve yine bu bölgeye girilen bir string ifadenin ekranda görüntülenmesi sağlanmıştır.

Örnek:

Dışarıdan girilen bir ismin kaç karakterden oluştuğunu bulan program:

#include<stdio.h> #include<conio.h> char *isim; void main() { clrscr(); printf(“Bir isim giriniz:”); scanf(“%s”,isim); for(i=0; isim[i];i++); printf(“İsminiz %d karakterden oluşmaktadır”,i); getch(); }

Page 121: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

121

Program Çıktısı:

İsminizi giriniz: mustafa İsminiz 7 karakterden oluşmaktadır

Açıklama: Yukarıdaki for döngüsünde şart ifadesi olan isim[i] ile isme girilen string ifadenin i. karakterinin boşluk olup olmadığı, yani stringin sonuna gelinip gelinmediği kontrol ediliyor. for cümlesinin sonunda ; kullanılarak bir sonraki cümleye etki etmemesi sağlanmıştır. i değişkeni her seferinde bir arttığı için sonuçta bize karakter sayısını verecektir. Örnek:

#include<stdio.h> #include<conio.h> #include<string.h> int i,sayi; void main() { clrscr(); char yer[][35]={{“Ali”},{“Meryem”},{“Buraya çok uzun bir isim gelecektir”}}; char *isimler[]={{“Ali”},{“Meryem”},{“Buraya çok uzun bir isim gelecektir”}}; printf(“yer string dizisinin büyüklüğü=%d byte”, sizeof(yer)); sayi=sizeof(isimler); for(i=0; i<3; i++) sayi+=strlen(isimler[i])+1; printf(“\n isimler string dizisinin büyüklüğü=%d’dir”, sayi); getch(); }

Program Çıktısı:

Yer string dizisinin büyüklüğü=102 byte İsimler string dizisinin büyüklüğü=53 byte

Page 122: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

122

Açıklama: Dizi tanımlanırken sabit değer verileceği zaman boyutlardan herhangi birini veya pointer kullanarak ikisini birden serbest bırakabiliriz. Yukarıdaki örnekte tanımlı olan “yer” ve “isimler” dizileri bu şekilde tanımlanmıştır.

1. printf() cümlesindeki “sizeof(yer)” ifadesiyle “yer” adındaki iki boyutlu dizinin kapladığı alan, 3x35=105 byte olarak ekrana yazılacaktır. Dizi, her bir elemanı 35 byte’lık 3 elemandan oluşacak şekilde tanımlandığı için içindeki veriye bakılmaksızın data segmentten 105 byte’lık yer ayrılacaktır.

Aynı veriyi “isimler” dizisiyle karaktere pointer kullanarak tanımlayıp yerleştirdiğimizde stringin uzunluğu sabit olmayıp girilen veriye bağlı olacaktır. Dolayısıyla,

Siziof(isimler) 2+2+2 = 6 byte 1. eleman 3+1 = 4 byte (+1 sonlandırma karakteri için düşünülmüştür) 2. eleman 6+1 = 7 byte (+1 sonlandırma karakteri için düşünülmüştür) 3. eleman 35+1 = 36 byte (+1 sonlandırma karakteri için düşünülmüştür) ----------------------------------------------- toplam = 53 byte yer işgal edecektir. Dizinin 3 elemanının byte cinsinden büyüklüğünün toplamı for cümlesi ve for cümlesinin etkilediği “sayi+=strlen(isimler[i])+1;” ifadesi ile hesaplanmaktadır. strlen(char*) fonksiyonuyla stringteki karakter sayısı hesaplanmaktadır. Ayrıca her defasında, sonlandırma karakteri (‘\0’) için 1 byte eklenmiştir. Örnek: 5 isimden oluşan bir isim listesini alfabetik bir şekilde sıralayan program:

#include<stdio.h> #include<conio.h> char *isimler[5]; char *tmp; void main() { clrscr(); for(i=0; i<=4; i++) { printf(“isim[%d]=”,i); scanf(“%s”,isimler[i]); } for(i=0;i<=3;i++) for(j=i+1;j<=4;j++) {

Page 123: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

123

if (isimler[i]>isimler[j]) { *tmp=isimler[i]; isimler[i]=isimler[j]; isimler[j]=*tmp; } } printf(“Sıralı isimleri görmek için bir tuşa basınız...”); getch(); clrscr(); for(i=0; i<=4; i++) printf(“%s\n=”,isimler[i]); }

Program çıktısı:

İsim[0]=Zülfü İsim[1]=Ahmet İsim[2]=Ozgür İsim[3]=Resul İsim[4]=Musa Sıralı isimleri görmek için bir tuşa basınız... Ahmet Musa Ozgür Resul Zülfü

Örnek: Dışarıdan girilen bir stringte, yine dışarıdan girilen bir karakterin kaç defa takrarlandığını bulan program:

#include<stdio.h> #include<conio.h> char *str, ch; int i,adet; void main() { clrscr(); printf(“Bir string giriniz:”);scanf(“%s”,str); prinrf(“Aranacak karakteri giriniz:”); scanf(“%c”,ch);

Page 124: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

124

for(i=0; str[i]; i++) adet+=(str[i]= =ch); if (!(adet)) printf(“%s’de %c, %d tane var”, *str,ch,adet); else printf(“%s’de %c karakteri hiç yok!”, *str,ch); getch(); }

Program çıktısı:

Bir string giriniz: mustafa Aranacak karakteri giriniz: a mustafa’da a, 2 tane var

Örnek:

Girilen bir stringi tersine çeviren program:

#include<stdio.h> #include<conio.h> #include<string.h> char *str; int i; void main() { clrscr(); printf(“Bir string giriniz:”);scanf(“%s”,str); for(i=strlen(str); i>0 ; i--) printf(“%c”,str[i]); getch(); }

Program Çıktısı:

Bir string giriniz: ahmet temha

Page 125: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

125

Örnek:

Girilen stringi kayan yazı şeklinde ekrana getiren program:

#include<stdio.h> #include<conio.h> #include<dos.h> char str[20]; int i; void main() { printf(“Bir string giriniz:”);scanf(“%s”,str); do{ for(i=1;i<=80;i++) { clrscr(); gotoxy(i,5); printf(“%s”,str); delay(40); } }while(!kbhit()); getch(); }

Açıklama: For döngüsüyle stringin her defasında yazdırılacağı sütun konumu belirlenir. Stringin birbirinin üstüne yazılmaması için for döngüsünün her adımında ekran temizlenerek string bir sağına yazılıyor. String bu sayede ekranda sağa kayıyormuş gibi gözüküyor. Kayma işleminin hızını ayarlamak için bir sonraki adımı geciktirmek amacıyla delay() fonksiyonu kullanılmıştır. dos.h kütüphanesinde tanımlı olan delay() fonksiyonu işaretsiz tamsayı olarak aldığı parametreyi milisaniye olarak değerlendirir. Örneğin, programdaki “delay(40);” cümlesiyle programın işlemesi 40 milisaniye geciktirilir.

Do-while döngüsüyle yazının ekranda sürekli kayması sağlanır. Do-while döngüsünden çıkma şartı, kullanıcının herhangi bir tuşa basmasıdır. Bunun için kbhit() fonksiyonu kullanılmıştır. kbhit() fonksiyonu, bir tuşa basılmadığında sıfır değerini, bir tuşa basıldığında ise sıfırdan farklı bir tamsayı değeri üretir. Örnek:

String.h kütüphanesinde tanımlı olan strupr() fonksiyonunun(Bu fonksiyon parametre olarak aldığı stringi büyük harflere dönüştürmektedir) işlevini gerçekleştiren program:

#include<stdio.h> #include<conio.h> char str1; int i,a; void main() { clrscr();

Page 126: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

126

printf(“Büyük harflere çevrilecek ifadeyi giriniz:”); gets(str1); for(i=0;i<=strlen(str1);i++) { a=str1[i]; //veya *(str1+i); if (a>96) { a=a-32; str1[i]=a; //veya *(str1+i)=a; } } puts(str1); getch(); }

Program Çıktısı:

Büyük harflere çevrilecek ifadeyi giriniz:ahmet AHMET

Açıklama: Aslında yukarıdaki programın yaptığı işi strupr() fonksiyonu yapmaktadır. Girilen stringi karakter karakter inceleyerek küçük harf karakterleri büyük harf karakterlerine çevirmektedir. Bu örnekte stringi okumak için gets() fonksiyonundan, stringi yazmak için de puts() fonksiyonundan faydalanılmıştır.

ASCII kod tablosunda büyük harfler 65’ten başlar(‘A’=65,’B’=66). Küçük harfler ise 97’den başlamaktadır(‘a’=97, ‘b’=98). Dolayısıyla küçük harfi büyük harfe çevirmek için aralarındaki 32 karakterlik sabit farkı kullanmak yeterlidir. Örneğin ‘a’ yı ‘A’ ya çevirmek için ‘a’ nın ASCII kodu olan 97’nin bulunduğu bellek bölgesine 32 eksiği olan 65’in yazılması yeterlidir.

: str[0] 97 ‘a’ str[1] ‘l’ str[2] ‘i’ :

Str[0]=97-32=65 işleminden sonra bellek görüntüsü şu şekilde olacaktır:

Page 127: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

127

: str[0] 65 ‘A’ str[1] ‘l’ str[2] ‘i’ :

Programda kontrol biraz daha detaylı düşünülürse girilen stringin içinde harf haricinde herhangi bir karakterin kullanılıp kullanılmadığı da test edilebilir. Bu amaçla isalpha() fonksiyonu da kullanılarak stringi okutma kısmı aşağıdaki şekilde kontrol edilebilir:

do{ clrscr(); printf(“stringi girin:”); gets(str1); for(i=0; i<strlen(str1) ; i++) if (!(isalpha(str[i])) break; } while(i<strlen(str1));

Örnek: “string.h” kütüphanesinde tanımlı olan strstr() fonksiyonunun( “strstr(s1,s2)” şeklinde kullanılan bu fonksiyon s1 stringi içerisinde s2 stringini arar.) işlevini yapan program:

#include<stdio.h> #include<conio.h> char *str1,*str2; int i,,j; void main() { do{ clrscr(); printf(“İlk stringi giriniz:”); gets(str1); printf(“\n İkinci stringi giriniz:”); gets(str2); if (strlen(str1)<strlen(str2)) printf(“ilk stringin uzunluğu ikinci stringin uzunluğundan fazla olmalı!”); else break; }while(1); for(i=0; i<strlen(str1)-strlen(str2); i++) {

Page 128: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

128

for(j=0; j<strlen(str2); j++) if (!((str1+i)[j]==str2[j])) break; if(j==strlen(str2)) printf(“%s %d. Sıradadır”, *str2,i); } getch(); }

Program Çıktısı:

İlk stringi giriniz: ahmet İkinci stringi giriniz: met met 3. sıradadır

Page 129: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

129

Bölüm Sonu Alıştırmaları 1. Dizilere niçin ihtiyaç duyarız? 2. Aşağıdaki programın çıktısı ne olur?

#include<stdio.h> #include<conio.h> int a[]={12, -5, 23, 62, -34}; void main() { clrscr(); printf(“ilk+son:%d\n”, a[0]+a[4]); printf(“ortadaki:%d\n”, a[2]); printf(“toplam:%d”, a[0]+a[1]}+a[2]+a[3]+a[4]); getch(); }

3. Bir dizideki tüm elemanlarda düzgün bir artış olup olmadığını bulan bir program

geliştiriniz. Örneğin 15, 20, 25, ... dizisinde düzgün bir artış vardır ve aralarındaki fark 5’tir.

4. Bir cümle içinde geçen her karakterin tekrar sayısını bulan programı geliştiriniz. 5. Aşağıdaki Pascal üçgenini oluşturan programı geliştiriniz.

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1

1 5 10 10 5 1 : : : : : : : : : : : :

6. N kişi yuvarlak bir masa etrafında oturmaktadır. Oyunun kuralına göre 1. oyuncudan

başlayarak k tane sayılacak ve k. oyuncu oyun dışına alınacaktır. Bu kurallara göre en son kalan kişiyi bulan programı geliştiriniz.

7. Bir cümledeki kelime sayısını bulan programı geliştiriniz. 8. 1’den N’e kadar sayıların toplamını pointer kullanarak bulan programı geliştiriniz. 9. Pointer kullanarak pop-up menu oluşturunuz.

Page 130: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok
Page 131: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

131

9 FONKSİYONLAR C programlama dilinde altprogramların hepsi fonksiyon şeklinde tanımlanır. Pascal programlama dilinde olan prosedürler C’de yoktur. Bilindiği gibi Pascal’da prosedürler altprogramdan anaprograma bir değer döndürmezler. Fonksiyonlar ise geriye bir değer döndürmek gerektiğinde kullanılırlar. C dilinde ise geriye değer döndürmek gerekse de gerekmese de fonksiyonlar kullanılır. Ancak, fonksiyonun isminden önce, geriye döndürülecek değerin tipinin belirtilmesi gerekir. Eğer geriye döndürülecek değer yoksa fonksiyon tipinin “void” olarak belirtilmesi gerekir. Bu durumda derleyici geriye herhangi bir değer döndürülmeyeceğini bilecektir.

Bir C programının gövdesi olan main() de bir fonksiyondur. main() fonksiyonu, işletim sisteminden çağrılır. Geriye değer döndürebilir. Genellikle bu değer, programın hatalı olup olmadığını test etmek için kullanılır. AnsiC’de tüm fonksiyonlar geriye değer döndürmek zorundadır. Fonksiyonun yapısı:

fonksiyon_tipi fonksiyon_ismi(parametreler) { tanımbloğu; anablok; ...... return(geri dönen değer); }

Örnek:

#include<stdio.h> #include<conio.h> void ciz() { int i; char ch=’-’; for(i=0; i<75 ;i++) printf(“%c”,ch); } void main() { clrscr(); ciz(); getch(); }

Programın Çıktısı:

----------------------------------------------------------------------------

Page 132: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

132

Parametreler: Altprogram ile anaprogram arasında değer transferi yapan değişkenlere parametre denir. Parametreler, fonksiyon isminden sonra açılan parantez içerisinde belirtilirler. Birden fazla parametre var ise virgülle ayrılmaları ve parametrelerin tiplerinin mutlaka belirtilmesi gerekir. Örnek:

int topla(int a, int b); { return(a+b); }

Burada fonksiyonun geri gönderdiği değer int olarak tanımlanmıştır. Fonksiyonun adı topla olarak verilmiştir. Fonksiyonun iki adet parametresi vardır. Bu parametrelerin amacı ana programdan iki ayrı integer(tamsayı) degeri alt programa taşımaktır. Alt programda alınan bu tamsayı degerler, toplanarak return deyimi ile ana programa geri döndürülmektedir.

#include<stdio.h> #include<conio.h> int topla(int a,int b) { return(a+b); } void main() { int x=2, y=3; int z; clrscr(); z=topla(x,y); printf(“z=%d”,z); getch(); }

Fonkiyon ismiyle birlikte tanımlanırken verilen parametrelere formal parametre denir. Bu parametreler için kullanılan isimler, sadece fonksiyon içinde geçerlidir. Ana programda fonksiyonu çağırırken kullanılan parametrelere aktuel parametre denir. Aktuel parametrelerin ana programda tanımlı olması gerekir. Bu isimlerin formal parametrelerin isimleriyle aynı olması zorunluluğu yoktur. Örnek:

Fonksiyon olarak tanımlayacağımız ve dışarıdan okutacağımız 4 işlemi(+, - , / , * ) yine dışarıdan okutulan iki tamsayıya uygulayıp sonucu yazdıran program:

Page 133: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

133

#include<stdio.h> #include<conio.h> int topla(int x,int y) { return(x+y); } int cikar(int x, int y) { return(x-y); } long carp(int x, int y) { return(x*y); } float bol(int x, int y) { return(x/y); } void main() { int a,b; char kar,devam; clrscr(); do{ clrscr(); printf(“ilk sayıyı giriniz:”); scanf(“%d”,&a); printf(“ikinci sayıyı giriniz:”); scanf (“%d”,&b); printf(“Yapılacak işlemi giriniz(+, - , / , *); kar=getch(); printf(“\n”); switch(kar) { case ‘+’ : printf(“%d”,topla(a,b)); break; case ‘-’ : printf(“%d”,cikar(a,b)); break; case ‘*’ : printf(“%ld”,carp(a,b)); break; case ‘/’ : printf(“%f”,bol(a,b)); break; default: printf(“Yanlış İşlem Girdiniz!”); } printf(“\nDevam mı(E/H)?”); devam=getche(); }while(devam==’E’ || devam==’e’); getch(); }

Page 134: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

134

Page 135: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

135

Program Çıktısı:

İlk sayıyı giriniz: 10 İkinci sayıyı giriniz: 5 Yapılacak işlei giriniz(+,-,*,/): - 5 Devam mı(E/H)? H

Örnek:

#include<stdio.h> #include<conio.h> #define SOLUST 201 #define SAGALT 188 #define SOLALT 200 #define SAGUST 187 #define YATAY 205 #define DIKEY 186 void cerceve(int x1, int y1, int x2, int y2) { int i; for(i=y1+1;i<y2;i++) { gotoxy(i,x1);printf("%c",YATAY); gotoxy(i,x2);printf("%c",YATAY); } for(i=x1+1;i<x2;i++) { gotoxy(y1,i); printf("%c",DIKEY); gotoxy(y2,i); printf("%c",DIKEY); } gotoxy(y1,x1); printf("%c",SOLUST); gotoxy(y2,x1); printf("%c",SAGUST); gotoxy(y1,x2); printf("%c",SOLALT); gotoxy(y2,x2); printf("%c",SAGALT); } void main() { int sat1,sut1,sat2,sut2;

Page 136: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

136

clrscr(); printf("Sol ust kosenin koordinatlarini giriniz:"); printf("\nx1="); scanf("%d",&sat1); printf("y1="); scanf("%d",&sut1); printf("Sag alt kosenin koordinatlarini giriniz:"); printf("\nx2="); scanf("%d",&sat2); printf("y2="); scanf("%d",&sut2); clrscr(); cerceve(sat1,sut1,sat2,sut2); getch(); }

Programın Çıktısı:

Sol üst köşenin koordinatlarını giriniz: X1=1 Y1=1 Sol alt köşenin koordinatlarını giriniz: X2=20 Y2=20

Örnek:

f(x)=3x3+5x2+3x+2 fonksiyonunda x’e [-1+1] aralığında 0.1 artımlar ile değer verilerek f(x) fonksiyonunun sonuçları bir diziye aktarılmak isteniyor. Fonksiyon tanımlanarak bu işlemin gerçekleştirildiği program:

#include<stdio.h> #include<conio.h> #include<math.h> float fx(float x) { return(3*pow(x,3)+5*x*x+3*x+2); }

Page 137: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

137

void main() { float fdizi[25]; int i; clrscr(); for(i=-10; i<10; i++) fdizi[i+10]=fx(i/10); for(i=0; i<20; i++) printf(“%.f”, fdizi[i]); getch(); }

Program Çıktısı:

-2.000 -1.537 -1.136 -0.779 -0.448 -0.125 0.208 0.569 0.976 1.447 2.000 2.653 3.424 4.331 5.392 6.625 8.048 9.679 11.536 13.637

Örnek: Dışarıdan girilen bir string içerisinde, yine dışarıdan girilen bir karakterin kaç tane olduğunu bulan programın fonksiyon kullanılarak yapılması:

#include<stdio.h> #include<conio.h> int kackarakter(char *str, char kar) { int i,karakter_sayısı=0; for(i=0; str(i); i++) if(str[i]==kar) karakter_sayisi++; return(karakter_sayisi); } void main() { char *st,kr; clrscr(); printf(“Stringi giriniz:”); scanf(“%s”,st); printf(“Stringte aranılacak karakteri giriniz:”); kr=getch(); printf(“Girilen stringin içinde %d tane %c var”, kackarakter(st,kr),kr); getch(); }

Page 138: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

138

Program Çıktısı:

Stringi Giriniz: adana Strinte aranılacak karakteri giriniz: a Girilen stringin içinde 3 tane a var

Altprogramdan anaprograma değer transferi: Parametrelerin anaprogramdan altprogramlara değer transfer ettiği daha önce de söylenmişti. İstenildiği taktirde pointerlar kullanılarak tanımlanan parametreler vasıtasıyla altprogramdan anaprograma değer transferi de yapılabilir.

Fonksiyonlar sonuçta bir değer döndürebilirler ancak, fonksiyondan birden fazla değer istenirse bellekte bu değerlerin tutulduğu yerin adreslerinin altprograma gönderilmesi gerekir. Zira altprogramlarda bu adreslerin içeriklerinde yapılacak değişiklikler anaprograma geri dönüldüğünde aynen geçerli olacaktır. Örnek: 20 değişik sorudan oluşan bir anket 200 kişilik bir gruba dağıtılıyor. Bu insanların sorulara verdiği cevaplar değerlendirilmek üzere şu işlemlere tabii tutuluyor:

i) Her bir soruya beklenen cevabı veren kişilerin sayısı, bir dizi olarak okutulacaktır. Beklenen cevapların her birinin toplam verilen cevaplar içerisindeki yüzdelik ağırlığı hesaplanarak bir başka diziye aktarılacaktır.

ii) Verilen cevaplara göre standart sapma bulunacaktır.

Standart sapma= yansvar

Varyans= 1

1

n2

1

)(

n

ii xx , x = dizinin ortalaması

Yukarıdaki işlemleri gerçekleştiren programın fonksiyon kullanılarak yazılması:

#include<stdio.h> #include<conio.h> int yuzde[20],soru[20]; int *p; void anketoku() { printf(“Anket sonuçlarını giriniz:”); for(i=0;i<20;i++) { printf(“soru[%d+1]=”,i); scanf(“%d”,&soru[i]); } }

Page 139: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

139

int toplam_cevap_sayisi(int soru_[20]) { int i,toplam=0; for(i=0; soru_[i] ;i++) toplam+=soru_[i]; return(toplam); } yuzde_bul(int soru_[20], int yuzde_[20]) { for(i=0; soru_[i]; i++) yuzde_[i]=(100*soru_[i])*toplam; } main() { clrscr(); p=yuzde; anketoku(); *p=toplam_cevap_sayisi(soru); ort= top/20; yuzde_bul(soru,p); }

Page 140: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

140

Bölüm Sonu Alıştırmalar 1. Ekrana seçime göre yıldızlardan oluşan bir kare, üçgen veya dikdörtgen çizen

programı geliştiriniz. (Her biri için ayrı ayrı fonksiyon tanımlayınız)

2. Koordinatları verilen iki noktanın doğru denklemini çıkaran fonksiyonu geliştiriniz. 3. Verilen bir dizinin 2. en büyük elemanını, diziyi sıralamadan bulan fonksiyonu

geliştiriniz. 4. Bir bakteri kültüründeki çoğalma, kültürdeki bakteri sayısı ile doğrudan ilgilidir.

Matematiksel olarak herhangi bir andaki bakteri sayısı;

t: Başlangıçtan itibaren geçen birim zaman, P0

: Başlangıçtaki bakteri sayısı, P: t. zamandaki bakteri sayısı olmak üzere, P= P0 [1+0.0289t + (0.0289t)2 /2 + (0.0289t)3 /6+ (0.0289t)4 /24+...+(0.0289t)n /n!]

formülü ile hesaplanmaktadır. Verilen P ve t değerleri için n en fazla 10 olmak üzere P değerini hesaplayan bir program geliştiriniz.

Page 141: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

141

10 C’DE TANIMLI BAZI STANDART FONKSİYONLAR

10.1 CONIO.H FONKSİYONLARI

10.1.1 clrscr() Text ekranı temizleme fonksiyonudur. Eğer window() fonksiyonundan sonra kullanılırsa window() ile verilen koordinatlar arasını temizler. Temizleme işlemi textbackground() ile belirtilen renkle yapılır. Fonksiyon Tanımı:

void clrscr(void);

Kullanım:

clrscr();

10.1.2 delline() Text ekranda imlecin bulunduğu satırı siler. Alttaki satırlar birer satır üste kayar. Yine window() fonksiyonundan etkilenerek tanımlı koordinatlar arasındaki satırı siler. Fonksiyon Tanımı:

void delline(void);

Kullanım:

delline();

10.1.3 clreol() Text ekranda imlecin bulunduğu pozisyondan satır sonuna kadar olan kısmı siler. windows() fonksiyonundan etkilenir. Fonksiyon Tanımı:

void clreol(void);

Page 142: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

142

Kullanım:

clreol();

10.1.4 insline() Text ekranda imlecin bulunduğu satırdan itibaren araya boş bir satır ekler. İmlecin bulunduğu satır dahil, alttaki satırlar birer aşağı kayar. En alttaki satır kaybolur. Fonksiyon Tanımı:

void insline(void);

Kullanım:

insline();

10.1.5 textcolor() Text ekranda yazı rengini tanımlar. Fonksiyon Tanımı:

void textcolor(int renk);

Kullanım:

textcolor(renk);

Açıklama:

Parametre olarak kullanılacak renk 0..15 şeklinde renk kodları olabileceği gibi sabit olarak tanımlanmış renk isimleri de olabilir. Tablo 9.1’de C’de tanımlı olan renk kodları ve isimleri verilmiştir.

Page 143: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

143

Tablo 9.1 Renk Kodları ve İsimleri

10.1.6 textbackground() Text ekranda zemin rengini tanımlar. Fonksiyon Tanımı:

void textbackground(int renk);

Kullanım:

textbackground(renk);

Açıklama:

Yukarıda verilen 0-7 arası renkler geçerlidir.

10.1.7 textattr() Text ekranda yazının yanıp sönme, renk ve zemin rengi niteliklerini tanımlar. Bu nitelikler 8-bit ile tanımlanır:

y z z z r r r r : 0 - 255

y: yanıp sönme(1:yanıp söner 0:sabit) zzz: zemin rengini temsil eden 3-bit rrrr: yazı rengini temsil eden 4-bit Örneğin,

1 0 1 0 0 0 0 1 : 161 1: yanıp söner 010: 2-yeşil 0001: 1-mavi

Kod Tanımlı İsim Kod Tanımlı isim 0 1 2 3 4 5 6 7

BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY

8 9 10 11 12 13 14 15

DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTAYELLOW WHITE

Page 144: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

144

Fonksiyon Tanımı:

void textattr(int t_nitelik);

Kullanım:

textattr(t_nitelik);

Açıklama:

Burada parametre olarak kullanılan t_nitelik 0-255 arasında bir değerdir. Örneğin, “textattr(161);” cümlesinden sonra ekrana yazdırılacak metin mavi zemin üzerine yeşil ve yanıp sönen şekilde olacaktır.

10.1.8 lowvideo() Text ekranda yazının görüntüsünü matlaştırır. Fonksiyon Tanımı:

void lowvideo(void);

Kullanım:

lowvideo();

10.1.9 highvideo() Text ekranda yazının görüntüsünü parlaklaştırır. Fonksiyon Tanımı:

void highvideo(void);

Kullanım:

highvideo();

Page 145: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

145

10.1.10 normvideo() lowvideo() ile matlaştırılan veya highvideo() ile parlaklaştırılan yazının görüntüsünü normal hale çevirir. Fonksiyon Tanımı:

void normvideo(void);

Kullanım:

normvideo();

10.1.11 wherex() Text ekranda imlecin o anki yatay(x koordinatı) pozisyonu verir. Fonksiyon Tanımı:

int wherex(void);

Kullanım:

x=wherex();

Açıklama:

Sonuçta 1-80 arasında tamsayı değer üretir. window() fonksiyonundan etkilenir.

10.1.12 wherey() Text ekranda imlecin o anki düşey pozisyonunu(y koordinatı) verir. Fonksiyon Tanımı:

int wherey(void);

Kullanım:

y=wherey();

Page 146: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

146

Açıklama:

Sonuçta 1-25 arasında tamsayı değer üretir. window() fonksiyonundan etkilenir.

10.1.13 gotoxy() İmleci text ekranda (x,y) ile verilen koordinatlara konumlandırır. Fonksiyon Tanımı:

void gotoxy(int x, int y);

Kullanım:

gotoxy();

Açıklama:

x, text ekran sütun değerini gösterir ve 1-80 arasında tamsayı değerler alabilir. y, text ekran satır değerini gösterir ve 1-25 arasında tamsayı değerler alabilir. window() fonksiyonundan etkilenir.

10.1.14 window() Text ortamda ekranı, vereceğimiz yeni koordinatlar ile sınırlandırmak için kullanılır. Aktif ekran window() fonksiyonu ile verilen koordinatlar arasında kalır. Fonksiyon Tanımı:

void window(int sut1,int sat1,int sut2,int sat2);

Kullanım:

window(sut1,sat1,sut2,sat2);

Açıklama:

(sut1,sat1) koordinatı windowun sol üst köşesine, (sut2,sat2) ise sağ alt köşesine işaret eder. Windowun solüst köşesi (1,1) koordinatından başlar. Ekranın eski haline getirilmesi için “window(1,1,80,25);” cümlesinin kullanılması gerekir.

Page 147: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

147

10.1.15 kbhit() Herhangi bir tuşa basılıp basılmadığını kontrol eder. Fonksiyon Tanımı:

int kbhit(void);

Kullanım:

kbhit();

Açıklama:

Bir tuşa basılmışsa sıfırdan farklı tamsayı değer döndürür. Bir tuşa basılmadığı sürece sıfır değer döndürür.

10.1.16 cprintf() Text ortamda tanımlı windowun içinde formatlı bir çıkış bilgisini yazdırmak için kullanılır. Fonksiyon Tanımı:

Biçimi printf() fonksiyonu gibidir.

Kullanım:

Kullanım biçimi printf() fonksiyonu gibidir.

Açıklama:

Çıkışa gönderdiği byte sayısını geri döndürür. window(), textbackground(), textcolor(), lowvideo(), highvideo(), normvideo() fonksiyonlarından etkilenir.

10.1.17 cscanf() Text ortamda konsoldan formatlı bilgi girişi için kullanılır. Fonksiyon Tanımı:

Biçimi scanf() fonksiyonu gibidir.

Kullanım:

Kullanım biçimi scanf() fonksiyonu gibidir.

Page 148: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

148

Açıklama:

Girilen alanların sayısını geri döndürür. textbackground(), textcolor(), lowvideo(), highvideo(), normvideo() fonksiyonlarından etkilenir. Örnek:

#include<stdio.h> #include<conio.h> #include<dos.h> #include<string.h> char isim[10]; int x=1,y=5; void main() { clrscr(); window(5,3,40,10); textbackground(2); clrscr(); gotoxy(5,3); textcolor(4); lowvideo(); cprintf(“Adınızı giriniz:”); normvideo(); textbackground(2); cscanf(“%s”,isim); window(45,3,75,10); textbackground(1); clrscr(); textcolor(15); do{ gotoxy(x,y);delline(); cprintf(“%s”,isim); x++; if(x>=30) x=1; delay(50); }while(!kbhit()); getch(); window(20,12,60,18); textbackground(6); clrscr(); textcolor(4); highvideo(); gotoxy(10,3); cprintf(“iyi günler”); getch(); window(1,1,80,25); textbackground(0); clrscr(); getch(); }

Page 149: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

149

10.2 STRING.H FONKSİYONLARI

10.2.1 strcpy() Kaynak stringten kopyalamak istediğimiz hedef stringe karakter dizisi karakter dizisi kopyalamamızı sağlar. Fonksiyon Tanımı:

char *strcpy(char *hedef, const char *kaynak);

Kullanım:

strcpy(str1,str2);

Açıklama:

C dilinde stringi herhangi bir değişkene direkt atama cümlesi yoktur. Böyle bir işlem için strcpy() fonksiyonu kullanılır.

10.2.2 strncpy() Kaynak stringin ilk n karakteri hedef stringe kopyalanır.

Fonksiyon Tanımı:

char *strncpy(char *hedef, const char *kaynak, int kar_say);

Kullanım:

strncpy(str1,str2,3);

Açıklama:

Parametre olarak verilen kar_say, 1 ile kaynak stringteki karakter sayısı arasında olmalıdır.

10.2.3 strlen() Parametre olarak verilen stringteki karakter sayısını verir. Fonksiyon Tanımı:

Page 150: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

150

int strlen(const char *s);

Kullanım:

strlen(str);

Açıklama:

Sonlandırıcı karakter, yani NULL sayılmaz.

10.2.4 strcat()

Hedef stringin sonuna kaynak stringi ekler. Fonksiyon Tanımı:

char *strcat(char *hedef, const char *kaynak);

Kullanım:

strcat(str1,str2);

10.2.5 strncat() Kaynak stringin ilk n karakterini hedef stringin sonuna ekler. Fonksiyon Tanımı:

char *strncat(char *hedef, const char *kaynak, int kar_say);

Kullanım:

strncat(str1,str2,2);

Page 151: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

151

10.2.6 strcmp() İki stringi birbiriyle karşılaştırır. Fonksiyon Tanımı:

int strcmp(const char *s1, const char *s2);

Kullanım:

strcmp(str1,str2);

Açıklama:

str1, str2’den küçükse geriye döndürülecek değer negatif, eşitse sıfır ve büyükse pozitif tamsayı olacaktır.

10.2.7 strncmp() İki stringin ilk n karakterini karşılaştırır. Fonksiyon Tanımı:

int strncmp(const char *s1, const char *s2, int kar_say);

Kullanım:

strncmp(str1, str2, 4);

10.2.8 strlwr() Parametre olarak verilen stringin bütün karakterlerini küçük harfe çevirir. Fonksiyon Tanımı:

char *strlwr(char *s);

Kullanım:

strlwr(str);

Page 152: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

152

10.2.9 strupr() Parametre olarak verilen stringin tüm karakterlerini büyük harfe çevirir. Fonksiyon Tanımı:

char *strupr(char *s);

Kullanım:

strupr(str);

10.2.10 strstr() Parametre olarak verilen ilk stringin içinde ikinci stringi arar ve ilk bulduğu yerin adresini geri döndürür. Bu adreste ilk stringin ikinci stringi içerdiği kısmıyla geri kalan kısmı vardır. Fonksiyon Tanımı:

char *strstr(const char *s1, const char *s2);

Kullanım:

strstr(str1,str2);

Açıklama:

Eğer aranılan string bulunamazsa NULL değeri döndürülür.

10.2.11 strchr() Parametre olarak verilen stringin içinde tek karakter arar ve ilk bulduğu yerin adresini geri döndürür. Fonksiyon Tanımı:

char *strchr(const char *s, int c);

Kullanım:

Page 153: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

153

strchr(str,ch);

Açıklama:

Eğer aranılan karakter bulunamazsa geriye NULL değeri döndürülür.

10.2.12 strset() Parametre olarak verilen stringin tüm karakterlerini yine parametre olarak verilen karaktere çevirir. Fonksiyon Tanımı:

char *strset(char *s, int ch);

Kullanım:

strset(str,ch);

10.2.13 strnset() Parametre olarak verilen stringin ilk n karakterini yine parametre olarak verilen karakterlere çevirir. Fonksiyon Tanımı:

char *strnset(const char *s1, const char *s2, int kar_say);

Kullanım:

strnset(str1,str2, n);

10.2.14 strrev() Parametre olarak verilen stringi tersine çevirir. Fonksiyon Tanımı:

char *strrev(char *s);

Page 154: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

154

Kullanım:

strrev(str);

10.3 MATH.H Fonksiyonları

10.3.1 abs() Parametre olarak verilen tamsayının mutlak değerini üretir. Fonksiyon Tanımı:

int abs(int x);

Kullanım:

abs(x);

Açıklama:

Makro olarak tanımlanmıştır. Örnek: abs(-5) 5

10.3.2 cos() Parametre olarak radyan cinsinden verilen açının cosinüsünü verir. Fonksiyon Tanımı:

double cos(double x);

Kullanım:

cos(x);

Page 155: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

155

Açıklama:

-1 ile +1 arasında değerler üretir.

10.3.3 sin() Parametre olarak radyan cinsinden verilen açının sinüsünü verir. Fonksiyon Tanımı:

double sin(double x);

Kullanım:

sin(x);

Açıklama:

-1 ile +1 arasında değerler üretir.

10.3.4 tan() Parametre olarak radyan cinsinden verilen açının tanjantını verir. Fonksiyon Tanımı:

double tan(double x);

Kullanım:

tan(x);

Açıklama:

-1 ile +1 arasında değerler üretir.

10.3.5 atan() Parametre olarak radyan cinsinden verilen açının tanjantını verir. Fonksiyon Tanımı:

Page 156: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

156

double atan(double x);

Kullanım:

atan(x);

Açıklama:

-/2 ile +/2 arasında değerler üretir.

10.3.6 exp() e’nin parametre olarak verilen x. kuvvetini alır.

Fonksiyon Tanımı:

double exp(double x);

Kullanım:

exp(x);

Açıklama:

pow() fonksiyonu da üs alma işlemini exp() ve log fonksiyonunu kullanarak yapmaktadır.

10.3.7 pow() Parametre olarak verilen x’in, yine parametre olarak verilen y. kuvvetini alır. Fonksiyon Tanımı:

double pow(double x, double y);

Kullanım:

pow(x,y); // xy

Page 157: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

157

Açıklama:

pow() fonksiyonunun temelinde exp() ve log vardır:

pow(taban,üs)=exp(üs*log(taban));

10.3.8 log() Parametre olarak verilen x’in doğal logaritmasını verir. Fonksiyon Tanımı:

double log(double x);

Kullanım:

log(x);

10.3.9 log10() Verilen parametrenin onluk tabandaki logaritmasını verir.

10.3.10 sqrt() Verilen parametrenin karekökünü alır. Fonksiyon Tanımı:

double sqrt(double x);

Kullanım:

sqrt(x); // x

10.3.11 ceil() Parametre olarak verilen x değerine eşit veya daha büyük en yakın tamsayı değerini verir(Yukarı yuvarlama). Fonksiyon Tanımı:

double ceil(double x);

Page 158: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

158

Kullanım:

ceil(x);

10.3.12 floor() Parametre olarak verilen x değerine eşit veya daha küçük en yakın tamsayı değerini verir(Aşağı yuvarlama). Fonksiyon Tanımı:

double floor(double x);

Kullanım:

floor(x);

Örnek:

#include<stdio.h> #include<conio.h> void main() { clrscr(); getch(); }

Page 159: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

159

10.4 STDIO.H Fonksiyonları

10.4.1 getc()

Dosyadan tek karakter okumak için kullanılır. Fonksiyon Tanımı:

int getc(FILE *dosya_deg);

Kullanım:

getc(dosya_deg);

Açıklama:

Okunan karakteri geri döndürür. Dosya sonuna gelinmişse ya da hata durumunda EOF döndürür. Makro olarak tanımlanan getc()’ nin fonksiyon olarak tanımlanmış versiyonu fgetc()’dir.

10.4.2 putc()

Dosyaya tek karakter yazdırmak için kullanılır. Fonksiyon Tanımı:

int putc(int c, FILE *dosya_deg);

Kullanım:

putc(c,dosya_deg);

Açıklama:

Hata durumunda EOF geri döndürür. İşlem başarılıysa yazdırılan karakterin ASCII kodu döndürülür. Makro olarak tanımlanmış olan putc’nin fonksiyon olarak tanımlanmış versiyonu fputc()’dir.

10.4.3 gets()

Standart giriş aygıtından bir string okur.

Page 160: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

160

Fonksiyon Tanımı:

char *gets(char *s);

Kullanım:

gets(str);

Açıklama:

\n buluncaya kadar standart giriş birimindeki girilen karakter dizisini alır. Fakat string’te \n bilgisi bulunmaz.

10.4.4 puts() Standart giriş birimine bir stringi yazdırmak için kullanılır. Çıkış yeni bir satıra yapılır. Fonksiyon Tanımı:

int puts(const char *s);

Kullanım:

put(str);

Açıklama:

İşlem başarılı ise yazdırılan stringin son karakterini döndürür. Diğer durumda EOF geri döndürülür.

10.4.5 getw() Dosyadan tamsayı okur. Fonksiyon Tanımı:

int getw(FILE *dosya_deg);

Page 161: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

161

Kullanım:

getw(dosya_deg);

Açıklama:

İşlem başarılı ise okutulan sayının bir fazlası geri döndürülür. Dosya sonuna gelindiğinde veya hata durumunda EOF geri döndürülür. Geri döndürülen EOF’nin dosya sonunda mı yoksa hatadan mı olduğunu anlamak için feof veya ferror kullanılmalıdır.

10.4.6 putw() Dosyaya tamsayı yazmak için kullanılır. Fonksiyon Tanımı:

int putw(int w, FILE *dosya_deg);

Kullanım:

putw(dosya_deg);

Açıklama:

Hata durumunda EOF döndürülür. Başarılıysa yazdırılan sayının kendisi geri döndürülür.

10.4.7 sprintf() Formatlı bir şekilde, parametre olarak verilen string içine yazdırılmak istenen parametre yerleştirilir. Fonksiyon Tanımı:

int sprintf(char *s, çıkış biçimi karakterleri,değerler listesi);

Kullanım:

sprintf(s,”%d”,n);

Page 162: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

162

Açıklama:

Yazdırılan toplam byte sayısı geri döndürülür. Hata durumda EOF geri döner.

10.4.8 sscanf() Bir stringten formatlı giriş işlemini yapar. Fonksiyon Tanımı:

int sscanf(char *s, çıkış biçimi karakterleri, değerler listesi);

Kullanım:

sscanf(s,”%d”,n);

Açıklama:

Eğer işlem başarılı olursa girilen alanların sayısı geri döndürülür. s’in sonundan okumaya çalışırsa EOF geri döndürülür.

10.5 TIME.H Fonksiyonları

10.5.1 clock() Fonksiyonun çalıştırıldığı andaki sistem saati bilgileri alınır. Fonksiyon Tanımı:

clock_t clock(void);

Kullanım:

clock();

Açıklama:

C’de clock_t tipi, zaman bilgisinin saniye, dakika ve saat bilgilerini CLK_TCK birimine göre tutmaktadır. clock_t time.h’ta long olarak tanımlanmıştır. Fonksiyonla elde edilecek sayı, CLK_TCK’e bölündüğünde zaman saniye cinsinden elde edilir. CLK_TCK sabitinin değeri 18.2’dir.

10.5.2 time() O günün saat bilgisini saniye olarak verir.

Page 163: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

163

Fonksiyon Tanımı:

time_t time(time_t *z);

Kullanım:

time(z);

Açıklama:

Bilgisayarın zamanlayıcısına yerleştirilmiş 10 Ocak 1970 00:00:00 zaman bilgisinden hareket edilerek hesaplanır.

10.6 DOS.H Fonksiyonları

10.6.1 settime() Sistemin zaman bilgisini değiştirmek için kullanılır. Fonksiyon Tanımı:

void settime(struct time *z);

Kullanım:

settime(z);

Açıklama: Struct time yapı tipi aşağıdaki gibi tanımlanmıştır:

struct time{

unsigned char ti_min; //dakika unsigned char ti_hour; //saat unsigned char ti_hound; //milisaniye unsigned char ti_sec; //saniye

};

Page 164: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

164

10.6.2 gettime() Sistemin zaman bilgisini öğrenmek için kullanılır. Fonksiyon Tanımı:

void gettime(struct time *z);

Kullanım:

gettime(z);

Açıklama:

Struct time yapı tipi settime()’dakinin aynısıdır.

10.6.3 setdate() DOS tarih bilgisini değiştirmek için kullanılır. Fonksiyon Tanımı:

void setdate(struct date *z);

Kullanım:

setdate(z);

10.6.4 getdate() DOS’un tarih bilgisini almak için kullanılır. Fonksiyon Tanımı:

void getdate(struct date *z);

Kullanım:

getdate(z);

Page 165: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

165

Açıklama:

struct date tipi aş. gibi tanımlanır.

struct date{

int da_year; char da_day; char da_mon;

};

10.6.5 delay()

Parametre olarak verilen milisaniye kadar programın çalışmasını durdurur. Fonksiyon Tanımı:

void delay(unsigned ms);

Kullanım:

delay(ms);

10.6.6 sleep() Parametre olarak verilen saniye kadar programın çalışmasını durdurur.

10.6.7 sound() PC’nin ses üreticisinden, parametre olarak verilen frekansta ses üretir. Fonksiyon Tanımı:

void sound(unsigned frekans);

Kullanım:

sound(frekans);

Page 166: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

166

Açıklama:

Frekans, hertz olarak verilir. Her bir ses çevirimi 1 saniyedir. Bu fonksiyondan sonra mutlaka sesin kesilmesi için nosound() fonksiyonunun kullanılması gerekir.

10.6.8 nosound() PC’nin ses üreticisini kapatır. Fonksiyon Tanımı:

void nosound(void);

Kullanım:

nosound();

10.6.9 ctrlbrk()

Programın çalışması sırasında ctrl+break tuş kombinezonunun programı kesip kesmemesine izin verir. Fonksiyon Tanımı:

void ctrlbrk(int (*h)(void));

Kullanım:

ctrlbrk(fonk_ismi);

Açıklama:

Parametre olarak verilen fonksiyon sıfır değeri geri döndürürse aktif programın ctrl+break ile kesilmesine izin verilir. Aksi durumda program ctrl+break ile kesilemez.

Page 167: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

167

10.7 CTYPE.H Fonksiyonları isalnum(c): Parametre olarak verilen c, harf veya rakam ise true verir. isalpha(c): Parametre olarak verilen c harf ise true deg değer verir. isdigit(c): Parametre olarak verilen c rakam ise true değer verir. iscntrl(c):Parametre olarak verilen c, bir karakter siliyor veya herhangi bir kontrol karakteri ise true değer verir. isascii(c): Parametre olarak verilen c, geçerli bir ASCII karakter ise true değer verir. isprint(c): Parametre olarak verilen c, yazdırılabilir bir karakter ise true değer verir. isgraph(c): isprint() fonksiyonu gibidir. Boşluk karakteri hariç tutulmuştur. islower(c): Parametre olarak verilen c küçük harf ise true değer verir. isupper(c): Parametre olarak verilen c büyük harf ise true değer verir. ispunct(c): Parametre olarak verilen c noktalama işareti ise true değer verir. isspace(c): Parametre olarak verilen c boşluk, tab, satırbaşı, yeni satır, düşey tab veya sayfa ilerletme ise true değerini verir.

Satırbaşı: cr, yeni satır: lf, düşey tab: vt, sayfa ilerletme:ff karakterleriyle gösterilir. isxdigit(c): Parametre olarak verilen c hexadecimal ise true verir. toupper(c): Parametre olarak verilen c’yi büyük harfe çevirir. tolower(c): Parametre olarak verilen c’yi küçük harfe çevirir. toascii(c): Parametre olarak verilen c’yi 0-127 arasında bir koda dönüştürür.

toupper() ve tolower() makrolarının fonksiyon olarak tanımlanmış versiyonları _toupper() ve _tolower()’dır.

10.8 STDLIB.H Fonksiyonları

10.8.1 atoi() Parametre olarak verilen stringi tamsayıya çevirir.

Fonksiyon Tanımı:

int atoi(const char *s);

Kullanım:

atoi(str);

Açıklama:

Eğer string çevrilemezse değer sıfır olarak geri döndürülür.

10.8.2 atol() Parametre olarak verilen stringi long tipinde tamsayıya çevirir.

Page 168: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

168

Fonksiyon Tanımı:

long atol(const char *s);

Kullanım:

atol(str);

Açıklama:

Eğer string çevrilemezse geriye sıfır döndürülür.

10.8.3 atof() Parametre olarak verilen stringi reel sayıya çevirir.

Fonksiyon Tanımı:

double atof(const char *s);

Kullanım:

atof(str);

Açıklama:

Eğer string çevrilemezse değer sıfır olarak geri döndürülür.

10.8.4 itoa() Parametre olarak tamsayıyı stringe çevirir.

Fonksiyon Tanımı:

char *itoa(int değer, char *s, int taban);

Kullanım:

itoa(n,str,10);

Page 169: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

169

Açıklama:

Çevirme işlemi verilen tabana göre olur.

10.8.5 strtod()

Parametre olarak stringi double tipinde reel sayıya çevirir.

Fonksiyon Tanımı:

double strtod(const char *s, char **adres);

Kullanım:

strtod(“ 1.1E+3”,&endptr);

Açıklama:

Parametre olarak verilecek string aşağıdaki formata uymalıdır: [boşluk][işaret][rakamlar].[rakamlar][e veya E[işaret]rakamlar]

10.8.6 strol() Parametre olarak verilen stringi, tabanı baz alarak uzun tamsayıya çevirir. Fonksiyon Tanımı:

long strtol(const char *s, char **adres, int taban);

Kullanım:

strtol(“ -12015”, &adres, 10);

Açıklama:

Hata durumunda geriye sıfır değeri döndürür. Verilen string aşağıdaki formata uymalıdır: [boşluk][işaret][0][x][rakamlar]

10.8.7 div() İki tamsayıyı bölme işleminde kullanılır.

Page 170: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

170

Fonksiyon Tanımı:

div_t div(int pay, int payda);

Kullanım:

div(pay,payda);

Açıklama:

Bölüm sonucunda kalan ve bölüm div_t yapı tipi ile geri döndürülür. Bu tip aşağıdaki şekilde tanımlanmıştır:

typedef struct {

long int quot; //bolum long int rem; //kalan

} div_t ;

10.8.8 max ve min

max(a,b) İki tamsayıdan büyük olanı verir min(a,b) İki tamsayıdan küçük olanı verir

10.8.9 rand() Rastgele sayı üreticisi olarak kullanılır. Fonksiyon Tanımı:

int rand(void);

Kullanım:

rand();

Page 171: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

171

Açıklama:

Bu fonksiyon 0- RAND_MAX arasında bir tamsayı değeri üretir. RAND_MAX sabitinin değeri 0x7FFFU hexadecimal sayısıdır. U=unsigned

10.8.10 random() 0 ile parametre olarak verilen değerin bir eksiği arasında tamsayı değerler üretir. Fonksiyon Tanımı:

int random(int num);

Kullanım:

random(100); //0-99

Açıklama:

Her defasında farklı ilk değerle başlaması isteniyorsa mutlaka randomize() fonksiyonu kullanılmalıdır.

10.8.11 randomize() Random sayı üreticisini başlatmak için kullanılır.

Fonksiyon Tanımı:

int randomize(void);

Kullanım:

randomize();

10.8.12 exit() Programı sonlandırmak için kullanılır.

Fonksiyon Tanımı:

void exit(int status);

Page 172: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

172

Kullanım:

exit(1);

Açıklama:

Sonlandırmadan önce, çıkış buffer’ı temizlenir, dosyalar kapatılır.

10.8.13 quicksort()

Quick Sort algoritması kullanılarak sıralama yapılır.

Page 173: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

173

11 YAPILAR (STRUCTURES) C dilinde tanımlı standart veri tipleri de kullanılarak, bir grup veri, bir yapı içinde tanımlanabilir. Örneğin kompleks sayılar aslında reel ve imajinel iki ayrı kısımdan oluşmaktadır. Şu ana kadar anlatılan veri tiplerinden hiç biriyle böyle bir yapı tanımlanamaz. Ancak bu tür veri gruplarını tanımlamak için C programlama dilinde yapı(structure) kullanılır. Tanımı:

struct yapi_adi { <tip adı> y_el1; <tip adı> y_el2; <tip adı> y_el3; <tip adı> y_el4; : };

Aslında tanımlanan bu yapı(structure) yeni bir veri tipini göstermektedir. Dolayısıyla bellekte bu yapıda bir eleman için yer ayrılması istendiğinde yapı, elemana verilecek tip ismi gibi kullanılabilir:

struct yapi_adi eleman;

Örnek:

#include<stdio.h> #include<conio.h> struct komp { float re; float im; }; struct komp a,b,c; void main() { clrscr(); a.re=14.50; a.im=4.6; b.re=12.4; b.im=2.4; c.re=a.re + b.re; c.im=a.im + b.im; printf(“ c kompleks sayısı =%.2f + %.2f i \n“,c.re,c.im); getch(); }

Page 174: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

174

Bu yapı yeni bir tip ismine atanabilir. Böylece her defasında “struct komp” tanımlaması yerine sadece verilen yeni tip ismi kullanılır. Böyle bir tip ismi kullanılarak aynı işlem bir fonksiyon olarak aşağıda tanımlanmıştır.

Örnek:

#include<stdio.h> #include<conio.h> typedef struct komp kompleks; kompleks topla( kompleks a, kompleks b) { kompleks c; c.re=a.re+b.re; c.im=a.im+b.im; return( c ); } void main() { clrscr(); kompleks a,b,c; printf(“a.re = “); scanf(&a.re); printf(“a.im=”); scanf(&a.im); printf(“b.re = “); scanf(&b.re); printf(“b.im=”); scanf(&b.im); c=topla(a,b); printf(“ c kompleks sayısı =%.2f + %.2f i \n“,c.re,c.im); getch(); }

Benzer tanımlamalar farklı yapılar içinde kullanılabilir. Örneğin kesirli sayıların pay ve paydaları ayrı ayrı tutulmak istenirse bunlar için de bir yapı tanımlanabilir.

struct kes_say{ int pay; int payda; } k_sayi;

Yukarıda verilen örnekte tip tanımlanırken bir de tanımlanan tipten k_sayi isminde değişken alınmıştır.

typedef struct kes_say kesir; kesir a,b,c; c.pay=a.pay*b.payda+a.payda*b.pay; c.payda=a.payda*c.payda;

Page 175: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

175

Yapılar iç içe tanımlanabilir. Yani tanımlanılan bir yapı başka bir yapı içinde kullanılabilir.

Örnek Tanım ve Kullanım:

struct tarih { int gun; int ay; int yil; }; struct isim { char adi[20], soyadi[20]; }; struct ogrenci { long no; char not; struct isim ad; struct tarih tar; }; typedef struct ogrenci kayit;

void main() { kayit prg1[100]; strcopy(prg1[0].ad.adi,”Mehmet”); strcopy(prg1[0].ad.soyadi,”Sengul”); prg1[0].no=130012; prg1[0].not=60; prg1[0].tar.gun=21; prg1[0].tar.ay=2; prg1[0].tar.yil=2000; }

Yukarıdaki örnekte iç içe structure tanımlanmıştır. Tanımlanan structure kullanılarak 100 elemanlı bir dizi oluşturulmuştur. Bu dizinin alt elemanlarına nasıl ulaşılacağı gösterilmiştir. Turbo C kütüphanesi oluşturulurken, derleyicinin include edilen dosyalardan tanıyacağı çok sayıda structure tanımlı olduğu görülebilir. Kendine referanslı elemanlarda bu yapı kullanılarak tanımlanabilir. Örnek:

#define ad_ver (el_ad ) malloc(sizeof(eleman)) struct el_yap {

Page 176: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

176

int veri; struct el_yap *ad; }; typedef struct el_yap eleman; typedef eleman *el_ad; el_ad a; a=ad_ver; a->veri=20; a->ad=ad_ver;

Kendine referanslı bu yapı kullanılarak link listeler, yığın ve ağaç lar oluşturulabilir.

Page 177: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

177

12 GRAFİK

12.1 INITGRAPH Grafik arabirimine donanımı hazırlamak için grafik sürücüsü ve modunu grafik kartından tanır ve arabirimi yükler. Tanımı:

void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);

12.2 GRAPHRESULT En son kullanılan hatalı veya çalışmamış (başarısız) grafik komutunun hata kodunu verir. GrOk graphics.h 'ta tanımlı bir sabit olup 0 (sıfır) değerine karşılık gelir. Eğer komut doğru çalışmış (başarılı) ise bu kod üretilir. Tanım:

int far graphresult(void);

Tablo 12.1’de, sonuçta bir hata kodu üretecek grafik komutları verilmiştir.

detectgraph setcolor drawpoly setfillstyle fillpoly setgraphmode floodfill setlinestyle grapherrormsg setpalette initgraph settextjustify pieslice settextstyle registerbgidriver setusercharsizeregisterbgifont setviewport setallpalette setvisualpage

Tablo 12.1 - Hata kodu üreten grafik komutları Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) {

Page 178: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

178

/* Grafik sürücüsünü otomatik algılama isteği */ int gsurucusu = DETECT, gmodu, hatakodu; /* Grafik moduna geçiş için donanımı hazırlar */ initgraph(&gsurucusu, &gmodu, ""); /* Grafik ekranın başlayıp başlamadığı sonucunu öğrenir */ hatakodu = graphresult(); if (hatakodu != grOk) /* Bir hata kodu üretir */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Çıkmak için herhangi bir tuşa basın:"); getch(); exit(1); /* Bir hata kodu ile döner */ } /* Bir çizgi çizer */ line(0, 0, getmaxx(), getmaxy()); /* Bir tuşa basılınca grafik ekranı kapatarak programdan çıkar.*/ getch(); closegraph(); return 0; }

Program çıktısı:

12.3 GRAPHERRORMSG Verilen hata koduna ait ingilizce hata mesajını bir stringte verir. Tanım:

Page 179: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

179

char *far grapherrormsg(int hatakodu);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #define ALGILAMA -50 int main(void) { /* Bir hata oluşmasını sağlar */ int gsurucusu = ALGILAMA, gmodu, hatakodu; /* Grafik moduna geçiş için donanımı hazırlar. */ initgraph(&gsurucusu, &gmodu, ""); /* Başlatma sonucunda herhangi bir hatanın oluşup oluşmadığına bakar */ hatakodu = graphresult(); /* Eğer bir hata oluşmuşsa çıkışta yazdırmasını sağlar */ /* Hata mesajını tanımlar */ if (hatakodu != grOk) { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için bir tuşa basın:"); getch(); exit(1); /* Bir hata kodu ile programı keser. */ } /* Bir çizgi çizer */ line(0, 0, getmaxx(), getmaxy()); /* bir tuşa basılınca grafik ekranı kapatıp programdan çıkar */ getch(); closegraph(); return 0; }

Program Çıktısı:

Page 180: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

180

Grafik Hatası3: Graphics hardware not detected Durdurmak için bir tuşa basın:

12.4 CLEARDEVICE Grafik ekranını siler. Text ekranda clrscr() fonksiyonunun yaptığı gibi.

Tanım:

void far cleardevice(void);

12.5 SETCOLOR Çizgi rengini tanımlar.

Tanım:

void far setcolor(int color);

İlişkili Fonksiyonlar: getcolor graphresult setbkcolor getmaxcolor setallpalette setpalette Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int renk, maxrenk, x, y; char msg[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) {

Page 181: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

181

printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } /* İzin verilebilecek maksimum renk sayısı */ maxrenk = getmaxcolor(); /* Mesajı ortalamak için */ settextjustify(CENTER_TEXT, CENTER_TEXT); x = getmaxx() / 2; y = getmaxy() / 2; /* İzin verilecek (tanımlı) bütün renkler için döngüye sokulur */ for (renk=1; renk<=maxrenk; renk++) { /* Ekranı temizler */ cleardevice(); /* Yeni bir çizgi rengi tanımlar */ setcolor(renk); /* Mesajı ekrana yazar */ sprintf(msg, "Renk: %d", renk); outtextxy(x, y, msg); getch(); } closegraph(); return 0; }

Program Çıktısı:

Page 182: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

182

12.6 SETBKCOLOR Paleti kullanarak zemin rengini tanımlar.

Tanım:

void far setbkcolor(int renk);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu =DETECT, gmodu, hatakodu; int z_rengi, maxrenk, x, y; char msg[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } /* Desteklenen maksimum renk sayısını verir */ maxrenk = getmaxcolor(); /* Mesajı ortalamak için */ settextjustify(CENTER_TEXT, CENTER_TEXT); x = getmaxx() / 2; y = getmaxy() / 2; /* Kullanılabilecek bütün renkler için döngüye sokulur */ for (z_rengi=0; z_rengi<=maxrenk; z_rengi++) { cleardevice(); /* Yeni bir zemin rengi seçer */ setbkcolor(z_rengi); /* Mesajı ekrana yazar */

Page 183: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

183

if (z_rengi == WHITE) setcolor(BLUE); sprintf(msg, "Zemin Rengi: %d", z_rengi); outtextxy(x, y, msg); getch(); } closegraph(); return 0; }

Program Çıktısı:

12.7 GETCOLOR En son kullanılan aktif çizgi rengini verir. Tanım:

int far getcolor(void);

12.8 GETBKCOLOR En son kullanılan aktif zemin rengini verir.

Tanım:

int far getbkcolor(void);

12.9 GETMAXCOLOR Maksimum renk kodunu verir. Tanım:

int far getmaxcolor(void);

Page 184: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

184

Örnek:

#include <graphics.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int z_rengi, xort, yort; char bkname[35]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; setcolor(getmaxcolor()); settextjustify(CENTER_TEXT, CENTER_TEXT); /* Aktif zemin rengini verir */ z_rengi = getbkcolor(); /* Renk değerini stringe çevirir. */ itoa(z_rengi, bkname, 10); strcat(bkname, " aktif zemin rengidir."); /* Mesajı görüntüler */ outtextxy(xort, yort, bkname); getch(); closegraph(); return 0; }

Page 185: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

185

Program Çıktısı:

12.10 OUTTEXT Grafik ortamında o an kullanılan aktif görüntü penceresinden bir stringi görüntüler. Tanım:

void far outtext(char far *textstring);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xort, yort; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik Hatası: %s\n",

grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2;

Page 186: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

186

/* İmleci ekranın ortasına konumlandırır. */ moveto(xort, yort); /* İmlecin bulunduğu pozisyondan itibaren metni yazar */ outtext("Bu "); outtext("bir "); outtext("denemedir."); /* Ekranın ortasından metni yazmaya başlar. */ /* imlecin yeri değişmez */ outtextxy(xort, yort, "Bu bir testtir."); closegraph(); return 0; }

Program Çıktısı:

12.11 OUTTEXTXY Grafik modunda o an kullanılan aktif görüntü penceresinin istenen koordinatından verilen stringi görüntüler. Tanım:

void far outtextxy(int x, int y, char far *textstring);

12.12 SETTEXTSTYLE Metnin özelliklerini belirler.

Page 187: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

187

Tanım:

void far settextstyle(int font, int yon, int kar_buy);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> /* Desteklenen metin biçimlerinin isimleri */ char *fontismi[] = { "DEFAULT font", "TRIPLEX font", "SMALL font", "SANS SERIF font", "GOTHIC font" }; int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int bicim, xort, yort; int buyukluk = 1; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; settextjustify(CENTER_TEXT, CENTER_TEXT); for (bicim=DEFAULT_FONT; bicim<=GOTHIC_FONT; bicim++) { cleardevice(); if (bicim == TRIPLEX_FONT) buyukluk = 4; /* Bir metin biçimi seçin */ settextstyle(bicim, HORIZ_DIR, buyukluk);

Page 188: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

188

outtextxy(xort, yort, fontismi[bicim]); getch(); } closegraph(); return 0; }

Program Çıktısı:

12.13 SETTEXTJUSTIFY Grafik ekranda yazdırılacak metnin sağa, sola veya ortaya konumlanmasını sağlar.

Tanım: void far settextjustify(int horiz, int vert);

Outtext fonksiyonunu etkiler metin yatay veya düşey konumlandırılabilir. Tablo 12.2’de yatay ve düşey verilebilecek değerler verilmiştir.

Parametre ismi Değeri Nasıl Konumlandırılacağı

Yatay LEFT_TEXT (0) Sola <

CENTER_TEXT (1) > metni ortala < RIGHT_TEXT (2) > Sağa

Düşey BOTTOM_TEXT (0) En alttan CENTER_TEXT (1) Ortalayarak

TOP_TEXT (2) En üstten

Tablo 12.2 - Yatay ve düşey verilebilecek değerler

Page 189: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

189

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> /* fonksiyon tanımlama */ void hiza(int x, int y); /* Yatay yazı ve ortalama ayarları */ char *y_hiza[] = { "LEFT_TEXT", "CENTER_TEXT", "RIGHT_TEXT"}; /* Dikey yazı ve ortalama ayarları */ char *d_hiza[] = { "LEFT_TEXT", "CENTER_TEXT", "RIGHT_TEXT"}; int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xort, yort, yh, dh; char msg[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; /* Döngü kullanılarak ortalama ayarları yapılıyor. */ for (yh=LEFT_TEXT; yh<=RIGHT_TEXT; yh++) for (dh=LEFT_TEXT; dh<=RIGHT_TEXT; dh++) { cleardevice(); settextjustify(yh, dh); sprintf(msg, "%s %s", y_hiza[yh], d_hiza[dh]); /* Ekranda metni kunumlandıracak fonksiyon çağırılıyor. */ hiza(xort, yort);

Page 190: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

190

outtextxy(xort, yort, msg); getch(); } closegraph(); return 0; } /* x,y noktasına "x" yazar. */ void hiza(int x, int y) { line(x-4, y, x+4, y); line(x, y-4, x, y+4); }

Program Çıktısı:

Page 191: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

191

12.14 GETTEXT Text modu ekranından belleğe metin kopyalar. Tanım:

int gettext(int x1, int y1, int x2, int y2, void *metin);

Koordinatlar mutlaktır. Window a bağlı değildir. Yani sol üst köşe 1,1 koordinatıdır. Örnek:

#include <conio.h> char buffer[4096]; int main(void) { int i; clrscr(); for (i = 0; i <= 20; i++) cprintf("Line #%d\r\n", i); gettext(1, 1, 80, 25, buffer); gotoxy(1, 25); cprintf("Ekranı temizlemek için herhangi bir tuşa basın"); getch(); clrscr();

Page 192: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

192

gotoxy(1, 25); cprintf("İlk ekranı tekrar yüklemek için herhangi bir tuşa basın"); getch(); puttext(1, 1, 80, 25, buffer); gotoxy(1, 25); cprintf("Çıkmak için herhangi bir tuşa basın."); getch(); return 0; }

Program Çıktısı:

Line #0 Line #1 Line #2 Line #3 Line #4 : Line #20 Ekranı temizlemek için herhangi bir tuşa basın

İlk ekranı tekrar yüklemek için herhangi bir tuşa basın

Line #0 Line #1 Line #2 Line #3 Line #4 : Line #20 Çıkmak için herhangi bir tuşa basın

Page 193: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

193

12.15 GETTEXTSETTINGS Aktif grafik fontu hakkında bilgi verir.

Tanım:

void far gettextsettings(struct textsettingstype far texttypeinfo);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> /* Desteklenen fontların isimleri */ char *font[] = { "DEFAULT_FONT", "TRIPLEX_FONT", "SMALL_FONT", "SANS_SERIF_FONT", "GOTHIC_FONT" }; /* Desteklenen metin yönleri */ char *yon[] = { "HORIZ_DIR", "VERT_DIR" }; /* yatay ortalama */ char *y_hiza[] = { "LEFT_TEXT", "CENTER_TEXT", "RIGHT_TEXT" }; /* Dikey ortalama */ char *d_hiza[] = { "BOTTOM_TEXT", "CENTER_TEXT", "TOP_TEXT" }; int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; struct textsettingstype textinfo; int xort, yort, ht; char bicst[80], yonstr[80], buyst[80]; char y_hizastr[80], d_hizastr[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın ");

Page 194: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

194

getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; /* Aktif metin ayarları hakkında bilgi */ gettextsettings(&textinfo); /* metin bilgisini stringe çevirir. */ sprintf(bicst, "%s fontudur.", font[textinfo.font]); sprintf(yonstr, "%s yonüdür.", yon[textinfo.yon]); sprintf(buyst, "%d büyüklüğüdür.", textinfo.charsize); sprintf(y_hizastr, "%s Yatay hizalamadır.", y_hiza[textinfo.horiz]); sprintf(d_hizastr, "%s Dikey hizalamadır.", d_hiza[textinfo.vert]); /* Bilgiyi görüntüler */ ht = textheight("W"); settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(xort, yort, bicst); outtextxy(xort, yort+2*ht, yonstr); outtextxy(xort, yort+4*ht, buyst); outtextxy(xort, yort+6*ht, y_hizastr); outtextxy(xort, yort+8*ht, d_hizastr); getch(); closegraph(); return 0; }

Program Çıktısı:

Page 195: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

195

12.16 TEXTHEIGHT Pixel olarak en son kullanılan string görüntüleme stiline göre karakterlerin yüksekliğini verir.

Tanım:

int far textheight(char far *textstring);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int y = 0; int i; char msg[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } /* ekrana metin yazar */ for (i=1; i<11; i++) { /* Metnin biçim, yön ve büyüklüğü verilir. */ settextstyle(TRIPLEX_FONT, HORIZ_DIR, i);

Page 196: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

196

sprintf(msg, "Büyüklük: %d", i); outtextxy(1, y, msg); /* bir sonraki metin satırına ilerler */ y += textheight(msg); } getch(); closegraph(); return 0; }

Program Çıktısı:

12.17 TEXTWIDTH Pixel olarak grafik ortamda en son kullanılan, aktif string biçimine göre karakterlerin genişliğini verir.

Tanım:

int far textwidth(char far *textstring);

Örnek Kullanım:

y = getmaxy() / 2; settextjustify(LEFT_TEXT, CENTER_TEXT); for (i=1; i<11; i++) { settextstyle(TRIPLEX_FONT, HORIZ_DIR, i);

Page 197: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

197

sprintf(msg, "Büyüklük: %d", i); outtextxy(x, y, msg); x += textwidth(msg); } getch(); closegraph(); return 0; }

12.18 MOVETO Pixel imlecini x,y koordinatına taşır. Tanım:

void far moveto(int x, int y);

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; char msg[80]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } /* imleci konumlandırır (20, 30) */ moveto(20, 30); /* İmlecin bulunduğu pozisyona nokta koyar*/ putpixel(getx(), gety(), getmaxcolor());

Page 198: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

198

/* (20, 30) pozisyonundan itibaren oluşturlan yeni string yazılır */ sprintf(msg, " (%d, %d)", getx(), gety()); outtextxy(20, 30, msg); /* (100, 100) imlec pozisyonuna konumlanır. */ moveto(100, 100); /* Bulunduğu pozisyona bir nokta koyar */ putpixel(getx(), gety(), getmaxcolor()); /* mesajı bulunduğu konumdan itibaren yazar */ sprintf(msg, " (%d, %d)", getx(), gety()); outtext(msg); getch(); /* Aktif imleç pozisyonunu (20, 30) noktasına taşır*/ moveto(20, 30); /* İmlecin bulunduğu yere bir nokta koyar. */ putpixel(getx(), gety(), getmaxcolor()); /* (20, 30) noktasından itibaren bir mesaj yazar*/ sprintf(msg, " (%d, %d)", getx(), gety()); outtextxy(20, 30, msg); /* İmleci verilen bağıl mesafeye göre yeniden konumlandırır. */ moverel(100, 100); /* İmlecin bulunduğu yeni konuma bir nokta koyar */ putpixel(getx(), gety(), getmaxcolor()); /* Aktif pozisyondan itibaren mesaj yazar. */ sprintf(msg, " (%d, %d)", getx(), gety()); closegraph(); return 0; }

Program Çıktısı:

Page 199: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

199

12.19 MOVEREL Aktif imleç pozisyonunu verilen bağıl değerlere göre değiştirir.

Tanım:

void far moverel(int dx, int dy);

12.20 LINE Verilen iki koordinat arasına bir çizgi çizer. Aktif çizgi rengi, çizgi biçimi ve çizgi kalınlığını kullanarak x1,y1 noktasından x2,y2 noktasına bir çizgi çizer. Tanım:

void far line(int x1, int y1, int x2, int y2);

İlişkili fonksiyonlar: getlinesettings lineto setlinestyle linerel setcolor setwritemode Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xmax, ymax; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik Hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); }

Page 200: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

200

setcolor(getmaxcolor()); xmax = getmaxx(); ymax = getmaxy(); /* Çapraz bir çizgi çizer */ line(0, 0, xmax, ymax); getch(); /* Aktif imleç pozisyonunu (20, 30) konumuna taşır*/ moveto(20, 30); /* (20, 30) noktasından itibaren bir mesaj yazar*/ sprintf(msg, " (%d, %d)", getx(), gety()); outtextxy(20, 30, msg); /* Aktif imleç pozisyonundan (100, 100) noktasına bir çizgi çizer */ lineto(100, 100); /* Aktif imleç pozisyonundan itibaren mesaj yazar */ sprintf(msg, " (%d, %d)", getx(), gety()); outtext(msg); moveto(20, 30); sprintf(msg, " (%d, %d)", getx(), gety()); outtextxy(20, 30, msg); /* Aktif imleç pozisyonundan (100, 100) mesafe uzağa bir çizgi çizer */ linerel(100, 100); getch(); closegraph(); return 0; }

Program Çıktısı:

Page 201: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

201

12.21 LINETO Aktif imleç pozisyonundan (x,y) koordinatına bir çizgi çizer.

Tanım:

void far lineto(int x, int y);

İlişkili fonksiyonlar: getlinesettings setlinestyle line setvisualpage linerel setwritemode setcolor

12.22 LINEREL Aktif çizgi rengi, çizgi biçimi ve çizgi kalınlığını kullanarak, imleç pozisyonundan verilen bağıl bir mesafe uzağa çizgi çizer.

Tanım:

void far linerel(int dx, int dy);

İlişkili fonksiyonlar: getlinesettings lineto setlinestyle

Page 202: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

202

line setcolor setwritemode

12.23 SETLINESTYLE Aktif çizgi biçimini, çizgi kalınlığını ve çizgi desenini değiştirir. Tanım:

void far setlinestyle(int cizbicimi, unsigned desen, int cizkal);

İlişkili fonksiyonlar: arc getlinesettings pieslice bar3d graphresult rectangle circle line sector drawpoly linerel ellipse lineto Örnek:

#include <graphics.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <conio.h> /* Desteklenen çizgi biçimleri */ char *cizbicimi[] = { "SOLID_LINE", "DOTTED_LINE", "CENTER_LINE", "DASHED_LINE", "USERBIT_LINE" }; int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int bicim, xort, yort, kuldesen; char bicimstr[40]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */

Page 203: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

203

{ printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; /* kullanıcı çizgi deseni */ /* ikili: "0000000000000001" */ kuldesen = 1; for (bicim=SOLID_LINE; bicim<=USERBIT_LINE; bicim++) { /* Çizgi biçimi seçilir */ setlinestyle(bicim, kuldesen, 1); /* çizgi biçimini stringe çevirir */ strcpy(bicimstr, cizbicimi[bicim]); line(0, 0, xort-10, yort); rectangle(0, 0, getmaxx(), getmaxy()); outtextxy(xort, yort, bicimstr); getch(); cleardevice(); } closegraph(); return 0; }

Program Çıktısı:

Page 204: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

204

Page 205: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

205

12.24 GETLINESETTINGS Aktif çizgi biçimi, çizgi kalınlığı ve çizgi desenini verir.

Tanım:

void far getlinesettings(struct linesettingstype far *lineinfo);

İlişkili fonksiyonlar: setlinestyle

12.25 RECTANGLE Grafik ekranda verilen koordinatlar arasında dikdörtgen çizer.

Tanım:

void far rectangle(int x1, int y1, int x2, int y2);

İlişkili fonksiyonlar: setcolor setlinestyle Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void)

Page 206: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

206

{ int gsurucusu = DETECT, gmodu, hatakodu; int x1, y1, x2, y2; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } x1 = getmaxx() / 2 - 50; y1 = getmaxy() / 2 - 50; x2 = getmaxx() / 2 + 50; y2 = getmaxy() / 2 + 50; /* Bir dikdörtgen çizer */ rectangle(x1,y1,x2,y2); getch(); closegraph(); return 0; }

Program Çıktısı:

12.26 PUTPIXEL Verilen koordinata bir piksel noktası koyar. Tanım:

void far putpixel(int x, int y, int renk);

İlişkili fonksiyonlar: getpixel putimage

Page 207: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

207

Örnek: #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define PIX_SAY 1000 #define GEC_ZAMAN 100 /* milisaniye gecikme verilecektir */ int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int i, x, y, renk, maxx, maxy, maxrenk, ras_sinir; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx() + 1; maxy = getmaxy() + 1; maxrenk = getmaxcolor() + 1; while (!kbhit()) { /* randomize sayı üretir */ ras_sinir = random(32767); srand(ras_sinir); for (i=0; i<PİX_SAY; i++) { x = random(maxx); y = random(maxy); renk = random(maxrenk); putpixel(x, y, renk); } delay(GEC_ZAMAN); srand(ras_sinir); for (i=0; i<PİX_SAY; i++) { x = random(maxx); y = random(maxy); renk = random(maxrenk); if (renk == getpixel(x, y)) putpixel(x, y, 0); } }

Page 208: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

208

getch(); closegraph(); return 0; }

Program Çıktısı:

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <math.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int i,x,y; double dx; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); }

Page 209: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

209

setcolor(2); line(140,240,500,240); line(320,140,320,340); for (i=0 i<360 i++) { dx:=i*pi/180; /*dx ile açılar radyan cinsinden hesaplanmaktadır */ x=dx*50; /* x ekseninde her bir açıya karşılık düşen mesafe*/ y:=sin(dx)*50; /*y ekseninde açının sinüsü 50 kat büyütülerek alınır*/ putpixel((320+x),(240-y),3); /*Koordinatı belirlenen nokta işaretlenir.*/ } getch(); closegraph(); return 0; }

Program Çıktısı:

Page 210: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

210

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int i,y,x1,x2,y1,y2; initgraph(&gsurucusu, &gmodu, "c:\\tc\\bgi"); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } setcolor(1); restorecrtmode(); clrscr(); printf("doğru üzerindeki iki noktanın koordinatlarını girin\n"); printf("x1=");scanf("%d",&x1); printf("y1=");scanf("%d",&y1); printf("x2=");scanf("%d",&x2); printf("y2=");scanf("%d",&y2); setgraphmode(gmodu); setbkcolor(6); cleardevice; setcolor(2); line(150,300,500,300); line(200,100,200,400); setcolor(3); for (i=1; i<100 ; i++) { y=i*(y2-y1)/(x2-x1)+y1-x1*(y2-y1)/(x2-x1); putpixel(200+i,300-y,3); } getch(); closegraph(); return 0; }

Page 211: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

211

Program Çıktısı: Doğru üzerinde iki noktanın koordinatını girin X1=50 Y1=100 X2=150 Y2=200

12.27 GETPIXEL Verilen piksel noktasının rengini verir. Tanım:

unsigned far getpixel(int x, int y);

İlişkili fonksiyonlar: getimage putpixel

12.28 BAR İçi dolu bir bar çizer.

Tanım:

void far bar(int x1, int y1, int x2, int y2);

Page 212: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

212

İlişkili fonksiyonlar: bar3d setcolor setlinestyle rectangle setfillstyle Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xort, yort, i; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; /* Dolgu deseni sayısında döngü kurulur */ for (i=SOLID_FILL; i<USER_FILL; i++) { /* Dolgu biçimimi değiştirir */ setfillstyle(i, getmaxcolor()); /* Verilen koordinatlar arasında içi dolu bir bar çizer */ bar(xort-50, yort-50, xort+50, yort+50); getch(); } closegraph(); return 0; }

Program Çıktısı:

Page 213: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

213

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #define pi 314E-2 int main(void) { int yil[7]={92,93,94,95,96,97,98}; int ur[7]={70,73,78,85,87,97,93}; int gsurucusu = DETECT, gmodu, hatakodu; int i; long double x, fx; char *s; char *u; char *y; initgraph(&gsurucusu, &gmodu, "c:\\tc\\bgi"); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); }

Page 214: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

214

setcolor(1); line(300,250,650,250); line(350,50,350,300); for (i=0; i<7; i++){ sprintf(u,"%d",ur[i]); sprintf(y,"%d",yil[i]); setfillstyle(7,i+1); bar(350+i*30,250-2*ur[i],350+(i+1)*30,250); setcolor(i+1); settextstyle(2,0,0); outtextxy(350,20,"BAR() ile bar grafik ”örneği"); outtextxy(340,250-2*ur[i],u); outtextxy(360+i*30,260,y); } setcolor(3); line(0,400,350,400); line(50,200,50,450); for (i=0; i<7; i++){ sprintf(u,"%d",ur[i]); sprintf(y,"%d",yil[i]); setfillstyle(5,i+1); bar3d(50+i*30,400-2*ur[i],50+(i+1)*30,400,10,1); setcolor(i+1); settextstyle(2,0,0); outtextxy(40,250,"Bar3D() ile bar grafik ”örneği"); outtextxy(40,400-2*ur[i],u); outtextxy(60+i*30,410,y); } getch(); closegraph(); return 0; }

Program Çıktısı:

Page 215: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

215

12.29 BAR3D Verilen koordinatlar arasında içi dolu, üç boyutlu bir bar çizer.

Tanım:

void far bar3d(int x1, int y1, int x2, int y2, int derin, int ust);

İlişkili fonksiyonlar: bar setcolor setlinestyle rectangle setfillstyle Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xort, yort, i; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; for (i=EMPTY_FILL; i<USER_FILL; i++) { /* Dolgu biçimini değiştirir */ setfillstyle(i, getmaxcolor()); /* Üç boyutlu bir bar çizer */ bar3d(xort-50, yort-50, xort+50, yort+50, 10, 1); getch(); } closegraph(); return 0; }

Page 216: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

216

Program Çıktısı:

12.30 SETFILLPATTERN Kullanıcının tanımladığı dolgu deseni tanımlanır. Desen 8*8 bit ten oluşan, 8 byte lık bir alandır.

Tanım:

void far setfillpattern(char far *desen, int renk);

Page 217: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

217

İlişkili fonksiyonlar: fill_patterns (enum tipi) graphresult getfillpattern sector getfillsettings setfillstyle Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int maxx, maxy; /* Kullanıcının tanımladığı dolgu deseni */ char desen[8] = {0x00, 0x70, 0x20, 0x27, 0x24, 0x24, 0x07, 0x00}; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx(); maxy = getmaxy(); setcolor(getmaxcolor()); /* Kullanıcının tanımladığı dolgu deseni */ setfillpattern(desen, getmaxcolor()); /* Ekranı tanımlanan dolgu deseni ile doldurur */ bar(0, 0, maxx, maxy); getch(); closegraph(); return 0; }

Page 218: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

218

Program Çıktısı:

12.31 SETFILLSTYLE Dolgu deseni ve rengini değiştirir. Desen kullanıcının tanımladığı dolgu desenidir. Tanım:

void far setfillstyle(int desen, int renk);

İlişkili fonksiyonlar: bar floodfill pieslice bar3d getfillsettings sector fillpoly graphresult Örnek:

#include <graphics.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <conio.h> /* Desteklenen dolgu desenlerinin isimleri */ char *desenismi[] = { "EMPTY_FILL", "SOLID_FILL", "LINE_FILL", "LTSLASH_FILL", "SLASH_FILL", "BKSLASH_FILL", "LTBKSLASH_FILL", "HATCH_FILL", "XHATCH_FILL", "INTERLEAVE_FILL", "WIDE_DOT_FILL", "CLOSE_DOT_FILL", "USER_FILL" };

Page 219: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

219

int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int bicim, xort, yort; char bicimstr[40]; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; for (bicim = EMPTY_FILL; bicim < USER_FILL; bicim++) { /* Dolgu biçimini değiştirir */ setfillstyle(bicim, getmaxcolor()); /* Dolgu biçimini stringe çevirir. */ strcpy(bicimstr, desenismi[bicim]); bar3d(0, 0, xort-10, yort, 0, 0); outtextxy(xort, yort, bicimstr); getch(); cleardevice(); } getch(); closegraph(); return 0; }

Program Çıktısı:

Page 220: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

220

Page 221: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

221

12.32 GETFILLPATTERN Kullanıcının tanımladığı dolgu desenini bellek bölgesine alır. Tanım:

void far getfillpattern(char far *desen);

İlişkili fonksiyonlar: fill_patterns getfillsettings setfillpattern

12.33 GETFILLSETTINGS Aktif dolgu desen ve renk bilgisini verir.

Tanım:

void far getfillsettings(struct fillsettingstype far *fillinfo);

İlişkili fonksiyonlar: getfillpattern setfillpattern setfillstyle

12.34 ARC Bir yay parçası çizer.

Tanım:

Page 222: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

222

void far arc(int x, int y, int basaci, int bitaci, int cap);

Açıklama:

(x,y) yayın merkezini gösterir. basaci ve bitaci derece olarak başlangıç ve bitiş açısıdır. Cap yayın çapıdır. İlişkili fonksiyonlar: circle getaspectratio ellipse graphresult fillellipse pieslice getarccoords sector Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gsurucusu = DETECT, gmodu, hatakodu; int xort, yort; int basaci = 45, bitaci = 135; int cap = 100; initgraph(&gsurucusu, &gmodu, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1) } xort = getmaxx() / 2; yort = getmaxy() / 2; setcolor(getmaxcolor()); /* Bir yay parçası çizer */ arc(xort, yort, basaci, bitaci, cap); getch(); closegraph(); return 0; }

Page 223: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

223

Program Çıktısı:

12.35 GETARCCOORDS En son kullanılan arc fonksiyonunun koordinatlarını verir. Tanım:

void far getarccoords(struct arccoordstype far *arccoords);

İlişkili fonksiyonlar: arc fillellipse sector

12.36 CIRCLE (x,y) merkezli verilen çapta bir çember çizer. Tanım:

void far circle(int x, int y, int cap);

İlişkili fonksiyonlar: arc fillellipse sector ellipse getaspectratio setaspectratio Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void)

Page 224: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

224

{ int gdriver = DETECT, gmode, hatakodu; int xort, yort; int cap = 100; int basaci = 0, bitaci = 360; int xcap = 100, ycap = 50; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; setcolor(getmaxcolor()); /* çember çizer */ for (i=1; i<50; i++){ setcolor(random(15)); circle(xort, yort, cap); delay(100); } for (i=1; i<50; i++){ setcolor(random(15)); circle(xort, yort, cap); delay(100); } /* elips çizer */ ellipse(xort+100, yort, basaci, bitaci, xcap, ycap); getch(); for (i=0; i<13; i++) { setfillstyle(i,WHITE); fillellipse(xcenter,ycenter,100,50); getch(); } getch(); closegraph(); return 0; }

Page 225: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

225

Program Çıktısı:

12.37 ELLIPSE Elips şeklinde başlangıç, bitiş açısı, x ve y koordinatları üzerindeki çapları verilen bir yay parçası çizer. Tanım:

void far ellipse(int x, int y, int basaci, int bitaci, int xcap, int ycap);

İlişkili fonksiyonlar: arc fillellipse sector circle getaspectratio setaspectratio

12.38 FILLELLIPSE İçi dolu bir elips çizer. Elipsin (x,y) merkezi ve x ve y eksenleri üzerindeki çapları verilir. Elipsin içi aktif dolgu deseni ve dolgu rengi ile doldurulur. Tanım:

void far fillellipse(int x, int y, int xcap, int ycap);

İlişkili fonksiyonlar: arc getaspectratio circle pieslice ellipse setaspectratio

Page 226: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

226

12.39 PIESLICE Merkezi, çapı, başlangıç açısı ve bitiş açısı verilen dolu bir daire dilimi çizer. Tanım:

void far pieslice(int x, int y, int basaci, int bitaci, int cap);

İlişkili fonksiyonlar: fill_patterns (enumerated tipi) sector fillellipse setfillstyle graphresult Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gdriver = DETECT, gmode, hatakodu; int xort, yort; int basaci = 45, bitaci = 135, cap = 100; int xrad = 100, yrad = 50; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } xort = getmaxx() / 2; yort = getmaxy() / 2; /* Dolgu biçimini ayarlar ve daire dilimini çizer */ setfillstyle(EMPTY_FILL, getmaxcolor()); pieslice(xort, yort, basaci, bitaci, cap); getch(); for (i=EMPTY_FILL; i<USER_FILL; i++) { setfillstyle(i, getmaxcolor());

Page 227: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

227

sector(xort, yort, basaci, bitaci, xrad, yrad); getch(); } getch(); closegraph(); return 0; }

Program Çıktısı:

Page 228: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

228

Page 229: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

229

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <math.h> #define pi 3.14 int main(void) { int a[7] ={50,70,30,80,60,30,40}; int ur[7]; int gsurucusu = DETECT, gmodu, hatakodu; int i,t,baci,x,y; char u[5]=" "; initgraph(&gsurucusu, &gmodu, "c:\\tc\\bgi"); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } setcolor(1); baci=0; t=0; for (i=0; i<7; i++) { /* Örnekte toplam 360 dereceye eşit bir şekilde */ ur[i]=0; /* seçilmiştir. Eğer farklı olursa her bir */ t+=a[i]; } /* dilimin pastada kaç derecelik yer */ /* kaplayacağının yandaki gibi hesaplanması */ ge for (i=0;i<7;i++) { /* gerekir. */ ur[i]=a[i]*360/t;} for (i=0; i<7; i++) { setfillstyle(3,i+2); pieslice(220,200,baci,baci+a[i],100); baci+=a[i]; setcolor(i+2); x=50*cos((baci-ur[i]/2)*pi/180); /* Değerlerin üzerine yazılması için*/ y=50*sin((baci-ur[i]/2)*pi/180); /* yazılacak yerin koordinatları */ sprintf(u,"%i",ur[i]); /* hesaplanmalıdır. */ outtextxy(220+x,200-y,u);getch(); }

Page 230: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

230

getch(); closegraph(); return 0; }

Program Çıktısı:

12.40 SECTOR İçi dolu elips dilimi çizer. Dış çerçevesi aktif çizgi rengi ile içi ise aktif dolgu ayarları kullanılarak çizilir. Tanım:

void far sector(int x, int y, int basaci, int bitaci, int xcap, int ycap);

İlişkili fonksiyonlar: arc getaspectratio setfillpattern circle graphresult setfillstyle ellipse pieslice setgraphbufsize getarccoords

Page 231: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

231

12.41 FLOODFILL Kapalı bir alanı aktif dolgu deseni ve dolgu rengini kullanarak doldurur. Kapalı bölge içerisinde bir noktanın koordinatı ve sınır rengi verilmelidir.

Tanım:

void far floodfill(int x, int y, int s_rengi);

İlişkili fonksiyonlar: drawpoly fillpoly setfillstyle fill_patterns graphresult Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gdriver = DETECT, gmode, hatakodu; int maxx, maxy; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx(); maxy = getmaxy(); setcolor(getmaxcolor()); setfillstyle(SOLID_FILL, getmaxcolor()); rectangle(0, 0, maxx, maxy); circle(maxx / 3, maxy /2, 50); circle(maxx / 2, 20, 100); circle(maxx-20, maxy-50, 75); circle(20, maxy-20, 25); getch();

Page 232: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

232

/* kapalı bölgeyi doldurur */ floodfill(2, 2, getmaxcolor()); getch(); closegraph(); return 0; }

Program Çıktısı:

12.42 DRAWPOLY Nokta sayısı ve noktaları verilen bir poligonu çizer. Poligon kapalı bir bölge gösterebileceği gibi açıkta kalabilir. Tanım:

void far drawpoly(int noktasayisi, int far *polnoktalari);

Açıklama:

*polnoktalari poligonu oluşturan naktasayisi kadar koordinattır. Her bir koordinatın x ve y gibi iki değeri vardır. İlişkili diğer fonksiyonlar: fillpoly graphresult floodfill setwritemode

Page 233: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

233

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { int gdriver = DETECT, gmode, hatakodu; int maxx, maxy; int poly[10]; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx(); maxy = getmaxy(); poly[0] = 20; /* birinci nokta */ poly[1] = maxy / 2; poly[2] = maxx - 20; /* 2. */ poly[3] = 20; poly[4] = maxx - 50; /* 3. */ poly[5] = maxy - 20; poly[6] = maxx / 2; /* 4. */ poly[7] = maxy / 2; /* İlk noktayı en son tekrarlarsak bölgeyi kapatmış oluruz. */ poly[8] = poly[0]; poly[9] = poly[1]; /* poligonu çizer */ drawpoly(5, poly); Fillpoly(5, poly); getch(); closegraph(); return 0; }

Page 234: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

234

Program Çıktısı:

12.43 FILLPOLY İçi dolu bir poligon çizer Tanım:

void far fillpoly(int noktasayisi, int far *polnoktalari[]);

Açıklama:

*polnoktalari noktasayisi kadar noktayı içerir. İlişkili fonksiyonlar: drawpoly floodfill setfillstyle fill_patterns graphresult

12.44 GETIMAGE Grafik ekranın verilen koordinatlar arasındaki görüntüsü byte olarak bellekte verilen değişken ismiyle saklanır. Tanım:

void far getimage(int x1, int y1, int x2, int y2,void far *bitmap);

İlişkili fonksiyonlar: imagesize putimage putpixel

Page 235: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

235

Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <alloc.h> void save_screen(void far *buf[4]); void restore_screen(void far *buf[4]); int maxx, maxy; int main(void) { int gdriver=DETECT, gmode, hatakodu; void far *ptr[4]; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx(); maxy = getmaxy(); rectangle(0, 0, maxx, maxy); line(0, 0, maxx, maxy); line(0, maxy, maxx, 0); save_screen(ptr); /* Aktif ekran kayıt edilir. */ getch(); /* Bir tusa basılıncaya kadar ekran dondurulur. */ cleardevice(); /* Ekran temizlenir. */ restore_screen(ptr); /* Kayıt edilen ekran tekrar yüklenir. */ getch(); /* Ekran dondurulur. */ closegraph(); return 0; } void save_screen(void far *buf[4]) { unsigned buyukluk; int ystart=0, yend, yincr, blok; yincr = (maxy+1) / 4; yend = yincr; buyukluk = imagesize(0, ystart, maxx, yend); /* Görüntünün byte olarak büyüklüğü alınır. */ for (blok=0; blok<=3; blok++) { if ((buf[blok] = farmalloc(buyukluk)) == NULL)

Page 236: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

236

{ closegraph(); printf("Hata: Ekranı saklamak için heap alanda yeterli boş bellek miktarı yoktur().\n"); exit(1); } getimage(0, ystart, maxx, yend, buf[blok]); ystart = yend + 1; yend += yincr + 1; } } void restore_screen(void far *buf[4]) { int ystart=0, yend, yincr, blok; yincr = (maxy+1) / 4; yend = yincr; for (blok=0; blok<=3; blok++) { putimage(0, ystart, buf[blok], COPY_PUT); farfree(buf[blok]); ystart = yend + 1; yend += yincr + 1; } }

Program Çıktısı:

12.45 IMAGESIZE Görüntünün büyüklüğünü byte olarak verir. Tanım:

unsigned far imagesize(int x1, int y1,int x2, int y2);

Page 237: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

237

Açıklama:

Eğer seçilen bölgedeki görüntünün büyüklüğü 64K-1 byte tan daha büyük veya eşit ise 0xFFFF bilgisi verilir. İlişkili fonksiyonlar: getimage putimage

12.46 PUTIMAGE Bellekte byte olarak saklanmış bir görüntüyü grafik ekrana taşır.

Tanım:

void far putimage(int x1, int y1, void far *bitmap, int opsiyon);

Açıklama:

bitmap genellikle getimage fonksiyonuyla belleğe aktarılmış bitmap görüntüye işareteder. Opsiyon değerine göre bitmap görüntü ekrana zemindeki görüntüyle üstüste biniştirilir. İlişkili fonksiyonlar: getimage putpixel imagesize setvisualpage Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #define OKbuy 10 void draw_ok(int x, int y); int main(void) { int gdriver = DETECT, gmode, hatakodu; void *ok; int x, y, maxx; unsigned int buyukluk; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */

Page 238: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

238

{ printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } maxx = getmaxx(); x = 0; y = getmaxy() / 2; draw_ok(x, y); buyukluk = imagesize(x, y-OKbuy, x+(4*OKbuy), y+OKbuy); /* Görüntüyü bellekte tutmak için heap alandan boş alan istenir. */ ok = malloc(buyukluk); /* görüntüyü alır */ getimage(x, y-OKbuy, x+(4*OKbuy), y+OKbuy, ok); /* herhangi bir tuşa basılıncaya kadar */ while (!kbhit()) { /* Eski görüntü tekrar yüklenir */ putimage(x, y-OKbuy, ok, XOR_PUT); x += OKbuy; if (x >= maxx) x = 0; /* yeni görüntü konur. */ putimage(x, y-OKbuy, ok, XOR_PUT); } free(ok); closegraph(); return 0; } void draw_ok(int x, int y) { /* ekranda bir ok çizer */ moveto(x, y); linerel(4*OKbuy, 0); linerel(-2*OKbuy, -1*OKbuy); linerel(0, 2*OKbuy); linerel(2*OKbuy, -1*OKbuy); }

Page 239: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

239

Program Çıktısı:

12.47 SETVIEWPORT Grafik ekran için aktif görüntü penceresini koordinatlarıyla tanımlamamızı sağlar. Tanım:

void far setviewport(int x1, int y1, int x2, int y2, int clip);

İlişkili fonksiyonlar: clearviewport getviewsettings graphresult Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #define TASMA 1 /* Görüntü penceresinin dışına çıkılmamasını sağlar */ int main(void) { int gdriver = DETECT, gmode, hatakodu; void *ok; int x, y, maxx; unsigned int buyukluk; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) /* bir hata oluşursa */ { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:");

Page 240: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

240

getch(); exit(1); } setcolor(getmaxcolor()); /* Aktif doğal grafik ekran penceresinde mesaj görüntüler */ outtextxy(0, 0, "* <-- (0, 0) doğal grafik ekran penceresi"); /* Daha küçük bir grafik penceresi tanımlar */ setviewport(50, 50, getmaxx()-50, getmaxy()-50, TASMA); /* metin görüntüler */ outtextxy(0, 0, "* <-- (0, 0) in Daha küçük grafik penceresi"); xort = getmaxx() / 2; yort = getmaxy() / 2; /* Aktif grafik penceresi hakkında bilgi verir. */ getviewsettings(&viewinfo); /* Bilgiyi stringe çevirir */ sprintf(topstr, "(%d, %d) görüntü penceresinin sol üst köşesidir.", viewinfo.left, viewinfo.top); sprintf(botstr, "(%d, %d) görüntü penceresinin sağ alt köşesidir.", viewinfo.right, viewinfo.bottom); sprintf(clipstr, "taşmaya izin verilmez %s.", clip[viewinfo.clip]); /* Bilgiyi görüntüler */ settextjustify(CENTER_TEXT, CENTER_TEXT); ht = textheight("W"); outtextxy(xort, yort, topstr); outtextxy(xort, yort+2*ht, botstr); outtextxy(xort, yort+4*ht, clipstr); getch(); closegraph(); return 0; }

12.48 GETVIEWSETTINGS Aktif grafik ekran penceresi bilgilerini verir. Tanım:

void far getviewsettings(struct viewporttype far *viewport);

Page 241: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

241

İlişkili fonksiyonlar: clearviewport getx gety setviewport

12.49 CLEARVIEWPORT Aktif görüntü penceresini temizler.

12.50 RESTORECRTMODE Grafik ekrandan önce kullanılan text ekranı tekrar yükler.

Tanım:

void far restorecrtmode(void);

İlişkili fonksiyonlar: getgraphmode initgraph setgraphmode

12.51 SETGRAPHMODE Sistemi tekrar grafik ekrana ayarlar ve ekranı temizler. Daha önce initgraph fonksiyonunun kullanılmış olması gerekir. Restorecrtmode fonksiyonundan sonra grafik ekrana tekrar geri dönmek için kullanılır. Tanım:

void far setgraphmode(int mode);

İlişkili fonksiyonlar: getgraphmode graphresult restorecrtmode getmoderange initgraph Örnek:

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) {

Page 242: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

242

int gdriver = DETECT, gmode, hatakodu; void *ok; int x, y, maxx; unsigned int buyukluk; initgraph(&gdriver, &gmode, ""); hatakodu = graphresult(); if (hatakodu != grOk) { printf("Grafik hatası: %s\n", grapherrormsg(hatakodu)); printf("Durdurmak için herhangi bir tuşa basın:"); getch(); exit(1); } x = getmaxx() / 2; y = getmaxy() / 2; /* mesaj görüntüler */ settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(x, y, "Grafik ekrandan çıkmak için herhangi bir tuşa basın:"); getch(); /* Tekrar text moda geçer */ restorecrtmode(); printf("Şimdi text ekrandayız.\n"); printf("Grafik moda geri gitmek için herhangi bir tuşa basın:"); getch(); /* grafik moda geri döner */ setgraphmode(getgraphmode()); /* mesaj görüntüler */ settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(x, y, "Şimdi tekrar grafik ekrandayız."); outtextxy(x, y+textheight("W"), "Durdurmak için herhangi bir tuşa basın:"); getch(); closegraph(); return 0; }

12.52 GETMAXX/GETMAXY Maksimum X ve Y koordinatlarını verir.

Page 243: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

243

Tanım:

int far getmaxx(void); int far getmaxy(void);

İlişkili fonksiyonlar: getx gety

12.53 GETX Aktif pixel konumunun X koordinatını verir. Alınan değeri aktif grafik penceresi etkileyecektir. Tanım:

int far getx(void);

İlişkili fonksiyonlar: getmaxx getviewsettings moveto getmaxy gety

12.54 GETY Aktif pixel konumunun Y koordinatını verir. Alınan değeri aktif grafik penceresi etkileyecektir. Tanım:

int far gety(void);

İlişkili fonksiyonlar: getmaxx getviewsettings moveto getmaxy getx

Page 244: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok
Page 245: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

245

13 DOSYA YAPILARI Dosya bir bellek birimine, genellikle disk ünitesine kayıt edilmiş veri kümesidir(byte kümesi). Bu veri; metni, karakterleri, kayıtları(structures) veya resimleri oluşturan byte kümesi olabilir. Dosya disk üzerine yazılırken ve okunurken iki farklı şekilde işlenir. Metin (text) tipi dosya akımları ve ikili (binary) tipteki dosya akımıdır. Metin Tipi Dosya Akımı: Bu tip akımlar ile açılan dosyalara karakterlerin ascii karşılıkları işlev olarak yerleştirilir. Örneğin (Carriage Return –CR veya ASCII 13) ve (Line Feed –LF veya ASCII 10) karakter ikilisi yazılmaya çalışılırsa yeni bir satırın başına konumlanır. Bu tip dosyalara sırasal erişim yapılabilir. Okuyucu yazıcı kafa yazdığı veya okuduğu veri miktarı kadar disk üzerinde ilerler. İkili Tipte Dosya Akımı: Dosyaya yazılırken veya okunurken karakterlerin kontrol edilip dönüştürülmesi söz konusu değildir. Karakterler dosyaya olduğu gibi yazılır ve yine böyle okunur. İlerlenecek byte miktarı belirlenerek, dosyada okuyucu yazıcı kafanın bulunduğu pozisyondan istenen kadar ileriye veya geriye konumlanılabilir. Buna rasgele erişim denilmektedir. Dosyaların hangi akımla tutulacakları açılış modu ile birlikte verilir. Dosyaya yazma veya okuma işleminin yapılabilmesi için mutlaka dosyanın açık olması gerekir. Yapılan değişikliklerden sonra dosyanın kapatılması gerekir. Aksi durumda dosyadaki son yapılan değişiklikler kaybedileceği gibi dosyada daha önceden bulunan verilerde kaybolabilir.

13.1 Dosya işlemleri için kullanılan fonksiyonlar

13.1.1 fopen fonksiyonu

Dosya açma fonksiyonudur. Dosya ismi ve açılış modu parametre olarak verilir. Tanım:

File *fopen (const char *dosya simi, const char *mod)

Açıklama:

File, Dosya tip bildirim deyimidir. Bu tipte tanımlanan bir değişken ile disk üzerinde bir dosyaya işaret edilebilir.

Dosya başarı ile açılmış ise file tipinde bir işaretçi, aksi takdirde NULL geri döndürülür. Dosya, disk üzerinde yeterli alan olmaması, mevcut olmayan bir dosyanın okuma için açılmak istenmesi gibi çeşitli nedenlerle doğru açılmayabilir. Bu yüzden dosyanın açılıp açılmadığı kontrol edilmelidir. Dosyaya verilecek isim parametresinin mutlaka tek olması gerekir. Mod parametresi ile verilebilecek açılış modları aşağıdaki şekilde kullanılabilir.

Page 246: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

246

“r” veya “rt” :Dosya sadece okuma amacıyla açılıyor. Daha önceden mevcut olmalıdır.

“w” veya “wt” :Yazma amacıyla açılıyor. Daha önceden mevcut dosya bu modda açılırsa içindeki bilgiler silinir.

“a” veya “at” :Dosyanın sonundan itibaren ekleme yapmak amacıyla açılır. Okuma yapılmaz.

“r+” veya “r+t” :Önceden var olan bir dosya okuma ve yazma yapmak için açılır. “w+” veya “w+t” :Dosya ilk defa okuma ve yazma yapmak için açılır. Eğer böyle bir

dosya daha önce varsa içindeki bilgiler silinir. “a+” veya “a+t” :Dosyanın sonundan itibaren ekleme yapmak için açılır. Dosyadan

aynı anda okuma da yapılabilir.

İkili (Binary) dosyalar için: “rb” :İkili bir dosya okuma amacıyla açılır. “wb” :İkili bir dosya ilk defa yazma yapmak için açılır. Dosya mevcut ise içindeki bilgiler

silinir. “ab” :İkili bir dosyanın sonundan itibaren ekleme yapmak için kullanılır. “rb+” :İkili bir dosya okuma ve yazma yapmak amacıyla açılır. “wb+” :İkili bir dosya ilk defa yazma ve aynı anda okuma yapmak için açılır. Dosya

mevcut ise içindeki bilgiler silinir. “ab” :İkili bir dosyanın sonundan itibaren ekleme yapmak için kullanılır. Aynı anda

okuma da yapılabilir. Örnek Kullanım:

#include <stdio.h> #include <stdlib.h> void main() { file *f; f=fopen(“dene.txt”, “w”); if (f==NULL) { printf(“Dosya açılamadı”); exit(0); }; fclose(f); }

13.1.2 fputc fonksiyonu

Tanım:

int fputc(int kar, file *dosyad);

Page 247: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

247

Açıklama:

int tipinde parametre olarak verilen kar değişken değerini unsigned char türüne çevirerek dosya değişkeniyle işaret edilen dosyaya yazar. Yazıcı kafa bir karakter ileriye konumlanır. Geri gönderdiği değer ise yazılan karakter sayısıdır. Eğer hata oluşursa EOF değeri geri gönderirlir.

13.1.3 fputs fonksiyonu

Tanım:

int fputs( const char *st, file *dosyad);

Açıklama:

String şeklinde verilen karakter dizisini, dosya değişkeniyle işaret edilen dosyaya yazar. Karakter dizisinin sonlandırma karakteri ‘\0’ dosyaya yazılmaz.

Yazdırma işleminde herhangi bir hata oluşmamışsa yazılan son karakter geri gönderilir. Hata durumunda ise EOF değeri geri gönderilecektir.

Text bir dosyaya yazma yapılırken ‘\n’ (LF) karakteri, CR /LF ikili karakter kombinezonuna dönüştürülerek yazılır. Dolayısıyla yazılan karakter sayısı ile dosyadaki karakter sayısı bire bir eş olmayabilir.

13.1.4 fprintf fonksiyonu

Tanım:

int fprintf(file *dosyad, const char *format, argumanlar);

Açıklama:

argumanlar ile verilen değerler, format değişkeniyle belirtildiği biçimde dosya değişkeniyle işaret edilen dosyaya yazılır. Yazma işlemi başarılı olursa yazılan karakter sayısı geri gönderilir. Herhangi bir hata durumunda negatif değer geri gönderilir. format parametresi printf fonksiyonundaki ile aynıdır.

13.1.5 fwrite fonksiyonu

Tanım:

size_t fwrite(void *tampon, size_t buyuk, size_t sayi, file *dosyad);

Page 248: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

248

Açıklama:

Dosya değişkeni ile işaret edilen dosyada yazıcı kafanın bulunduğu pozisyondan itibaren, tampondaki “sayi” adet bilgi yazılır. “buyuk” parametresi yazılacak her bir bilginin uzunluğunu gösterir. Yazılan karakterlerin sayısı geri gönderilir. ferror ve feof fonksiyonlarıyla hata durumu ve dosya sonu kontrolü yapılabilir.

13.1.6 fgetc fonksiyonu

Tanım:

int fgetc(file *dosyad);

Açıklama:

Okuyucu kafanın bulunduğu aktif pozisyondan, işaret edilen karakteri okur ve okuyucu kafanın pozisyonu okuduğu karakteri ilerler. Dosyanın sonuna gelinmiş ise EOF değeri geri gönderilir. EOF değeri –1 e karşılık geldiği için ikili dosyalarda çalışılırken feof ile bu kontrol yapılmalıdır. Hata durumunda yine EOF değerini geri gönderecektir. İkili dosyalarda hata kontrolü ferror ile yapılabilir.

13.1.7 fgets fonksiyonu

Tanım:

char *fgets(char *st, int sayi, file *dosyad);

Açıklama:

Dosyada okuyucu kafanın bulunduğu pozisyondan itibaren sayi parametresiyle verilen değerin bir eksiği kadar karakter okuyarak bunu st ile verilen karakter dizisi parametresine atar. Okuma işlemi sonunda st karakter dizisinin sonuna sonlandırma işareti ‘\0’ eklenir. Başarılı olursa karakter dizisi geri gönderilir. Başarısız olursa NULL değeri geri gönderilir. Dosya sonunda da aynı değer geri gönderileceğinden ferror ve feof fonksiyonlarıyla kontrol edilmeleri gerekir.

13.1.8 fscanf fonksiyonu

Tanım:

int fscanf(file *dosyad, const char *format, argumanlar);

Page 249: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

249

Açıklama:

format değişkeniyle belirtildiği biçimde dosya değişkeniyle işaret edilen dosyadan, argumanlar ile gösterilen bölgeye veri okunur. Okuma işlemi başarılı olursa okunan argumanlar’ın sayısı geri gönderilir. Dosya sonuna gelindiğinde EOF değeri geri gönderilir. format parametresi scanf fonksiyonundaki ile aynıdır.

13.1.9 fread fonksiyonu

Tanım:

size_t fread(void *tampon, size_t buyuk, size_t sayi, file *dosyad);

Açıklama:

Dosyada okuyucu kafanın bulunduğu pozisyondan itibaren sayi kadar bilgi okunur. Her bir okunan bilgi uzunluğu buyuk parametresi ile belirtildiği kadardır. Okunan bu bilgi tampon içine yerleştirilir. Okuyucu kafa okunan bilgi kadar ilerler. Başarılı olursa okunan karakter sayısı geri gönderilir. feof ve ferror fonksiyonları kullanılarak hata durumu veya dosya sonuna gelinip gelinmediği sorgulanabilir. Örnek:

//Dosyaya karakter - karakter bilgi kaydetme #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> main(){ FILE *di; char kar; clrscr(); di=fopen("dene.dat","a"); if (di==NULL){ di=fopen("dene.dat","w"); if (di==NULL) { printf("dosya oluşturulamadı\n"); exit(1); }; }; for (kar=65; kar<91;kar++) { fputc(kar,di); }; fclose(di); di=fopen("dene.dat","r"); if (di==NULL){ printf("dosya oluşturulamadı\n"); exit(1);

Page 250: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

250

}; while (!feof(di)) { kar=fgetc(di); printf("%c",kar); }; fclose(di); getch(); return(0); }

Örnek:

//Dosyaya string bilgileri kayıt etme #include <stdio.h> #include <conio.h> #include <stdlib.h> main(){ FILE *di; char *kar[10],*kark; int i; char cev; clrscr(); di=fopen("denes.dat","a"); if (di==NULL){ di=fopen("dene.dat","w"); if (di==NULL) { printf("dosya oluşturulamadı\n"); exit(1); }; }; i=0; do { printf("isim[%i]=",i); scanf("%s",kar[i]); fputs(kar[i],di); printf("çıkmak istiyormusunuz="); cev=getch(); i++; } while ((toupper(cev)==69) || (i>9)); fclose(di); di=fopen("denes.dat","r"); if (di==NULL){ printf("dosya oluşturulamadı\n"); exit(1); }; while (!feof(di)) {

Page 251: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

251

fgets(kark,10,di); printf("%s \t",kark); }; fclose(di); getch(); return(0); }

13.2 Main Fonksiyonu Argümanları Yapılan Turbo C programının çalışabilir derlenmiş kodu dışarıdan argüman(parametre) verilerek çalıştırılmak istenebilir. Eğer DOS komutları hatırlanırsa; örneğin bir dosyanın bulunduğu dizinden silinebilmesi için “del” komutu ile beraber silinecek dosya adının da girilmesi gerekmekteydi. Dosya adı argüman olarak komutun peşinden yazılır. C dilinde de, main fonksiyonunun parametreleri komut satırında programın ismi ile birlikte girilir ve bu argümanların kontrolü program içinden yapılabilir. Örnek:

#include <stdio.h> #include <stdlib.h> #include <conio.h> int main(int parsay, char *pardeg[]) { char *st; void dosyaz(); void dosoku(); if (parsay<=1) { printf("\n dosya adı girilmemiştir"); return(-1); } st=pardeg[1]; dosyaz(st); dosoku(st); return(0); } void dosyaz(char *st) { FILE *dd; int say; int i=0; dd=fopen(st,"a"); if (dd==NULL) { dd=fopen(st,"w"); if(dd==NULL){ printf("\n dosya açılamıyor. "); exit(1);

Page 252: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

252

} } printf("\n tamsayı de§erleri girin\n"); do{ i++; printf("\n el %i=",i);scanf("%i",&say); if(say<0) break; if(fwrite(&say,sizeof(say),1,dd)!=1) {printf("\n hata var"); exit(1); } }while (say>=0); fclose(dd); } void dosoku(char *st){ FILE *dd; int say; dd=fopen(st,"r"); if (dd==NULL) { printf("\n dosya açılamıyor"); exit(1); } while(!feof(dd)){ if (fread(&say,sizeof(say),1,dd)!=1) { if(!feof(dd)){ printf("\n okuma hatası"); exit(1);} exit(1); } printf("\n say=%i",say); } fclose(dd); }

Açıklama:

Örnek programdan da görüleceği gibi parsay argümanı programın ismi ile birlikte girilen parametre sayısını vermektedir. pardeg argümanı ise bir string dizisi olarak verilen argüman değerini verir. Böylece komut ortamında üzerinde çalışılmak istenilen dosyanın adı da verilebilir. Negatif bir sayı girilene kadar, girilen sayıları, ismi komut satırında verilen dosyaya kaydeder. Daha sonra aynı dosyadan girilen bilgileri okuyarak ekrana yazar. Bu dosya işlemler için kullanılan fonksiyonlar:

fseek() fonksiyonu

Dosya işaretçisini istenen byte üzerine konumlandırmak için kullanılır.

Tanım:

fseek(file *dd, long bil_mik, int baslama);

Page 253: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

253

Açıklama:

bil_mik parametresi, dosya işaretçisinin başlama pozisyonundan itibaren konumlanacağı yere kadar (byte olarak) bilgi miktarıdır. Başlama pozisyonu ise o an dosyanın işaretçisinin bulunduğu konumdur. Fseek() fonksiyonu sadece ikili dosya tipinde kullanılmalıdır. Teorik olarak metin (text) tipi dosyalara uygulansa da, içindeki karakterlerin dosyaya yazımı esnasındaki karakter dönüşümlerini yaptığı için doğrudan erişimi gerçekleştirmek güçtür. Dosya konumları için kullanılan sabitler: SEEK_SET 0 Dosyanın ilk byte bilgisi SEEK_CUR 1 Dosya işaretçisinin o an bulunduğu pozisyon SEEK_END 2 Dosyanın sonu bil_mik parametresinin tipi long verildiği için 64 K dan daha büyük dosyalarda da işlem yapmak mümkün olmaktadır.

ftell() fonksiyonu

Dosya işaretçisinin, dosyanın ilk byte bilgisinden olan uzaklığını byte olarak verir. Herhangi bir anda dosyada ki işaretçinin pozisyonunu öğrenmek için kullanılır. Tanım:

long ftell(FILE *dd);

Açıklama:

İkili oluşturulmuş bir dosya üzerinde bu fonksiyonların kullanıldığı örnek aşağıda verilmiştir. Örnek:

#include <stdio.h> #include <stdlib.h> #include <conio.h> int main(int parsay, char* pardeg[]){ FILE *dd; char i; dd=fopen("dene.dat","ab+"); if (dd==NULL) dd=fopen("dene.dat","wb+"); if(dd==NULL) { printf("\nDosya açılamadı hata var."); return(-1); }

Page 254: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

254

if (ftell(dd)==SEEK_SET) printf("\nDosyanın başındasınız. %li",ftell(dd)); for (i=65;i<75;i++) fwrite(&i,sizeof(char),1,dd); printf("\nYazma tamamlandı dosyadan okumak için herhangi bir tuşa basın"); getch(); fseek(dd,0,SEEK_SET); while (!feof(dd)){ fread(&i,sizeof(char),1,dd); printf("\t %c",i); } printf("\n istediğiniz byte 'a konumlanıp okuma yapa bilirsiniz."); printf("\n konumlanmak istediğiniz byte ="); scanf("%i",&i); fseek(dd,SEEK_SET,i); if (ftell(dd)==SEEK_END) { printf("\nDosyanın sonundasınız. %li",ftell(dd));} else { fread(&i,sizeof(int),1,dd); printf("\n %c",i);} fclose(dd); getch(); return(0); }

Örnek:

Aşağıdaki örnekte kayıt yapısı kullanılarak bir rasgele erişimli (random access)dosya nasıl oluşturulabilir gösterilmiştir. Tanımlanan kayıt yapısının boyutu kullanılarak dosyada kayıt -kayıt ilerleme sağlanabileceği gibi istenen kayıta konumlanma da sağlanabilir.

#include <stdio.h> #include <stdlib.h> #include <conio.h> struct ogr_t { int no; char ad[15]; char sad[15]; } ogr; char cev; int main(int parsay, char* pardeg[]){ FILE *dd; int ksay,i; dd=fopen("dene.dat","ab+"); if (dd==NULL) dd=fopen("dene.dat","wb+"); if(dd==NULL) { printf("\nDosya açılamadı hata var.");

Page 255: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

255

return(-1); } do { printf("\n Öğrenci no:");scanf("%d",&ogr.no); printf("\n Adı :");scanf("%s",ogr.ad); printf("\n Soyadı :");scanf("%s",ogr.sad); fwrite(&ogr,sizeof(ogr),1,dd); printf("Devam edecekmisiniz e/h :");cev=getch(); } while (toupper(cev)=='E'); fseek(dd,0,SEEK_END); ksay=ftell(dd)/sizeof(ogr); printf("\ntoplam kayıt sayısı=%d",ksay); printf("\nYazma tamamlandı dosyadan okumak için herhangi bir tuşa basın"); getch(); fseek(dd,0L,SEEK_SET); clrscr(); printf("™grenci No Adı Soyadı"); for (i=1;i<=ksay;i++) { fread(&ogr,sizeof(ogr),1,dd); printf("\n %d %s %s",ogr.no,ogr.ad,ogr.sad); } printf("\n istediğiniz kayıta 'a konumlanıp okuma yapa bilirsiniz."); printf("\n konumlanmak istediğiniz kayıt ="); scanf("%d",&i); fseek(dd,(i-1)*sizeof(ogr),SEEK_SET); if (ftell(dd)==SEEK_END) { printf("\nDosyanın sonundasınız. %li",ftell(dd));} else { fread(&ogr,sizeof(ogr),1,dd); printf("\n %d \t\t %s \t\t\t %s",ogr.no,ogr.ad,ogr.sad); } fclose(dd); getch(); return(0); }

Açıklama:

Yukarıdaki örnek ten de görüleceği gibi, kayıt yapısındaki her hangi bir bilgiyi yine kendi büyüklüğünü baz alarak kayıt -kayıt dosyaya yazmamız mümkündür. Ayrıca kayıt büyüklüğünü kullanarak istediğimiz kayıta konumlanabiliriz. Böylece ikili bir dosyaya kayıt eklemek, kayıt silmek, kayıt bilgilerini güncellemek ve kayıtları değişik kriterlere göre listelemek mümkün olmaktadır.

Page 256: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

256

Page 257: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

257

KAYNAKLAR 1. Nicol Tony, Programming in C 2. Brian W.Kernighan, Dennis M. Ritchie, The Programming Language, Prentice Hall 3. H.Chris Pappas, H.Murray William, C/C++ Programcının Rehberi, Sistem 4. Turbo C++ 3.0 Help 5. Erdun Hakan, Demiralp Fehmi, Turbo C, Beta 6. Bayburan Bahattin, Microsoft Standart C, Beta 7. Özel Galip, Turbo C, Türkmen 8. Kocaman İsmet, C Programlama Dili, Sistem 9. Erdun Hakan, Durak Murat, Uzman C/C++ Programlama, Beta 10. Erdun Hakan, Turbo ve Borland C&Pascal ile Grafik, Beta 11. Güven Zülkif, Erverdi Asım Taylan, Pascal ve Program Geliştirme, Sürat 12. Akpınar Haldun, Turbo ve UCSD Pascal, Kipaş

Page 258: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok
Page 259: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

259

İÇİNDEKİLER

1 PROGRAMLAMAYA GİRİŞ ................................................................................................ 1

1.1 TARİHÇE ......................................................................................................................... 1 1.2 PROGRAM TASARIMI ................................................................................................... 2

2 ALGORİTMALAR VE AKIŞ DİYAGRAMLARI .............................................................. 3

3 C PROGRAMLAMA DİLİNE GİRİŞ ................................................................................ 15

3.1 C DİLİNİN YAPISI ......................................................................................................... 15 3.2 C DİLİNİN BAZI ÖZELLİKLERİ .................................................................................. 19

4 DEĞİŞKENLER VE SABİTLER ........................................................................................ 23

4.1 C PROGRAMLAMA DİLİNDE TANIMLI STANDART VERİ TİPLERİ ....................................... 23 4.1.1 Statik Değişkenler: .................................................................................................. 28 4.1.2 Dinamik Değişkenler: .............................................................................................. 28 4.1.3 Lokal ve Global Değişkenler: .................................................................................. 29 4.1.4 Sabitler .................................................................................................................... 30

5 GİRİŞ/ÇIKIŞ FONKSİYONLARI ..................................................................................... 33

5.1 PRİNTF() FONKSİYONU ...................................................................................................... 33 5.2 SCANF() FONKSİYONU ...................................................................................................... 38

6 OPERATÖRLER .................................................................................................................. 45

6.1 İŞLEM ÖNCELİKLERİ......................................................................................................... 47 6.2 BİRBİRİYLE İLİŞKİLİ OPERATÖRLER ................................................................................. 49

6.2.1 Atama İşlemi ............................................................................................................ 49 6.2.2 Çoklu Atama ............................................................................................................ 49 6.2.3 Sıkıştırılmış Atama .................................................................................................. 50 6.2.4 Karşılaştırma Operatörleri ..................................................................................... 50 6.2.5 Boolean Tip ............................................................................................................. 50 6.2.6 Boolean Atamalar ve Birbirleriyle İlişkili Operatörler ........................................... 50

7 KONTROL CÜMLELERİ ................................................................................................... 57

7.1 ŞART CÜMLELERİ ....................................................................................................... 57 7.1.1 IF Şart Cümlesi ....................................................................................................... 57 7.1.2 IF-ELSE Şart Cümlesi ............................................................................................. 59 7.1.3 Üçlü Koşul İfadesi (?:) ............................................................................................ 62 7.1.4 SWITCH Deyimi ...................................................................................................... 63

7.2 DÖNGÜ CÜMLELERİ ................................................................................................... 68 7.2.1 While Döngüsü ........................................................................................................ 68 7.2.2 Do-While Döngüsü .................................................................................................. 72 7.2.3 For Döngüsü ........................................................................................................... 75 7.2.4 Break, Continue ve Goto deyimleri ......................................................................... 79 7.2.5 Goto ......................................................................................................................... 80

8 DİZİLER ................................................................................................................................ 85

8.1.1 C programlama dilinde dizi tanımı ......................................................................... 85 8.1.2 Dizinin özellikleri .................................................................................................... 86

8.2 KARAKTER DİZİLERİ(STRINGLER) ....................................................................... 101 8.2.1 String Tanımlama .................................................................................................. 101

Page 260: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

260

8.2.2 String Dizileri ........................................................................................................ 105 8.3 POINTER(GÖSTERİCİ) VERİ TİPİ ............................................................................... 108

8.3.1 Pointer Aritmetiği .................................................................................................. 113 8.4 DİNAMİK BELLEK KULLANIMI ....................................................................................... 117

8.4.1 malloc() fonksiyonu ............................................................................................... 118 8.4.2 calloc() fonksiyonu ............................................................................................... 118 8.4.3 free() fonksiyonu .................................................................................................... 119

9 FONKSİYONLAR .............................................................................................................. 131

10 C’DE TANIMLI BAZI STANDART FONKSİYONLAR ........................................... 141

10.1 CONIO.H FONKSİYONLARI ..................................................................................... 141 10.1.1 clrscr() ................................................................................................................... 141 10.1.2 delline() ................................................................................................................. 141 10.1.3 clreol() ................................................................................................................... 141 10.1.4 insline() ................................................................................................................. 142 10.1.5 textcolor() .............................................................................................................. 142 10.1.6 textbackground() ................................................................................................... 143 10.1.7 textattr() ................................................................................................................. 143 10.1.8 lowvideo() .............................................................................................................. 144 10.1.9 highvideo() ............................................................................................................ 144 10.1.10 normvideo() ....................................................................................................... 145 10.1.11 wherex() ............................................................................................................. 145 10.1.12 wherey() ............................................................................................................. 145 10.1.13 gotoxy().............................................................................................................. 146 10.1.14 window() ............................................................................................................ 146 10.1.15 kbhit() ................................................................................................................ 147 10.1.16 cprintf().............................................................................................................. 147 10.1.17 cscanf() .............................................................................................................. 147

10.2 STRING.H FONKSİYONLARI ................................................................................... 149 10.2.1 strcpy() .................................................................................................................. 149 10.2.2 strncpy() ................................................................................................................ 149 10.2.3 strlen() ................................................................................................................... 149 10.2.4 strcat() ................................................................................................................... 150 10.2.5 strncat() ................................................................................................................. 150 10.2.6 strcmp() ................................................................................................................. 151 10.2.7 strncmp() ............................................................................................................... 151 10.2.8 strlwr() ................................................................................................................... 151 10.2.9 strupr() .................................................................................................................. 152 10.2.10 strstr() ................................................................................................................ 152 10.2.11 strchr() ............................................................................................................... 152 10.2.12 strset() ............................................................................................................... 153 10.2.13 strnset().............................................................................................................. 153 10.2.14 strrev() ............................................................................................................... 153

10.3 MATH.H FONKSİYONLARI ............................................................................................ 154 10.3.1 abs() ....................................................................................................................... 154 10.3.2 cos() ....................................................................................................................... 154 10.3.3 sin() ....................................................................................................................... 155 10.3.4 tan() ....................................................................................................................... 155 10.3.5 atan() ..................................................................................................................... 155 10.3.6 exp() ....................................................................................................................... 156 10.3.7 pow() ..................................................................................................................... 156

Page 261: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

261

10.3.8 log() ....................................................................................................................... 157 10.3.9 log10() ................................................................................................................... 157 10.3.10 sqrt() .................................................................................................................. 157 10.3.11 ceil() .................................................................................................................. 157 10.3.12 floor() ................................................................................................................ 158

10.4 STDIO.H FONKSİYONLARI ............................................................................................ 159 10.4.1 getc() ..................................................................................................................... 159 10.4.2 putc() ..................................................................................................................... 159 10.4.3 gets() ...................................................................................................................... 159 10.4.4 puts() ..................................................................................................................... 160 10.4.5 getw() ..................................................................................................................... 160 10.4.6 putw() .................................................................................................................... 161 10.4.7 sprintf() .................................................................................................................. 161 10.4.8 sscanf() .................................................................................................................. 162

10.5 TIME.H FONKSİYONLARI .............................................................................................. 162 10.5.1 clock() .................................................................................................................... 162 10.5.2 time() ..................................................................................................................... 162

10.6 DOS.H FONKSİYONLARI ................................................................................................ 163 10.6.1 settime() ................................................................................................................. 163 10.6.2 gettime() ................................................................................................................ 164 10.6.3 setdate() ................................................................................................................. 164 10.6.4 getdate() ................................................................................................................ 164 10.6.5 delay() ................................................................................................................... 165 10.6.6 sleep() .................................................................................................................... 165 10.6.7 sound() ................................................................................................................... 165 10.6.8 nosound() ............................................................................................................... 166 10.6.9 ctrlbrk() ................................................................................................................. 166

10.7 CTYPE.H FONKSİYONLARI ........................................................................................... 167 10.8 STDLIB.H FONKSİYONLARI .......................................................................................... 167

10.8.1 atoi() ...................................................................................................................... 167 10.8.2 atol() ...................................................................................................................... 167 10.8.3 atof() ...................................................................................................................... 168 10.8.4 itoa() ...................................................................................................................... 168 10.8.5 strtod() ................................................................................................................... 169 10.8.6 strol() ..................................................................................................................... 169 10.8.7 div() ....................................................................................................................... 169 10.8.8 max ve min ............................................................................................................. 170 10.8.9 rand() ..................................................................................................................... 170 10.8.10 random() ............................................................................................................ 171 10.8.11 randomize() ....................................................................................................... 171 10.8.12 exit() .................................................................................................................. 171 10.8.13 quicksort() ......................................................................................................... 172

11 YAPILAR (STRUCTURES) .......................................................................................... 173

12 GRAFİK ........................................................................................................................... 177

12.1 INITGRAPH ................................................................................................................. 177 12.2 GRAPHRESULT .......................................................................................................... 177 12.3 GRAPHERRORMSG ................................................................................................... 178 12.4 CLEARDEVICE ........................................................................................................... 180 12.5 SETCOLOR .................................................................................................................. 180 12.6 SETBKCOLOR ............................................................................................................. 182

Page 262: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

262

12.7 GETCOLOR ................................................................................................................. 183 12.8 GETBKCOLOR ............................................................................................................ 183 12.9 GETMAXCOLOR ........................................................................................................ 183 12.10 OUTTEXT ................................................................................................................ 185 12.11 OUTTEXTXY ........................................................................................................... 186 12.12 SETTEXTSTYLE ..................................................................................................... 186 12.13 SETTEXTJUSTIFY .................................................................................................. 188 12.14 GETTEXT ................................................................................................................. 191 12.15 GETTEXTSETTINGS .............................................................................................. 193 12.16 TEXTHEIGHT .......................................................................................................... 195 12.17 TEXTWIDTH ........................................................................................................... 196 12.18 MOVETO .................................................................................................................. 197 12.19 MOVEREL................................................................................................................ 199 12.20 LINE .......................................................................................................................... 199 12.21 LINETO .................................................................................................................... 201 12.22 LINEREL .................................................................................................................. 201 12.23 SETLINESTYLE ...................................................................................................... 202 12.24 GETLINESETTINGS ............................................................................................... 205 12.25 RECTANGLE ........................................................................................................... 205 12.26 PUTPIXEL ................................................................................................................ 206 12.27 GETPIXEL ................................................................................................................ 211 12.28 BAR........................................................................................................................... 211 12.29 BAR3D ...................................................................................................................... 215 12.30 SETFILLPATTERN ................................................................................................. 216 12.31 SETFILLSTYLE ....................................................................................................... 218 12.32 GETFILLPATTERN ................................................................................................. 221 12.33 GETFILLSETTINGS ................................................................................................ 221 12.34 ARC........................................................................................................................... 221 12.35 GETARCCOORDS ................................................................................................... 223 12.36 CIRCLE ..................................................................................................................... 223 12.37 ELLIPSE ................................................................................................................... 225 12.38 FILLELLIPSE ........................................................................................................... 225 12.39 PIESLICE .................................................................................................................. 226 12.40 SECTOR ................................................................................................................... 230 12.41 FLOODFILL ............................................................................................................. 231 12.42 DRAWPOLY ............................................................................................................ 232 12.43 FILLPOLY ................................................................................................................ 234 12.44 GETIMAGE .............................................................................................................. 234 12.45 IMAGESIZE ............................................................................................................. 236 12.46 PUTIMAGE .............................................................................................................. 237 12.47 SETVIEWPORT ....................................................................................................... 239 12.48 GETVIEWSETTINGS .............................................................................................. 240 12.49 CLEARVIEWPORT ................................................................................................. 241 12.50 RESTORECRTMODE .............................................................................................. 241 12.51 SETGRAPHMODE .................................................................................................. 241 12.52 GETMAXX/GETMAXY .......................................................................................... 242 12.53 GETX ........................................................................................................................ 243 12.54 GETY ........................................................................................................................ 243

13 DOSYA YAPILARI ........................................................................................................ 245

13.1 DOSYA İŞLEMLERİ İÇİN KULLANILAN FONKSİYONLAR.................................................... 245

Page 263: 1 PROGRAMLAMAYA GİRİŞshyo.firat.edu.tr/sites/shyo.firat.edu.tr/files/C Dili ile Programlama.pdf · .1 PROGRAMLAMAYA GİRİŞ 1.1 TARİHÇE Tasarlanan ilk mikroişlemciler çok

İçindekilerC Dili ile Programlama

263

13.1.1 fopen fonksiyonu .................................................................................................... 245 13.1.2 fputc fonksiyonu ..................................................................................................... 246 13.1.3 fputs fonksiyonu ..................................................................................................... 247 13.1.4 fprintf fonksiyonu ................................................................................................... 247 13.1.5 fwrite fonksiyonu ................................................................................................... 247 13.1.6 fgetc fonksiyonu ..................................................................................................... 248 13.1.7 fgets fonksiyonu ..................................................................................................... 248 13.1.8 fscanf fonksiyonu ................................................................................................... 248 13.1.9 fread fonksiyonu .................................................................................................... 249

13.2 MAİN FONKSİYONU ARGÜMANLARI .............................................................................. 251

KAYNAKLAR............................................................................................................................. 257