Program: Belirli bir amaca yönelik olarak bilgisayarda yerine getirilmesi istenen sıralı işlemler için yazılmış kodlardır. 

Veri: Bilgisayara girilen işlenmemiş bilgilerdir. 

Programlama Dilleri 

1­) Makine Dili:Makine tarafından hiçbir değişikliğe uğratılmadan kullanılabilen dillerdir. 

0 CMP AC AH 1 2­) Sembolik Diller:Sembollerle yazılan programlama dilleridir.Bu sembollerin makine tarafından anlaşılması için makine diline çevrilmesi gerekir. 

  1. a) Alt Düzey Programlama Dilleri:Makine diline çok yakındır.Yazılan programlar küçük bir çevirme ile Maine diline çevrilmektedir.(Assembler) 
  2. b) Üst Düzey Programlama Dilleri:Bilgisayar kullanıcısının kolaylıkla yazabildiği makine diline mutlaka çevrilmesi gereken dillerdir.(Fortran,Pascal,Basic… ) Derleyiciler(Compiler):Üst düzey dil kodlarını makine diline çeviren program. 

C Programlama Dilinin Temelleri 1­ Program fonksiyon ve değişkenlerden oluşur. 2­ Bir fonksiyon deyimlerden oluşur.(Deyim:Bilgisayara yapacağını anlatan komut öğesidir.) 3­ Değişkenler ise programın çalışma süresince kullanılan değerleri alır. 4­ C programları main() fonksiyonu ile başlar ve main() fonksiyonu ile biter. 5­ Programda tüm fonksiyonlar, main() fonksiyonunun içinde çağrıldıkları zaman kullanılırlar. 6­ Program satırlarında deyimlerden sonra ; kullanılır. 7­ Bir program editörde yazıldıktan sonra kaydedildiğinde .c uzantısını alır. 8­ programda tüm fonksiyonlar { ile başlar } ile biter. 

Main() Ana fonksiyon { Fonksiyona başlama printf(“ C Programlama Dili”) ; Deyim bitişi } Fonksiyon bitişi 9­ Printf komutunda değişkenler yazdırılken uygun kontrol karakterleri ile kullanılmaktadır. 10­ Scanf fonksiyonunda rakamsal değerler okuturken değişken adının önüne & işareti konulmalıdır. 

Veri Türleri, Oparatörler ve Değişkenler Program içerisinde değişken ve sabitler veri türünde tanımladıktan sonra kullanılırlar. 

Veri Türleri; a)char b)int c)float d)double 

  1. a) char: Lokal karakter setinde 1 karakteri tanımlamak için kullanılan veri tipidir. *Bellekte 1 baytlık(1 sekizli) yer kaplar. * ­128 den +127 ye kadar olan tamsayıları belirtmek mümkündür. 7 6 5 4 3 2 1 0 

Sayı alanı işaret biti Burada sayı alanındaki bitler 1 yapılırsa +127 sayısı elde edilir.(max. değeri) 

#include <stdio.h> main() {char a; a=’­ ’ ; Printf(“ a nın değeri %c “ ,a) } Yukarıda örnekte printf fonksiyonunda karakter değişkeni olarak tanımlanan “ a” değeri %c formatı ile verilmiş. b)int Tamsayılar için kullanılan değişken türünü tanımlar. Bellekte 2 byte(16 bit) yer kaplar. ­32768 den +32768 Kontrol karakteri olarak %d kullanılır. int şeklinde tanımlanmış bir değişken veya sabite ondalık kesirli bir sayı atanırsa ondalık kısım sayıya katılmaz. 

#include <stdio.h> main() {int a,b,c,d; printf(“ Birinci Sayı..:” );scanf(“ %d”, a); printf(“İkinci Sayı..:” );scanf(“ %d”,b ); c=a+b; d=a*b; Printf(“ Toplamı = %d Çarpımı = %d “ ,c,d); }c) Float 

Reel sayıları ifade eden değişkenler için kullanılır. Hafızada 32 bitlik(4 byte) yer kaplar. 3,4*10­38 den 3,4*10 +38 e kadar. Kontrol karakteri olarak %f kullanılır. 

#include <stdio.h> main() {float a; a=10/7; printf(“ 10 / 7 :”,a ); }d)double Float ile aynı işi yapar fakat kapasitesi daha büyüktür. Hafızada 64 bitlik yer kaplar. 1,7*10­308 den 1,7*10 +308 e kadar Pirntf(“ %5,2d “,a) Anlamı a sayısının tam kısmından 58 karakteri ondalık kısımdan 2 karakteri alır. Output fonksiyonlarında kullanılabilen genel amaçlı semboller; \n Bir satır atla \t Tab Aritmetik Operatörler 

++ arttırma operatörü ( değişken++ …:işl em gördükten sonra bir arttırır, ++ değişken …:işl em sembolünü bir arttırır ) ­­ eksiltme operatörü % kalan operatörü 

+,­,*,/ dört işlem operatörleri 

C’NİN PROGRAM YAPISI 

C programı en basit haliyle değişkenler, C’y e ait özel isimler (int, char, for, switch v.b) ve fonksiyonlardan meydana gelmiştir. 

C’nin t emeli fonksiyonlar üzerine kurulduğundan Trbo C’ y e ailt özel isimler hariç kullanılan komutların tümü ve hatta programın kendisi bir fonksiyondan ibarettir. 

main() {ifade­1; ifade­2; .ifade­n;

Turbo C de program yapısı en genel haliyle aşağıdaki gibidir. 

  • Preprocessor Direktifleri 
  • Global Değişken Girdileri 
  • Fonksiyon protatipleri 
  • Fonksiyon tanımlamaları 

1) Preprocessor Direktifleri (Ön İşlemci Komutları) Ön işlemci direktifleri #define ve #include direktifleridir. 

#define Komutu 

#define komutu ile programın her yerinde geçerli olmak üzere verilen değişkene belirtilen karakter yerleştirilir. 

#define sembolik_isim (değişken) yerini_tutacak_text #definer pi 3,1415 Bu örnekte pi sembolik bir sabittir. Program içerisinde asla değiştirlemez. 

#define pi 3,1415 

float alan,r ; main() {printf (“ Yarıçapı giriniz:”) ; scanf (“ %f ” ,& r); alan = r * r* pi ; printf (“ %f yarıçaplı dairenin alanı % f dir.” ,r , alan) ; }#define ile komut ve işlemler de tanımlanabilir. 

#define topla ( a , b ) ( a + b ) İnt x , y , z ; main() {x = 12 ; y = 3 ; z = topla ( x , y ) * 10 ; printf (“ toplam = % d “ , z ) ; }#include Direktifi ; 

Bu direktif ile belirtilen dosya içindeki makro komutların, global tip tanımlamalarının, fonsiyon tanımlamaları ve foksiyon protatiplerinin programın derlenmesi aşamasında hafızaya yüklenmesini ve bunların derlenmesini sağlar. 

Örneğin ; #include <stdio.h> direktifi ile stdio.h dosyası içerisindeki standart giriş ve çıkış için ihtiyaç duyulan komutları ve fonksiyonların kullanımı için ihtiyaç duyulan fonksiyon protatipleri ve değişkenler hafızaya yüklenir ve program içerisinde kullanılabilir hale getirilir. 

DEĞİŞKEN TANIMLAMALARI Değişkenler main () ana fonksiyonunun içinde veya dışında tanımlanabilirler. Eğer main ( ) fonksiyonun içinde tanımlandıysa bu değişkenler sadece main ( ) fonksiyon içinde kullanılabilir. main ( ) fonksiyonun dışında tanımlandıysa tanımlandığı yerden itibaren program sonuna kadar kullanılabilirler. 

Örnekler ; 

float f = 3,1 ; void yaz ( ) ; main ( ) {int a = 0 ; printf (“ %f % d “ , f , a); yaz ( ); }char x = ‘$’ ; yaz ( ) 

{printf ( “ % c “ , x ) ; }c ( ) ; { a = 100 ; }main ( ) { int b = 20 ; a = 0 ; c ( ); printf ( “ %d %d “ , a , b ); }……………………………………………………………….. 

int a = 0 ; c ( ) {a = 100 ; }main ( ) { int b = 20 ; c ( ); printf (“ %d %d “ , a ,b ); }FONKSİYON PROTATİPLERİ (FOKSİYON BİLDİRİLERİ) 

Fonksiyon tanımlamaları main ( ) den önce yada sonra yapılabilir yada kullanılan fonksiyonlar C ‘nin ilgili fonksiyon kütüphanelerinden bulunabilir. 

Fonksiyon protatipleri program içerisinde iki durumda gerekidir. a) Kullanılan fonsiyon fonksiyon kütüphanesinden seçildiyse b) Fonksiyon tanımlamaları main den sonra yapıldıysa c) Fonksiyon tanımlamalrı main den önce yapıldıysa Protatipin verilmesine gerek yoktur. 

(ders1.cpp) 

#include <stdio.h> #include <math.h> 

// pow( ) fonksiyonu math.h kütüpane dosyasından seçildiğinden math.h dosyası programın başında verilir. int x , y , p ; int power ( ); // fonksiyonun protatipi ( fonksiyon mainden sonra tanımlandığından fonksiyon protatipi fonksiyona giren ve fonksiyondan çıkan değerlerin kontrolü için main den önce verilmiştir.) main ( ) {scanf (“ %d ” , &x ) ; scanf (“ %d “ , &y) ; power ( ); printf (“ % d , nin % d kuvveti = % d ” , x , y , p) ; }power ( ) //fonksiyon tanımlaması { p = pow ( x , y ) ; }FONKSİYON TANIMLAMA KISMI 

main ve diğer fonksiyonlardan oluşur. Programın derlenip çalıştırılmasıyla icra fonksiyondan başlar ve aşağı doğru satır satır iner. Burada main ( ) den önce veya sonra tanımlanan veya fonksiyon kütüphanelerinden seçilen fonksiyonlar main içinde kullanılarak icra edilir. Bu yüzden main fonksiyonu ana fonksiyondur. 

(ders2.cpp) 

int x , y , p ; oku ( ) { scanf (“ %d %d “ , x , y ) ; }topla ( ) { oku ( ); p = x + y ; }main ( ) {topla ( ) ; printf (“ %d + %d = %d” , x , y , p ); }printf Çıkış Fonksiyonu 

Bütün fonksiyonlar main fonksiyon içinde icra edilir. oku ( ) nun icrası topla ( ) fonksiyonuna topla ( ) nın icrası da main ( ) foksiyonuna bağlıdır. 

Bir değişkeni yada işlemin değerini ekrana yazmak için kullanılan fonksiyon printf fonksiyonudur. Burada printf ( ) fonksiyonunun protatipi stdio.h başlık dosyası içinde verildiğinden #include <stdio.h> direktifi kullanılır. 

Printf ( format stringi , değer_listesi) ; format stringi “ ile başlar “ ile biter. format stringinde ; 

­ Açıklama kısmı : seçimliktir ve ekrana doğrudan basılır. ­ çıkış formatı : % işaretini takiben bir veya birkaç değişken tipinden oluşur. 

Ekrana basılacak değerin hangi formatta olacağını göstarir ( %d %c %f …) . ­ Escape düzen kısmı : / işaretini takiben başlar. Bir veya birkaç karakterden 

oluşabilir. Program içinde özel anlam içerir. Değerin ekrana basılacağı konuma etkisi vardır. printf (“ a nın b ye oranı %f dir. /n“,or an ) ; 

