değişken bildirimleri

22
Değişken Bildirimleri Yerel (Local) Bildirim Programdaki her bloğun ve fonksiyonun içinde kendi yerel değişkenleri tanımlanabilir. Bloğun içindeki tüm işlemler sonlandığında yerel değişkenler bellekten silinir. Genel (Global) Bildirim Genel değişkenler tüm fonksiyonların dışında bildirilirler. Program içindeki blok ve fonksiyonların hepsine aittir ve program çalıştığı sürece bellekte saklanır.

Upload: eros

Post on 08-Feb-2016

63 views

Category:

Documents


0 download

DESCRIPTION

Değişken Bildirimleri. Yerel ( Local ) Bildirim Programdaki her bloğun ve fonksiyonun içinde kendi yerel değişkenleri tanımlanabilir. Bloğun içindeki tüm işlemler sonlandığında yerel değişkenler bellekten silinir. Genel (Global) Bildirim - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Değişken Bildirimleri

Değişken Bildirimleri

• Yerel (Local) Bildirim • Programdaki her bloğun ve fonksiyonun içinde kendi

yerel değişkenleri tanımlanabilir. • Bloğun içindeki tüm işlemler sonlandığında yerel

değişkenler bellekten silinir.

• Genel (Global) Bildirim • Genel değişkenler tüm fonksiyonların dışında bildirilirler. • Program içindeki blok ve fonksiyonların hepsine aittir ve

program çalıştığı sürece bellekte saklanır.

Page 2: Değişken Bildirimleri

Depolama Sınıfları

• Bir tanıtıcı( değişken ve fonksiyon isimleri) depolama sınıfıDepolama süreci: tanıtıcının hafızada tutulduğu süreFaaliyet alanı: tanıtıcın program içinde kullanılabileceği yer.Bağlama: çok kaynaklı bir program içinde tanıtıcının yalnızca o

andaki kaynak dosyada mı yoksa uygun bildirimlerle herhangi bir kaynak dosya da geçerli olacağı.

• Otomatik depolama süreciBildirildikleri blok için yaratılır ve bloktan çıkıldığında yok edilir.auto: yerel değişkenler için varsayılandır.

auto double x, y; register: çok hızlı erişilmesi gereken değişkenleri yerleştirir.

Yalnızca otomatik değişkenler için kullanılabilir.register int counter = 1;

Page 3: Değişken Bildirimleri

Depolama Sınıfları• Statik depolama süreçi

Program çalışmaya başladığı andan itibaren var olurlar.Varsayılan değerleri sıfırdır.static: yerel değişkenler fonksiyonlarda tanımlanır.

Fonksiyon sonlandıktan sonrada değeri tutmaya devam eder.Sadece kendi fonksiyonu içinde bilinirler.

extern: C' de uzun programların derlenmesi için programlar, dosyalar halinde bölünür. Dosyalar sonradan birleştirileceğinden ,bir dosya için geçerli değişkenlerin diğer dosyalar içinde geçerli hale gelmesi için, dosyaların başına diğer dosyaların global değişkenleri yazılır ve başına " . extern" getirilir.Herhangi bir fonksiyonda bilinirler.

Page 4: Değişken Bildirimleri

Faaliyet Alanı Kuralları

• Dosya faaliyet alanıHerhangi bir fonksiyon dışında bildirilmiş tanıtıcılar bu

faaliyet alanına sahiptir.Global değişkenler, fonksiyon tanımları ve fonksiyon

prototipleri bu faaliyet alanına sahiptir.• Fonksiyon faaliyet alanı

Etiketler bu faaliyet alanına sahip tek tanıtıcılardır.(Örneğin basla:)

Bulundukları fonksiyon içinde her yerde kullanılabilirler ancak fonksiyon gövdesi dışında kullanılamazlar.

Page 5: Değişken Bildirimleri

Faaliyet Alanı Kuralları

• Blok faaliyet alanıBir blok içinde bildirilmiş tanıtıcılar sahiptir.

Bloğun sonlandığı küme parantezine ulaştığında sona erer.

Değişkenler ve fonksiyon parametreleri(fonksiyon için yerel değişkenler) bu faaliyet alanına sahiptir.

Bloklar yuvalandığında ve dıştaki bloktaki tanıtıcı içteki bloktaki tanıtıcıyla aynı isme sahip olduğunda, dış bloktaki tanıtıcı iç blok sona erene kadar saklanır.

• Fonksiyon prototipi faaliyet alanıFonksiyon prototipinin parametre listesinde kullanılan

tanıtıcılar bu faaliyet alanına sahip tek tanıtıcılardır.

