Kaynak kitaplar C How to Program C++ How to Program C by Example The C Programing Language C Programlama Dili, Standart C Programlama Dili



Benzer belgeler
PROGRAMLAMAYA GİRİŞ DERS 2

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-1 Kapsama Kuralları & Rasgele Sayı Üretimi & Rekürsif (Özyinelemeli) Fonksiyonlar

Yrd. Doç. Dr. Caner ÖZCAN

Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü

Bölüm 2 - C ile Programlamaya Giriş

Dr. Fatih AY Tel: fatihay@fatihay.net

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Döngü Komutları. Komutu. while Komutu Diğer Operatörler Bileşik Komut for Komutu. İçiçe Döngüler break ve continue Komutları

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

BİL-142 Bilgisayar Programlama II

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Bölüm 4 C de Program Kontrolü

Hafta 13 Fonksiyonlar

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

Yrd. Doç. Dr. Caner ÖZCAN

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

C Programlama Dilininin Basit Yapıları

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

Temel Giriş/Çıkış Fonksiyonları

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

ELN1001 BİLGİSAYAR PROGRAMLAMA I

BİL1001 Bilgisayar Bilimlerine Giriş 1

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

Diziler (Arrays) Çok Boyutlu Diziler

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

Pointer Kavramı. Veri Yapıları

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Programlama Dilleri 1. Ders 4: Diziler

Genel Programlama II

Programlamaya Giriş. Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.

2. Dereceden Denklemin Köklerini Bulan Program

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

HSancak Nesne Tabanlı Programlama I Ders Notları

Göstericiler (Pointers)

BLM 112- Programlama Dilleri II. Hafta 2 C Programlarının Bellek Düzeni ve Rekürsif (Özyinelemeli) Fonksiyonlar

Döngü (Loop) Deyimleri / Veri Belirleyicileri / Matematiksel Fonksiyonlar

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Fonksiyonlar (Altprogram)

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Giriş. ENF102 Jeoloji

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

MAK 1005 Bilgisayar Programlamaya Giriş C DİLİNE GİRİŞ. Prof. Dr. Necmettin Kaya

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

Eln 1001 Bilgisayar Programlama I

BLM 111 ALGORİTMA VE PROGRAMLAMA I

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

Hafta 12 Karakter Tutan Diziler

Sınav tarihi : Süre : 60 dak.

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

1 PROGRAMLAMAYA GİRİŞ

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

Bölüm 3 Yapısal Programlama

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Temel Bilgisayar Bilimleri Ders Notu #4-1. kısım

Algoritma ve Programlamaya Giriş

C Konsol Giriş Çıkış Fonksiyonları

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

8. Bölüm DİZİLER. tip dizi_ismi[eleman_sayısı]; Bütün diziler 0 ile baţlar.

Hafta 8 C Dilinde Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

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

BİLGİSAYAR PROGRAMLAMA DERSİ

Eln 1002 Bilgisayar Programlama II

10/17/2007 Nesneye Yonelik Programlama 3.1

C PROGRAMLAMA D İ L İ

DİZİLER 5/4/2010. ENF-102 Jeoloji Giriş. Tek Boyutlu Diziler. Tek Boyutlu Diziler. Örnek. Örnek

BİLGİSAYAR PROGRAMLAMA DERSİ

Döngü komutları komutların bir çok kez yeniden yürülmesini. sağlayan, programlamada kullandığımız önemli yapılardan biridir.

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

C Programlama printf() Fonksiyonu

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

BLM 111 Algoritma ve Programlama I Güz 2018

C PROGRAMLAMA D İ L İ

BMT 101 Algoritma ve Programlama I 7. Hafta. Yük. Müh. Köksal Gündoğdu 1

Programlama Dilleri Laboratuvarı

Özyineleme (Recursion)

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Temel Bilgisayar Programlama

Bigisayar Programlama

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Transkript:

C Programlama 1

2 İşlenecek konular Değişken Tipleri, Operatörler, giriş/çıkış ve önişlemci konularının kısaca tekrarlanması Yapılı Programlama ve Program Kontrol Fonksiyonlar Diziler İşaretçiler(göstergeler) Karakter ve Karakter katarları fonksiyonları Yapılar (Structures), Unions, Bit manipülasyonları Dosya işlemleri (file processing) İleri C konuları Uygulama

3 Kaynak kitaplar C How to Program, H.M. Deitel and P.J. Deitel, 3rd Edition, Prentice Hall, 2000. C++ How to Program, H.M. Deitel and P.J. Deitel, 2nd Edition, Prentice Hall, 1997. C by Example, Greg Perry, Que, 1999. The C Programing Language, Brian W. Kernigham and Denis M. Ritchie (Türkçesi: Sistem yayıncılık, www.sistem.com.tr) C Programlama Dili, Rıfat Çölkesen, Papatya Yayıncılık Eğitim, (www.papatya.info). Standart C Programlama Dili, www.linux-team.com/kitaplar/ckitabi.pdf C How to Program kitabının slide ları (bu slide lar aynı zaman da slide şeklinde hazırlanan ders notlarının temelini oluşturacaktır. Orjinal slide lar www.deitel.com web sitesinden temin edilebilirler)

4 Bilgiler ve istekler Dersin resmi web sayfası http://web.inonu.edu.tr/~markan/242/c242.html Ders notları ve dersle ilgili diğer bilgilere bu web sayfasından erişilebilir İki haftada bir ödev verilecek ve ödevler yıl içi notunu etkileyecektir En son ödev öğrenilen tüm bilgileri içerecek şekilde geniş olacaktır Herkes bir e-mail adresi alacak ve mümkünse ödevler e- mail ile gönderilecek (text olarak, No Attachment!) Mail adresim: markan@inonu.edu.tr Ders sırasında cep telefonları kapatılacak

5 Kullanılacak derleyiciler Visual C++ 5 ve Turbo C derleyicileri kullanılacak Bazı bilgisayarların networkları bozuk olduğundan Visual C++ tüm bilgisayarlara yüklenemedi Turbo C DOS versiyonu community.borland.com web sitesinden üçretsiz olarak temin edilebilir (search for antique Turbo C!!!) (veya google dan turbo C yazın!)