“a nın b ye oranı “ Ekrana basılacak açıklama kısmı.. “ % f “ çıkış formatı “dir “ Ekrana basılacak açıklama kısmı.. “/n “ Escape düzen karakteri (kursor alt satırın başına konumlanır) “ oran “ Ekrana basılacak karakter. 

printf ( “ % d ASCII kodlu karakter % c sir” , 65,65) ; Burada yazdırılcaak her iki değer de 65 dir. Fakat yazım formatları farklıdır. 

0 1 0 0 0 0 0 1 = 65 

% d %c ( int ) (char) 65 ‘A’ “65 ASCII kodlu karakter A dır. “ çıktısı alınır. 

#include < stdio.h> char c , str= “ Süleyman Demirel Üniversitesi” ; main ( ) {printf ( “ % s ( %c , %c , %c ) “ , str ,’S’ , ‘ D’ , ‘Ü’ ) ; }Format Komutları (kontrol karakterleri ) , değişkenlerle birebir eşlenerek işlem görürler. 

Çıkış Format Karakterleri 

Tüm Format karakterleri (kontrol karakterleri ) % işatreti ile başlar. Bu format çıkışın hangi formda olacağı ve değerin nasıl yorumlancağını belirtir. 

Tip Karakterleri 

Çıkış Formatları 

d İşaretli tamsayı u İşartsiz tamsayı f Gerçel sayı e Üstel sayı 

İd Long tamsayı if Double gerçel sayı c Tek karakter s String 

ESCAPE DÜZENİ KARAKTERLERİ 

Program çalıştığında kullanılan bazı tuşlar istenmediği halde bir komut olarak yorumlanabilir (Enter , tab , del …) yada kullanılan özel karakterler ( ?, ‘, “ …) C’ de özel anlama sahip olduğu için farklı yorumlanıp hatalar sebep olabilir. İşte bunun yerine Escape düzeni karakterleri kullanılır. Karakter Karakterin Anlamı \n Bir satır aşağıya \r Kursoru Satırın başına getirir. \b Kursoru bir kolon geri çek \a Zil sesi \t Yatay tab \v Printer için yeni satır başı \f Printer için yeni sayfa başı \ddd 8 lik sayı sisteminde verilen sayının ASCII karakteri \xdd 16 bitlik sayı sisteminde verilen sayının ASCII karakteri 

#include<stdio.h> int x = 1 , y = 1; main( ) {printf (“ \a \a * C programlama * \a \a \n “) ; printf (“ \ 

scanf Fonksiyonu 

Daha önceden tanımlanmış olan değişken alanlarına bir değer okumak için scanf fonksiyonu kullanılır. Bu fonksiyonun yapısı aşağıdaki şekildedir. 

scanf ( format stringi , adres listesi) ; Format stringi giriş yapılacak karakterlerin tipine göre hafızada ayrılan alanlara uygun olarak girişin hangi formatta olacağını belirtir. Adres listesi ise girişi yapılacak değişkenin hafızadakiadresini belirtir. Bunun için değişkenin önüne & işareti koymak yeterlidir . Adres oparatörü sadece numerik değişkenleri için kullanılır. String değişkenler hafızada bir karakter dizisi olarak ifade edildiğinden string değişkenler önüne & işareti konulmsa da olur. 

scanf( “ %d “ ,&a ) ; &a adresindeki iki bayt lık bölgeye %d ile girişin tam sayı biçiminde olağınını belirtir. 

Scanf fonksiyonunda okuma işlemi tab, boşluk ve Enter tuşuna basılan yere kadar yapılır. 

#include<stdio.h> char ad_soyad [30] ; main( ) 

{printf ( “ ad ve soyad :” ) ; scanf (“ %s “, ad_soyad) ; printf (“ merhaba %s “, ad_soyad) ; }Çalıştığında ad ve soyad : ALİ ASLAN merhaba ALİ 

Okuma işlemi i harfinden sonra kesilmiştir. Bu durumda ad ve soyad iki değişken ile alınmalıdır. printf ( “ Ad ve soyad :” ) ; scanf (“ %s %s “ , ad , soyad) ; 

GİRİŞ FORMAT KARAKTERLERİ 

Format stringi içinde % işaretini izleyen karakterler belirli tipe sahip değişkene değer girişinin hangi formda olacağını belirtir. % Tip Karakterleri Anlamı d İşaretli Tam Sayı o Long işaretli tam sayı u İşatersiz tamsayı e Üstel gerçel sayı f Gerçel sayı lf Double gerçel sayı c Karakter s String 

Çeşitli Format Sitillerine Göre Giriş Örnekleri 

Scanf fonksiyonunun format stringleri içerisinde printf fonksiyonunda da olduğu gibi açıklama karakterleri bulunabilir. Bu durumda format stringine tüm olmasada uymak gerekir. 

scanf (“ %d %d “ , &x,&y) ; 10 15 ↵ 

10 ( kontrol karakterleri arasında boşluk var ) 15 ↵ 

Giriş iki yolla yapılabilir. Değerler arasına boşlık kullanılır yada her değerden sonra basılır. 

scanf (“ %d%d “ , &x,&y) ; 10 15 ↵ 

10 ( kontrol karakterleri arasında boşluk yok) 15 ↵ 

Yinede boşluk kullanılır yada Her değerderden sonra basılır. 

scanf (“ %d , %d “ , &x,&y) ; 10 , 15 1.. 

10 ( kontrol karakterleri arasında boşluk var ) 10 152.. 

15 Değişkenler arasına , konmalıdır İkinci kullanım yanlıştır. scanf (“ a ve b değerleri %d %d “ ,&x , &y) ; a ve b deperleri 10 15 ile işlem görülür. 

scanf (“ a ve b değerleri %d %d “ ,&x , &y) ; a ve b deperleri 10 15 yazılır. a ve b 10 15 ↵ 

Girilen ifadelerden sonra enter kullanılarak da yapılabilir. 

Scanf (“ %d %d”, &x,&y ) ; değim başında kullanılan boşluk ifadeleri derleyici tarafından ihmal edilir. Scanf (“ %d %d ” , &x,&y ) ; Değim içinde format stringi sonunda boşluk kullanılmaz. Çünkü giriş sırasında hata meydana getirir. 

#include<stdio.h> float i , j ; main( ) {printf ( “ x ve y değerlerini girin”) ; scanf (“ x = %f y = % f “ , &i , &j ) ; printf (“ x + 1 = %f y – 1 = %f “ i+1 , j­1 ) ; }Burada girişler scanf de belirtilen format stringine uygun olarak yapılmalıdır. 

Operatörler 

İki bilgiden amaca yönelik olarak yeni bilgi elde etmesini sağlayan sembolik araçlardır.C de operatörler üç gruba ayrılır. 

1) Aritmetiksel operatörler 

Bu operatörler numerik değerlerin işlenmesinde kullanılır. 

* / % + ­ İkili oparatörler ++ ­­ + ­ Tekli Oparatörler & | ^ ~ << >> Bit Seviye Oparatörleri += ­= *= /= %= >>= <<= &= |= ~= 

Birleşik atama oparatörleri 

2) İlişkilendirme ve Mantıksal Oparatörler İlişkilendirme oparatörleri iki değerin karşılaştırılmasında kullanılır.Karşılaştırmanın doğru yada yanlış olmasına göre numerik değer üretir. < <= >= = = != Mantıksal oparatörler mantık değerleri olan doğru ve yanlış değerlerini işleyerek yeni mantıksal sonuçlar üretir. && || ! 

3)Diğer Oparatörler Bu iki gruba ek olarak C de bazı özel oparatörler vardır. Bu oparatörler ; 

İşaret Anlam 

= Atama oparatörü ?: Üçlü koşul oparatörü & Adres oparatörü * Dolaylı oparatörü ; İfade sonu oparatörü , Virgül oparatörü Size of Boyut oparatörü Tip Tip oparatörü /**/ Açıklama oparatörü 

Ek Açıklama: ( = Atama oparatörü) 

Bir değeri bellekteki değişkene atamak için kullanılır.Bu sembol sağındaki değişkeni solundaki değişkene atar.Burada sağ tarafda oluşan değerin atanabileceği (ve tanımlı)sol tarafta değişken bulunmalıdır. 

int x;int y=8; int x[5]; float t,u; main() {x=y=x[0]=x[4]=0; t=u=x[2]=3.14; }Birden çok değişkene aynı anda aynı değerler atanabilir. 

Aritmetik işlem oparatörleri 

+ Toplama oparatörü ­ Çıkarma oparatörü * Çarpma oparatörü / Bölme oparatörü % Mod oparatörü 

  • Mod oparatörü iki tam sayı değerinin bölünmesinden elde edilen kalanı bulur. 

float x=!89,y=4,z; main() {z=x+y; /* z=! 89 + 4 =5.89 */ z=x­y; z=x*y; z=x/y; z=x%y; /* Yanlıştır çünkü % sadece tam sayılarda geçerlidir */ }*Uygulama Aritmetiksel giriş ve çıkış işlemlerini ayrı ayrı fonksiyonlar kullanarak programlar hazırlayınız. 

Unary (Tekli) Oparatörler; ­ , + , ­­ ,++ olmak üzere dört tane unary operatör vardır. En önemlileri – azaltım ve ++ artırım operatörleridir. Unary ( ­ ) operatörü işlenen değerin işaretinin tersinin alınmasını sağlar. b = 300 ; a = ­b ; /* a = ­300 olur*/ 7Bu operatörler tek başına kullanılabildiğinden tekli operatörler denir. printf (“ %d sayısının tersi %d “ , x , ­ x ) ; 

Artım ve Azaltım ( ­­ ve ++ ) Operatörleri 

Bu operatörler tamsayı ve gerçel sayı tipine sahip bir değişkenin değerine 1 eklemek veya bir değerden 1 çıkarmak için kullanılır. ­­ a (işlem öncesi a azalt ) ++a (işlem öncesi a arttır ) a­­ (işlem sonrası a azalt ) a++(işlem sonrası a arttır ) 

a = b++ ( a = b sonra b = b+1 ) c = d­­ ( c = d sonra d = d ­­ ) a = ++b ( b = b + 1 sonra a = b) a = ­­ b ( b = b – 1 sonra a = b) 

Örnek ; b = 3 için a = ++b ( b = b+1 b = 4 a = b a = 4 ) a = b++ ( a = b a = 4 b = b+1 b = 5 ) 

­­ ve ++ operatörleri aynı zamanda atama işlemi de yaptığından, bu operatörlerden önce veya sonra değer atamasının yapılabileceği değişkenin bulunmasına dikkat edilmelidir. 

c = a++ +b ; ( a=4 ve b=5 icin) işlem sırası c = a +b a= a+1 

son değerleri c = 9 a = 5 b = 5 

c = ++a ­b ; işlem sırası a= a+1 c = a­b 

a = 5 b = 5 c = 0 c = ­­ a + b ­­ ; işlem sırası a = a ­1 c = a+ b b = b ­1 

a = 3 c = 8 b = 4 

c = a + a++ ­ b­­ ; işlem sırası a = a+1 c=a+a­b b= b – 1 

a = 5 c = 5 b = 4 

++ ve – operatörleri değişkenin solunda ise işlem önceliğine sahiptir. İkisi de değişkenin sağında ise işleme sağdan sola doğru gidilir. 