Page 6: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>void a( void ); /* fonksiyon prototipi*/void b( void ); /* fonksiyon prototipi */void c( void ); /* fonksiyon prototipi */int x = 1; // global degisken int main( ){ int x = 5; /* main'e yerel degisken */ printf ("main'in faaliyet alani disindaki yerel x degiskeni %d olur.\n", x ); { // yeni faaliyet alanina basla int x = 7; printf( "main'in faaliyet alani icindeki yerel x degiskeni %d olur.\n", x ); } // yeni faaliyet alanini bitir printf( "main'in faaliyet alani disindaki yerel x degiskeni %d olur.\n", x ); a( ); // a automatic yerel x' e sahiptir. b( ); // b static yerel x' e sahiptir. c( ); // c global x kullanır. a( ); // a automatic yerel x' e tekrar ilk değer atar. b( ); // static yerel x onceki değerini korur c( ); // global x'de değerinin korur. printf( "main icindeki yerel x %d olur.\n", x ); getch(); return 0;}

Page 7: Değişken Bildirimleri

void a( void ){ int x = 25; /* a her çağırıldığında ilk değeri atanır */ printf( "\na'ya girildikten sonra yerel x %d olur.\n", x ); ++x; printf( "a'dan cikmadan once yerel x %d olur.\n", x );}void b( void ){ static int x = 50; // sadece static ilk değer atama // b'nin ilk cağırılması printf( "\nb'ye girerken static x %d olur.\n", x ); ++x; printf( "b'den cikarken once static x %d olur.\n", x );}void c( void ){ printf( "\nc' ye girerken global x %d olur.\n", x ); x *= 10; printf( "c' den cikarken global x %d olur.\n", x );}

Page 8: Değişken Bildirimleri

Yineleme• Yineleme fonksiyonu(recursive fonc.)

Kendi kendini çağırır.Yalnızca en basit durumu ya da temel durumu nasıl çözeceğini

bilir.Problemi iki kavramsal parçaya ayırır

Nasıl yapacağını bildiği Nasıl yapacağını bilmediği

Orijinal probleme benzemeli(daha basit ya da daha küçük) Fonksiyon yeni bir kopyasını çağırarak nasıl yapacağını bilmediği problemi

çözer .(Yineleme çağrısı)Sonunda temel durum çözülmüş olur.

Bir önceki kopyasına bir sonuç aktarır ve sonuçların döndürüldüğü bir dizi, fonksiyonun orijinal çağrısının en son sonucu döndürmesine kadar yukarıya devam eder.

Page 9: Değişken Bildirimleri

Yineleme

• Örneğin: faktöriyel5! = 5 * 4 * 3 * 2 * 1Göz önünde bulundur

5! = 5 * 4!4! = 4 * 3! ...

Yineleme şekilde hesaplanabilir.Teme durum(1! = 0! = 1) çöz ardında döndür.

2! = 2 * 1! = 2 * 1 = 2;3! = 3 * 2! = 3 * 2 = 6;

Page 10: Değişken Bildirimleri

Yineleme

Page 11: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>long faktoriyel(long);int main(){ int i; for(i=1;i<=10;i++) printf("%3d!=%7ld\n",i,faktoriyel(i)); getch(); return 0;}long faktoriyel(long sayi){ if(sayi<=1) return 1; else return(sayi*faktoriyel(sayi-1)); }

Page 12: Değişken Bildirimleri

Yinelemeleri Kullanan Örnek:Fibonacci Serileri• Fibonacci serisi: 0, 1, 1, 2, 3, 5, 8...• Her şayi kendinden önceki iki tanenin toplamıdır.• Yinelemeli olarak çözümü:

fib(0)=0fib(1)=1fib( n ) = fib( n - 1 ) + fib( n – 2 )

Page 13: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>long fibonacci(long);int main(){ long sonuc,sayi; printf("Bir tamsayi giriniz:"); scanf("%d",&sayi); sonuc=fibonacci(sayi); printf("Fibonnaci(%d)=%d",sayi,sonuc); getch(); return 0; }long fibonacci(long n){ if(n==0 || n==1) return n; else return(fibonacci(n-1)+fibonacci(n-2)); }

Page 14: Değişken Bildirimleri

Diziler

• DiziAynı isme ve aynı tipe sahip olmaları sebebiyle

birbiriyle ilişkili olan hafıza konumlarının bir grubudur.• Bir dizi içindeki bir elemanı yada konumu belirtmek için

Dizi ismiPozisyon

• Format:diziismi[pozisyon]

İlk elemanın pozisyonu 0’dır.c isimli n elemanlı bir dizi

c[ 0 ], c[ 1 ]...c[ n – 1 ]

Page 15: Değişken Bildirimleri

Genel Programlama Hatası

• “Dizinin yedinci elemanı” ile “yedinci dizi elemanı” arasındaki farkı anlamak önemlidir. Dizi belirteçleri sıfırdan başladığı için “dizinin yedinci elemanı” 6 belirtecine sahiptir. ”yedinci dizi elemanı” ise 7 belirtecine sahiptir ve aslında dizinin sekizinci elemanıdır. Bu “bir eksik”(off-by-one) hatalarının kaynağıdır.

NOT: Dizi belirteçlerini içine alan köşeli parantezler, C’de bir operatör olarak kullanılır ve parantezlerle aynı seviyede önceliğe sahiptirler

Page 16: Değişken Bildirimleri

Dizilerin Bildirimleri• Bir dizi tanımlarken belirtilmesi gerekenler• İsmi• Tipi• Eleman sayısı

arrayTip arrayİsim[ elemanSayısı ];• Örnek:

int c[ 10 ]; float myArray[ 3284 ];

• Bir anda birden fazla dizi tanımlamak• Sıradan değişkenlerle aynı formatta• Örneğin:

int b[ 100 ], x[ 27 ];

Page 17: Değişken Bildirimleri

Dizi Kullanan Örnekler

• Atama değerleriint n[ 5 ] = { 1, 2, 3, 4, 5 };

Yeterince atma yoksa kalan elemanlara 0 atanır.• int n[ 5 ] = { 0 }

All elements 0Fazla atamada yazım hatası verir.

• Eğer boyut belirtilmemişse atama değerleri bunu belirlerint n[ ] = { 1, 2, 3, 4, 5 };

5 atama değeri ver, dizi 5 boyutlu olacak

Page 18: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>int main(){ int n[ 10 ], i; for ( i = 0; i <= 9; i++ ) n[ i ] = 0; printf( "%s%13s\n", "Eleman", "Deger" ); for ( i = 0; i <= 9; i++ ) printf( "%7d%13d\n", i, n[ i ] ); getch(); return 0;}

#include <stdio.h>#include <conio.h>int main(){ int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 }; int i; printf( "%s%13s\n", "Eleman", "Deger" ); for ( i = 0; i <= 9; i++ ) printf( "%7d%13d\n", i, n[ i ] ); getch(); return 0;}

Page 19: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>#define BOYUT 10int main(){ int s[ BOYUT ], j;

for ( j = 0; j <= BOYUT - 1; j++ ) s[ j ] = 2 + 2 * j;

printf( "%s%13s\n", "Eleman", "Deger" );

for ( j = 0; j < BOYUT; j++ ) printf( "%7d%13d\n", j, s[ j ] ); getch(); return 0;}

