Diziler – C Programlama Dili

in #tr7 years ago


Program yazarken bazen çok fazla sayıda değişkene ihtiyaç duyulabilir, 300-500 gibi. Bu gibi durumlarda her bir değişkeni ayrı tanımlamak, ayrı isim ve değer vermek inanılmaz zordur. İşte bu gibi durumlarda imdadımıza diziler yetişir.

Bilgisayarda verilerin tutulduğu RAM'in özelliği diske göre hızlı çalışmasıdır. Yapı olarak baktığımızda yukarıdan aşağıya doğru çizilen tek boyutlu bir yapıdır.

RAM, tek boyutlu olarak adreslenen bir yapıdır. Dizileri anlatırken kullanacağımız çok boyutlu ifadesi tamamen izafidir, yani bizim kabulümüzdür. Tek boyutlu ya da çok boyutlu olarak ifade ettiğimiz tüm diziler, hepsi RAM'de tek boyutlu gibi tutulur.

Diziler (arrays), aynı veri tipinden olan değişkenleri aynı isim altında tek seferde tanımlamamıza imkan verir. Tipleri; int, char, float ve double olabilir.

Tek Boyutlu Diziler

Programlamada aynı veri tipindeki değişkenleri tek bir isim altında toplayarak oluşturacağımız tek boyutlu diziler, programcıya çok kolaylıklar sunar.

Genel tanımlaması aşağıdaki gibidir :

int a[200]; // veriTipi diziAdi[boyut];

Bu bildirimle int tipinde ismi a olan 200 elemanlık bir dizi tanımlamış olduk.

Bu tanımlamada ilk başta verilen veriTipi int, char, float veya double olabilir. Sonrasında gelen dizi adı değişken isimlendirme kurallarına uyulacak şekilde her şey olabilir. Sonrasında gelen köşeli parantez operatörü ise diziler için kullandığımız bir operatördür. Bunun içerisine dizinin kaç elemanlı olacağını belirten sayısal bir değer girebiliriz.

Java Programlama Dersleri Tek Boyutlu Diziler Arrays
Kaynak

Bazı derleyiciler , dizi bildirimlerinde eleman sayısının tamsayı türünden sabit bir ifadeyle belirtilmesinin zorunluluğunu kabul eder. Yani böyle bir kullanım :

onlar için hatalıdır. Bunun yerine şu şekilde kullanılması gerektiğini savunurlar :

Ancak bu kullanımı kabul eden derleyiciler de mevcuttur.

Dizilere değer atama veya herhangi bir değişkenine erişme normal değişken atamalarından biraz farklıdır.

int dizi[10];

dediğimizde 10 elemanlı int tipinde bir dizi oluşturmuş oluruz. Bu dizinin 3.elemanına bir değer atamamız gerekirse

dizi[2] = 34;

şeklinde bir ifade kullanırız. 3.eleman dedik ama dizi[2] dedik? Buradaki çelişki dizi index değerlerinin 1’den değil 0’dan başlamasından ileri gelir. Yani dizinin ilk elemanı:

dizi[0] ‘dır.

10 elemanlı bir dizide son eleman ise :

dizi[9]’dur.

Yani özetle dizinin bir elemanına erişmek istiyorsak o dizi elemanının indis değerini de yanında belirtmemiz gerekir. Çünkü dizi sonuç olarak çok elemanlı bir yapıdır ve sadece ismini kullanmamız bir anlam ifade etmez.

Dizi elemanlarına yukarıdaki örnekte belirttiğimiz gibi tek tek değer ataması yapabileceğimiz gibi, toplu bir şekilde de yapmak mümkündür :

Toplu ilk değer atamasında dizi eleman sayısının belirtilmesi zorunlu değildir.

Şimdi bu anlattıklarımızı gösteren bir iki uygulama yapalım. İlk olarak dizi elemanlarına ilk değer atamasını ve dizi elemanlarına erişimi bir for döngüsünde yapan basit bir uygulama yapalım :