(21 – 5 * 3 + 2) öncelik yıldız işlemindedir. (21 – 15 + 2 ) işlemler burada soldan sağa doğru olur. (21 – 15 ) + 2 = 6 + 2 = 8 

örnek ;a = ++a + a ( a = 4 için ) ++ a = a+1 => a = 5 + a = a+a => a = 10 = a = 10 

a = ++a + a ( a = 4 için ) a = a+a 

sayfa 17 ve 18 örnbekler var.. 

BİT – SEVİYE OPERATÖRLERİ 

Assembler’ d a yapılan bit işlemleri C ‘ de dit seviye operatörleri ile desteklenmektedir. Bit seviye operatörleri tamsayı tipindeki değerlerin bitlerini kontrol etmek, değiştirmek, sağa sola kaydırmak için kullanılır. ( Gerçel sayılar için bu işlemler geçerli değildir. ) 

Bit – Seviye Operatörleri & Bit Seviye AND | Bit Seviye OR 

^ Bit Seviye XOR ~ Unary NOT << Sola Kaydırma >> Sağa Kaydırma 

1 ) And Operatörü ( & ) 

& operatörü iki değerin bitlerini AND mantığına göre işler. 

X Y X & Y 0 0 0 0 1 0 1 0 0 1 1 1 

n = n & ‘ 0 ‘ ( unsigned n = ‘ 0 ‘ olsun ) 

01100001 (‘ 0 ‘) = 97 & 01001111 (‘ 0 ‘) = 79 01000001 (‘ A ‘) = 65 

n = n & ‘ 0 ‘ ifadesini artık n = ‘ A ‘ değerine sahiptir, Örnek program ; #include <stdio.h> unsigned char n; main ( ) {for ( n = ‘ 0 ‘ ;n <= ‘ 0 ‘ ;n++ ) 

{printf ( “ % c “ , n & ‘ 0 ‘); } }2 ) OR Operatörü ( | ) 

iki tamsayının değerlerini bit olarak or mantıksal yöntemine göre karşılaştırır. 

X Y X | Y 0 0 0 0 1 1 1 0 1 1 1 1 

Bı operatöre genellikle bit gruplarının değerlerini 1 yapmak için kullanılır. 

3 ) XOR Operatörü ( ^ ) 

İki değere ait bitler teker teker karşılaştırılır. karşılaştırmada bitler aynı ise 0 farklı ise 1 değeri üretilir. 

X Y X ^ Y 0 0 0 0 1 1 1 0 1 1 1 0 

^ operatörü bir değerin belirlenen bitlerin ters çevirmek için kullanılır. 

#include <stdio.h> unsigned char x , y; main ( ) {x = ‘a’ ; /* a nın ASCII kodu 57 */ y = ‘ A ‘ /* A nın ASCII kodu 65 */ printf ( “ % u \n “ , x^y ) ; }Ekran çıktısı = 32 dir. 

4 ) NOT Operatörü ( ~ ) 

Verilen tamsayı değerinin bitlerinin tersini alır. Yani 0 => 1 1 => 0 yapar. x ~x 0 1 1 0 NOT işlemine tabi tutulan işaretli bir tamsayı değişkenin sonucu aşağıdaki gibidir. 

~x = ­ (x + 1) Örnek ; X = 44 ise ~x = ­45 buradan da – x = ~x + 1 

Eğer değişken işaretsiz bir tamsayı ise ; ~x = (2n ­ 1 ) – x şeklindededir. ( n bit sayısıdır.) 

~x = ( 28 – 1 ) – x ~x = ( 216 – 1 ) – x 

5 ) Sağa Kaydırma Operatörü ( >> ) 

Sağa Kaydırma Operatörü ( >> ) bir tamsayının bitlerinin verilen değer kadar sağa doğru kaydırılmasını sağlar. Tamsayı >> k ( k, sağa doğru bitlerin ne kadar kaydırılacağını belirtir. ) Bu operatöre ile matematiksel anlamda bitlerin sağa doğru her kaydırılışı sayının 2 ile bölünmesi demektir. Yani 

x >> k

2

Sağa kaydırma ile elde edilen değer ondalık ise bu değer aşağı yuvarlanır. 

+3 >> 1 = 3 = 1,5

2

­3 >> 1 = ­3 = ­1,5 ­2 2 

± . . . . . . . 

. . . . . . . . 

(artan bit) 

1 1 0 1 0 0 1 1 

8 bitlik işaretli tamsayı için (char) sağa doğru bir defa kaydırma. 

= ­ 45 

1 1 1 0 1 0 0 1 

± . . . . . . . 

0 0 . . . . . . . 

6 ) Sola Kaydırma Operatör (<<) 

= ­ 23 

8 bitlik işaretsiz tamsayı için (unsigned char) sağa doğru bir defa kaydırma. 

Sola kadırma operatörü (<<) bir tamsayının bitlerinin verilen değer kadar sola kaydırılmasını sağlar. Sola doğru bitlerin kaydırılması ile basılan bitlere 0 yerleştirilir. 

Tamsayı << k x . 2

Sola kaydırma matematiksel olarak bitlerin sola doğru her kaydırılması için 2 ile çarpılması demektir. 

2bit likchar 

2 << 3 = 2* 2^3 = 16 ­10 << 4 = ­10*2^4 = ­160 ‘0’ < < 1 = 97*2 =194 

BİLEŞİK ATAMA OPERATÖRLERİ 

Operatörlerin kullanımını kısıtlamak için kullanılır. 1.. değişken1 = değişken operatör ifade 2.. değişken1 operatör = ifade 1. ifade yerine 2i ifade kullanılır.Basit Hali Kısıtlanmış Hali 

x = x + y x +=y x = x – y x ­ =y x = x * y x * =y x = x / y x / =y x = x % y x %=y x = x &y x &=y x = x | y x | =y x = x ^ y x ^ =y x = x >> y x >> =y x = x << y x << =y 

Örnekler : a ) x = (x*a) + (x/b) 

x =x*(a +1/b) x*= (a+1/b) b) x = x* (x*5) 

X* = (x*5) 

İLİŞKİLENDİRME VE MANTIK OPERATÖRLERİ 

A­) İlişkilendirme operatörleri : İki değer karşılaştırılması için kullanılan ve karşılaştırma doğru ise 1 , yanlış ise 0 değeri üretilir. İlişkilendirme operatörleri ; 

> Büyüktür >= Büyük veya eşittir 

< Küçüktür <= Küçük vya eşittir = = Eşittir ! = Eşit değildir. 

Karakterarasında karşılaştırma yapılabilir. karakterler karşılaştırılırken ASCII kodları kullanılır. ‘a’ > ‘b’ 0 (yanlış) a nın ASCII kodu = 97 b nin ASCII kodu = 98 ‘A’ = = 65 1 (Doğru) A nın ASCII kodu = 65 

B­) Mantık Operatörleri Mantık Operatörleri ilişkilendirme operatörleri ile beraber olarak, birden fazla ifadenin test edilmesi için kullanılır. İstenen değer 0 yada 1 değerini alır. 

C de kullanılan mantık operatörleri 

&& AND operatörü || OR operatörü ! NOT operatörü 1 ) ! NOT Mantıksal Operatörü 

İlişkisel bir ifadein sonucunda elde edilen değerin tersini almak için kullanılır. 

! ( 0 ) => Doğru (1) ! ( 1 ) => Yanlış (0 ) ! (| = = 1) => yanlış ( 0 ) ! (1<0) => Doğru (1) 

2 ) && AND Mantıksal Operatörü 

İlişkisel iki ifadeyi birbirine bağlayan ve bu ilişkisel ifadeleri AND mantığına göre değerlendiren operatördür. 

(20 > 1) ( 0 = = 0 ) => Doğru ( 1 ) (‘a’ = = ‘b’ ) && ( ­1 > ­2 ) => Yanlış ( 0 ) 

İfade 1 İfade 2 İfade1&&İfade 2 

0 0 Yanlış 0 1 Yanlış 1 0 Yanlış 1 1 Doğru 

3 ) || OR Mantıksal Operatörü 

Mantıksal iki ifadeyi birbirine bağlayan ve bu operatördür. 

İfade 1 İfade 2 İfade1 || İfade2 

0 0 Yanlış 0 1 Yanlış 1 0 Yanlış 1 1 Doğru 

( 20 >1 ) || (0 = = 0 ) => Doğru ( ‘a’ = = ‘b’ ) || (­1 > 0 ) Yanlış 

İlişkisel ve mantıksal Operatörler için işlem önceliği operatörlerde ve işlem önceliği herzaman () ve [ ] ile belirlenmelidir. Eğer bu şekilde işlem öncelii belirlenmediyse C de işlem önceliği toplamaya göre yapılır. 

1 ) (x > y && ! (z<b) || c<= d işlem sırası: < ( z<b ) ! !( z<b ) > x>y <= c<=d && () &&!(z<b) || ( ) || ( ) 

Üçlü Koşul ( Ternary ) Operatörü (?:) 

Bir ifadenin doğru yada yanlış olmasına göre farklı ifadelerin yerine getirilmesini sağlar. ifade1 ? ifade2 : ifade3 Bu ifadeye göre sonuç ;ifade1 doğru ise ifade2 yanlış ise ifade3 olacaktır. 

örnek: j = (i<0) ? (­i) : (i) z = max(x , y ) ? x : y ; cevap = harf = = ‘A’ 

ilişkilendirme operatörleri sonuç :cevap= 1 ilişkilendirme poretörü doğru cevap= 0 ilişkilendirme poretörü yanlış Atama operatörü ve ilişkilendirme operatörleri yukardaki örnekte olduğu gibi içiçe kullanılabilirler. Aynı ifadeyi Ternary poeratörünü kullanarak yapalım; 

cevap = ( harf = = ‘A’ ) ? 1 : 0 ; 

Atama Operatörleri Örnekleri ; Atama operatörleri ard arda atama yapabilirler ve ifade üzerinde birden fazla kullanılabilirler. 

a = b = j = d = 1 x [0] = x [1] =y[1] = 0 a = a + 1; b = a * c; b = a++ * c ; 

şeklinde yazılabilir. a = a + 10; b = a * c; c = c – 1; b = ( a+= 10) * c ­­ 

k = d + b ; 1 = k * m – 2 ; 1 = (k = d + b) * m – 2 

Sizeof Boyut Operatörü Verilen bir tipin veya değerin hafızada işgal ettiği bölgenin bayt olarak sayısını verir. Bu opretörlerün iki tip kullanımı vardır. 1 ) sizeof (char ) ; 1 sizeof ( int ) ; 2 sizeof (float ) ; 4 

2 ) char ch; 

int i ; float f; double d; long double ld; sizeof i ; 2 ( değişken int tipinde olduğu için) sizeof f ; 4 ( değişken float tipinde olduğu için) sizeof ch ; 1( değişken char tipinde olduğu için) 

şeklinde kullanılır. örnek: long f; unsigned char uc; int i ; float x; 

x = +uc*i; 

Kısaca ; İfade içerisindeki değişkenler en büyük değer aralığına sahip değişken tipine çevrilir. unsigned int unsigned int 

ve işlem yapılır. Sonuç atanacak değişkenin tipine çevrilerek çıartılır 

long unsigned int 

long int 

Long int 

x = floatCAST Dönüşümleri ; 

Belirli bir tipe sahip değerin diğer bir tipe dönüştürülmsi işlemine cast dönüşümü denir. 

(Tip İsmi ) ifade ; Örnek:int a 

