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.






19 Ocak 2011 Çarşamba

YTU NOT ORTALAMASI HESAPLAMA PROGRAMI

Dönem sonu yaklaşınca bu soruyu herkes kendisine sorar..Ortalamam kaç ? Repeat olacak mıyım? (Benim gibi D:) .Benimde can sıkıntısından aklıma geldi yazayım dedim  .Çokta güzel olmadı da denebilir.Ama yine de denemeye değer. :). Kodları aşağıya yazdım isterseniz verdiğim linkten de indirebilirsiniz programın exe si ile beraber.

KODLAR:


#include <stdio.h>
#include <stdlib.h>
float islem (int);
int main()
{
int ders,i=1,kredi,toplamk=0;
double toplam=0.0,ortalama;
printf("\t\t************************************\n");
printf("\t\t*                                  *\n");
printf("\t\t*     NOT ORTALAMASI HESABI        *\n");
printf("\t\t*                                  *\n");
printf("\t\t************************************\n");
printf("\n\t\t\tA=>4.0\t\tA-=>3.7\n\n\t\t\tB+=>3.3\t\tB=>3.0\n\n\t\t\tB-=>2.7\t\tC+=>2.3\n\n\t\t\tC=>2.0\t\tC-=>1.7\n\n\t\t\tD+=>1.3\t\tD=>1.0\n\n\t\t\tF=>0.0\n\n");
printf("Toplamda kac ders aldiniz ? ");
scanf("%d",&ders);
while(i<=ders)
{
printf("Sectiginiz %d. ders kac kredi ?" , i);
scanf("%d",&kredi);
toplamk=toplamk+kredi;
toplam=toplam+islem(kredi);
i++;
}
printf("Toplam da %d kredi ders secmissiniz .\n\n",toplamk);
ortalama=toplam/toplamk;
printf("Not ortalamaniz %.2lf dir\n\n",ortalama);
printf("\n");
if(ortalama < 2.0 )
{
printf("Adim adim repeat ' a dogru ilerliyorsunuz !! %c %c %c %c \n\n ",1,1,1,1);
}
system("pause");
return 0;
}
float islem(int kredi)
{
float not;
printf("sectiginiz dersin yukaridaki tabloya gore sayisal degerini giriniz : ");
scanf("%f",&not);
return not*kredi;
}
Buraya tıklayarak kodları ve programı indirebilirsiniz.

18 Ocak 2011 Salı

YAZ OKULU ÜCRET HESAPLAMA PROGRAMI VE KODLARI

İlk dönem yavaş yavaş biterken  , aynı zamanda  ben ve benim gibi öğrencilerin yaz okulu dersleri kafasında yavaş yavaş oluşmaya başlamıştır.İşte bu yüzden ben de dedim ki bir yaz okulu  ücreti hesaplayan programı yapayım.Bu programın ilk sürümüdür.Daha gelişmişleri gelecek.Eksikler var.Bu eksiklerden ötürü affola.... :-)  

Buraya tıklayarak kaynak kodları ve programı indirebilirsiniz...

2 Ocak 2011 Pazar

BEN DEKİ DEV C++ VE VISUAL STUDIO FARKI...

Çok basit bir problem...Altı üstü program kullanıcıdan bir sayı isteyecek bu sayının kaç basamaklı olduğunu ve basamak değerlerini kullanıcıya söyleyecek .Algoritmasıda kolay. Her ne kadar kolay ve doğru olsada Dev C++ derleyicisi şifreleme de ki metin testinde yaptığı azizliği gene yaptı ...Ben kodları aşağıya yazdım.İsterseniz sizde derleyin.Varsa visual studio ikisinde de deneyin ve görün.Bende Dev derleyicisi yanlış sonuçlar gösterirken Visual studio doğru sonuçlar gösterdi.




#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int sayi,sayi2;
    int bs=1,k,i;
    printf( "sayi:" );
    scanf("%d",&sayi);
    sayi2=sayi;
    while(sayi2>=10)
    {
                   sayi2=sayi2/10;
                   bs++;
                   }
    printf("basamak sayisi %d dir\n",bs);
    for(i=1;i<=bs;i++)
    {
                      k=sayi/ (int) pow (10,(bs-i));
                      printf("%d. basamak %d dir\n",i,k);
                      sayi=sayi% (int) pow (10,(bs-i));
                      }
    system("pause");
    return 0;
}
Kodları indirme linki :  http://hotfile.com/dl/96004860/685ac37/basamak_degeri.c.html