Uygulamanın başında int tipinde ismi dizi olan 10 elemanlık bir dizi tanımladık.

Sonrasında ekrana "DİZİLER" yazısını yazdırdıktan sonra for döngüsüne geldik. Bu döngü 0'dan başlayıp 10'a kadar dönecektir. Burada sınırı 10 vermemizin sebebi dizi eleman sayısının 10 olmasıdır.

Yani i değeri 0,1,2,.... 9 değerlerini aldıktan sonra döngüden çıkacaktır. Dizi elemanlarının index değerinin sıfırdan başladığını düşünürsek 10 elemanlı bir dizinin son elemanının indis değerinin 9 olmasından dolayı bu şekilde ayarladık.

for döngüsünün içindeki

dizi[i] = i + 1;

ifadesi ile dizi elemanlarına ilk değer ataması yapılırken,

printf("%d.eleman : %d\n\t", i+1, dizi[i]);

ifadesi ile de her bir dizi elemanının değeri ekrana yazdırılmaktadır. Sonuç aşağıdaki gibidir :

Şimdi de char tipinde bir dizi nasıl tanımlanır ve dizi elemanlarına erişimi nasıldır, görebileceğimiz bir uygulama yazalım :

Uygulamada

char dizi[] = {'D','I','Z','I','L','E','R'};

ifadesi ile char tipinde 7 elemanlı bir dizi tanımlayıp ilk değer atamasını tek tırnak içerisinde yaptık. Sonrasında for döngüsüne girildi. Döngüde kullandığımız i kontrol değişkeninin aldığı değerler 0 ile 6 arasında olup dizimizin indis sayıları ile örtüşmektedir.

for döngüsünün içerisinde kullanılan

printf("%c", dizi[i]);

printf() fonksiyonu ile her bir dizi elemanı karakter olarak her bir döngüde yazdırılmış olup sonuç aşağıdaki gibidir :

Bu karakter dizisini aşağıdaki gibi tek seferde yazdırmamız da mümkündü. Tabi bu sadece karakter dizilerine has bir durumdur :

Son olarak kullanıcıdan aldığı notların ortalamasını hesaplayan bir program yazalım :

Uygulamada float tipinde adı notlar olan 10 elemanlı bir dizi tanımladık. Ayrıca yine float tipinde ismi toplam olan ve ilk değeri 0 olan bir değişken tanımlandı.

Sonrasında bilgi amaçlı verilen printf() fonksiyonlarından sonra for döngüsünde girildi.

for döngüsü diğer döngülerimizde olduğu gibi dizi boyutu kadar dönecek şekilde ayarlandı. Döngü içerisinde kullanıcıya

printf("\t%d.notu giriniz : ",i+1);

fonksiyonuyla 1.2.3.4.....9. notu giriniz şeklinde bilgi mesajı verilirken, kullanıcıdan alınan bilgi

scanf("%f",&notlar[i]);

fonksiyonuyla dizi elemanlarına sırayla atanmaktadır.

Sonrasında kullanıcıdan alınan not değerleri, aşağıdaki ifade ile

toplam += notlar[i];

toplanacaktır. Bu ifade aslında toplam = toplam + notlar[i]; ifadesinden başka bir şey değildir.

Döngüden çıkıldıktan sonra ise kullanıcıya

printf("\n\tNotların Ortalaması : %f", toplam / 10);

Notların Ortalaması : ....

şeklinde bir mesaj verilecektir. Çıktımız ise aşağıdaki gibidir :

Diziler hakkında bilinmesi gereken önemli bir durum var : C dilinde dizi elemanlarının sayısını sınırlayan bir kural bulunmamaktadır. Bu ifadeyi açmak gerekirse  yani siz 5 elemanlı bir dizi tanımlayıp 7 atama yapabilirsiniz. Böyle bir durumda derleyici hata vermeyecektir. Ancak sizin programınızın ne sonuçlar doğurur o bilinmez tabi.

Bir uygulamasını yapalım :