float x , y; main () {printf ( “ Bir sayı giriniz “) ; scanf ( “ %d “ , &a ); x = a /3; y = (float ) a / 3; ( x= = y ) ? puty ( “çift “ ) : puts ( “ Tek \n” ); }Tip dönüşümleri ( Genel Aritmetiksel Dönüşümler) Bir aritmetiksel ifadede sıkça farklı tiplere sahip sabitler ve değişkenler kullanılır. Bu gibi ifadelerin işlem sürebilmesi için işlenen tiplerin aynı olması gerekir. Farklı tiplere sahip iki değer derleyici tarafından aynı tipe çevrilir. 

Dönüşümlerde uygulanan kulrallar , 1 ) 

char ± 127 char int shortint± ± 32567 shortint int Unsigned shortint 0­65535 unsigned char unsigned int Unsigned char 0­255 unsigned shortint unsigned int 

float double 

2 ) Yukarıdaki işlemlerden sonra ; 

Küçük değer aralığına sahip değerler aynı işleme giren daha büyük değer aralığına sahip değer tipine dönüştürülür. Tip Değer aralığı Tip Boyut Değer aralığı int ±32768 Float 4 B =±3,4*10±38 unsigned int 0­65535 Double 8B ±1,7*10308 long int ±2143483648 Long float 8 B ±1,7*10308 unsigned longint 0­4294967295 Long double 10 B =±3,4*10493 double ­ long double ­ 

Örnek : char ch ; int i; float f ; double d; long double ld; sonuç = (ch*i ) + ( f / d ) ­ ( f + i ) + ld 

int double double 

int double double 

double 

double 

long double 

Aritmetik işlemlerde değişken tiplerinin dönüşümğnğn sizeof fonksiyınu ile kullanımına örnekler : 

char ch ; int i; float f ; double d; long double ld ; 

sizefo ( f + i ) ; 

double int 

double 

double 

sizeof ( 7 * ch ) = 2 

int int int 

sizeof ( 2 * d – f ­ ld ) = 10 sizeof fn [ 7 ] = 7 * 4 = 28 

POINTER’ LAR Pointer bir değişkenin adresini içeren değişkenlerdir. Bilgisayarlar ayrı ayrı yada bitişik guplar halinde idare edebilen ardışık olarak sayaçlaştırılmış ( adreslenmiş) hafıza hücrelerinindizisine sahiptir. 

Her pointer bir başka bellek hüvresini gösteren hafıza alanıdır. 

char c = ‘A’ ; char *p; p = &c ,&c(1500) &p 

A 1500 

p değişkenine c nin içeriği değil (‘A’ ) , C nin adresi (1500) atanmıştır. Böylelikle p nin c yi görmesi sağlanır. 

( & ) adres görüntüsü ( değişken ve dizi değişkenleri için kullanılır ) ( * ) dolaylı operatör.(pointer in gösterdiği aderste bulunan değere ulaşır.) 

örnek : int = 10 , y = 20 , z[3] ; int *pi ; /* pi int tipinde bilgiyi gösteren pointer değişkendir */ pi = &x ; /* x değişkeninin adresi pi pointerine atanır.*/ 

/* pi x değişkeninin adresine sahiptir ve x değişkenini gösterir */ y = * pi /* pi ye atanan hafıza bölgesindeki değer y değişkenine atanır */ 

/* yani y = 10 dur */ 

x = 0 (yada *pi = 0 yazılabilir.) 

