Diziler – C Programlama Dili

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.

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",¬lar[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.

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 :

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/
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
Thanks :)
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.