C Programlama

Ek Bilgiler

C'de Yapılar (Structures)

► Detaylı anlatım

Daha önce, aynı türden olan verileri diziler içinde tanımlamak suretiyle tek bir dizi ismi ile bu verilere erişim sağlayarak kullanabileceğimizi gördük. Ancak, türleri farklı olan verileri tek bir isim altında toplayabilmemiz için C bize farklı ve özel bir veri türü kullanma olanağı sağlar. Bu özel veri türüne yapı adı verilir.

Yapı, farklı veri türlerini bir grup altında toplayan bir veri türüdür. İki veya daha fazla elemandan oluşur. Bir yapı içindeki bütün veri tipleri aynı olabileceği gibi, her veri türü birbirinden farklı da olabilir.

Yapı Bildirimi

Yapıların genel şekli aşağıda gösterildiği şekildedir:

struct adı {
   veri-türü eleman1;
   veri-türü eleman2;
   .
   .
   .
   veri-türü elemanN;
} değişken-listesi;

Yukarıda görülen struct kelimesi bir yapı tanımlar. adı ifadesi ise yapının adını göstermektedir. veri-türü ifadesi C'de kullanılan herhangi bir veri türünü gösterir. değişken-listesi ifadesi yapı için tanımlanan değişkenleri göstermektedir. adı veya değişken-listesi ifadelerinden birisi mutlaka tanımlanmış olmalıdır.

Bir yapı içinde yer alan bölümlere eleman veya alan adı verilir.

Bir yapı içindeki veriler birbiri ile mantıksal olarak ilişkilidir:

struct yap1 {
  char cdizi1[15];    /* İsim      */ 
  char cdizi2[15];    /* Soyadı    */
  char cdizi3[15];    /* Memleketi */
  char cdizi4[15];    /* Tahsili   */
  int id1;            /* Yaşı      */
} yd1;

Yukarıdaki ifadeler, dört adedi karakter dizisi ve bir adedi int bir değer olmak üzere toplam beş elemandan oluşan yap1 adlı bir yapı ve bu yapı için ayrıca yd1 adlı bir değişken tanımlar. İstediğiniz sayıda tanımlayabileceğiniz bu değişken yoluyla yapının elemanlarına ulaşabilirsiniz.

Yapı Elemanlarına Değer Atanması

Bir yapı içinde yer alan bir elemana yapı değişkeni yolu ile ulaşmak için aşağıdaki ifadeyi kullanabilirsiniz:

yapı-değişkeni.alan-adı

Örneğin yap1 yapısının id1 değişkenine 21 değerini atamak için aşağıdaki ifadeyi kullanabilirsiniz:

yd1.id1 = 21;

Aynı değeri ekrana yazmak için ise şu ifadeyi kullanabilirsiniz:

printf("%d", yd1.id1);

yap1 yapısının id1 değişkenine kullanıcının girdiği bir değeri okutmak için şu ifadeyi kullanabilirsiniz:

printf("Yaşını giriniz: ");
scanf("%d", &yd1.id1);

yap1 yapısında yer alan cdizi1 dizisine bir değer girmek ve aynı değeri ekrana yazdırmak için aşağıdaki ifadeleri kullanabilirsiniz:

printf("Adını giriniz: ");
gets(yd1.cdizi1);
printf("%s", yd1.cdizi1);

yap1 yapısında yer alan cdizi1 dizisinin ikinci karakterine erişmek için de aşağıdaki ifadeyi kullanabilirsiniz:

printf("%c", yd1.cdizi1[2]);

Yapılar sayesinde tek bir değişken yolu ile birden fazla farklı türden veriye ulaşabilirsiniz.

Şimdi, bu özellikleri bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

struct yap1 {
  char cdizi1[15];    /* İsim      */ 
  char cdizi2[15];    /* Soyadı    */
  char cdizi3[15];    /* Memleketi */
  char cdizi4[15];    /* Tahsili   */
  int id1;            /* Yaşı      */
} yd1;