Bu durumda pi nin gösterdiği alana 0 değeri yerleştirilir. ( x = 0 olur ) pi = &z [ 0] /* pi pointeri z [0] elemanını gösteriyor) *pi = 541 (z [0] elemanının adresine 541 yerleştirilir. ) 

Bu ifadenin bellek durumu ; int = 10 , y = 20 , z[3] ; int *pi ; 

&x &y &z[0] &z[0] &z[1] &z[2] &pi 

10 20 NULL (1600) (1602) (1604) (1606) (1608) 

pi = &x ;&x &y &pi1600 

1600 

y = * p&x &y &z[0] &pi 

10 10 1600 

*pi = 0&x &y &z[0] &pi 

0 10 1600 

pi = &z [ 0 ] ve pi = 541 

&x &y &z[0] &z[0] &z[1] &z[2] &pi 

0 10 541 1604 (1600) (1602) (1604) 

Pointerler Ve Diziler 

Dizilerle yapılan işlerin aynısı pointerlarlada yapılabilir ve işlemler daha hızlı olur. 

int m [10] ; int *pi 

pi = &m [ 0 ] (veya pi = m) &pi m Pi 

&m[0] &m[y] 

x= *pi ( yada x = m [0 ] ) 

pi dizinin bir elemanını gösteriyorsa ( pi +1 ) ile bir sonraki eleman ve ( pi + i ) ile de pi den sonra i eleman gösterilir. 

pi m [ 0 ] ı gösteriyorsa, * (pi +1 ) ifadesi m [ 1 ] in içeriğini gösterr. 

&pi pi +1 pi + 9 Adres Değerleri Pi 

*pi *(pi+1) * ( pi +2) * (pi + 9) Adresteki değerl. 

Buradan ; 

Pi [i] = * ( pi + i) özdeştir. 

PROĞRAM KONTROL İFADELERİ 

Bazı ifadelerin(işlemlerin) yerine getirilebilmesi için birtakım şartların sağlanmış olması gerekir. Böyle durumlarda program içerisinde öncelikle gerekli şartların kontrol edilmesi gerekir. 

Şart kontrollerinde ilişkisel ve mantıksal operatörlerinde yardımıyla doğru ya da yanlış sonucu üretilir. Bu sonuca göre ifadeler işlem görür ya da görmez. 

C ‘de şartların kontrolü if ve switch ifadeleri ile sağlanır. 

1) if ifadeleri 

if (şart testi) ifade Şart testi DOĞRU(sıfırdan farklı sayi olma durumu) ise 

ifade işleme tabii tutulur. 

if (şart testi) {ifade_1; ifade_2; ifade_3; …ifade_N:

Şart testi DOĞRU ise { ve } işaretleri arasındaki ifadeler işleme tabii tutulur. Yanlış olması durumunda ise küme parantezi arasındaki ifadeler işlenmez. 

ÖRNEK: 

if (a>0) printf(“po zitif”) ; if (a=0) printf(“sıfır”); if (a<0) printf(“n egatif” ); 

2) if­ else ifadeleri 

Bazı durumlarda if’ teki şart testine bağlı olarak, şart doğru ise bir ifadenin(ya da ifade bloğunun), yanlış ise diğer bir ifadenin yerine getirilmesi gerekebilir. Bu durumda if­else yapısı kullanılır. 

if (şart testi) ifade1; else ifade2; 

Şart testi DOĞRU ise ifade1, değilse ifade2 işleme tabii tutulur. 

Şart if (şart testi) 

testi DOĞRU ise if’ i izleyen ifade bloğu, değilse {else’i i zleyen ifade bloğu işleme tabii tutulur. ifade_1; ifade_N; 

Eğer if veya else’de n sonraki komut sayısı bir ise küme parantezi kullanmaya gerek kalmaz. 

}else {ifade_1; ifade_N:

ÖRNEK: 

İf (b==0) printf(“ ifade sonsuzdur” ); else printf(“ Oran= %d”, a/b); 

3) if­else if ifadeleri 

if (şart testi) {ifade bloğu }else if (şart testi) {ifade bloğu }else if (şart testi) {ifade bloğu }…… else {ifade bloğu

Bu yapıda şart testleri yukarıdan aşağıya doğru icra görür. Doğru olana kadar şart testleri kontrol edilir. Şart doğru olduğu zaman o şarta bağlı ifade bloğu icra görür. 

Şartlardan hiçbiri doğru değilse sonraki else’ yi izleyen ifare bloğu işlem görür. Ancak son kısımdaki else bloğu seçimliktir, kullanılmayabilir. 

ÖRNEK: #define sayi 4040 int tahmin; 

main() { 

tekrar: printf(“Sayiyi tahmin ediniz?”); scanf(“%d”,&tahmin); if(tahmin==sayi) printf(“Tebrikler”); else if (tahmin>sayi) { 

printf(“Girdiğiniz sayi buyuktur.”); goto tekrar; }else

printf(“Girdiğiniz sayi kucuktur”); goto tekrar: }printf(“Oyun sona erdi.”):

4) Üçlü Koşul Seçeneği 

(İfade_1) ? (ifade_2) : (ifade_3); İfade_1 doğruysa ifade_2, yanlışsa ifade_3 

işleme tabii tutulur. 

Bu ifade if’e benzetilirse; 

if (ifade_1) ifade_2; else ifade_3; şeklinde olur. 

ÖRNEK: 

if(tahmin==sayi) printf(“Doğru tahmin”); else(tahmin>sayi) ? printf(“tahmin>sayi”); : printf(“tahmin<sayi”); 

5) goto ifadesi 

goto ifadesi ile program içerisinde etiket olarak belirtilen noktalara program direkt yönlendirilebilir. 

goto aa; … . … . aa; 

(Program aşağı atlatılmış) 

bb; … . … . goto bb; 

(Program yukarıya atlatılmış) 

goto ifadesi ile ifade bloğundan çıkılabilir. Fakat döngü fonksiyon veya alt program içine sıçrama yapılamaz. Sıçramalar aynı döngü, blok ve fonksiyon içinde yapılabilir. 

Sıçramalar bir ifade bloğuna (belirli bir şartı sağlayan ifade bloğu içine),ayrıca main() bloğu içine sıçranmaz. 

main() 

{goto x; …… Geçersiz x:

main() 

{goto x; …… Geçerli x: ;

6) switch ifadeleri 

if­else if yapısına benzer mantıkla çalışır ve kullanımı daha kolaydır. 

ÖRNEK: if (cevap==’A’) printf(“Çok iyi”); else if (cevap==’B’) printf(“İyi”); else if (cevap==’C’) printf(“Orta”); else if (cevap==’D’) printf(“Zayıf”); else printf(“Notu yok”); Switch ile; switch(cevap) {case ‘A’: printf(“Çok iyi”);break; case ‘B’: printf(“İyi”); break; case ‘C’: printf(“Orta”); break; case ‘D’: printf(“Zayıf”); break; default : printf(“Notu yok”); break; } 

switch programında; switch değişkenin değerini teker teker case etiketlerinin değerleri ile karşılaştırılır. Bu karşılaştırma yukarıdan aşağı doğru,cevap değişkenin değerinin case etiketlerinden birine uymasına kadar devam eder. Eğer uyuşma varsa o case’e ait ifade işlem görür, ifade bloğunun sonunda bulunan break sayesinde switch ifadesinden çıkılır. Eğer cevap etiketi hiçbir etikete uymuyorsa default ile belirtilen ifade veya ifade bloğu işlem görür. 

Case’ lerden sonra break kullanılmaması durumunda bir case ait ifade işlem gördükten sonra bir sonraki case’e ait ifadeler işlem görür. 

Default kullanımı seçimliktir. Ayrıca case etiketleri değişken olamazlar,sabit değer almalıdırlar. 

Switch ifadesinin genel yapısı: 

switch (değisken) {case sabit_1 : ifade_1;ifade_2;….br eak; ………… .. case sabit_n : ifade_1;ifade_2;….br eak; 

default: ifade_1;ifade_2; }ÖRNEK: switch(cevap) {case ‘a’: case ‘A’: printf(“Çok iyi”);break; case ‘b’: case ‘B’: printf(“İyi”);break; } 

Büyük küçük harf ayrımı yapmadan a harfine basılırsa “Çok iyi” ,b harfine basılırsa “İyi” m esajlarını ekrana basar. 

switch(cevap) {case ‘a’: case ‘A’: printf(“Çok iyi”); case ‘b’: case ‘B’: printf(“İyi”); } 

Programımızda break yazılmadığından bir case ifadesinden sonra diğer case ifadeleride çalışır.A ya basıldığında ekran çıktısı Çok iyi ve İyi olur. 

DÖNGÜLER 

Döngüler kesin şartlara ulaşıncaya kadar ifadenin veya ifade bloğu içerisindeki ifadelerin icrasını sağlar. 

if ve goto ifadeleriyle de döngü oluşturulabilir fakat programın akışını bozduğu için fazla kullanılmaz. 

Etiket: ifade_1; … .. ifade_n; if (şart) goto Etiket; 

Şart sonda kontrol edilmiştir. 

Basla: if (şart) goto son ifade_1; …… ifade_n; goto Basla; son: 

Şart başta kontrol edilmiştir. 

C’DEKİ DÖNGÜ İFADELERİ 

1) do­while 

İlk doolarak do ifadesinden sonraki küme parantezi {içerisindeki ifade bloğu işlem görür. ifade_1; ifade_2; …. ifade_n; 

Bloğun sonunda şart testi yapılır. Eğer doğru ise döngünün başına gidilir ve ifade bloğu tekrar işlem görür. Şart testi yanlış ise döngüden çıkılır. 

}while(şart testi); 

ÖRNEK: int x,y; main() {x=y=0; do{++x; ++y; printf(“%d+%d=%d\n”,x,y,x+y); }while(x<=5); getch(); } 

x ve y değerlerine sıfır atanır. Do­while döngüsüne girildiğinde x ve y değerleri bir artırılır. x,y toplamları ekdana yazdırılır. 

Döngünün sonunda x’in değerinin beşe eşit olma veya beşten küçük olma durumu kontrol edilir. Sonuç doğru ise döngünün başına gidilir, yanlış ise döngüden çıkılır. 

Ekran çıktısı: 1+1=2 2+2=4 3+3=6 4+4=8 5+5=10 6+6=12 

2) while döngüsü 

while döngüsünde şart testi, do­while ifadesinden farklı olarak, döngü sonunda değil döngü başındadır. Bu yüzden döngü içine girmeden şart testi kontrol edilir. 

while(şart testi); {ifade_1; ifade_2; …. ifade_n; } 

Şart testi doğru ise döngüye girilir ve döngü içindeki ifadeler işlem görür. İfadelerin icrasından sonra tekrar şart testinin yapıldığı başa dönülür ve şart kontrol edilir. Şart sağlanıyorsa işlemler tekrarlanır. Şart sağlanmıyorsa döngüden çıkılır. 

ÖRNEK: while((ch=getch())!=’c’) printf(“Döngüdesin…”); printf(“Döngüden çıkıldı…”); 

NOT: while döngüsü ile do­while döngüsü arasındaki fark 

do { ifade_1; ifade_2; …. ifade_n; }while(şart testi); Şart Doğruysa Şart yanlışsa 

while(şart testi); { ifade_1; ifade_2; …. ifade_n; } Şart Doğruysa Şart yanlışsa 

3) for döngüsü 

for (Başlangıç;şart;artım) ifade; Başlangıç: Döngünün index değişkenine ilk değer atamasının yapıldığı kısımdır. Şart: İfadenin icrasının yapılması için gerekli koşulu belirten kısımdır. Artım: Döngünün ger turu için index değişkeninin ne kadar artacağını yada azalacağını belirten kısımdır. 

for (Baslangıc;Sart;Artım) ifade; {ifade_1; ……. ifade_n; } 

­ İlk olarak başlangıç ifadeleri gerçekleştirilir. ­ (2)Şart testi yapılır ve sonuç doğru ise ifade icra 

edilir, yanlış ise döngüden çıkılır. ­ Artım ifadeleri yerine getirilir. ­ Tekrar (2) ye gidilir. 

For Döngüsü Kullanım Türleri a)Başlangıç; 

for( ;şart;artım) {

­ Başlangıç for içinde verilmezse for döngüsü 

öncesinde verilmelidir. 

  1. b) for(Baslangıç;şart; ) 

{ …… . artım; } 

­ Artım for içinde verilmezse for bloğunun 

sonunda verilmelidir. 

­ c) Başlangıç; Artım ve başlangıç for içinde verilmezse 

for( ;şart; ) 

artımın for bloğunun sonunda, başlangıcında { döngüden önce verilmesi gerekir. …… .. artım; } 

  1. d) for (Baslangıc; ;Artım) 

{ if (şart) break; …… .

­ Şart belirtilmediğinde programımızı sonsuz döngüden kurtarmak için if ve break ifadelerini kullanırız. 

  1. e) Başlangıç; for( ; ; ) { if (şart) break; …… .. artım; } 

­ Her üçü de verilmemişse başlangıç döngüden önce,sonsuz döngüyü önlemek için if ve break döngü içinde ve artım da for bloğunun sonunda bulunur. 

Break ve Continue ifadeleri 

Do­while,while ve for ifadelerinin icrasının belirli bir yerde kırılmasının veya bir sonraki iterasyonun (iç içe döngülerde) kontrolüne geçilmesinin gerektiği durumlarda kullanılırlar. 

Break ifadesi 

Do­while,while , for ve switch ifade blokların da işlemi belirli bir yerde kırmak için kullanılır. Break kullanımı ile işlem sırası kırılan ifade bloğundan sonra gelen ifadeye geçer. 

for (Baslangıc; ;Artım) { …… . if (şart) break; …… . } ifade; 

­ if ile belirtilen şart sağlanıyorsa for ifade bloğu kırılır ve işlem sırası for döngüsünden sonraki ifadeye geçer. 

­ for (Baslangıc; şart1 ;Artım) 

şart3 ve şart4 doğruysa bulundukları { döngüden çıkılır bir sonraki ifade 

while (şart2); 

işlem görür. { …. 

­ Eğer şart1 ve şart2 de doğru ise bağlı if (şart3) break

oldukları döngü ifade blokları işleme … tabii tutulur. } ifade; if (şart4) break; … .. } ifade; 

Continue ifadesi 

Continue ifadesi break ifadesinin tersine bir sonraki iterasyon (döngüde n. turda iken n+1 tura geçmesi) için şart testinin sağlandığı yere gidilmesini sağlar. 

do{…… .. if (şart) continue; …… .. }while(şart); 

for (başlangıç; ;artım) {…… .. if (şart) continue; …… .. } 

Yukarıdaki durumlarda continue ifadesi ile eğer şart sağlanıyorsa döngü işlemlerine devam eder ve continue ifadesinden sonraki ifadeler işlem görmezler. Program döngü şartına dallanır. 

ÖRNEK: N sayısının faktoriyelini hesaplayan program. #include <stdio.h> #include <conio.h> 

main() {int m,n,i; printf(“n sayısını giriniz:”); scanf(“%d”,&n); if (n<0) printf(“sonsuz”); else if(n==0) printf(“1”); else {for (i=1,m=1;i<=n;++i) m=m*i;//m*=i } 

while(şart) {…… .. if (şart) continue; …… .. } 

printf(“%d \!=”,n,m); getch(); }Aynı örneğin fonksiyonlu yapılışı: #include <stdio.h> #include <conio.h> 

float m,n; int i; float fakt() {printf(“n sayısını giriniz:”); scanf(“%f”,&n); if (n<0) printf(“sonsuz”); else if(n==0) printf(“1”); else {for (i=1,m=1;i<=n;++i) m=m*i; (m*=i) }printf(“%.1f!= %.1f”,n,m); return m; }float main() {fakt(); getch(); return 0; } 

DİZİLER 

Bellekte ardı ardına sıralama aynı türden bilgilerin oluşturduğu yapılardır. 

A­) Tamsayı Diziler 

1­) Bir Boyutlu Diziler Tek boyut ile simgelenebilen tamsayı tipindeki bilgilerin oluşturduğu dizilerdir. 

Dizi Tipi Dizi Adi[Eleman Sayısı]=[{İlik Değerler}] 

Dizi tipi ,saklama bildirisi , niteleyici belirtilmelidir. 

Dizinin elemanlarının özelliklerini dizinin tipi belirler. Bunlar tamsayı tipte olmak üzere long,int,float vb. olabilirler. Dizi adı verilirken değişken isimleri tanımlama kurallarına göre verilmelidir. Dizi adının hemen sağında köşeli parantez içinde dizinin eleman sayısı belirtilmelidir. 

İnt ogr_kiloları[45]; Float ogr_boyları[45]; Char ogr_yasi[45]; 

Ör: İnt sayi[5] 

Sayi[0] sayi[1] sayi[2] sayi[3] 

sati[4] 

Bellekte 10 byte yer kaplar 

Dizi tanımlamaları esnasında dizi tipine uygun olarak da ile değer atamaları yapılabilir. 

İnt sayi[5]={10,12,9,5,20} Sayi[0]=10 Sayi[1]=12 Sayi[2]=9 Sayi[3]=5 

Sayi[4]=20 

Ör: Verilen 20 adet sayıyı sayı dizisine aktarın ve (küçükten büyüğe) ve (büyükten küçüğe) doğru sıralayınız. 

#include<stdio.h> #include<conio.h> int sayi[20]; char i,j,ARA; main() {clrscr(); do{printf(“ %d . sayi gir” ,i++); BU SATIRDA YANLIŞLIK VAR scanf(“ %d”,& sayi[i]); i++; BU SATIRDA YANLIŞLIK VAR }while(İ<20); for (i=0;i<19;i++) {for(j=i+1;j<20:j++) {if (sayi[i]>sayi[j]) [ARA=sayi[i]; sayi=sayi[j]; sayi[j]=ARA; }}}clrscr(); for(i=0;i<20;i++) {gotoxy(20;i+3); printf(“ %d\n”,s ayi[i]); }getche(); }ör:Dışarıdan rasgele 5 asyı girin Random olarak 5 sayı üretin Kaç tanesi tuttuğunu bulan programı yapınız. 

Ör: 

10 elemanlı A ve B dizilerine giriş yapınız ve bu dizinin elemanlarından pozitif olanları C dizisine toplayınız. 

For (i=1;i<10;i++) {if (A[i]>0) {j=j+1;c[j]=A[i]} if (B[i]>0) {j=j+1;c[j]=B[i]} }for (i=1;i<=j;i++) printf(“ %d . eleman = %d” ,i,c[i]); getche(); }2­) İKİ BOYUTLU DİZİLER 

İki boyut ile simgelenen tamsayı tipindeki dizilerdir. 

Dizi_Tipi Dizi_Adı[indis_1][indis_2]=[{ilk değerler}]; 

Aşağıdaki matris için bir dizi tanımlayalım; 

1 2 3 4 5 6 7 8 9 10 11 12 

3 satır , 4 sütundan oluşuyor 

char matris[3][4]; matris[2][3]=’ 12’ ; matris[0][1]=’ 2’ ; matris[1][3]=’ 8’ ; 

Dizinin ilk elemanları 0. indisten itibaren başlatıldığı için satır ve sütun indisleri birer azaltılmıştır. 

char matris(3)(4)={1,2,3,4,5,6,7,8,9,10,11,12}; veya char matris(3)(4)={ {1,2,3,4} , {5,6,7,8,9} , {10,11,12} }; şeklinde ilk değer atamaları yapılabilir. İstenirse 2 ve daha fazla boyutlu dizilerde ilk değer atması sırasında ilk indis değeri verilmeyebilir. Ancak diğer indis değerleri mutlaka verilmelidir. Bu durumda derletici eleman sayısını kendisi belirleyerek ilk değeri bulabilir. Bu şekilde kullanımlarda diziye kolayca eleman eklemek yada çıkarmak mümkündür. Char matris[][4]= { {1,2,3,4} , {5,6,7,8,9} , {10,11,12} }; 

Ör: 30 adet öğrenci için boy,yaş ve ağırlıklarını matrise giriniz ve her öğrencinin ortalamalarını bulunuz. 

30 x 3 lük bir matri olamlıdır; 

YAŞ BOY AĞIRLIK 1.Öğrenci 2.Öğrenci 

…30.Öğrenci 

For(i=0;i<=30;i++) {printf(“ Yaş”); scanf(“ %d”,A[ i][0]); printf(“ Boy” ); scanf(“ %d”,A[ i][1]); printf(“ Ağırlık”); scanf(“ %d”,A[ i][2]); }for (i=0;i<=30;i++) {yastoplam=yastoplam+A[i][0]; boytoplam=boytoplam+A[i][1]; kilotoplam=kilotoplam+A[i][2]; }yasortalama=yastoplam/30; boyortalama=boytoplam/30; kiloortalama=kilotoplam/30; printf(“ Yaş Ortalama=%d”,yasortalama); printf(“ Boy Ortalama=%d”,boyo rtalama); printf(“ Kilo Ortalama=%d”,kil oortalama); }ör: boyutları dışardan girilmek üzere 2 matrisin çarpımını tersini transpozunu bulunuz. 

3­) ÇOK BOYUTLU DİZİLER 

Boyutu 2 den fazla olan tamsayı dizilere denir. 

Dizi_Tipi Dizi_Adı[indis_1][indis_2]……[ indis_n]=[{ilk değerler}]; 

Char vektor[2][3][2]={4,3,5,6,­1,­6,7,9,0,15,45,2}; CHAR TİPLİ 

Eleman sayısı 12 Bellekte kapladığı yer 12 byte dır. 

B­) ALFA SAYISAL DİZİLER 

Tüm bilgisayar sistemlerinde ortak olarak bulunan 256 adet ascii karakterinden (özel karakter yada normal karakter) oluşan yapıya string denir ve bunların oluşturduğu dizi yapılarınada sayısal dizi adı verilir. Char veri tipi ile tanımlanır. Karakter ve string diziler olmak üzere ikiye ayrılır. 

1­) Karakter Diziler: karakter tipiyle oluşturulan, tek boyutlu dizilerdir. Dizi tipi olarak char bildirimi kullanılır. 

Char Dizi_Adı[eleman_sayısı]={ilk değer]; 

Char mesaj[7]={‘m’,’ e’, ’ r’, ’h ’,’ a’ ,’b’ ,’ a’ }; 

Bu tip dizilere ilk ilk değer aktarımı tanımlama kısmında yapılır. Diğer durumlarda ……. yapılamaz. 

Char mesaj[7] hafızada 7 byte yer kaplar. Pointer 

Pointer kullanımının avantajları aşağıdaki maddeler şeklinde sıralayabiliriz: 

  • Bütün bellek alanlarına ulaşılabilme 
  • Fonksiyonlar arası değer transferi yapabilme 
  • Programlar arası değer transferi yapabilme 
  • Sistem komut satırından parametre okuma 
  • Dinamik değişken alanını kullanma 
  • Boş bellekten yararlanma 
  • Diziler ve stringler üzerinde gelişmiş işlemleri yapabilme 
  • Hız ve bellek kazancı Tanım olarak pointer bir değişkenin adresini içeren değişkenlerdir. Her pointer bir başka bellek hücresini gösteren 2 bayt boyutundaki hafıza alanıdır. 

Ör­) Char c=’A’; (1) c, char tipinde bir değişken olarak tanımlanır 

(2) pointer tanımlarında daima değişken isminin soluna (*) 

işareti konur Char *p; Burada p char tipindeki bir pointer olarak tanımlanmıştır. p=&c (3) ifadesi ile c’nin adresi p değişkenine atanır. Bu durumda p 

c’yi gösterir. 

Bu olayı şematik olarak gösterelim; c’nin bellekteki adresi (yani &c) 15000 olsun. 

&c 15000 &p 

‘A’ 15000 

Burada görüldüğü gibi p değişkenine c’nin içeriği değil c’nin adresi atanmaktadır. Böylelikle p’nin c’yi göstermesi sağlanır. 

Pointerlarla ilgili işlemlerde genellikle (&) adres operatörü ve (*) dolaylı operatörü kullanılır. 

(a) & adres operatörü sadece değişkenler ve dizi elemanlarına uygulanabilir. İfadelere, 

sabitlere ve register değişkenlere uygulanamaz. (b) * dolaylı operatörü bir pointer’ a uygulandığı zaman pointer’ ın gösterdiği adreste 

bulunan değere ulaşılır. 

Bu iki tanımı örnekle pekiştirelim. 

Ör­)(1) int x=10, y=20, z[3]; 

(2) int *pi; (3) pi=&x; (4) y=*pi; (5) x=0; (yada *pi=0) (6) pi=&z[0]; (7) pi=541; 

yukarıdaki işlemler sonucunda x, y, z[0] değerlerini bulunuz? 

Çözüm: 

(1) x, y int tipinde tanımlanmış, z ise int tipli dizi olarak tanımlanmış ve x=10 ve y=20 ilk 

değer atamaları yapılmıştır (2) pi int tipinde pointer olarak tanımlanmıştır (3) pi pointerine x değişkeninin adresi atanmıştır (4) y değişkenine pi’y e atanan adresin belirttiği hafıza alanındaki değer y değişkenine sıfır 

atanmıştır (pi nin gösterdiği alana sıfır yerleştirilecektir.) (5) pi pointerine z[0] değişkeninin adresi atanmıştır. (başka bir değişle pi pointeri z[0] 

elemanını gösterecektir) (6) pi nin gösterdiği hafıza alanına (yani z[0] değişkenine) 541 değeri atanmıştır. 

Şimdi bu çözüm basamaklarını şekil ile gösterelim. 

(1) 

&x &y &z[0] &z[1] &z[2]. . . .. . . . &pi 

10 20 NULL 

(1600) (1602) (1604) (1606) (1608) . . . . . .. . . . 

(2) pi int tipindeki pointer olarak tanımlanmıştır. 

(3) 

&x &y &z[0] &z[1] &z[2] &pi 

10 20 1600 

(1600) (1602) (1604) 

(4) 

&x &y &z[0] &pi 

10 10 1600 

(1600) (1602) 

(5) 

&x &y &pi 

0 10 1600 

(1601) (1602) 

(6) 

&x &y &z[0] &pi 

10 10 1604 

(1602) (1602) (1604) 

(7) 

&x &y &z[0] &pi 

10 10 541 1604 

z[0]=*pi=541 

sonuç olarak; x=0; y=10; z[0]=541 ve &pi=1604 dir 

Ör­) x=100; pi=&x; &x &pi 

100 &x 

pi x değişkenin adresini verir *pi x değişkenin sahip olduğu değeri verir &pi pi değişkenin adresini verir 

x=x+1 yerine x+=1; *pi=*pi+1 yerine (*pi+=1); artım ifadeleri kullanılabilir. ++pi yerine (*pi)++; 

NOT: (*pi)++ ve *pi++ farklıdır. Çünkü * ve ++ aynı işlem önceliğine sahiptir ve işlem yönü sağdan sola doğrudur. *pi++ kullanılırsa; 

(*pi)++ = pi nin gösterdiği değer bir artırılır. *pi++ = *(pi++) = pi nin sahip olduğu adres değeri bir artırılır ve adresteki değere ulaşılmaz olacak. 

Ör­) (Pointer değişkenleri (*) dolaylı operatörsüz kullanılabilir.) 

(1) int *pi (2) int *pii (3) x=100; (4) pi=&x; (5) pii=pi; (pi nin gösterdiği değişken adresi pii ye atanır.) (6) *pi=2000; (7) *pii=3333; 

işleminin sonucunu inceleyiniz. 

(3) 

&x &pi &pii 

100 

(1550) 

(4) 

&x &pi &pii 

1550 

(1550) 

(5) 

&x &pi &pii 

1550 1550 

(1550) 

(6) 

&x &pi &pii 

2000 1550 1550 

(1550) 

(7) 

&x &pi &pii 

3333 1550 1550 

(1550) 

İşlem basamaklarının sonrasında x=3333 değerini alır. 

Diziler ve pointerlar 

Turbo C’de dizilerle yapılan işlemlerin tümü pointerlarlada yapılabilir. Genel anlamda pointerlarla yapılan işlemler daha hızlıdır. 

Bu olayı bir örnek ile açıklayalım. 

Ör­) int m[10],x,y,z,t,m,n; int *pi; pi=&m[0]; x=*pi y=*(pi+1); z=*(pi+2); t=*(pi+3); 

. . . . 

bir dizi ile bir pointer arasında bilinmesi gereken fark pointer bir değişkendir, dizi değişken değildir. 

pi=m doğru pi++ doğru 

m=pi yanlış m++ yanlış 

Ör­)(bir pointer dizisinin tanımlanması) 

char *birler[10]={“bir”,” iki”,…..,”do kuz”}; 

örnekler 

1­) standart dizinin elemanlarını pointer değişkeni vasıtasıyla ekrana basan ve dizinin elemanlarının bellek adreslerine listeleyen programı yapınız. 

#include <stdio.h> #include <conio.h> 

int dizi[5]={5,15,8,19,25}; int *p; char i; main() {p=dizi; clrscr(); for(i=0;i<5;i++) {printf(“ dizinin %s elemanı = %d” ,i,*(pi+i)); printf(“ dizinin %d elemanı = %u \n”,i,p i+i); }getch(); 

}2­) Girişten verilen dizi elemanlarının değerlerini değiştiren programı yapınız. 

int s[5]; int *p; char i; main() {clrscr(); while (i<5) {printf(“ %d sayı gir :”,i +1); scanf(“ %d”,& s[i]); i++; }p=s i=0; printf(“ %d. Eleman 5 ile çarpıldı %d \n ” ,i,*(p)*5); printf(“ %d elemanının bellekteki adresi”,s [i+3],p+3); *p=*p+8; printf(“ 1.eleman %d oldu”,s [0]); getch(); }3­) 2 basamaklı sayıların okunuşunu ekrana yazdıran programı yazınız.(bunu için standart dizileri ve pointer dizilerini birlikte ve ayrı ayrı kullanarak deneyiniz) 

A­) Fonksiyonlar 

Bir fonksiyon, belirli bir işi yerine getirmek için planlanmış bildiri ve ifadelerin oluşturduğu yapılardır. Her C programı en az bir fonksiyona sahiptir. Bu fonksiyon main() fonksiyonu olarak isimlendirilir. Main() fonksiyonu programın icrasının başlangıç noktasıdır. Bu fonksiyon program içerisindeki diğer fonksiyonların çağrılmasını sağlar ve kontrol eder. Kaynak programlar genellikle bir fonksiyondan daha fazlasına sahiptir. Main bu fonksiyonları belirli görevleri yerine getirmesi için çağrılır.çağrılar fonksiyonun icrası o fonksiyonun ilk ifadesi ile başlar ve return ifadesi ile karşılaştığında veya fonksiyon sonuna ulaşıldığında son bulur. Programın icrasına main de fonksiyonun çağrıldığı yerden bir sonraki ifadenin yerine getirilmesi ile devam eder. 

(C de bir fonksiyon yapısı) 

Dönüş Tipi Fonksiyon İsmi(Parametre Bildirimi) {Lokal TANIMLAR; İfadeler; } 

Dönüş Tipi= Fonksiyonun icrası bittiğinde main de buluduğu yere geri döneceği değerin hangi tipte olacağını belirtir. 

Lokal Tanımalar= Fonksiyon içinde tanımlı olan değişkenlerdir. 

Parametre Bildirimi= Çağrılan fonksiyon ile çağrıcı fonksiyon arasındaki iletişimi düzenleyen değişken topluluğudur. 

Ör: 

int i,j,a,b,c; int topla; {i++; j­­; return(i*a­j*b); }main() {i=0;j=10;a=2;b=2; tekrar; c=topla(); printf(“ %d\n”,c ); if (j>0) goto tekrar; getche(); } 

Fonksiyon parametrelerin tanımlanmasında iki yol vardır; a­) Klasik Stilde Tanımlama b­) Modern Stilde Tanımlama 

Bir fonksiyon tanımlanması; ­Fonksiyon İsmini ­Parametrelerin sayısı, tipi ve yapacağı işleri ifade eden komutları ­Fonksiyonu dönüş tipinide içerir. 

Main() {..}int main() {..}Eğer dönüş tipi verilmemiş ise derleyici bunu int olarak algılar.yukarıdaki iki main fonksiyonda aynıdır. 

a­) Klasik Fonksiyon Tanımlaması dönüş tipi fonksiyon ismi(parametre isimleri) parametre tanımlamaları {lokal tanımlamalar; ifadeler; }Ör: Double klasik(a,b); Double *a; Double *b; {…… . …… }b­) Modern Fonksiyon Tanımlamaları 

Dönüş Tipi Fonksiyon İsmi(Parametre Bildirimi) { 

Lokal Tnımlamalar İfadeler }Ör: Double modern(double *a,double *b) {…… . …… . }Ör: İnt max(int a,int b) {return(a>b) ? (a):(b); }int i,j,k; main() {i=10;j=15;k=max(i,j); printf(“ max deger =%d” ,k); }ör: ­3 sayısının 0 dan 10 kadar kuvvetlerini alan modern fonksiyonu prototipine uygun bir program; 

#include<stdio.h> int power(int m,int n); main() {int i; for (i=0;i<10;++i) printf(“ %d\n”,powe r(­3,i)); return 0; }int power(int x,int y) {int i;p=1; for(y=1;y<i;++y) p=p*x; return p; }ör: int power(int m,int n); main() 

{int i; for (i=0;i<10;++i) printf(“ %d\n”,powe r(­3,i)); return 0; }int power(int x,int y) int x,y; {int i;p=1; for(y=1;y<i;++y) p=p*x; return p; }B­) ALT PROGRAMLAR: 

Alt programlar belirli bir işlevi yerine getirmek amacıyla yapılmış olan program parçalarıdır. C de tüm alt programlar gercekte birer fonksiyondur. Teorik olarak her fonksiyonu icrası sona erdiğinde belirli bir tipe sahip değer üretir ve ana programa geri gönderir. Fakat alt programlar değer göndermekten cok ana programdan değerler alarak izlemler yürütürler. Bu yüzden alt programlar geri dönüş tipi void olan bir fonksiyon olarak kabul edilir(Burada kullanılan void tipi,fonksiyondan herhangi bir değerin geri gönderilmeyeceğini belirtir.). Bir alt programın yapısı, dönüş tipi hariç fonksiyonun yapısı ile aynıdır. 

void Alt Program İsmi (Parametre Bildirimi) {Lokal Tnımlamalar; İfadeler; }Alt programlar yapacakları işe göre 4 kısımda incelenebilir. 

a­) Alt programlar belirli bir işlevi yerine getirmek için ana program bilgilerine ihtiyaç duymayabilir. 

Ör: Void hata(void) {puts(“N egatif sayının kare kökü alınmak istendi”); }float x,y; main() {if (x>0.0) {y=sqrt(x);printf(“ %f” ,y);} 

else hata(); }b­) Alt programların icrasını yerine getirebilmesi için bazı bilgilerin ana programdan alınması gerekebilir. 

Ör: Void topla_yaz(float a, float b) {float c; c=a+b; printf(“ toplam=%f” ,c); }float x,y; main() {scanf(“ %f %f” ,&x,&y); topla_yaz(x,y); }c­) Alt programın icrası sona erdikten sonra ana programa bilgi transferi yapması gerekebilir. 

Ör: Void swap(float *sayi1,float *sayi2) {float t; t=*sayi1; *sayi1=*sayi2; *sayi2=t; }float x,y; main() {x=10;y=9; printf(“ swap çağrılmadan x=%f,y=%f”,x,y); swap(&x,&y); printf(“ swap çağrıldıktan sonra x=%f,y=%f”,x,y); }NOT: Dönüş tipi void olmayan bir fonksiyon sadece bir değer göndermektedir. Void veya başka bir dönüş tipli fonksiyondan birden fazla değerin seri gönderilmesi ancak pointerlar ile olur. 

Yukarıdaki programda geri gönderilecek değer iki tanedir. 

Gerçekte yukarıdaki alt programda geri dönen değer yoktur. Sadece iki değerin değiştirilme izlemi doğrudan değişkenlerin bellek içinde gerçek konumlarında yapılmıştır. 

d­)Alt programın icrası tamamen program değişkenlerine bağlıdır. 

Float a,b,c; Void topla(void) {c=a+b; }main() {scanf(“ %f %f” ,&a,&b); topla(); printf(“ c=%d”, c); }NOT: C’d e fonksiyonun içinde fonksiyon ve altprogram içinde altprogram tanımlanamaz. 

C­) DEĞİŞKENLERİN BELLEK KONUMLARI ve KULLANIM HAKLARI 

1­) Global (Genel) Veri Tanımlamaları: Hiçbir blok içerisinde yer almayacak şekilde yapılan tüm tip tanımlamaları bütün ifadeleri için globaldir. Yani bu değişkenler veya sabitler programın her yerinde kullanılabilir demektir. Global değişkenler kendinden sonra tanımlanan her C komutu ile kullanılabilir. Bellekte “ Data Segment” bölgesinde , program bellekte kaldığı sürece yer alır. Böylece fonksiyonun alt programlar arasında veri transferi aypılabilirler. 

Ör: Float c(); İnt x; Void a() İnt y; Void b() Float c; Main() {… . 

X,tüm fonksiyonların üzerinde tanımlandığından dolayı programın her yerinde kullanılabilir. ( c() fonksiyonunun prototipinin x ve y den önce tanımlanması x ve y nin kullanım hakkını etkilemez, çünkü prototipler sadece fonksiyona giriş/çıkış tiplerinin ne olduğunu derleyiciye bildirirken , fonksiyon içinde kullanılacak değişkenlere ait bilgi içermez) Y değişkeni ise b(),c() ve main() için geçerlidir. 

}2­) Lokal Veri Tanımlamaları: 

Fonksiyonlar dahil herhangi bir blok içinde tanımlanan yerel değişkenlerdir. Bu tür değişkenler sadece tanımlandıkları blok içerisinde veya bu blok içerisinde yer alan diğer alt bloklar içerisinde kullanılabilir. 

Ör: İnt x=5; Void a() {int x=7; printf(“ %d”,x) ; {int x=9; printf(“ %d”,x) ; }printf(“ %d”,x) ; }main() {printf(“ %d”,x) ; a(); printf(“ %dé,x); }3­) Yerel Değişkenlerin Varlığının Korunması: 

Bazı durumlarda belli bir bilginin sadece bir fonksiyon veya blok tarafından kullanılması , fakat buloğun icrası bittiğinde değerin kaybolmayıp bloğun tekrar icrasına kadar korunması istenebilir. 

Ör: İnt x=5; Void a() 7statik int x=0; printf(“ statik=%d”,x) ; ++x; }main()

Program çıktısı: 5 7 9 7 5 

Program Çıktısı: X=5 Statik=0 X=4 Statik=1 X=3 Statik=2 

while(x>0) {printf(“ x=%d”,x ); x­­; a(); }}D­) MAİN FONKSİYONU 

Her C programında bir tane main fonsiyonu bulunması zorunludur. Çünkü programın icrası main fonksiyonun başında başlar ve sonunda son bulur. Main de bir fonksiyon olduğu için kendi kendini çağırabilir veya çağrılan bir fonksiyon içinde kullanılması ile tekrar çağrılabilir. 

Ör: İnt c; İnt sayac=0; Main() {sayac++; printf(“ Program %d . kez çalışıyor”,sayac); printf(“ Devam edelimi?” ); c=getche(); if (toupper(c)==’ E’ ) main(); printf(“ stop” ); }Program içerisinde diğer fonksiyonların icrası ancak main onları çağırdığı zaman veya çağrılan bir fonksiyonun diğerini çağırması halinde gerçekleşir. Bu fonkiyonlar sahip oldukları parametreler için gerekli değerleri çağırdıkları fonksiyondan alırlar. 

(main fonksiyonun yapısı) 

Dönüş Tipi main(Parametre Bildirimi) {Lokal Tanımlamalar; İfadeler; }Fonksiyonlar main den parametreleri için değer alabiliyorsa, main ana fonksiyonda parametreleri DOS ortamında sistem komut satırında alır. Main ana fonksiyonda sadece 3 parametre bulunur. 

Main (int _argc,char *argv[],char *env[]) {…… . 

…… . }Tipler aynı olmak üzere , bu parametreleri programcıda isim verebilir. 

Main(parametre sayısı,char parametre[],char *cevre[]) {…… .. …… .. }1­) _argc(argument count)= Komut satırında girilen parametrelerin sayısını verir. Bu sayı içinde program imside vardır. 2­) *_argv(argument vektor)= Program ismi dahil , komut satırından girilen parametre verilerini sıra ile indise atar. 3­) *environ[]= MS­DOS işletim sisteminde bulunan ve COMSPEC,PROMPT,PATH isimli değişkenlere programdan ulaşmayı sağlar. 

Ör:Main() {char *path,*comspec,*prompt; path=getenv(“p ath” ); cumspec= getenv(“ cumspec”) ; prompt= getenv(“ prompt”) ; printf(“ PATH=%s”, (path==NULL) ? “BO Z”:p ath); printf(“ COMSPEC=%s”,c omspec); printf(“ PROMPT=%”s,prompt); putenv(“PAT H= C:\TP” ); path= setenv(“p ath”) ; printf(“ PATH in yeni değeri %s”,path); }Ör: #include<process.h> #include<stdio.h> #include<stdlib.h> main() {if (putenv(“PATH =C:\TC;C:\T P”) = =­1) {puts(“H ata” );exit(1); }else puts(“ OK” );

Dosyalar Bilgisayar sistemlerinin en önemli özelliklerinden biride veri saklama özelliğidir. Şu ana kadar yapılan programlarda,dışardan alınıp ana bellekte tutulan bilgiler programın icrası bittiğinde yada bilgisayar kapandığında kayboluyordu. Bilgisayara girişi yapılan bilgilerin kalıcılaştırılması işletim sisteminin organizasyonuna bağlı olarak dosya yapısı ile sağlanır. 

Dosya yapısına ait kavramlar (i) Bir öğrenciye ait ad, soyad, ve notların tutulduğu dosya yapısını örnek alalım. 

­ Her bir öğrenciye ait bilgiler altalta ve sütunlar biçiminde sıralanır ­ Böylece bütün öğrencilerin bilgileri tek bir ad, soyad ve notları sütunu ile belirtilir 

(ii) Dosya yapısı içinde anlamlı veri parçalarının oluşturduğu her bir sütun bilgilerine alan denir. ­ Dosya yapısını oluşturan alanların (2) özelliği vardır. 

­ verinin kapladığı alan ­ verinin tipi 

(iii) Bir veya birbiriyle ilgili birkaç alandan meydana gelen gruplara kayıt denir. 

(iv) İşletim sistemi yardımı ile yan bellekte ardışık olarak saklanan kayıtlar topluluğuna 

kütük denir. 

(v) Kütüğü oluşturan kayıt ve alanların satır ve sütun mantığı ile düzenlenmiş biçimine ise dosya denir. 

Ör­) Ahmet Kızıltuğ 70 80 90 Mehmet Şen 50 70 60 Arif Türküz 60 70 80 

Bilgileri için alan ve kayıt yapısı belli olan bir dosya oluşturalım. 

ADI SOYADI NOT – 1 NOT – 2 NOT – 3 Ahmet Kızıltuğ 70 80 90 Mehmet Şen 50 70 80 Arif Türküz 60 70 80 

DOSYA ÇEŞİTLERİ 

Girişi yapılan verilerin yan belleğe kaydedilip biçimleri dosya tiplerine göre değişir 

i­) Text Dosyalar ii­) Binary Dosyalar 

Text dosyalar ile Binary Dosyalar arasındaki farklar: 

à Text dosyalara girilen sayısal veriler girildikleri gibi kaydedilirken, Binary de sayısal veriler ikilik sisteme çevrilerek kaydedilir. 

à Text dosyalarda string bilgilerin sonunda yer alan ‘\n’ k arakteri ‘\r’ +’ \n’ ka rakter çiftine dönüştürülerek kaydedilir. Binary dosyalarda ve stringler sonunda yer alan ‘\n’ ka rakteri aynen kaydedilir. (satır sonu işareti olarak kullanılırlar.) 

à Text dosyalarda kayıtlara erişim sıralı, binary de ise rasgele olup bir anahtar alan vasıtasıyla olur. 

àText dosyalarda kayıt yazma işlemi sıra ile olur. Yazılan en son kayıttan sonra dosya sonu işareti konur. Binary de ise kayıt yazma işlemi anahtar alan vasıtasıyla boş bir kayıda konumlanarak yapılır. àText dosyalarda kayıt okuma işlemi ilk kayıttan, aranılan kayıta kadar sıra ile okunarak yapılır. Binary dosyalarda ise anahtar alan vasıtasıyla direkt yapılır. 

àText dosyalarda kayıt silme işleminden sonra diğer kayıtlar otomatik olarak yeniden sıralanır. Binary de ise silme anahtar alan vasıtasıyla olur. Silinen kaydın yeri kayıt ile dolduruluncaya kadar boş kalır. 

àText dosyalarda girilen bilgiler yan bellekte uzunlukları kadar yer kaplar. Binary dosyalarda ise girilen bilgiler yan bellekte verilerin tiplerinin uzunluğu kadar yer kaplar. 

àText dosyalarda aynı anda okuma ve yazma işlemi için kullanılamazlar. Binary dosyalar ise aynı anda okuma ve yazma işlemi için kullanılabilir. 

DOSYA ORGANİZASYONLARI 

C programlama dilinde 2 tane dosya mekanizması vardır, 

* Buffer’ lı dosya mekanizması. * Buffer’ sız dosya mekanizması. 

Buffer, bufferlı dosyalar için tahsis edilen ve disk ile kayıt değişkenleri arasında tampon olarak kullanılan bellek bölgelerine denir. 

Default uzunlukları 512 byte olup giriş/çıkış operasyonlarının daha hızlı olması amacı ile kullanılır. 

Dosyadan kayıt okumak istediğimizde dosyadan okutulan kayıtlar ilk olarak buffer’ a yerleştirilir ve buffer üzerindende kayıt değişkenleri ile gösterilen bellek alanlarına kopyalanır. 

Benzer olarak ta dosyaya kayıt yazmak istediğimizde kayıtlar ilk buffer’ a daha sonra ise dosyaya yazdırılır. 

Buffer’ sız dosya mekanizmasında ve her işlem direkt olarak bellek üzerinde yapılır 

Bufferlı Dosya Mekanizmasında Text Dosyalar. 

Dosya ile ilgili amaçlar 6 başlıkta toplanabilir. 

Kayıt Giriş 

Kayıt Arama 

Kayık Düzeltme 

Kayıt Silme 

Kayıt Ekleme 

Kayıt Listeleme 

  1. A) Kayıt Girişi 

Kayıt girişi aşağıdaki sırayı takip eder. 

Giriş Ünitesi Anabellek Yan Bellek 

fopen() dosyayı değişik biçimde açmak için kullanılır. 

FILE *fopen(char *dosya_ismi, char *dosya_modu) 

Dosya açılış modülleri 

w : Dosyanın sadece yazma modunda açılacağını gösterir. 

Dosya diskte daha önceden mevcutsa silinir, yeni dosya açılır. 

r : Dosyayı sadece okuma modunda açar. 

a : Dosya ekleme modunda açılır. Dosya mevcut ise ekleme modunda açar, dosya yoksa 

dosyayı yeniden oluşturur. 

w+ : yazma + okuma 

r+ : okuma + yazma 

a+ : ekleme + okuma 

t : text seçimliktir. 

b : binary kullanılmasa default olarak text modunda açılır. 

Ör­) 

FILE *dosya; dosya=fopen(“denem e.dat”,”wt” ); 

deneme.dat isimli dosya text tipinde ve yazma modunda açılmış. Üretilen değer dosya pointer değişkeni ile FILE türünde bir pointer’a atanmış 

fprintf() : Dosyaya formatlı kayıt yazmak için kullanılır. 

Ör­) 

fprintf(dosya,”%d \n”,sayi ); sayi değişkeninin aldığı değer format biçimi belirtilerek, dosya değişkeni ile belirtilen dosyaya kayıt edilir. 

fclose : açık durumdaki dosyayı kapatır. 

fclose (FILE *dosya); 

Ör­) rakam dosyasına 5 adet sayı kayıt etmekte olan program. 

#include <stdio.h> #include <conio.h> 

main() {FILE *dd; int i,no; clrscr(); dd=fopen(“ rakam” ,”wt ”) ; for(i=1;i<6;i++) {printf(“ %d. Sayıyı giriniz” ,i); scanf(“ %d”,&no ); fprintf(dd,”%d\n”,no); }fclose(dd); }Ör­) Bir işletmede çalışan personelin ad,soyad,tel bilgilerini dosyaya kayıt yapan programı yazınız. 

typedef struct { char adi[20]; 

char soyadi[30]; 

char tel[12]; }personel; main() {struct personel perskayit; FILE *dosya; dosya=fopen(“ personel.dat”, ”wt ” ); fprintf(dosya,“ %s \n”,pe rskayit.adi); fprintf(dosya,“ %s \n”,pe rskayit.soyadi); fprintf(dosya,“ %s \n”,pe rskayit.tel); fclose(dosya); }B) Kayıt Arama 

fscanf : önceden oluşturulan dosyadan kayıt okuma işlemi yapar à fscaf(FILE *dosya,format_listesi,değişken_listesi); 

fscanf(maliye,”%d %d %d \n”,x,y,z); 

(maliye ismi ile belirtilen dosyadan x,y,z değişkenlerinin değerleri belirtilen format sıralarında okutuluyor) 

àfgets : str,ng ifadeleri dosyadan formatsız olarak okutulmasını sağlar. fgets(adi,20,emlak); 

emlak ile temsil edilen dosyadan 20 karakteri okun ve adi değişkenine aktar. 

àfeof : dosya sonu controlü 

0 ‘ dan farklı ise dosya sonu 0 ‘ a eşitse dosya sonu değil 

feof(FILE *dosya); 

ferror : dosyalardaki hata göstergesi 0 ‘ dan faklı ise hata yok 0 ‘ a eşitse hata var Ör­) Kayıt Arama Programı (Girilen numarayı dosyadan arayan program.) 

#include <stdio.h> #include <conio.h> main() {FILE *dd; int i,no,ara; 

clrscr(); dd=fopen(“ rakam” ,” r+” ); printf(“ Aranılan no :” ); scanf(“ %d”,& ara); while(fscanf(dd,”%d”,&no)!=EOF); {if(ara!=no)continue; printf(“ %d”,no) ; } fclose(dd); }c) Kayıt Düzeltme 

rename= Diskte bulunan bir dosyanın isminin değiştirilmesi için kullanılır. Kullanımı: rename(eski_dosya_ismi,yeni_dosya_ismi); 

rename(“ veri.dat”, ”d eneme.dat”) ; 

unlink= Belirtilen dosyayı disk ortamından siler. Kullanımı: 

unlink(dosya_ismi); 

ÖRNEK: Verilen sayıyı dosyada arayıp, düzeltip, tekrar kaydeden prg. 

#include <stdio.h> #include <conio.h> main() {FILE *dd; FILE *dd1; int i,no,duz; clrscr(); dd=fopen(“rakam”,”rt”); dd1=fopen(“yedek”,”wt”); printf(“Düzeltilecek sayi”); scanf(“%d”,&duz); 

while(fscanf(dd,”%d”,&no)!=EOF) {if(duz==no) {printf(“Yeni sayi”); scanf(“%d”,&no); }fprintf(dd1,”%d\n”,no); 

}fclose(dd); fclose(dd1); unlink(“rakam”); rename(“yedek”,”rakam”); }d) Kayıt Silme 

ÖRNEK: Verilen sayıyı dosyada arar ve siler. 

#include <stdio.h> #include <conio.h> main() {FILE *dd; FILE *dd1; int i,no,sil; clrscr(); dd=fopen(“rakam”,”rt”); dd1=fopen(“yedek”,”wt”); printf(“Silinecek sayi”); scanf(“%d”,&sil); 

while(fscanf(dd,”%d”,&no)!=EOF) {if(sil==no) continue; fprintf(dd1,”%d\n”,no); }fclose(dd); fclose(dd1); unlink(“rakam”); rename(“yedek”,”rakam”); }e) Kayıt Ekleme ÖRNEK: #include <stdio.h> #include <conio.h> main() {FILE *dd; int i,no; clrscr(); 

dd=fopen(“rakam”,”a”); for(i=1;i<3;<++) {printf(“%d. sayi”,i); scanf(“%d”,&no); fprintf(dd1,”%d\n”,no); }fclose(dd); }f) Kayıt Listeleme 

ÖRNEK: 

#include <stdio.h> #include <conio.h> main() {FILE *dd; int i,no; clrscr(); dd=fopen(“rakam”,”rt”); while(fscanf(dd,”%d”,&no)!=EOF) printf(“ %d”,no) fclose(dd); }