#define BOYUT 10 10 değerine sahip, BOYUT isminde bir sembolik bir sabit yaratır. Sembolik sabitler, C önişlemcisi tarafından derleme esnasında yer değiştirme metniyle (replacement text) değiştirilecek olan tanıtıcılardır. Program önişlemeye sokulduğunda, BOYUT sembolik sabitiyle karşılaşılan her yerde BOYUT, değiştirme metni olan 10 ile değiştirilecektir.

Page 20: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>#define RESPONSE_SIZE 40#define FREQUENCY_SIZE 11int main(){ int answer, rating, frequency[ FREQUENCY_SIZE ] = { 0 }; int responses[ RESPONSE_SIZE ] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

for ( answer = 0; answer <= RESPONSE_SIZE - 1; answer++ ) ++frequency[ responses [ answer ] ];

printf( "%s%17s\n", "Oylama", "Frekans" );

for ( rating = 1; rating <= FREQUENCY_SIZE - 1; rating++ ) printf( "%6d%17d\n", rating, frequency[ rating ] ); getch(); return 0;}

Page 21: Değişken Bildirimleri

#include <stdio.h>#include <conio.h>#define BOYUT 10int main(){ int n[BOYUT] = { 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 <= BOYUT-1; i++ ) { printf( "%7d%13d ", i, n[ i ]) ;

for ( j = 1; j <= n[ i ]; j++ ) printf( "%c", '*' );

printf( "\n" ); } getch(); return 0;}

Page 22: Değişken Bildirimleri

#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#define BOYUT 7int main(){ int face, roll, frequency[BOYUT] = { 0 };

srand( time( NULL ) );

for ( roll = 1; roll <= 6000; roll++ ) { face = rand() % 6 + 1; ++frequency[ face ]; //swithc yapısı ilede yapılabilir. }

printf( "%s%17s\n", "Yuz", "Frekans" );

for ( face = 1; face <= BOYUT - 1; face++ ) printf( "%3d%17d\n", face, frequency[ face ] ); getch(); return 0;}