Merhaba, tekrar hoş geldiniz. Yapılar hakkındaki tartışmamıza devam edelim
ve dizilerle nasıl ilişkili olduklarını konuşalım.
Yapıların dizilere benzediğinden ve birden fazla değer saklayabildiğinizden bahsettik,
ancak farklı veri türlerine sahip olabilmeniz ve bunları bu şekilde gruplayabilmeniz
nedeniyle farklıdırlar.
Ama aslında yapı dizilerine de sahip olabilirsiniz.
Böylece yapının ne kadar faydalı olduğunu ve birbiriyle ilişkili unsurları mantıksal olarak gruplandırmanızı
sağladığını gördünüz. Bir etiket adı kullanarak struct
anahtar sözcüğünü kullanarak farklı öğelere sahip bir yapıyı nasıl tanımlayacağımızı
biliyoruz.
Ayrıca bu türde bir değişkeni nasıl oluşturacağımızı da biliyoruz.
Çünkü bir yapı esasen kullanabileceğiniz yeni bir veri türüdür.
Ve sonra üye seçim operatörünü kullanarak bir yapının elemanlarına erişebilirsiniz.
Peki, bir dizinin içinde birden fazla yapı oluşturmak istiyorsanız
ne olacak? Bunu yapabilirsin.
Örneğin, program tarafından kullanılan her tarih için üç yerine yalnızca
bir değişkeni takip etmek gerekir, bu bir yapının avantajıdır.
Bir programda 10 farklı tarih işlemek istersek, 30
yerine yalnızca 10 farklı değişkeni takip etmemiz gerekir.
Çünkü unutmayın, yapı kendi içinde üç değişken içerir.
10 farklı değişken için hala çok fazla, bu yüzden gerçekten
gitmek için en uygun yol değil. Muhtemelen bir dizi oluşturmak istersiniz.
Çünkü aynı türden 10 tane olması gerekir, tıpkı aynı türden 10 tane olması
gerektiği gibi. Sadece bir yapı tipi olacaktı.
Bu nedenle, 10 farklı tarihi işlemek için daha iyi
bir yöntem, c programlama dilinin iki güçlü özelliği olan yapılar ve dizilerin kombinasyonunu
içerir.
Daha da güçlü hale getirmek için bunları birlikte kullanabilirsiniz.
Bu yüzden bir dizi yapı tanımlamak tamamen geçerlidir
Yapı dizisi kavramı c'de çok güçlü ve önemli bir kavramdır, bu yüzden çok dikkatli olun.
Bir yapı dizisini bildirmek, diğer herhangi bir dizi türünü bildirmek gibidir.
Türü belirtirseniz, bu sadece bir yapı türü olur.
Bu nedenle, date adında bir yapı dizisi oluşturmak istiyorsanız,
struct date ve ardından değişken adını söylersiniz
ve ardından parantezleri kullanırsınız, tıpkı diğer diziler için
parantezleri kullandığınız gibi, boyutu belirtmeniz gerekir.
Bu durumda, date struct türünün 10 örneğini veya 10 öğesini oluşturuyorsak,
işaret için bu parantezlerin içine 10 diyeceğiz.
Böylece, 10 elemandan oluşan my dates adlı bir dizi tanımlanmış olur.
Dizinin içindeki her eleman, üç üye içeren bf tipi bir struct
date olarak tanımlanır.
Yani aslında yaptığınız şey, 30 farklı veri kümesini,
30 farklı veri öğesini depolamaktır.
Bir dizi yapının üyelerini tanımlamak için, tek
tek yapılar için kullandığınız kuralı uygularsınız.
Yapı adını nokta operatörüyle ve ardından üye adıyla dosyalarsınız.
Dizi içinde belirli bir yapı elemanına başvurmak oldukça doğaldır.
my dates dizisinin içindeki ikinci tarihi 8 Ağustos 1986 olarak ayarlamak için tek
yapmanız gereken dizinin adını (my dates) ve dizinin
indeksini belirtmektir. Burada ikinci tarihi belirtiyoruz.
Dizilerin 0 tabanlı olduğunu unutmayın. Yani 1 diyoruz, alt-1.
Ve sonra bu dizi elemanının elemanlarına veya bu eleman
için bu yapının üyelerine erişmek istiyorsak, nokta ay deriz.
Bu bize my dates dizisindeki ikinci öğeyi verecektir.
Bu struct türü için ay değeri ve burada ona 8 değerini atayacağız.
ve sonra güne erişmek istiyorsak, 8 Ağustos olduğu
için 8. günü de atayacağız. Ve son olarak, yıl için nokta yılının 1986'ya
eşit olduğunu söyleyebiliriz.
Bu şekilde, my dates dizisinin ikinci elemanına üç farklı değişken
atayabilirsiniz, çünkü struct türündedir, date struct.
Gerçekten farklı olmadığını fark etmelisiniz.
Buradaki tek fark sizin bir noktanız olması. Normalde, sadece my dates sub-1 derdiniz
ve bu kadar olurdu çünkü bu dizinin türüne bağlı olarak yalnızca bir değişken
atayabilirdiniz.
Ancak bu durumda, sub-1'i üç farklı değişkenle söyleyebilirsiniz
çünkü bunlar yapının içindeki üç öğedir.
Bir dizi yapıyı başlatma.
Yapı içeren dizilerin başlatılması, çok boyutlu dizilerin
başlatılmasına benzer.
Çok boyutlu dizilerde, dış kısımda küme parantezleri ve ardından her
satırı temsil eden iç kısımda küme parantezleri ile özel sözdizimini takip edeceğimizi unutmayın.
İç kısımdaki küme parantezleri aslında isteğe bağlıydı,
ancak çok daha okunabilir hale getirdi. Ben de bu geleneği takip etmeyi seviyorum.
Bu örnekte, tarih yapısı türünde bir tarihim oluşturuyoruz,
boyutu 5 olacak. Ve sonra sadece ilk üç öğeyi başlatacağız.
Tıpkı çok boyutlu bir dizi gibi, içinde küme
parantezleri vardır. Ve böylece sıfırın altında bir dizin olan
my dates dizisindeki ilk öğe. Ayın 12, tarihin 10
ve yılın 1975 olduğunu söyleyeceğiz.
Ve sonra aynı şeyi birinci eleman için yapacağız. 12.30.1980 diyeceğiz.
Üçüncü unsur için de 11-15 2005 diyeceğiz.
Ve my dates dizisindeki diğer iki öğeyi sağlamadığımız
için, bunlar hiçbir şekilde başlatılmayacaktır.
Böylece ilk üç tarih belirlenmiş olacak.
Dizide benim tarihim 12 10 1975,
12 30 1980 ve 11 15 2005.
Parantezlerin iç dönemleri isteğe bağlıdır, tıpkı çok boyutlu bir alanda olduğu gibi onlar da isteğe bağlıdır.
Ancak yine de bu iç parantezlerle okumayı ve takip etmeyi kolaylaştırıyor, ben olsam
bu geleneği takip ederdim.
Yani parantezlerden kurtulmak istiyorsanız
bunu yapabilirsiniz, ancak takip etmesi biraz daha zordur çünkü artık
sadece virgüller, virgüllerle ayrılmış öğeler veya virgüllerle ayrılmış öğeler vardır ve
bunlardan çok fazla yapıyorsanız çok kafa karıştırıcı olabilir.
Bunu doğru bir şekilde eşlemelisiniz, diyelim ki dördüncü virgülüm
için dördüncü elemandayım, tamam bu dizinin ikinci elemanı
olacak, takip etmesi daha zor, bu yüzden bunları küme parantezleri içinde kullanın.
Dizinin yalnızca üçüncü öğesini belirli bir değere başlatmak istiyorsanız,
tarihlerimi sub-5 olarak belirtebilirsiniz.
Burada hala diziyi oluşturuyorsunuz.
Hala değişkeni bildiriyor ve boyutunu beşe ayarlıyorsunuz.
Ancak küme parantezlerinin içinde,
iki iç parantez diyorsunuz ve 2'yi 12
10 1975 olarak başlatacaksınız.
Böylece, başlatmak istediğiniz öğeyi temsil eden köşeli parantezleri,
ardından eşittir atama operatörünü ve ardından yapının içindeki
öğeler için ay, gün ve yılı başlattığınız küme parantezlerinin
içinde göreceksiniz.
Böylece tam olarak hangi öğeyi başlatmak istediğinizi de belirtebilirsiniz.
My dates dizisinin ikinci öğesi olan ay ve günü 12 ve 30 olarak ayarlamak istiyorsanız, çok
benzer bir şey yapabilirsiniz.
Her bir niteliği ayırmak için virgül koymanız yeterlidir.
Aslında yılı ayarlamak istemezsiniz, bu yüzden bu küme parantezlerini kullanabilmek istersiniz.
Nokta ay eşittir 12 alt-1 nokta
gün eşittir 30 diyebilirsiniz.
Ve yine bu sözdizimi, başka yerlerdeki struct değişkenlerini
başlatmaya çok benziyor.
Buradaki tek fark, bir dizi olduğu için dizinin indeksini belirtmeniz gerektiğidir, ancak
benzer sözdizimine sahiptir.
Diziler içeren yapılar ne olacak?
Yapının içinde bir dizi içeren elemanlar.
Üye olarak bir dizi içeren yapıları bulmak da mümkündür.
Bu faydalı olabilir.
En yaygın kullanımı, bir yapı içinde bir karakter dizisi oluşturmaktır.
Karakter dizilerini dizeler için oldukça fazla kullanırız.
Dolayısıyla, bir yapının esasen bir karakter dizisi içermesi çok yaygın
bir durumdur.
Diyelim ki, üyeleri olarak aydaki gün sayısını
ve ay adı için üç karakterlik bir kısaltma içeren month
adlı bir yapı tanımlamak istiyorsunuz.
İşte bu noktada bir karakter dizisi kullanabiliriz. Yapısal ay diyebiliriz.
Bir yapıyı nasıl tanımlayacağımızı biliyoruz. Tekrar ediyorum, bu herhangi bir bellek ayırmak değildir.
Yapı bu şekilde tanımlanır. Bunlar, içinde bulunan unsurlardır.
Burada struct anahtar sözcüğünü kullanıyoruz. Yapının adını söyleriz. Etiket adı month'dır ve ardından sol
küme parantezimiz vardır ve ardından öğeleri belirtiriz.
Sonunda noktalı virgül bulunan gün sayısını temsil eden tamsayı olan bir elemanımız var.
Ve sonra bir karakter dizimiz var, karakter adı alt-üç,
yani üç karakterli olduğu için boyutu üç.
Ve sonra yapıyı noktalı virgüldeki sağ küme paranteziyle sonlandırıyoruz.
Ancak unutmayın, karakterler dizilerdir ve işaretçilerle de yakından ilişkilidirler, bunu artık biliyoruz.
Ancak, yapıları sadece bir üye eleman olarak koyarak kolayca diziler
içerebilirsiniz.
Böylece, gün sayısı adında bir tamsayı üyesi
ve ad adında bir karakter üyesi içeren bir ay yapısı kurulur.
Üye adı aslında üç karakterden oluşan bir dizidir, oldukça basittir.
Peki buna nasıl erişiyorsunuz? Öncelikle değişkeninizi oluşturmanız gerekir.
Değişken, yapının içindeki öğeler için bellek oluşturacak ve daha sonra 8 aylık
değişkenin içindeki uygun alanları ayarlamak isteyeceksiniz, karakter
dizisi çünkü adı buydu. İsmimiz ve gün sayımız
vardı. Burada isim olarak adlandırılır ve örnekte bir ay olarak adlandırılır.
Ay değişken türüdür ve ad da öğe türüdür, yani bu doğrudur.
Yani burada bir yapı oluşturuyoruz. Bu ayın tipi.
Değişken adı bir aydır. Onu hiçbir şeyle başlatmıyoruz.
Hemen 31 günlük bir ay sayısı belirledik.
Bu nokta üye seçim operatörünü kullanırız.
Ve sonra karakter dizisine atama yapmak istiyoruz, doğrudan
bir karakter dizisine atama yapamayız.
Her şeyi imzalamak istiyorsanız bir str karşılaştırması ya da başka bir şey yapmanız gerekir. Ve bunu yapabilirsin.
Bu dizinleri kullanmak zorunda değilsiniz. Str copy a month dot name virgül
ve ardından çift tırnak içinde j a n diyebilirsiniz
ya da dizinin elemanlarına indeks aracılığıyla eriştiğiniz bu şekilde
yapabilirsiniz.
Burada bir ay nokta adı diyoruz çünkü name üye değişkenine veya
üye öğesine erişmemiz gerekiyor.
Ve sonra parantezlerin içinde dizinin indeksini belirtiriz.
Bunu j, ikinci a, üçüncü n dizisindeki ilk karakteri imzalarken bulacağız.
Eğer ints, doubles ve floats yapsaydınız bu sözdizimini
görürdünüz. Normalde, bir karakter dizisine
sahip olduğunuzda, str stir copy fonksiyonunu kullanır ve her şeyi çift tırnakla atarsınız.
Ayrıca, değişkeni bildirirken çok benzer bir şey yaparak değişkeni
aynı değerlerle başlatabilirsiniz. Küme parantezlerinin hemen içinde, bir
dizi olduğu için, iç küme parantezleri ve ardından
her karakterin etrafında tek tırnak işaretleri olabilir.
Ve yılın her ayını temsil etmek için bir dizi içinde 12 aylık yapılar kurabilirsiniz.
Şimdi, struct month türünde
12 boyutlu bir dizi olan ve her ayı temsil edebilen bir ay değişkeni
oluşturabiliriz.
Ve sonra her ay için gün sayısını ve ardından ay kısaltmalarını harcayabiliriz.
Dolayısıyla, bu iki güçlü kavram olan dizileri ve
yapıları kullanmak çok ama çok faydalıdır.
Yapılar birçok elemana sahip olabilir, bu
nedenle aslında dizilerden oluşan bir yapı olabilirler ve yapının
içindeki elemanlar bir dizi olabilir.
Daha sonra yapıları işaretçiler gibi diğer öğeleri içerecek şekilde nasıl kullanabileceğimizden bahsedeceğiz.
Ancak yapıların her tür veriyi birçok farklı veri türünde
saklayabildiğini göreceksiniz.
Ve dizi konseptiyle birlikte kullanmak çok ama çok kullanışlıdır.
Umarım bu yardımcı olmuştur. Yine, bu kavramlardan bazılarını göstermek
ve daha sonra kod blokları içinde bazı örnekler getirmek
için bir meydan okumamız olacak. Teşekkür ederim.