void main (void)
{
  printf("Adı: ");
  gets(yd1.cdizi1);
  printf("Soyadı: ");
  gets(yd1.cdizi2);
  printf("Memleketi: ");
  gets(yd1.cdizi3);
  printf("Tahsili: ");
  gets(yd1.cdizi4);
  printf("Yaşı: ");
  scanf("%d", &yd1.id1);
  printf("%s %s %s %s %d", yd1.cdizi1, yd1.cdizi2, yd1.cdizi3, yd1.cdizi4, yd1.id1);
}

Yukarıdaki örnekte, program bir kişi için girdiğiniz verileri yap1 adlı bir yapının elemanlarına atar ve elemanları ekrana yazar. Bu durumda yapı elemanlarına daima yd1 değişkeni yoluyla ulaşılır.

Bir yapı içinde tanımlanan değişkenler program içinde yer alan diğer değişkenlerle aynı ada sahip olsalar bile, program değişkenleri farklı bir şekilde kabul eder. Bu özelliği bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

void main (void)
{
  struct yap1 {
    int id1;
    char cd1;
  } yd1;

  int id1 = 21;

  yd1.id1 = 192;
  yd1.cd1 = 'A';

  printf("%d %d %c", id1, yd1.id1, yd1.cd1);
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

21 192 A

Program yapı içinde yer alan id1 değişkeni ile yapı dışında yer alan id1 değişkenine tamamen farklı değişkenler olarak işlem yapar.

Yapılar İçin Değişken Tanımlama

Yukarıda yap1 adlı bir yapı bildirimi yaparken aynı zamanda yd1 adlı bir değişken tanımladık. yap1 yapısının bildirimini yaptıktan sonra, program içindeki işlem satırları ile aynı yapı için tekrar değişken tanımlamak mümkündür. Bir yapıyı bir kez tanımladıktan sonra, aşağıdaki ifade ile daha fazla değişken tanımlayabilirsiniz:

struct yapı-adı değişken-listesi;

Örneğin aşağıdaki ifadeyi kullanarak yap1 yapısı için 2 değişken tanımlayabilirsiniz:

struct yap1 yd2, yd3;

Bu size yapı tanımlamasından bağımsız olarak değişken tanımlama olanağı sağlar. Bu özellikten dolayı, yapı tanımlamalarında değişken tanımlamanız şart değildir. Bazı durumlarda yapı tanımlamalarında yapı adı tanımlamayabilirsiniz. Ancak, bu durumda değişken adlarını mutlaka tanımlamanız gerekir:

struct {
  char cdizi1[10];
  int id1;
  char cd1;
} yd1, yd2, yd3;

Yapı tanımlamalarında yapı-adı ve değişken-listesi ifadelerinin en az birisini kullanmanız gereklidir. İkisini birlikte kullanmak ise isteğe bağlıdır.

Şimdi bu özelliği bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

struct yap1 {
  char cdizi1[15];
  int id1;       
} yd1;

struct yap2 {
  char cdizi1[15];
  int id1;       
};

struct {
  char cdizi1[15];
  int id1;       
} yd3;

struct yap1 yd2;

void main (void)
{
  char cdizi[10];

  gets(yd1.cdizi1);
  gets(cdizi);
  yd1.id1 = (int) atoi (cdizi);
  printf("\n");

  gets(yd2.cdizi1);
  gets(cdizi);
  yd2.id1 = (int) atoi (cdizi);
  printf("\n");

  gets(yd3.cdizi1);
  gets(cdizi);
  yd3.id1 = (int) atoi (cdizi);  
  
  printf("%-15s %-d\n", yd1.cdizi1, yd1.id1);
  printf("%-15s %-d\n", yd2.cdizi1, yd2.id1);
  printf("%-15s %-d\n", yd3.cdizi1, yd3.id1);
}

Yukarıdaki örnekte, program 3 farklı yapı tanımlar. yap1 yapısının bildirimi hem yapı adı hem de değişken, yap2 yapısının bildirimi sadece yapı adı ve yap3 yapısının bildirimi ise sadece değişken tanımlanarak yapılmıştır. Girilen değerleri bu yapı içindeki elemanlara atayarak ekrana yazar.