30 Ocak 2011 Pazar

C DİLİNDE YAPILAR (STRUCTERS)

Arkadaşlar bildiğimiz üzere yapılar yani structlar C dilinin en önemli ve en zevkli konularından birisi olmakla beraber dosya işlemenin de olmazsa olmaz bilinmesi gerekenlerindendir.Ben de bu yüzden sizleri düşünerek kendi yazdığım kodlarla beraber bu konuyu gayet açıklayıcı bir şekilde anlatan bir yazı yayınlayayım dedim.Sizleri Structlarla baş başa bırakıyorum.Kolay gelsin...

YAPILAR(STRUCTURES)

C programlama dilinde bir takım modlar vardır bunlar ; int char double float ..vb. Bu modlar bizim kullanacağımız değişkenlerin tipini belirlemektedir.Örneğin int tamsayı, float ve double virgüllü sayıları ,char karakterleri... belirlemektedir. 

Hemen her programımızda değişkenleri kullandığımız için bizim açımızdan büyük önemleri vardır. Dizilerde hafızada bir takım yerler açılır bunları kutucuk olarak düşünürsek yan yana alt alta bir takım istediğiniz kadar kutucuk açabilirsiniz, fakat bu kutucukları doldururken belirlemiş olduğunuz değişken tipinin dışına çıkmazsınız şöyle ki:

İnt dizi[10]; kesinlikle kutucuklarınızın içerisine tam sayı koymak zorundasınız.

Char dizgi[10]; kesinlikle harf yada karakter girmelisiniz..
C de Kendi Türümüzü Oluşturalım


Peki siz hem karakter hem de sayı girmek isterseniz nasıl bir yol izlemelisiniz işte C programlama dili bize yeni bir YAPI tanımlama seçeneği vermiştir. Diyelim ben örgenci diye bir YAPI belirledikten sonra bunun kişisel özelliklerini ismini numarasını belirleyeceğim.
Örneğimizi inceleyelim:


Struct ogrenci {
     char  *isim[10];
     char  *soyisim[15];
     int      numara;
};


İşte kalıp olarak bir yapı(struct) bu şekilde belirtilmektedir. Örneğimize göre artık int double float gibi değil de ogrenci diye bir yapımız var hem de içerisinde int ve char tipinde değişkenler barındıran bir yapı!

Yapımız görüldüğü gibi hazır fakat diğer yapılar yani int double floatta olduğu gibi değişken tanımlamamız gerekmektedir.

İnt sayi = 15; sayi değişkeni hem tam sayidır hem de değeri 15 olarak atanmıştır.

Struct ogrenci kisi; kisi yeni bir ogrenci yapısıdır. İşte bu da bir yapı değişkeninin tanımlanış biçimidir.

Kodumuzu tam olarak bütünlersek: 


Struct ogrenci {
     char  *isim[10];
     char  *soyisim[15];
     int      numara;
};
Struct ogrenci kisi;  


Diyelim ki böyle bir kodu programımıza yazdınız, şimdi içeriğini nasıl kullanacağız?


Kisi.isim= "emre";
Kisi.soyisim = "celenk";
Kisi.numara = 1234567;


Artık içeriğimizde yukarıdaki kodda olduğu gibi kullanabiliriz. Aralarındaki Noktalara lütfen dikkat edelim! Bu programcılar için büyük bir kolaylıktır. Tabi ki de bunu diğer C kolaylıklarıyla kullanınca daha da rahat oluyor her şey.

Şimdiye kadarki kısmın daha iyi anlaşılabilmesi için tam çalışan bir program yazalım.

#include <stdio.h>
#include <stdlib.h>
struct uye
{
      char*isim[20];
      char*soyisim[25];
      int no;
      char*mail[60];
};//yapıalrı global tanımlamak main haricinde ki fonksiyonlarda kullanmayaı kolaylaştırır**
int main()
{
      struct uye kisi;//burada "struct uye" bizim veri tipimiz oldu artık.kisi ise değişkenimiz olmuştur**
      int c;
      printf("******Uye kayt islemine hos geldiniz******\n");
      printf("------------------------------------------\n");
      printf("Eklemek istediginiz kisinin ismini giriniz : ");
      scanf("%s",&kisi.isim);
      printf("Sirasiyla uyenin\n");
      printf("Soyismini giriniz : ");
      scanf("%s",&kisi.soyisim);
      printf("Numarasini giriniz : ");
      scanf("%d",&kisi.no);
      printf("E-mailini giriniz : ");
      scanf("%s",&kisi.mail);
      printf("\n");
      printf("%s\n%s\n%d\n%s\n",kisi.isim,kisi.soyisim,kisi.no,kisi.mail);
      printf("Yaptiginiz kayidi onayliyor musunuz? Onayliyor iseniz 1 'i , onaylamiyor iseniz 0 'i tuslayiniz\a\a\n");
      scanf("%d",&c);
      if(c==1)
            printf("Kaydiniz basariyla alindi\n");
      else if(c==0)
            printf("kaydiniz alinmdana programdan cikilacak\n");
      system("pause");
      return 0;
}

