Upload
others
View
16
Download
0
Embed Size (px)
Citation preview
İç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
İç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.
İç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ı
İç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
İç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ı:
İç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ı:
İç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ı:
İç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
İç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.
İç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
İç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ı,
İç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.
İç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.
İç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.
İç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.
İç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:
İç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.... }
İç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
İç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
İç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
İç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.
İç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?
İç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;
İç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
İç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
: :
İç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
: :
İç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
: :
İç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.
İç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(); }
İç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
İç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?
İç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);
İç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
İç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.
İç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.
İç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
İç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
İç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:
İç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
İç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
:
İç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:
İç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
:
İç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(); }
İç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
İç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;
İç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.
İç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
İç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;
İç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.
İç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)
İç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);
İç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;
İç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.
İç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(); }
İçindekilerC Dili ile Programlama
56
İç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!
İç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!
İç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:
İç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
İç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ı:
İç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); :
İç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;
İç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:
İç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
İç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.
İç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?
İç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.
İç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.
İç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”,¬); toplam+=not; printf(“Devam mı(E/H)?:\n”); devam=getch(); }
İç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();
İç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;
İçindekilerC Dili ile Programlama
73
float pay,payda; void main() { clrscr(); do{ i++; printf(“%d. notu giriniz:”,i); scanf(“%d”,¬); 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]? :
İç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!
İç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
İç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.
İç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));
İç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
İç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.
İç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(); }
İç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; }
İç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”,¬); if(not<0 || not>100) { printf(“Yanlış giriş!\n”); goto tekrar; } printf(“Notunuz:%d”,not); getch(); }
İçindekilerC Dili ile Programlama
83
Örnek program çıktıları:
Not giriniz: 75 Notunuz:75
Not giriniz: 101 Yanlış giriş! Not giriniz:50 Notunuz:50
İç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.
İç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.
İç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]);
İç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];
İç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(); }
İç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);
İç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:”);
İç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:
İç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;
İç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:
İç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:
İç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
İç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;
İç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;
İç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]);
İç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++)
İç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
İç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]
:
İç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.
İç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(); }
İç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’
İç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
İç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.
İç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
İç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) :
İç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:
İç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);
İç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=?
:
İç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.
İç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;
İç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.....}
İç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;
:
İç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;
İç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
İç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üğü);
İç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(); }
İç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(); }
İç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
İç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++) {
İç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);
İç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
İç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();
İç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:
İç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++) {
İç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
İç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.
İç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ı:
----------------------------------------------------------------------------
İç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:
İç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(); }
İçindekilerC Dili ile Programlama
134
İç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;
İç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); }
İç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(); }
İç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]); } }
İç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); }
İç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.
İç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);
İç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.
İç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
İç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();
İç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();
İç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.
İç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.
İç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(); }
İç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ı:
İç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);
İç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);
İç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:
İç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);
İç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);
İç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ı:
İç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
İç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);
İç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(); }
İç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.
İç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);
İç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);
İç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.
İç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
};
İç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);
İç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);
İç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.
İç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.
İç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);
İç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.
İç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();
İç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);
İç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.
İç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(); }
İç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;
İç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 {
İç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.
İç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) {
İç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:
İç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ı:
İç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) {
İç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ı:
İç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 */
İç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);
İç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; }
İç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;
İç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.
İç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);
İç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
İç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);
İç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ı:
İç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();
İç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
İç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 ");
İç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ı:
İç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);
İç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);
İç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());
İç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ı:
İç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); }
İç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ı:
İç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
İç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 */
İç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ı:
İçindekilerC Dili ile Programlama
204
İç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)
İç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
İç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); } }
İç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); }
İç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ı:
İç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; }
İç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);
İç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ı:
İç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); }
İç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ı:
İç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; }
İç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);
İç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; }
İç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" };
İç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ı:
İçindekilerC Dili ile Programlama
220
İç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:
İç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; }
İç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)
İç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; }
İç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
İç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());
İçindekilerC Dili ile Programlama
227
sector(xort, yort, basaci, bitaci, xrad, yrad); getch(); } getch(); closegraph(); return 0; }
Program Çıktısı:
İçindekilerC Dili ile Programlama
228
İç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(); }
İç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
İç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();
İç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
İç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; }
İç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
İç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)
İç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);
İç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 */
İç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); }
İç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:");
İç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);
İç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) {
İç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.
İç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
İç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.
İç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);
İç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);
İç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);
İç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);
İç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)) {
İç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);
İç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);
İç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); }
İç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.");
İç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.
İçindekilerC Dili ile Programlama
256
İç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ş
İç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
İç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
İç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
İç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
İç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