Resimdeki 5 tur dönecek ve 5 atama yapacak yazıları hatalıdır, döngümüz 6 tur dönüp 6 atama yapacaktır.

Bu uygulamada 3 elemanlı int tipinde adı sayilar olan bir dizi tanımlandı. Sonrasında for döngüsü ile sırasıyla 6 atama işlemi yapıldı. Ancak dizi eleman sayımız 3 olmasına rağmen 6 atama yapıldığında bile derleyici hata vermedi.

Çıktımız aşağıdaki gibidir :

Böyle bir sınırlayıcı olmadığı için dizilerle yapılan işlemlerde daha dikkatli olmak gerekir.

Bir dizinin hafızada ne kadar yer kapladığını da yine sizeof() operatörünü kullanarak bulabilirsiniz :

İki Boyutlu Diziler

RAM de dizi elemanlarının tek boyutlu dizilerde olduğu gibi peşpeşe saklandığından bahsetmiştim. Çok boyutlu dizi kavramının tamamen izafi yani bizim kabulümüz olduğunu da söyledim.

Java Programlama Dersleri İki boyutlu dizilerin yapısı
Kaynak

İki boyutlu dizilerin genel tanımı aşağıdaki gibidir :

Bu kabule göre yukarıdaki bdizi , 2 satır 3 sütundan oluşan 2 boyutlu bir dizidir. Böyle bir diziye ilk değer ataması ise aşağıdaki gibi yapılır :

Satır ve sütunlar aşağıdaki gibi temsil edilir :

Şimdi de iki boyutlu dizi elemanlarına nasıl erişebileceğimizi gösteren basit bir uygulama yapalım :

2 boyutlu dizi elemanlarına erişim için iç içe 2 for döngüsü kullanılır. En dıştaki döngü satırlar arası gezerken hemen içinde j ile ifade ettiğimiz döngü ise sütunlarda gezecektir. Yani i, satırları; j ise sütunları temsil eder. Çıktımız ise aşağıdaki gibidir :

Üç boyutlu Diziler

C dilinde genelde çok boyutlu dizilere rastlayacağınızı düşünmüyorum. Ama olur da rastlarsanız en fazla kullanılan 1,2 ve 3 boyutlu dizilerdir.

Bunların mantığını da aşağıdaki görsel çok iyi ifade etmektedir :

Java Programlama Dersleri 3 boyutlu diziler
Kaynak

2 boyutlu dizilerde satır ve sütundan bahsedip bunları i ve j gibi iki değerle ifade etmiştik. Dizi 3 boyutlu olunca bu sefer 3.boyutu temsil edecek bir k değişkeni devreye giriyor, yani derinliği ifade etmek için kullanılıyor.

3 boyutlu diziler kavramı gözünüzü korkutmasın. 3 boyutlu dizi dediğimiz diziler aslında 2 boyutlu dizilerin art arda konulması ile oluşan yeni yapının adı oluyor. Mantığı bu şekilde düşünürseniz anlamak oldukça kolaylaşacaktır.

Gelelim tanımlamasına

Böyle bir tanımlamada k değerimiz 2, i olarak ifade ettiğimiz satır değerimiz 3 ve j değeri olarak ifade ettiğimiz sütun değeri de 4 tür.

Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.

Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.

Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.



Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/18/03/2019/diziler-c-programlama-dili/
Sort:  

Hi, @etasarim!

You just got a 1.7% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.


Bu yazı Curation Collective Discord Sunucusunda küratörlere önerilmiş ve manuel inceleme sonrasında @c-squared topluluk hesabından oy ve resteem almıştır.
This post was shared in the #turkish-curation channel in the Curation Collective Discord community for curators, and upvoted and resteemed by the @c-squared community account after manual review.
@c-squared runs a community witness. Please consider using one of your witness votes on us here

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.

Coin Marketplace

STEEM 0.05
TRX 0.32
JST 0.081
BTC 63311.46
ETH 1687.53
USDT 1.00
SBD 0.41