6 Visual C++ da Yeni Dosya Açma Visual C++ başlatın Visual C++ sın File menusunden New ı seçin. (File menusunu kullanın, toolbardaki New File (yeni dosya) iconunu kulanmayınız. Toolbardaki iconun dezavantajı dosyayı saklamayana kadar C terimlerinin değişik renkte gözükmemesidir. New dialog penceresi göründüğünde Files opsiyonuna tıklayınız. C++ Source File opsiyonuna tıklayınız File name kutusuna dosyanıza vereceğiniz ismi girin Location kutusuna dosyanızı kaydetmek istediğiniz klasörü girin. Boş bir dosya açılacaktır. Yazmak istediğiniz programı yazın.

7 Visual C++ da Yeni Dosya Açma Program bittikten sonar Compile ediniz Visual C++ bir pencere açar ve default projects workspace açmak isteyip istemediğinizi sorar. Buna evet deyin. Programda olan hatalari (eğer varsa) ve uyarıları Status çubuğudan (pencerenin alt kısmında) kontrol edebilirsiniz. Hata var ise bu hatalari gideriniz ve yeniden Compile ediniz. Eğer hata yok ise programı Execute ediniz. Exe dosyasını oluşturmak istiyormusunuz kutusu geldiğinde evet deyin. Programın çıktısı MSDOS penceresinde görünür

8 Visual C++ derleyicisinde ilk program /* Visual C++ taki ilk proram Ekrana kendi ismini yazma */ #include <stdio.h> // #include <iostream.h> int main() { printf( isim soyad ); // cout << isim soyad \n ; return 0 }

1 C ye Giriş Değişkenler ve Sabitler Tipler İşlemler Giriş ve Çıkışlar Önişlemci Direktifleri

2 Değişkenler Kullanılmadan önce tüm değişkenler tanımlanmalıdır. Her değikenin bir adı olmalı Her değişkenin bir tipi olmalı Her değişken sakladığı bir değere sahiptir Değişkenlerin ismi 1 harften 31 harfe kadar olabilir. İsim bir harfle başlamalıdır; sayı ve _ alt çizgi içerebilirler. Boşluk içeremezler. Eğer değişken fonksiyondan önce tanımlanmış ise global değişken olur. Örnek: int main() { int i, j; char c; float x; // programın geri kalan kısmı }

Değişken tipleri 3 C`deki bazı değişken tipleri Tanımlama adı char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long long int signed long int unsigned long int float double long double Tip Karakter İşaretsiz Karakter İşaretli Karakter Tam sayı İşaretsiz tamsayı İşaretli tamsayı Kısa tamsayı İşaretsiz kısa tamsayı İşaretli kısa tamsayı Uzun tamsayı Uzun tamsayı (long la aynı) İşaretli uzun tamsayı (long int la aynı) İşaretsiz uzun tamsayı Gerçel (real) sayı Çift real sayı Uzun real çift sayı

4 Değişkenler Diğer programlama dilerinden farklı olarak C karakter katarları değişkenlerine sahip değildir. Karakter değişkenlerine bir karakterden fazla karakter atanamaz. Tabloda gösterilen değerler tipik değerlerdir. Fakat bunlar bilgisayardan bilgisayara ve derleyiciden derleyiciye farklılıklar gösterebilirler Tanımlama adı Değer aralığı char -128 to 127 unsigned char 0 to 255 signed char -128 to 127 int -32768 to 32767 unsigned int 0 to 65535 signed int -32768 to 32767 short int -32768 to 32767 unsigned short int 0 to 65535 signed short int -32768 to 32767 long int -2147483648 to 2147483647 signed long int -2147483648 to 2147483647 float -3.4E+38 to 3.4E+38 double -1.7E+308 to 1.7E+308 long double -1.7E+308 to 1.7E+308

5 Karakter katarları Sabitleri Karakter katarları (birden fazla karakter) sabitleri her zaman iki tırnak işareti arasında gösterilirler. Örneğin: C programlama Tüm karakter katarları sabitleri sıfır ile biter. Fakat siz bu sıfırı görmezsiniz. C programlama hafızada şöyle saklanır C p r o g r a m l a m a 0 Sıfır olmadan C, karakter katarlarının nerde bitiğini göremez. Burdaki sıfır (ASCII null), ASCII 48 0 sıfırından farklıdır

6 Karakter sabitleri Tüm karakter sabitleri tek tırnak arasında gösterilmelidir ( R ) R ve R C de çok farklıdır. \ (ters bölü) den sonra gelen karakterlere kontrol karakterleri denir. Özel bazı karakterleri yazdırmak için kullanılırlar. Örnek: \xa0 á \a terminal zili (Alarm) \b Bulunduğu satırda bir basamak geri gitme (Backspace) \f Satır besleme (Form feed) \n Yeni satır (Newline) \r Bulunduğu satırın başına gider (Carriage return) \t tab \v Dikey tab (Vertical tab)

İşlemler 7 C Matematiksel işlemleri C işlemi İşlem sırası Aritmetik işlem Algebrik yazılım C yazılımı Toplama + f + 7 f + 7 Çıkarma - p c p - c Çarpma * bm b * m Bölme / x / y x / y Mod % r mod s r % s İşlem(ler) işlemler(ler) Hesaplama sırası (precedence) () parantez Ilk önce parantez işlemi yapılır. İç içe bir kaçtane varsa en içteki önce yapılır. *, /, veya % Çarpma, Bölme, Mod İkinci olarak hesaplanırlar. Eğer birkaçtane varsa soldan sağa doğru gidilir + veya - Toplama Çıkarma Enson işlem yapılır. doğru gidilir Eğer birkaçtane varsa soldan sağa

8 Eşitleme işlemleri Eşitleme-tayin etme işlemleri eşitleme cümlesini kısaltmak için kullanılır c = c + 3; c += 3; şeklinde ifade edilebilirler Diğer eşitleme işlemleri: d -= 4 (d = d - 4) e *= 5 (e = e * 5) f /= 3 (f = f / 3) g %= 9 (g = g % 9)

9 Artırma ve Azaltma işlemleri Artırma işlemi (++) c+=1 yerine kulanılabilir Azaltma işlemi (--) c-=1 yerine kulanılabilir ön artırma işlem değişkenden önce kullanılır (++c veya --c) Değişken bulunduğu cümle hesaplanmadan önce değişir sondan artırma işlem değişkenden sonra kullanılır (c++ or c--) Cümle, değişken değişmeden once hesaplanır

10 Artırma ve Azaltma işlemleri Eğer c=5 ise, printf( "%d", ++c ); sonuç 6 printf( "%d", c++ ); Sonuç 5 Her iki durumdada c nin değeri şimdi 6 dır Değişken hesaplamanın içinde değil ise Ön artırma ve sondan artırma aynı sonucu verir ++c; printf( %d, c ); ile c++; printf( %d, c ); aynidır

11 Karşılaştırma işlemleri Dataları karşılaştırma için kullanılırlar = = Eşittir > Büyüktür < Küçüktür >= Büyüktür veya eşittir <= Küçüktür veya eşittir!= Eşit değildir

12 Mantık işlemleri Birden fazla karşılaştırma işleminin sonucunu karşılaştırma için kullanılırlar && Ve Veya! Değil

13 Giriş ve Çıkış printf() standart çıktı aletine ki bu genelde ekrandır data gönderir. printf(kontrol_katarı, bir veya birden fazla değer); Karakter katarı print etme printf( Malatya bu yil çok karlı ) printf() te kullanılan çevirim karakterleri : %s karakter katarı veya karakter çıktısı için kulanılır printf( %s, C Zevklidir!\n ); %c -karakter çıktısı için kulanılır printf( %c %c, A, B );

Giriş ve Çıkış 14 Çevirim karakterleri : %d tam sayı çıktısı için kulanılır printf( Adım Ahmet, universite %d öğrencisiyim, 3); %f real sayılar çıktısı için kulanılır printf( %f, 345.67); %e exponential real sayılar çıktısı için kulanılır printf( %e, 2345); %g %f veya %e kısasını kullanır %u işaretsiz tam sayılar çıktısı için kulanılır %o oktal tam sayılar çıktısı için kulanılır %x hexadecimel tam sayılar çıktısı için kulanılır %% %işaretini print eder

15 Giriş için scanf() kullanılması scanf() program kullanıcısının klavyeden data girişini sağlar scanf() ile printf() birbirine benzer. Kontrol_katarı hangi tip datanın klavyeden geleceğini belirtir. scanf() hemen hemen printf() ile aynı çevirim karakterlerini kullanır. Değişken adlarından önce her zaman & işareti kullanılmalıdır. Dizi (array) için kullanılmaz. scanf( "%d", &integer1 );

16 Ön işlemci direktifleri Ön işleme Program derlenmeden önce işleme konurlar Diğer dosyaların programa eklenmesi Sembolik sabit ve makroların tanımlanması Program parçasının şartlı derlenmesi Ön işlemci direktiflerin şartlı hesaplanması Ön işlemci komutların formatları satır # ile başlar sütun da genelde # başlar, yalnızca boşluk olabilir.

#include ön işlemci komutu 17 #include Belirtilen dosyanın kopyası ön işlemci komutunun yerine konur #include <dosya_adı> Dosyayı standart kütüphanesinde arar standart kütüphanesindeki dosyalar için kullanılır #include dosya_adı" Önce dosyayı programın derlendiği klasörde, sonra standart kütüphanede Kullanıcının (programcının) tanımladığı dosyalar için kullanılır kullanış: Birçok program dosyasından oluşan programların birlikte derlenmesi başlık dosyası ortak deklerasyon ve tanımlar içeren dosyalarda (yapılar, fonksiyon protitipleri) #include tüm dosyalarda

18 #define ön işlemci komutu : sembolik sabitler #define Bu ön işlemci komutu sembolik sabit ve makroları oluşturmak için kullanılır Sembolik sabitler Program derlendiği zaman, sembolik sabitlerin geçtiği kısımlar tanımlanan metin ile değiştirilir (tip tanımlamaya gerek kalmaz) Format #define tanımlanan yeralacak-metin örnek: #define PI 3.14159 Tanımlananın sağındaki herşey yer-alacak-metin olarak algılanır #define PI = 3.14159 PI yerine "= 3.14159 alır Bir defa oluşturulan sembolik sabitler tekrar tanımlanamazlar (programın içerisinde)

19 #define ön işlemci komutu : makrolar Makro #define de tanımlanan operasyondur Değişkensiz makro sembolik sabit gibi işlem görür Değişkenli makronun değişkeni yer-alacak-metinde kullanılır Yer-alacak-metin işlem görür, data tipi kontrol edilmez makro #define CIRCLE_AREA( x ) ( PI * ( x ) * ( x ) ) tanımı area = CIRCLE_AREA( 4 ); komutunun area = ( 3.14159 * ( 4 ) * ( 4 ) ); yapar

20 #define ön işlemci komutu : makrolar Birçok değişkenli makro #define RECTANGLE_AREA( x, y ) ( ( x ) * ( y ) ) tanımı rectarea = RECTANGLE_AREA( a + 4, b + 7 ); komutunun rectarea = ( ( a + 4 ) * ( b + 7 ) ); #undef Tanımlanan sembolik sabit veya makro yu tanımsız hale getirir Eğer sembolik sabit veya makro tanımsız yapılmış ise daha sonra yeniden tanımlanabilirler

Şartlı Derleme Şartlı derleme Ön işlemci komutlarını ve derlemeyi kontrol eder sizeof ön işlemci komutlarında hesaplanamaz Yapıları if gibidir #if!defined( NULL ) #define NULL 0 #endif Sembolik sabit NULL ın tanıplanıp tanımlanmadığını bakar Eğer NULL tanımlanmış ise, defined( NULL ) 1 değerini alır Eğer NULL tanımlanmamış ise, bu fonksiyon NULL değerini sıfır (0) olarak tanımlar Her #if, #endif ile bitmeli #ifdef #if defined( name ) #ifndef #if!defined( name ) 21

22 Şartlı Derleme Diğer tanımlar #elif if yapısındaki else if gibi #else if yapısındaki else gibi Programın bir kısmını yok sayma Programdaki bir kısım yazılım kullanılmak istenmezse ve program eski stil açıklama (comment) içeriyorsa, /*... */ kullanılamaz Onun yerine #if 0 Programdan çıkarılan kısım #endif Yazılım parçasını tekrar kullanmak için, 0 ı 1 e çevirmek yeterli

Formatlı çıktı 23 Çıktının boyutu çevirim karakterinin önüne yazılacak bir işaretsiz tamsayı ile kontrol edilebilir. Tamsayı gerekli en az boyutu belirtir. Eğer bilginin uzunluğu belirtilenden kısa ise önüne belirtilen boyutu tamamlayacak kadar boşluk bırakılır. Eğer bilginin uzunluğu belirtilenden uzun ise bilginin hepsi gösterilecek kadar yer ayrılır.

Formatlı çıktı 24 #include <stdio.h> int main() { int i=12345; float x=345.678; printf("%3d %5d %8d\n\n", i, i,i); printf("%f %10f %13f\n\n",x,x,x); return 0; } 012345678901234567890123456789012345 12345 12345 12345 345.678000 345.678000 345.678000

25 Formatlı çıktı Real sayıların ondalık kısmının uzunluğuda kontrol edilebilir. printf("%f %.1f %.3f\n\n",x,x,x); Çevirim karakterinin önüne yazılan tamsayının önüne (-) konulması boşluğun önde değil bilgiden sonra olacağını belirtir printf("%3d %-5d %-8d\n\n", i, i,i);

Örnek program /* borcun faizinin hesaplanmasi */ #include <stdio.h> int main() { int gunler=45; // borcun uzerinden gecen gun sayisi float borc = 3500.00; // alinan borc float faiz_orani=0.155; // yillik faiz float gunluk_faiz; // gunluk faiz 26 } gunluk_faiz=faiz_orani/365; // floating-point degeri hesapla // gunler int oldugundan, float a cevrilir gunluk_faiz = borc * gunluk_faiz * gunler; borc+=gunluk_faiz; // faizlerle birlikte yeni borcu hesapla printf( Toplam borc %.2f", borc); return 0;

1 Yapısal Programlama ve Seçmeli Yapı Kontrol Yapısı If Komutlu yapı If/Else Komutlu yapı Çoktan Seçmeli switch yapısı örnekler

2 Kontrol Yapısı Sırasal hesaplama Komutlar yazıldıkları sıraya göre bir biri ardına hesaplanır Kontrolun aktarılması Hesaplanan komutun bir sonraki komut olmaması goto komutunun aşırı kullanılması birçok probleme sebep olmuştur, iyi programlama tekniğinde kullanılması tercih edilmez Bütün programlar 3 değişik kontrol yapısı ile yazılabilir (Bohm ve Jacopini) Sırasal yapı: C nin doğal ozelliği. Programlar sırasıyla hesaplanır Seçmeli yapı: C de 3 tip vardır: if, if/else, ve switch Tekrarlamalı yapı : C de 3 tip vardır: while, do/while ve for

3 if Seçmeli Yapı Seçmeli yapı: Alternatif komutlar arasinda seçim yapmak için kullanılır. Algoritma: Eğer öğrencinin notu > 60 Print Gecti Eğer karşılaştırma doğru ise Print komutu işleme konur ve sonraki komuta geçer Eğer yanlış ise, Print komutu işleme konmaz ve sonraki komuta geçer Yanlış 0, doğru ise sıfırdan farklı herhangi bir değerdir C cümlesi: if ( not >= 60 ) printf( Gecti\n" );

if Seçmeli Yapı 4 if yapısı tek-giriş/tek-çıkış yapılıdır not >= 60 doğru print Gecti yanlış

5 if/else Seçmeli Yapı if Yalnızca karşılaştırma doğru olduğunda işlem yapar if/else Belirli bir işlemin, sonucun doğru veya yanlış olmasına bağlı olarak yapılmasını sağlar Algoritma: Eğer öğrencinin notu >= 60 Print Gecti Değilse Print Kaldi

6 if/else Seçmeli Yapı C kodlama: if ( not >= 60 ) else printf( Gecti\n"); printf( Kaldi\n"); Durum operatorü (?:) Üç tane arguments alır (şart, sonuç eger doğru ise, sonuç eğer yanlış ise) Yukarıdaki kodlama C de şöyle yazılabilir: not >= 60? printf( gecti\n ) : printf( kaldi\n );

if/else Seçmeli Yapı 7 if/else seçmeli yapının akış diagramı yanlış not >= 60 doğru print kaldi print gecti

8 if/else Seçmeli Yapı Birçok cümleli yapıya örnek: if ( not >= 60 ) printf( gecti.\n" ); else { } printf( kaldi.\n" ); printf( bu dersi yeniden almalisiniz.\n" ); Parantez olmadan else ten sonraki cümle printf( " bu dersi yeniden almalisiniz.\n" ); Otamatik olarak işlenir

switch -Çoktan Şeçmeli Yapı 9 switch Değişkenin alabileceği muhtemel değerler test ediliyorsa ve sonuca göre değişik işlem uygulanıyorsa switch kullanılabilir Format Bir dizi case etiketi ve seçmeli default etiketi switch ( değer ){ case '1': işlemler; case '2': işlemler; default: işlemler; } break; yapıdan çıkmayı sağlar

switch -Çoktan Şeçmeli Yapı 10 switch yapısının akış diagramı doğru case a işlem(ler) break yalnış doğru case b işlem(ler) break yanlış... doğru case z işlem(ler) break yanlış default işlem(ler)

switch -Çoktan Şeçmeli Yapı 11 switch yapısının break kullanılmayan akış diagramı case a yalnış doğru işlem(ler) case b yanlış doğru işlem(ler)...... case z yanlış doğru işlem(ler) default işlem(ler)

/* harfli notları sayma */ #include <stdio.h> 12 int main() { char not; int asay = 0, bsay = 0, csay = 0, dsay = 0, fsay = 0; printf( Notun harfini girin.\n"); scanf( %c,&not); switch ( not ) { /* döngü kullanılmadığından switch bir defa yapılır*/ case 'A': case 'a': /* girilen not A */ ++asay; /* veya a */ break; case 'B': case 'b': // girilen not B ++bsay; // veya b break;

13 case 'C': case 'c': /* girilen not C */ ++csay; /* veya c */ break; } } case 'D': case 'd': /* girilen not D */ ++dsay; /* veya d */ break; case 'F': case 'f': /* girilen not F */ ++fsay; /* veya f */ break; case '\n': case' ': // bu girişleri işleme koyma break; default: // diğer tüm karakterleri için printf( Yanlis not harfi girildi." ); printf( " Yeni notu girin.\n" ); break;

14 printf( "\nher harf notu icin toplamlar:\n" ); printf( "A: %d\n", asay ); printf( "B: %d\n", bsay ); printf( "C: %d\n", csay ); printf( "D: %d\n", dsay ); printf( "F: %d\n", fsay ); return 0; }

/* girilen iki sayının karşılaştırılması */ 15 #include <stdio.h> int main() { int x, y; printf( iki sayi giriniz ); scanf( %d %d, &x,&y); if( x == y ) printf( \ngirilen iki sayi bir birine esittir\n ); if( x < y ) printf( ilk sayi ikincisinden kucuktur\n ); if( x > y ) printf( ilk sayi ikincisinden buyuktur\n ); return 0; }

/* girilen iki sayının karşılaştırılması-ic ice if ler */ 16 #include <stdio.h> int main() { int x, y; printf( iki sayi giriniz ); scanf( %d %d, &x,&y); if( x == y ) printf( \ngirilen iki sayi bir birine esittir\n ); else if( x < y ) printf( ilk sayi ikincisinden kucuktur\n ); else if( x > y ) printf( ilk sayi ikincisinden buyuktur\n ); return 0; }

/* hafizadaki sayiyi tahmin etme */ 17 #include <stdio.h> int main() { int x; printf( sayiyi tahmin ediniz ); scanf( %d, &x); if( x == 26 ) printf( \ntebrikler sayiyibildiniz!!!\n ); else if( x < 26) printf( Sayidan kucuk deger girdiniz\n ); else if( x > 26 ) printf( Sayidan buyuk deger girdiniz \n ); return 0; }

/* Daire veya kare alanini hesaplama */ #include <stdio.h> int main() { char secim; float r; printf( \ndaire alani hesaplamak icin D\n ); printf( \nkare alani hesaplamak icin K\n ); scanf( %c, &secim); if( (secim == D ) (secim == d ) ){ printf( dairenin yaricapini giriniz scanf( %f,%r); printf( dairenin alani=%f\n,3.14*r*r); } if( (secim == K ) (secim == k ) ){ printf( karenin kenarini giriniz\n ) scanf( %f,%r); printf( Karenin alani=%f\n,r*r); } if( (secim!= D ) (secim!= d ) (secim!= K ) (secim!= k ) ) printf( yanlis secim girdiniz\n ); return 0; } 18

Program Kontrol 1 Giriş Tekrarlamanın önemi Kontrollü Saymalı Tekrarlama for tekrarlamalı yapı for yapısı: Notlar for yapısı ile ilgili örnek çoktan seçmeli switch yapısı do/while tekrarlama yapısı break ve continue komutları özet-yapılı programlama

2 Giriş Bu kısımda işlenecekler Kontrollu tekrarlama yapıları For while do/while break komutu Belirli bir kontrol yapısından anında ve hızlı bir şekilde çıkışı sağlar continue komutu Tekrarlama yapısının kalan kısmını atlamayı ve döngünün geri kalan kısmından devam eder

3 Tekrarlamanın önemi Döngü Bilgisayarın bazı şartların doğru olduğu sürece tekrarladığı komutlar grubu Programcı belirli bazı işlemlerin (hesaplamalarin) bazı değerlerin (veya bir değerin) doğru olmasına bağlı olarak tekrarlamasını ister Kontrollü saymalı tekrarlama Belli sayıda tekrarlama: döngünün kaç defa tekrarlanacağı bilinir Tekrarlamanın sayılması için Kontrol değişkeni kullanılır Bilgi sonunu belirten kontrollü tekrarlama Tekrarlama sayısı bilinmeyen durumlarda kullanılır Bilgi sonunu belirten değer döngü sonunu belirtmek için kullanılır

4 Tekrarlama Kontrollü saymalı tekrarlama için gerekenler Kontrol değişkeninin adı (döngü sayıcısı) Kontrol değişkenin ilk değeri Son değeri kontrol eden şart (döngü devam etmelimi etmemelimi) Kontrol değişkeninin değerini döngüde değiştirmek için Artırma (veya azaltma)

5 for Tekrarlama Yapısı for döngüsü koşulu önceden belirlenen tekrarlamalarda kullanılır for dögüsünün formatı for ( ilkdeğer; döngüdevamtesti; artırma ) komut(lar); örneğin: for( sayici = 1; sayici <= 10; sayici++ ) printf( "%d\n", sayici ); 1 den 10 a kadar olan tamsayilari print eder Noktalı virgül (;) olmamasına dikkat ediniz

6 for Tekrarlama Yapısı İlkdeğer ve artırma Virgül ile ayrılmış değerler olabilirler örneğin: for (int i = 0, j = 0; j + i <= 10; j++, i++) printf( "%d\n", j + i );

7 for Yapısı: Notlar Aritmetik ifadeler İldeğer(başlama), döngü-devam testi, ve artma aritmetik ifade içerebilir. Eğer x 2 ye ve y 10 a eşit ise for ( j = x; j <= 4 * x * y; j += y / x ) şartı Notlar: for ( j = 2; j <= 80; j += 5 ) artırma" negatif (azaltma) olabilir Eğer devam şartı başlangıçta yanlış ise for yapısı hesaplanmaz (işleme konmaz) Kontrol for yapısından sonraki komuta geçer Kontrol değişkenleri şartına eşittir Sıklıkla print edilir veya döngü içinde kullanılırlar, fakat şart değildir.

8 /* for yapisi ile çift sayıların toplamı */ #include <stdio.h> int main() { int toplam = 0, sayi; for ( sayi = 2; sayi <= 100; sayi += 2 ) toplam += sayi; printf( Toplam %d dir\n ", toplam ); } return 0;

9 while Tekrarlama Yapısı Tekrarlama yapısı for döngüsü while dongusu ile yapılabilir Algoritma: While alış-veriş listemde alınacak malzemeler daha var ise bir sonraki malzemeyi al ve listeden sil while döngüsü durum yanlış olana kadar devam eder

10 while Tekrarlama Yapısı örnek: int kati = 2; while ( kati <= 1000 ) kati = 2 * kati; kati <= 1000 doğru kati = 2 * kati yanlış

11 Örnek problem örnek: 10 öğrencisi olan sınıfta quiz yapılıyor. Sınıfın ortalamsını bulunuz. Algoritma: A1: Toplam, not_sayicisi, Not, ortalama tanimla A2: Toplam 0, not_sayicisi 1 A3: not_sayıcısı <=10 olduğu sürece bir sonraki notu giriniz Toplam Toplam + Not not_sayicisi not_sayicisi + 1 A4: ortalama (Toplam/10) A5: ortalama yaz A6: bitir

/* 10 tane ogrencinin not ortalamasini 12 bulan program */ #include <stdio.h> int main() { int not_sayicisi, not, toplam, ortalama; /* baslama degerleri */ toplam = 0; not_sayicisi = 1; /* hesaplama kismi */ while (not_sayicisi <= 10 ) { printf( Notu giriniz: " ); scanf( "%d", &not ); toplam = toplam + not; not_sayicisi = not_sayicisi + 1; } /* bitirme kismi */ ortalama = toplam / 10; printf( sinif ortalamasi %d\n", ortalama ); return 0; /* program basari ile bitmistir */ }

13 Öğrenci sayısı belli olmayan örnek A1: toplam, not_sayicisi, not, ortalama tanimla A2: toplam 0, not_sayicisi 0 A3: İlk not u giriniz (bitirmek için çıkış_sayisi giriniz)) A4: kullanıcı çıkış_sayisi girmediği sürece toplam toplam + not not_sayicisi not_sayicisi + 1 bir sonraki not u giriniz (bitirmek için çıkış_sayisi giriniz) A5: Eğer not_sayicis sıfıra eşit değil ise Değilse A6: Bitir ortalama toplamın / not_sayicisi ortalama yaz hiç bir not girilmedi yaz

14 /* ogrenci sayisi bastan bilinmeyen dersin ortalamasi */ #include <stdio.h> int main() { float ortalama; int not_sayici, not, toplam; /* baslama degerleri */ toplam = 0; not_sayicisi = 0; /* hesaplama kismi */ printf( Notu giriniz, bitirmek icin -1 giriniz: " ); scanf( "%d", &not ); while ( not!= -1 ) { toplam += not; not_sayici++; printf( Notu giriniz, bitirmek icin -1 giriniz: " ); scanf("%d", &not); }

15 /* bitirme kismi */ if ( not_sayici!= 0 ) { ortalama = ( float ) toplam / not_sayici; printf( Sinif ortalamasi %.2f", ortalama ); } else printf( Herhangi bir not girilmedi\n" ); } return 0; /* program basari ile bitmistir */

/* while ve switch kullanilarak harfli notları sayma */ #include <stdio.h> 16 int main() { int not; int asay = 0, bsay = 0, csay = 0, dsay = 0, fsay = 0; printf( Notun harfini girin.\n" ); printf( Notlarin girisini bitirmek icin 1 girin.\n" ); while ( ( not = getchar() )!= `1` ) { switch ( not ) { /* while içinde switch*/ case 'A': case 'a': /* girilen not A */ ++asay; /* veya a */ break; case 'B': case 'b': // girilen not B ++bsay; // veya b break;

case 'C': case 'c': /* girilen not C */ ++csay; /* veya c */ break; 17 case 'D': case 'd': /* girilen not D */ ++dsay; /* veya d */ break; case 'F': case 'f': /* girilen not F */ ++fsay; /* veya f */ break; case '\n': case' ': // bu girişleri işleme break; } } default: // diğer tüm karakterleri için printf( Yanlis not harfi girildi." ); printf( " Yeni notu girin.\n" ); break;

18 printf( "\nher harf notu icin toplamlar:\n" ); printf( "A: %d\n", asay ); printf( "B: %d\n", bsay ); printf( "C: %d\n", csay ); printf( "D: %d\n", dsay ); printf( "F: %d\n", fsay ); return 0; }

19 do/while Tekrarlama Yapısı do/while tekrarlama yapısı while yapısına benzer Şartlı kısım döngü bir defa yapıldıktan sonra test edilir Format: do { Bütün işlemler en az bir defa yapılır işlemler(komutlar); } while ( şart ); örnek (say = 1 ise): do { printf( "%d ", say ); } while (++say <= 10); 1 den 10 a kadar print eder

do/while Tekrarlama Yapısı 20 do/while tekrarlama yapısının akış diagramı işlem(ler) şart doğru yanlış

21 /* do/while tekrarlama yapisinin kullanilmasi */ #include <stdio.h> int main() { int sayici = 1; do { printf( "%d ", sayici ); } while ( ++sayici <= 10 ); } return 0;

22 break ve continue komutu break while, for, do/while veya switch yapılarından ani çıkışı sağlar Program işlemlerine, yapıdan sonraki ilk işlemle devam eder break cümlesinin genel kullanımı Döngüden erken kurtulma switch yapısının geri kalan kısmını pas geçmek

23 break ve continue komutu continue while, for veya do/while yapılarında döngü içinde geri kalan kısımları pas geçer Döngüdeki diğer şarta geçer while ve do/while for Döngü devam testi continue işleme konur konmaz test edilir Artırma ifadesi işleme konur, sonra döngü devam testi yapılır

/* continue komutunun for yapisinda kullanilmasi */ #include <stdio.h> 24 int main() { int x; for ( x = 1; x <= 10; x++ ) { } if ( x == 5 ) continue; /* dongudeki diger kodlari eger x == 5 ise pas gec */ printf( "%d ", x ); } printf( "\n5 i print etmemek icin continue kullanilmasi\n" ); return 0;

25 Özet-Yapılı Programlama Yapılı programlama Yapısız programa göre test etmesi, derlemesi ve değiştirilmesi daha kolay Yapılı programlama için kurallar 1. En basit akış diagramı ile başlayın 2. Herhangi bir dikdörtgen (işlem grubu) iki dikdörtgen (işlemler grubu) ile değiştirilebilir. 3. Herhangi bir dikdörtgen (işlem grubu) herhangi bir kontrol yapısı ile değiştirilebilir (sıralı, if, if/else, switch, while, do/while veya for) 4. Kural 2 ve Kural 3 herhangi bir sıra şeklinde ve birçok defa uygulanabilir

Özet-Yapılı Programlama 26 Kural 1 en basit akış diagramıyla başlayın Kural 2 herhangi bir dikdörtgen iki dikdörtgenle değiştirilebilir Kural 2 Kural 2 Kural 2...

Özet-Yapılı Programlama 27 Kural 3 Kontrol yapısı herhangi bir Dikdörtgenin yerini alabilir Kural 3 Kural 3 Kural 3

28 Özet-Yapılı Programlama Bütün programlar 3 tane kontrole ayrışabilirler Sıralı (Ardışık) derleyici tarafından otomatik olarak yapılır Seçme if, if/else veya switch Tekrarlama while, do/while veya for İki yolla birleştirilebilirler İç içe gömme (Kural 3) küme (Kural 2) Herhangi bir seçme if ile yeniden yazılabilir, ve herhangi bir tekrarlama while ile yeniden yazılabilir

1 Fonksiyonlar Giriş C de Program Modülleri Fonksiyonlar Fonksiyon tanımlanması Fonksiyon prototipi Fonksiyonun Çağrılması: Değer ile çağrılması ve Adres (Referans) ile çağrılması Rasgele (Random) sayı üretilmesi Değişkenlerin Faaliyet Alanı Global ve Yerel (Lokal) Değişkenler Saklama sınıfları Faaliyet alanı kuralları Döngü ve özyineleme (recursion) karşılaştırılması

2 Giriş Küçük parçalara bölmek Programı küçük parçalardan veya elemanlardan oluşturun Bu küçük parçalar modül alarak adlandırılır Parçaları kontrol etmek değiştirmek orjinal programdan daha kolaydır C de main() ana fonksiyonunun altında çalışan kendi fonksiyonlarının yazma ihtiyacı main() fonksiyonun asıl amacı içindeki modüllerin hesaplanmasının kontrolu Fonksiyona gitme ve geri dönmek

3 C de Program Modülleri Fonksiyonlar C de Modüller fonksiyonlar olarak adlandırılır Programlar kulanıcı tanımlı fonksiyonları C kütüphanesindeki fonksiyonlarla birleştirir (ortak kullanım) C standart kütüphanesi geniş değişik fonksiyonlara sahiptir Fonksiyonun çağrılması (fonksiyona gitme) Fonksiyonun adı ve parametrelerinin sağlanması Fonksiyonlar yapılması istenen işlemi yapar Fonksiyon sonuçlari getirir Fonksiyonun çağrılmasınin kıyaslanması: Öğretmen öğrencilerden verilen problemleri çözmelerini ister Öğrenciler çözüm yollarını araştır, problemleri çözer, sonuçları getirirler Detayların saklanması: öğretmen detayları bilmez

Fonksiyonlar 4 Fonksiyonlar Programı modüller haline getirmek Fonksiyon içinde tanımlanan tüm değişkenler yereldir Sadece tanımlandıkları fonksiyon tarafından bilinirler Parametreler Fonksiyonlar arasında haberleşmeyi sağlarlar Yerel değişkenler Fonksiyonun yararları Böl ve yönet Hakim olunabilecek program geliştirmek Yazılımın tekrar kulanılması Hazır fonksiyonlarin yeni programları yazmak için kullanılması Detayların saklanması(kütüphane fonksiyonları gibi) Yazılım tekrarından kaçınılması (Tekerleği yeniden icat etmeme!)

5 Fonksiyon tanımlanması Fonksiyon tanımlama formatı Gerigelen-değer-tipi fonksiyon-adı( parametre-listesi ) { değişkenlerin tanımlanması ve komutlar } Fonksiyon-adı: fonksiyon adı tanımlanırken değişkenlerin adlandırılmasındaki kurallar uygulanır Gerigelen-değer-tipi: sonuçun data tipi (belirtilmediği zaman tamsayı (int) varsayılır) void fonksiyonun her hangi bir bilgi geri göndermediğini belirtir Parametre-listesi: virgül ile ayrilmış liste, kullanılan parametreler tanımlanır Her parametre için tip açıkça belirtilmelidir (int tipi hariç, belirtilmese olur)

6 Fonksiyon tanımlanması Değişkenlerin tanımlanması ve komutlar: Fonksiyon bloku Değişkenler blok içinde tanımlanabilirler Fonksiyonun içinde başka fonksiyonlar tanımlanamaz Dönüş kontrolu Herhangi bir sonuç geri dönmuyor ise return; veya, fonksiyon blok parantezi sonuna ulaştığında Eğer sonuç geri dönüyor ise return işlem(veya değişken);

örnek /* girilen 3 sayinin enbüyüğünün bulunmasi */ #include <stdio.h> 7 int enbuyuk( int, int, int ); /* fonksiyon prototipi */ int main() { int a, b, c; printf( Uc tane sayi giriniz: " ); scanf( "%d%d%d", &a, &b, &c ); printf( Sayıların enbüyüğü : %d\n", enbuyuk( a, b, c ) ); } return 0; /* Enbuyuk fonksiyonunun tanimi */ int enbuyuk( int x, int y, int z ) { int max = x; if ( y > max ) max = y; if ( z > max ) max = z; } return max;

Fonksiyon Prototipi 8 Fonksiyon prototipi Fonksiyon adı Parametreler fonksiyonun aldığı (kulandığı) değişkenler Dönüş tipi fonksiyonun gönderdiği data tipi (varsayılan int) Fonksiyonların doğru kullanıp kullanmadıklarını kontrol için kullanılır Prototip eğer fonksiyon programda kullanıldıktan sonra tanımlanmış ise gereklidir örneğin int maximum( int, int, int ); 3 tane tama sayı Dönen data tamsayı Çevirme Datalarin daha düşük tipe çevrilmesi, hatalı sonuç verebilir

9 Fonksiyon Prototipi Fonksiyon prototipini her zaman tanımlamanız gerekmez ama iyi bir programlama tekniği olarak önerilmektedir Fonksiyon prototipi programlama hatası yapmanızı engeller C çok güçlü bir derleyeciye sahip olmasına rağmen fonksiyon prototipi olmadan yanlış data gondermenize engel olmaz Sonuç: tüm fonksiyonlarınızı prototipleyiniz

Fonksiyonun Çağrılması: Değer ile çağrılması ve Adres (Referans) ile çağrılması 10 Fonksiyona gidildiğinde kullanılırlar Değer ile çağırma Değişkenlerin kopyası fonksiyona gönderilir Fonksiyondaki deşiklikler orjinallerini etkilemez Fonksiyon, gönderilen değişkenler üzerinde değişiklik yapmayacak ise kullanılır Yanlışlıkla yapılacak değişikliklerden kaçınılır Adres ile çağırma Değişkenlerin adresleri (Orjinalleri) gönderilir Fonksiyondaki değişiklikler orjinallerini etkiler Sadece güvenilen fonksiyonlarda kullanılır Biz şimdilik değer ile çağırma yöntemini kullanacagız.

11 Rasgele Sayi Üretilmesi rand fonksiyonu <stdlib.h> başlık dosyasını yükletin 0 ve RAND_MAX (en az 32767) arasında herhangi bir "rasgele" sayısına döner i = rand(); 0 ve RAND_MAX arasında her sayının gelme şansı eşittir ölçeklemek 1 ve n arasında rasgele sayı elde etmek 1 + ( rand() % n ) rand() % n sonucu 0 ve n 1 arasındaki sayıdır 1 ile 6 arasındaki sayıları elde etmek için 1 + ( rand() % 6)

12 Rasgele Sayi Üretilmesi srand fonksiyonu <stdlib.h> Tam sayı alır ve rand fonksiyonu için bir başlangıç noktası ayarlar srand( tam_sayı ); srand( time( NULL ) ); //<time.h> dosyasını programınıza ekleyiniz time( NULL ) Programın çalıştığı sıradaki saniye cinsinden zamanı gösterir Başlama noktasını tamamen rasgele eder

/* zarın rasgele atıldığı program */ #include <stdlib.h> #include <stdio.h> 13 int main() { int i; unsigned baslama_yeri; printf( Baslama yerini girin: " ); scanf( "%u", &baslama_yeri ); srand( baslama_yeri ); for ( i = 1; i <= 10; i++ ) { printf( "%10d", 1 + ( rand() % 6 ) ); } if ( i % 5 == 0 ) printf( "\n" ); } return 0;

14 Örnek: Şans oyunu Craps oyununun simulasiyonu Kurallar İki zar atılır İlk atışta 7 veya 11, oyuncu kazanır İlk atışta 2, 3, veya 12 (craps denir), oyuncu kaybeder 4, 5, 6, 8, 9, 10 değer oyuncunun sayısı olur Oyuncu kazanmak için 7 den önce sayısı nı atmak zorundadır

/* Craps programi*/ #include <stdio.h> #include <stdlib.h> #include <time.h> 15 int zarat( void ); int main() { int oyundurumu, toplam, oyuncusayisi; srand( time( NULL ) ); toplam = zarat( ); /* zarin ilk atisi */ switch( toplam ) { case 7: case 11: /* ilk atista kazanir */ oyundurumu = 1; break; case 2: case 3: case 12: /* ilk atista kaybeder */ oyundurumu = 2; break; default: /* sayiyi hatirla */ oyundurumu = 0; oyuncusayisi = toplam; printf( Oyuncunun sayisi %d\n", oyuncusayisi ); break; }

while (oyundurumu == 0 ) { /* zar atmaya devam */ toplam = zarat( ); if ( toplam == oyuncusayisi ) /* oyuncu sayisini bul kazan */ oyundurumu = 1; else if ( toplam == 7 ) /*toplam 7 ye esit ise kaybeder */ oyundurumu = 2; } 16 if (oyundurumu == 1 ) printf( Oyuncu kazanir\n" ); else printf( Oyuncu kaybeder\n" ); } return 0; int zarat( void ) { int zar1, zar2, atmatoplam; } zar1 = 1 + ( rand() % 6 ); zar2 = 1 + ( rand() % 6 ); atmatoplam = zar1 + zar2; printf( oyuncunun attigi %d + %d = %d\n", zar1, zar2, atmatoplam ); return atmatoplam;

oyuncunun attigi 4 + 4 = 8 Oyuncunun sayisi 8 oyuncunun attigi 6 + 1 = 7 Oyuncu kaybeder oyuncunun attigi 2 + 6 = 8 Oyuncunun sayisi 8 oyuncunun attigi 2 + 2 = 4 oyuncunun attigi 4 + 2 = 6 oyuncunun attigi 1 + 4 = 5 oyuncunun attigi 2 + 3 = 5 oyuncunun attigi 5 + 6 = 11 oyuncunun attigi 4 + 5 = 9 oyuncunun attigi 3 + 1 = 4 oyuncunun attigi 3 + 2 = 5 oyuncunun attigi 1 + 2 = 3 oyuncunun attigi 2 + 3 = 5 oyuncunun attigi 1 + 3 = 4 oyuncunun attigi 1 + 2 = 3 oyuncunun attigi 4 + 3 = 7 Oyuncu kaybeder oyuncunun attigi 5 + 2 = 7 Oyuncu kazanir Program çıktıları 17

18 Değişkenlerin Faaliyet Alanı Değişkenlerin faaliyet alanı (Variable Scope) fonksiyon yazarken çok önemlidir Değişkenlerin faaliyet alanı hangi fonksiyonun hangi değişkeni tanıyabileceğini belirler Değişkenlerin faaliyet alanı değişkenleri bir fonksiyonda korurken diğer fonksiyonların değiştirme ihtimalini engeller. Eğer fonksiyonun bir değişkene erişme ihtiyacı yok ise, bu fonksiyonun o değişkeni görmemesi lazımdır

19 Global ve Yerel Değişkenler Global değişkenler programın her yerinde tanınan değişkenlerdir Global değişkenleri kullanmak tehlikeli olabilir, programın bir kısmı değiştirmemesi gereken değişkeni değiştirebilir Global değişkenler genelde programın en başında tanımlanırlar, herhangi iki fonksiyon arasında tanımlanabilirler ama en başta tanımlanmaları programcı veya kullanıcı tarafından daha çabuk görülmesini sağlar Global değişkenleri fonksiyona parametre olarak göndermek C de karışıklık yaratır, değişken eğer global tanımlanmış ise parametre olarak göndermek gerekmez Yerel değişkenler sadece tanımlandıkları fonksiyon tarafından görünür ve değiştirilebilirler Yerel olarak tanımlanan değişkenlerin faaliyet alanları korunmuş olur Başka fonksiyonlar tarafından görünemezler ve değiştirilemezler Yerel değişkenler blokları sona erdiğinde tanımlarını kaybederler

Global ve Yerel Değişkenler /* global ve yerel değişkenlerin tanimlanmasi */ 20 int toplam; // global değişken #include <stdio.h> float ortalama; //global değişken int main() { int sayi; //yerel değişken char g; //yerel değişken...... //programin diger kismi... return 0; }

21 Saklama Sınıfları Saklama Sınıf belirleyicileri Saklama sınıfı hafızada değişkenin saklama süresi-4 adet Faaliyet alanı (Scope) değişkenlerin program içinde nerede tanınabileceğini belirtir, bazıları tüm programda bazıları ise programın bir kısmında tanınabilirler ( global ve yerel değişkenler) Bağlantı(Linkage) belirleyicinin(tanımlayıcının) hangi dosyalarda bilindigini belirtir (birden fazla program birleştirildiği zaman) Otomatik saklama Değişken kendi bloğu içinde tanımlanır ve blok bitiğinde yok edilirler auto: yerel değişkenler için varsayılır auto double x, y; register: değişkenleri yüksek hızdaki kaydedicinin içine koymaya çalışır Sadece otomatik değişkenler için kullanılabilir register int counter = 1;

22 Saklama Sınıfları Statik saklama Değişkenler program süresi boyunca korunurlar İlk değerleri otomatik olarak sıfır varsayılır static: fonksiyon içinde tanımlanan yerel değişkenler static olabilirler Değişkenin değeri fonksiyon sona erdiğinde korunur Sadece tanımlandıkları fonksiyon tarafından bilinirler static int say = 1; extern: global değişkenler ve fonksiyonlar için otomatik varsayım Herhangi bir fonksiyonda bilinirler

23 Faaliyet Alanı Kuralları Dosya faaliyet alanı (File scope ) Fonksiyon dışında tanımlanan belirliyici, tüm fonksiyonlar tarafından bilinirler Global değişkenler, fonksiyon tanımları, fonksiyon prototipileri için kullanılır Fonksiyon faaliyet alanı (Function scope) Yalnızca fonksiyonun yapısı içinde kullanılabilirler Sadece etiketlerde kullanılırlar (örneğin start:, case:,..vb)

24 Faaliyet Alanı Kuralları Blok faaliyet alanı (Block scope) Bloğun içinde deklere edilen belirleyici Blok faaliyet alanı tanımlamadan sonra başlar, sağ } parantezi ile biter Değişkenler, fonksiyon parametreleri(fonksiyonun yerel değişkenleri) için kullanılır Eğer iç blokta aynı isimde bir değişken var ise, Dış blok iç bloktan saklanır Fonksiyon prototipi faaliyet alanı (Function prototype scope) Parametre listesindeki belirleyiciler için kullanılır

/* Faaliyet alanı(scoping) örneği */ #include <stdio.h> void a( void ); /* fonksiyon prototipi */ void b( void ); /* fonksiyon prototipi */ void c( void ); /* fonksiyon prototipi */ int x = 1; /* global değişken */ int main() { int x = 5; /* main içinde yerel değişken */ printf( mainin dis faaliyet alanindaki yerel x degeri %d\n, x ); 25 { /* yeni faaliyet alani baslat */ int x = 7; printf( mainin ic faaliyet alanindaki x degeri %d\n", x ); } /* yeni faaliyet alaninin sonu */ } printf( main in dis faaliyet alanindaki yerel x degeri %d\n", x ); a(); /* a fonksiyonun otomatik yerel x degeri var */ b(); /* b fonksiyonun statik yerel x degeri var */ c(); /* c fonksiyonu global x kullaniyor*/ a(); /* a fonksiyonu otomatik yerel x degerine yeniden ilk */ /* deger atıyor */ b(); /* static yerel x daha onceki degerini koruyor */ c(); /* global x de daha onceki degerini korur */ printf( main icindeki yerel x degeri %d\n", x ); return 0;

void a( void ) { int x = 25; /* a fonksiyonu her cagrildiginda ilk deger atanir */ 26 } printf( "\na fonk girildikten sonra yerel x degeri %d\n", x ); ++x; printf( a fonk dan cikmadan once yerel x degeri %d \n", x ); void b( void ) { static int x = 50; /* b fonksiyonu ilk cagrildiginda */ /* ilk deger atanmasi */ printf( "\nb fonk. girildiginde yerel static x degeri %d \n", x ); ++x; printf( b fonk. Ayrilir iken yerel static x degeri %d \n", x ); } void c( void ) { printf( "\nc fonk. Girildiginde global x degeri %d \n", x ); x *= 10; printf( b fonk. Ayrilir iken global x degeri %d \n", x ); }

mainin dis faaliyet alanindaki yerel x degeri 5 mainin ic faaliyet alanindaki x degeri 7 mainin dis faaliyet alanindaki yerel x degeri 5 Program çıktısı 27 a fonk girildeikten sonra yerel x degeri 25 a fonk dan cikmadan once yerel x degeri 26 b fonk. girildiginde yerel static x degeri 50 b fonk. Ayrilir iken yerel static x degeri 51 c fonk. Girildiginde global x degeri 1 b fonk. Ayrilir iken global x degeri 10 a fonk girildeikten sonra yerel x degeri 25 a fonk dan cikmadan once yerel x degeri 26 b fonk. girildiginde yerel static x degeri 51 b fonk. Ayrilir iken yerel static x degeri 52 c fonk. Girildiginde global x degeri 10 b fonk. Ayrilir iken global x degeri 100 main icindeki yerel x degeri 5

28 Tekrarlama-kendi kendini çağırma (Recursion) Tekrarlama fonksiyonları Kendi kendini çağıran fonksiyonlardır Yalnızca temel problemi çözebilirler Problemi böl Ne yapabilir Ne yapmayabilir Yapamadığı kısım orjinal problemi andırır Yapamadığı kısım için fonksiyon kendi yeni kopyasini çağırır (tekrarlama basamağı) Sonunda temel promlem çözülmüş olur

29 Tekrarlama- kendi kendini çağırma (Recursion) örnek: faktöriyel 5! = 5 * 4 * 3 * 2 * 1 Şuna dikkat edin 5! = 5 * 4! 4! = 4 * 3!... Faktöriyel tekrarlama ile çözülebilir Temel kısmı çöz (1! = 0! = 1) sonra 2! = 2 * 1! = 2 * 1 = 2; 3! = 3 * 2! = 3 * 2 = 6;

/* bir tamsayının faktörünün hesaplanması */ #include <stdio.h> 30 long faktor( int ); int main() { int sayi; long sonuc; printf( bir tam sayi giriniz: " ); scanf( "%d", &sayi ); result = faktor( sayi ); printf( %d faktoriyeli = %ld\n", sayi, sonuc ); return 0; } /* tekrarlama faktor fonksiyonu tanimi*/ long faktor( int n ) { if ( n <= 1 ) return 1; else return ( n * faktor( n - 1 ); }

31 Örnek: Fibonacci serisi Fibonacci serisi: 0, 1, 1, 2, 3, 5, 8... Her sayı kendinden önceki iki sayının toplamına eşittir Tekrarlama ile çözülebilir: fib( n ) = fib( n - 1 ) + fib( n 2 ) fibonacci fonksiyonu: long fibonacci( long n ) { if (n == 0 n == 1) // temel kısım return n; else return fibonacci( n - 1) + fibonacci( n 2 ); }

Örnek: Fibonacci serisi 32 fibonacci fonksiyonu için tekrarlama setleri f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) + f( 0 ) return 1 return 1 return 0

/* tekrarlama fibonacci fonksiyonu */ #include <stdio.h> 33 long fibonacci( long ); int main() { long sonuc, sayi; } printf( bir tam sayi giriniz: " ); scanf( "%ld", &sayi ); result = fibonacci( sayi ); printf( "Fibonacci( %ld ) = %ld\n", sayi, sonuc ); return 0; /* tekrarlama fibonacci fonksiyonu tanimi*/ long fibonacci( long n ) { if ( n == 0 n == 1 ) return n; else return fibonacci( n - 1 ) + fibonacci( n - 2 ); }

Özyineleme (Recursion) ile Döngünün karşılaştırılması Tekrarlama Döngü: Açık döngü Özyineleme (Recursion): tekrarlanan fonksiyon çağrımı Çıkış Döngü: döngü şartı sona erdiğinde Kendi kendini çağırma(recursion): temel kısım görüldüğünde Her ikiside sonsuz döngü olabilir Denge Performans (döngü) ve iyi yazılım mühendisliği (özyineleme) arasında seçiminizi yapınız Performasın gerektiği yerde kendi kendini çağırma (recursion) kullanmaktan kaçının! Daha fazla zaman ve extra hafıza alır 34

Örnekler 35 Anaprogramda girilen bir sayının faktöriyelini altprogramda (fonksiyon) hesaplayan ve sonucu anaprogramda ekranda gösteren bir program yazınız. Anaprogramda girilen iki sayının ortak bölenlerinin en büyüğünü altprogramda (fonksiyon) hesaplayan ve sonucu anaprogramda ekranda gösteren bir program yazınız. İlk 50 asal sayıyı hesaplayan ve ekrana yazan bir fonksiyon yazınız. Anaprogramda girilen N kadar sayinin altprogramda (fonksiyon) okuyan ve sayilarin ortalamasini hesaplayan ve sonucu anaprogramda ekranda gösteren bir program yazınız.

36 Örnekler Newton-Raphson metodu ile f(x)=0 denklemini çözen bir program yazınız. Notlar: x n+1 =x n -f(x n )/f`(x n ) belirli şartlar altında köke yaklaşır Hasasiyet (x n+1 x n )/ x n+1 <10-5 kontrol edilebilir Adım sayısı sınırlanmalıdır (örneğin 200)

1 Diziler (Matrisler) Giriş Diziler Dizileri Tanımlama Örnek: Dizileri Kullanma Dizileri Fonksiyona Gönderme Dizi Elemanlarını Sıralama Dizi İçinde Araştırma Çoklu satır ve sutunlu Diziler

2 Giriş Diziler Bir biriyle ilgili dataları içerirler Statik yapıya sahiptirler ve program boyunca bunu korurlar Bütün data tipleri için tanımlanabilirler Dizilerle işlem yapmayı öğrenmek, programlarınızı daha verimli ve güçlü kılar C deki Diziler işaretçiler (pointerlar) ile yakın ilgilidir

Dizi Diziler Arka arkaya gelen hafıza yerleri grubu Hafızadaki bu yerler aynı ad ve tipdedir Bir elemana erişmek için, Dizi adı belirtilmeli Pozisiyon numarası belirtilmeli Format: DiziAdı[ pozisiyon numarasi ] İlk elemanı 0 pozisiyonundadır n elemanlı c Dizi: c[ 0 ], c[ 1 ]...c[ n 1 ] Dizi Adı (tüm elemanların aynı adı taşıdığına dikkat ediniz c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9] c[10] c[11] -45 6 0 72 1543-89 0 62-3 1 6453 78 3 Dizi içindeki elemanın pozisiyon numarası

4 Diziler Dizi elemanları normal değişkenler gibidir c[ 0 ] = 3; printf( "%d", c[ 0 ] ); Eleman numarasında işlem yapılabilir. Eğer x 3 e eşit ise c[ 5-2 ] == c[ 3 ] == c[ x ]

5 Dizileri Tanımlama Diziler tanımlanırken Adı Dizi tipi Eleman sayısı belirtilmelidir DiziTipi DiziAdı[ elemansayısı ]; Örnek: int c[ 10 ]; float kayit[ 3284 ]; Aynı tip dizilerin tanımlanması Formatı birçok değişken tanımlama gibidir Örnek: int b[ 100 ], x[ 27 ];

6 Dizilerin Bazı Özellikleri İlk değer atama int n[ 5 ] = { 1, 2, 3, 4, 5 }; Eğer yeterince değer atanmamış ise (küme işareti içindeki elemanlar yeterli değil ise), en sağdaki elemanlar 0 olur int n[ 5 ] = { 0 } Tüm elemanlar 0 Eğer eleman sayısından fazla değer atanmaya çalışılır ise hata verir C Dizilerinde sınır (Dizi sonu) kontrol etme yoktur Eğer eleman sayısı unutulmuş ise, ilk değer atama eleman sayısını belirler int n[ ] = { 1, 2, 3, 4, 5 }; 5 ilkdeğer, böylece 5 elemanlı dizi

/* Histogram print eden program */ #include <stdio.h> #define ELEMANSAYISI 10 7 int main() { int n[ ELEMANSAYISI ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 }; int i, j; printf( "%s%13s%17s\n", "Eleman", Deger", "Histogram" ); for ( i = 0; i <= ELEMANSAYISI - 1; i++ ) { printf( "%7d%13d ", i, n[ i ]) ; for ( j = 1; j <= n[ i ]; j++ ) /* bir çubuğu print et */ printf( "%c", '*' ); } printf( "\n" ); } return 0;

8 Program Çıktısı Eleman Deger Histogram 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 *

Karakter dizileri 9 C de tüm data tiplerine karşılık gelen değişken tipleri vardır, fakat karakter katarları (cümleleri) için bir değişken tipi yoktur Karakter dizileri Karakter-katarı bahar gerçekte bir statik karakterler dizisidir Karakter dizileri karakter katarı kullanılarak ilk değer tanımları yapılabilir char katar1[] = bahar"; Null karakteri '\0' karakter katarını bitirir katar1 gerçekte 6 elemana sahiptir Yukarıdaki tanım aşağıdaki tanıma eşittir char katar1[] = { b', a', h', a', r', '\0' }; Tek karaktere erişmek mümkündür katar1[ 2 ] karakter h dir

10 Karakter Dizileri Dizi adı dizi adresidir, böylece & işareti scanf için gerekmez scanf( "%s", katar2 ); Karakterleri boşluk girilene kadar okur Dikkat edin dizi sonunu aşan bilgi yazılabilir!!! Bir karakter katarı karakter dizisi içine ilkdeğer atama hariç direk olarak eşitleme ile atanamaz. char adi[]= Servet ; //ilkdeğer atama adi= Servet ; //gecerli değil

/* Karakter dizilerin kullanilmasi */ #include <stdio.h> 11 int main() { char dizi1[ 20 ], dizi2[] = Cumle kelime"; int i; printf(" cumleyi giriniz: "); scanf( "%s", dizi1 ); printf( dizi1: %s\ndizi2: %s\n" dizi1 karakter bosluklari ile:\n", dizi1, dizi2 ); for ( i = 0; dizi1[ i ]!= '\0'; i++ ) printf( "%c ", dizi1[ i ] ); } printf( "\n" ); return 0; cumleyi giriniz: merhaba nasilsiniz dizi1: merhaba dizi2: Cumle kelime dizi1 karakter bosluklari ile: m e r h a b a

12 Dizileri Fonksiyona Gönderme Dizileri gönderme Dizideki değişkenleri fonksiyona göndermek için, fonksiyon parametrelerinde dizi adını köşeli parantezsiz belirtin int addizi[ 24 ]; //dizi tanimlama kayitfonksiyonu( addizi, 24 ); //fonksiyona gönderme dizi büyüklüğü genelde fonksiyona gönderilir Diziler adres gönderme yöntemiyle fonksiyona gönderilir Dizi adi ilk elemanin adresidir Fonksiyon dizinin nerede saklandığını bilir dizi üzerindeki değişiklikler hafızadaki orjinallerini değiştirir

13 Dizileri Fonksiyona Gönderme Dizi elemanlarının gönderilmesi (fonksiyon çağrılması) Elemanların gönderilmesi değer ile çağırmaya girer, yani kopyası gönderilir kayitfonksiyonu(addizi[ 3 ]) Fonksiyon prototipi void soyad( int b[], int elemansayisi ); Parametre(dizi) adlari prototipte yazilmayabilir int b[] int [] şeklinde yazılabilir int elemansayisi basitçe int yazılabilir Yukaradaki prototip şöyle yazılabilir void soyad( int [], int );

/* dizi ve dizi elemanlarının fonksiyona gönderilmesi */ #include <stdio.h> #define N 5 void dizidegis( int [], int ); /* prototipe dikkat! */ void elemandegis( int ); int main() { int a[ N ] = { 0, 1, 2, 3, 4 }, i; printf( tum dizinin fonksiyona gonderilmesi-adres ile cagirma:\n" "\ndizi orijinal elemanlari:\n" ); 14 for ( i = 0; i <= N - 1; i++ ) printf( "%3d", a[ i ] ); printf( "\n" ); dizidegis( a, N ); /* adres ile cagirma */ printf( dizinin degisen elemanlari:\n" ); for ( i = 0; i <= N - 1; i++ ) printf( "%3d", a[ i ] ); } printf( "\n\n\ndizi elemaninin gonderilmesi-deger ile cagirma:\n" "\n a[3] degeri %d\n", a[ 3 ] ); elemandegis( a[ 3 ] ); /* deger ile cagirma */ printf( a[ 3 ] yeni degeri %d\n", a[ 3 ] ); return 0;

void dizidegis( int b[], int n ) { int j; 15 } for ( j = 0; j <= n - 1; j++ ) b[ j ] *= 2; void elemandegis( int e ) { printf( fonksiyondaki deger %d\n", e *= 2 ); } tum dizinin fonksiyona gonderilmesi-adres ile cagirma: dizi orijinal elemanlari: 0 1 2 3 4 dizinin degisen elemanlari: 0 2 4 6 8 dizi elemaninin gonderilmesi-deger ile cagirma: a[3] degeri 6 fonksiyondaki deger 12 a[ 3 ] yeni degeri 6

16 Dizi Elemanlarını Sıralama Dataları sıralama Önemli bir bilgisayar uygulamasıdır Hemen hemen bütün organizasyonlar bir takım dataları sıralama ihtiyacı duyar Kabarma (baloncuk (Bubble)) sıralama (çökme (sinking) sıralama) Diziden birçok geçme (tarama) Yan yana iki eleman karşılaştırılır Eğer eleman artıyorsa (veya benzer ise), değişim yok Eğer azalıyorsa, elemanlar yer değiştirilir İşlemi tekrarla örneğin: orjinal: 3 4 2 6 7 1. tarama: 3 2 4 6 7 2. tarama: 2 3 4 6 7 Küçük elemanlar üste kabarır (bubble)