Yukardaki örneğim Visual studio derleyicisinde denenmiştir ve çalışmaktadır.


Örneğimizde mümkün olduğunca farklı tip şekil kullanmaya çalıştım. Structures yapılarına görüldüğü gibi dışarıdan da veri girişi rahatlıkla bu şekilde yapılmaktadır.

YAPILARI DİZİLERDE KULLANMAK

Diyelim ki, bir öğrenci takip programı yapmak istiyoruz,fakat her örgenci için farklı değişken kullanmak hiç de akıllıca olmayacağından yapıları dizlerle birlikte kullanmayı öğrenerek daha kolay kısa ve hızlı programlar yapabileceğiz.

Sınıftaki öğrencilerin her birini:


emre.isim | emre.soyisim,|  emre.no
ahmet.isim | ahmet.soyisim,|  ahmet.no
ali.isim | ali.soyisim,|  ali.no
ayse.isim | ayse.soyisim,|  ayse.no


gibi sıralamak yerine dizilerin sürekli artışını kullanarak dizi; şeklinde tanımladığımız dizimizi:


dizi[0].isim | dizi[0].soyisim,|  dizi[0].no
dizi[1].isim | dizi[1].soyisim,|  dizi[1].no
dizi[2].isim | dizi[2].soyisim,|  dizi[2].no


şeklinde bir for döngüsüyle yapmak çok daha kolay hızlı ve akılcı bir yöntem olacaktır.

Bu konuyla ilgili değişik bir örnek daha vermek istersek; gün ay ve yılları girdi olarak alan ve bunları bir dizide tutan bir yapı belirleyerek bunun gayet güzel bir örneğini yapabiliriz.

Burada belki şaşıra bilinecek ek yer olabilir oda nasıl veri girişi yapılacağıdır ki onu da ya for döngüsü içerisinde ya da:


X[0].gun = 1;
x[0].ay = 2;
x[0].yıl= 2008;


şeklinde tanımlayabiliriz.Bu konuyu pekiştirici bir örneğin kodları aşağıda ki gibidir.


#include <stdio.h>
#include <stdlib.h>
struct personel
{
      int numara;
      char *ad[10];
      double ucret;
};
int main()
{
      struct personel p[3];
      int i;
      for(i=0;i<3;i++)
      {
            printf("%d.kisinin adini giriniz : ",i+1);
            scanf("%s",&p[i].ad);
            printf("%d. kisinin sicil nosunu giriniz : ",i+1);
            scanf("%d",&p[i].numara);
            printf("%d.kisinin ucretini giriniz : ",i+1);
            scanf("%lf",&p[i].ucret);
      }
      printf("\n");
      printf("girdiginiz degerler aynen asagidaki gibidir \n");
      printf("Sahislar    ad      sicil_no      maas\n");
      printf("__________________________________________\n");
      for(i=0;i<3;i++)
      {
            printf("%d.sahis : %s      %d      %lf\n",i+1,p[i].ad,p[i].numara,p[i].ucret);
      }
      system("pause");
      return 0;
}

YAPILARIN FONKSİYONLARA AKTARILMASI

Bilinmelidir ki, fonksiyonlar C programlama dilinde çok önemli bir yere sahiptirler ve hemen her programınızın içine dahil ederek daha kısa daha hızlı programlar icra edebilirsiniz.

Yapılar konusunu fonksiyonlar içerisinde görmek gerekirse, prototipimiz şuna benzer bir şekilde olmalıdır.


Void fonksiyon( struct uye kisi)


ya da 


Void fonksiyon(struct uye*)


şeklinde olmalıdır..

Bu konuyu pekiştirici güzel bir örnek aşağıdaki gibi kodlanabilir.

#include <stdio.h>
#include <stdlib.h>
struct sayi
{
      int i;
      int j;
}koordinat={5,23};
void yaz (struct sayi);
int main()
{
      yaz(koordinat);
      system("pause");
      return 0;
}
void yaz(struct sayi koordinat)
{
      printf("x degeri : %d\n",koordinat.i);
      printf("y degeri : %d\n",koordinat.j);
}

Bu yazının tamamının olduğu bir word dökümanı ,kaynak kodlarını ve exe lerini aşağıdaki link ' e koydum.İndirebilirsiniz.

Buraya tıklayarak kodları ve örnekleri indirebilirsiniz.






Hiç yorum yok:

Yorum Gönder