C Programlama etiketine sahip kayıtlar gösteriliyor.
C Programlama etiketine sahip kayıtlar gösteriliyor.

C Programlama Mükemmel Sayıları Bulmak (Perfect Numbers)

Kendisi hariç bütün pozitif bölenlerinin toplamı kendisine eşit olan sayılara mükemmel sayı denir. Mükemmel sayı terimini ilk olarak Pisagor ortaya atmıştır. Pisagor'a göre sayılarda mükemmellik, bir sayının bölenleriyle ilgiliydi. 

6 bir mükemmel sayıdır. Çünkü 6'nın pozitif bölenleri 1,2,3 ve 6'dır. 1+2+3=6 Bunun gibi 28 de mükemmel sayıdır. 28 = 1 + 2 + 4 + 7 + 14 Sayılar büyüdükçe mükemmel sayıları bulmak daha da zorlaşır. Günümüz bilgisayarlarının işlem gücüyle 34 milyondan fazla basamağı olan mükemmel sayılar keşfedildi. 

* 6,
* 28,
* 496,
* 8128,
* 33550336,
* 8589869056,
* 137438691328,
* 2305843008139952128
*................................................

C programlama dili ile iki sayı arasındaki mükemmel sayıları bulalım:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x, y, bir, iki, z;
    printf("--------------------------------------- \n");
    printf("Birinci sayiyi giriniz: ");
    scanf("%d", &bir);
    printf("ikinci sayiyi giriniz: ");
    scanf("%d", &iki);

    printf("iki sayi araligindaki mukemmel sayilar: \n");
    printf("--------------------------------------- \n");
    printf("%d ve %d: arasinda \n", bir, iki);
    printf("--------------------------------------- \n");

    for(x=bir; x<=iki; x++)
    {
        z = 0;

        for(y=1; y<x; y++)
        {
            if(x % y == 0)
            {
                z += y;
            }
        }

        if(z == x)
        {
            printf("%d, ", x);
        }
    }
    return 0;
}

C Programlama Örnek Kelimeleri Alfabetik olarak Sıralama

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int ametin;
    printf("Lutfen Kelime Sayisini Belirtiniz:\n");
    scanf("%d", &ametin);
    char Kelimeler[ametin][100], t[100];
    int x, y;
    printf("\nLutfen Kelimeleri Giriniz:\n");
    for (x = 0; x < ametin; x++)
        scanf("%s", Kelimeler[x]);

    printf("\nMetindeki Kelimeler:");
    for (x=0; x<ametin; x++)
    {
        printf ("\n%s", Kelimeler[x]);
    }
    for (x = 1; x < ametin; x++)
    {
        for (y = 1; y < ametin; y++)
        {
            if (strcmp(Kelimeler[y - 1], Kelimeler[y]) > 0)
            {
                strcpy(t, Kelimeler[y - 1]);
                strcpy(Kelimeler[y - 1], Kelimeler[y]);
                strcpy(Kelimeler[y], t);
            }
        }
    }
    printf("\n---------------------------------------------------\n");
    printf("\nMetindeki Kelimeleriniz Alfabetik Olarak Siralandi: ");
    for (x = 0; x < ametin; x++)
        printf("\n%s", Kelimeler[x]);
    return 0;
}


C Programlama Örnekler 4

Örnek 1 : Kullanıcının girmiş olduğu iki sayının arkadaş sayı olup olmadığını bulan bir C programı yazınız. 

Arkadaş Sayılar: A ve B pozitif iki sayı olsun. A'nın kendisi hariç pozitif bölenlerinin toplamı B ise ve B'nin kendisi hariç pozitif bölenlerinin toplamı A ise A ile B arkadaş sayılardır. 

Örneğin: 
220 ile 284 arkadaş sayılardır.
S(220)=1+2+4+5+10+11+20+22+44+55+110=284
S(284)=1+2+4+71+142=220 
 
#include <stdio.h>
#include <conio.h>
int main()
{
    int sayi1,sayi2;
    int s1Toplam=1,s2Toplam=1;
    int gecici,i=2;
    printf("Lutfen Sayilari Giriniz:\n");
    scanf("%d %d",&sayi1,&sayi2);
    if (sayi2>sayi1)
    {
        gecici=sayi1;
        sayi1=sayi2;
        sayi2=gecici;
    }
    while( i<=(sayi1/2) )
    {
        if(sayi1%i==0)
            s1Toplam=s1Toplam+i;
        if(sayi2%i==0)
            s2Toplam=s2Toplam+i;
        i=i+1;
    }
    if(sayi1==s2Toplam && sayi2==s1Toplam)
        printf("\nArkadas Sayilardir.");
    else
        printf("\nArkadas Sayi Degillerdir.");
    getch();
    return 0;
}


C Programlama Örnek Insertion Sort (Eklemeli Sıralama)

Insertion Sort (Eklemeli Sıralama) Bubble Sort algoritmasının iyileştirilmiş biçimidir. Sıralanacak dizinin ilk elemanını yerine bırakarak, sonraki elemanları (alt diziyi) sırayla alarak sıraya uygun olan yere sokar. Instertion Sort algoritması ile dizinin elemanları küçükten büyüğe sıralanır. En son ekrana dizinin yeni hali yazdırılır.
Eklemeli sıralama algoritmasının rastgele üretilmiş sayıları nasıl sıraya dizdiğini gösteren bir örnek.
#include <stdio.h>

int main()
{
  int n, dizi[100], x, y, t;

  printf("LUTFEN DIZI ELEMAN SAYISINI GIRINIZ\n");
  scanf("%d", &n);

  printf("%d ELEMANA AIT DEGERLERI GIRINIZ\n", n);

  for (x = 0; x < n; x++) {
    scanf("%d", &dizi[x]);
  }

  for (x = 1 ; x <= n - 1; x++) {
    y = x;

    while ( y > 0 && dizi[y] < dizi[y-1]) {
      t          = dizi[y];
      dizi[y]   = dizi[y-1];
      dizi[y-1] = t;

      y--;
    }
  }

  printf("ARTAN SIRAYA GORE LISTELEME:\n");

  for (x = 0; x <= n - 1; x++) {
    printf("%d\n", dizi[x]);
  }

  return 0;
}

C Programlama Örnek Selection Sort (Seçerek Sıralama)

Verinin hafızada sıralı tutulması için geliştirilen sıralama algoritmalarından  (sorting algorithms) Selection Sort (Seçerek Sıralama) algoritmasında uygulanan her adımda eldeki dizinin en küçük elemanı bulunuyor ve en başa atılıyor. Bu işlem her seferinde tekrarlanıyor. Dizinin sonuna gelindiğinde dizimiz küçükten büyüğe sıralanmış oluyor. Büyük sayıda verileri sıralamak için elverişsizdir. Bubble Sort algoritmasının iyileştirilmiş biçimi sayılır.






#include <stdio.h>

int main()
{
   int dizi[100], s, x, y, pw, t;

   printf("LUTFEN DIZI ICIN ELEMAN SAYISINI GIRINIZ\n");
   scanf("%d", &s);

   printf("%d ELEMANA AIT DEGERLERI GIRINIZ\n", s);

   for ( x = 0 ; x < s ; x++ )
      scanf("%d", &dizi[x]);

   for ( x = 0 ; x < ( s - 1 ) ; x++ )
   {
      pw = x;

      for ( y = x + 1 ; y < s ; y++ )
      {
         if ( dizi[pw] > dizi[y] )
            pw = y;
      }
      if ( pw != x )
      {
         t = dizi[x];
         dizi[x] = dizi[pw];
         dizi[pw] = t;
      }
   }

   printf("ARTAN SIRAYA GORE LISTELEME:\n");

   for ( x = 0 ; x < s ; x++ )
      printf("%d\n", dizi[x]);

   return 0;
}


C Programlama Örnek Bubble Sort (Kabarcık Sıralaması)

Verinin hafızada sıralı tutulması için geliştirilen sıralama algoritmalarından (sorting algorithms) arasında yazılması en kolay olan, ama büyük dizilerde çok yavaş kalan bir sıralama yöntemidir.

Kabarcık sıralaması'nın rastgele üretilmiş sayıları sıraladığını gösteren bir örnek
Sıralanacak dizinin üzerinde sürekli ilerlerken her defasında iki öğenin birbiriyle karşılaştırılıp, karşılaştırılan öğelerin yanlış sırada olmaları durumunda yerlerinin değiştirilmesi mantığına dayanır. Algoritma, herhangi bir değişiklik yapılmayıncaya kadar dizinin başına dönerek kendisini yineler. Adına "Kabarcık" sıralaması denmesinin nedeni büyük olan sayıların aynı suyun altındaki bir kabarcık gibi dizinin üstüne doğru ilerlemesidir. 

#include <stdio.h>

int main()
{
  int dizi[100], s, x, y, t;

  printf("LUTFEN DIZI ICIN ELEMAN SAYISINI GIRINIZ\n");
  scanf("%d", &s);

  printf("%d ELEMAN DEGERLERINI GIRINIZ\n", s);

  for (x = 0; x < s; x++)
    scanf("%d", &dizi[x]);

  for (x = 0 ; x < ( s - 1 ); x++)
  {
    for (y = 0 ; y < s - x - 1; y++)
    {
      if (dizi[y] > dizi[y+1])
      {
        t         = dizi[y];
        dizi[y]   = dizi[y+1];
        dizi[y+1] = t;
      }
    }
  }

  printf("ARTAN SIRAYA GORE LISTELEME:\n");

  for ( x = 0 ; x < s ; x++ )
     printf("%d\n", dizi[x]);

  return 0;
}

C Programlama Örnek Onluk Sistemi İkili Sisteme Dönüştürme

Kullanıcıdan alınan Decimal (Ondalık Sistem) sayıyı Binary (ikili Sisteme) dönüştüren C Programı.

#include <stdio.h>

int main()
{
  int s, x, y;

  printf("LUTFEN BIR SAYI GIRINIZ\n");
  scanf("%d", &s);

  printf("%d IKILI SAYI SISTEMINDE:\n", s);

  for (x = 50; x >= 0; x--)
  {
    y = s >> x;

    if (y & 1)
      printf("1");
    else
      printf("0");
  }

  printf("\n");

  return 0;
}

C Programlama Örnek Armstrong Sayılar

Tüm basamaklarındaki rakamların sayı değerlerinin küpleri toplamı, kendisine eşit olan sayılara "Armstrong sayı" denir. Diğer bir deyişle her bir basamağın o sayının basamak sayısı kadar üssü alınarak toplanmasıdır. Eğer toplam bu sayıyı veriyorsa o sayı Armstrong Sayıdır.

Bazı Armstrong sayıları: 0, 1, 2, 3, 153, 370, 407, 1634, 8208

153 = 13 + 53  33
1634 = 14 + 64 + 34 + 44

#include <stdio.h>

int pw(int, int);

int main()
{
   int s, sonuc = 0, gecici, bdeger, basamak = 0;

   printf("LUTFEN BIR SAYI GIRINIZ\n");
   scanf("%d", &s);

   gecici = s;
   while (gecici != 0) {
      basamak++;
      gecici = gecici/10;
   }

   gecici = s;

   while (gecici != 0) {
      bdeger = gecici%10;
      sonuc = sonuc + pw(bdeger, basamak);
      gecici = gecici/10;
   }

   if (s == sonuc)
      printf("%d ARMSTRONG SAYIDIR.\n", s);
   else
      printf("%d ARMSTRONG SAYI DEGILDIR.\n", s);

   return 0;
}

int pw(int s, int r) {
   int c, p = 1;

   for (c = 1; c <= r; c++)
      p = p*s;

   return p;

C Programlama Örnek Palindrome Sayılar

Tersten ve düzden okunduğu zaman okunuş yönüyle aynı olan sayılara Palindromik Sayılar denir.

Örnek: 3,5,8,101,232,3663,8008,12431 vb.

Asal palindromik sayılar:  2, 3, 5, 7, 11, 101, 131, 151, 181, 191,….
Karesel palindromik sayılar: 0, 1, 4, 9, 121, 484, 676, 10201, 12321, 14641, 40804, 44944,….
Küpsel palindromik sayılar: 0, 1, 8, 343, 1331, 1030301, 1367631, 1003003001,....

#include <stdio.h>

int main()
{
   int n, t = 0, temp;

   printf("LUTFEN BIR SAYI GIRINIZ\n");
   scanf("%d",&n);

   temp = n;

   while( temp != 0 )
   {
      t = t * 10;
      t = t + temp%10;
      temp = temp/10;
   }

   if ( n == t )
      printf("%d PALINDROMIK BIR SAYIDIR\n", n);
   else
      printf("%d PALINDROMIK DEGILDIR\n", n);

   return 0;
}


C Programlama Örnekler 3

Örnek 1 : 1'den n'e kadar Olan Çift Sayıların Toplamı ve Ortalaması
#include <stdio.h>
#include <conio.h>

int main(){

    int adet, sayac = 0, toplam = 0, i;

    printf("Lütfen kontrol edilecek n degerini giriniz: ");
    scanf("%d", &adet);

    if( adet <= 1 ){  //1 ve 1'den küçük ise sonlandır.
        printf("Lutfen 1 den buyuk deger giriniz!");
        getch();
        return 0;
    }

    for ( i=1; i<=adet; i++ ){
        if( i % 2 == 0){
            toplam+=i;
            sayac++;
        }
    }

    printf("Toplam= %d\n", toplam);
    printf("Ortalama= %d", toplam / sayac);

    getch();
    return 0;

}

C Programlama Örnek Enigma Makinesi (Enigma Machine)


Örneğimize geçmeden önce Enigma Makinesini tanıyalım. Bir Rotor makinesi olan enigma kriptolojide şifreleme ve deşifre işlemleri için kullanılan elektro-mekanik akışlı şifreli bir cihazdır. Enigma Makinesi ilk olarak Birinci Dünya Savaşının sonlarında Alman Mühendis Arthur Scherbius tarafından keşfedilmiştir. Scherbius tarafından geliştirilen bu mekanik şifreleyici cihaz 1920’lerin başlarında ticari amaçlı kullanılmış, ardından İkinci Dünya Savaşı öncesinde ve süresince Nazi Almanya’sında olmak üzere çeşitli ülkelerde askeri ve hükümete bağlı kuruluşlar tarafından benimsenmiştir.



(Yararlı Bağlantılar)
Enigma Şifrelemesinin Analizi ve Genel Prensipler
Enigma Makinesinin Çalışma Sistemi
Unutulmuş Bir Dahi Alan TURING
Alan Turing: Creator of modern computing
Wikipedia: Enigma Machine
Online Enigma Makinesi Emülatörü
Dünya Bilim Festivali — Enigma Tanıtımı
KhanAcademy Enigma Şifreleme Makinesi

C Programlama Sınıflar ve Nesneler

Sınıf (Class) Kavramı : Nesne tabanlı programlamada gereken nesneleri sınıflar yardımıyla oluşturmaktır. Sınıfları, nesneleri oluşturmak için önceden oluşturulmuş bir kalıp veya ilk örnek olarak da düşünülebilir. Örneğin, kağıt üzerine detayları çizilmiş bir ev planını kullanarak aynı evden pek çok örnek ev oluşturulabilir. İşte burada kağıt üzerindeki bu plan sınıftır. Bu plana bakılarak yapılan ev ise sınıftan oluşturulan nesne örneğidir.

Sınıf kavramı, nesne-tabanlı programlamanın temelini oluşturur. Nesnelerin her birinin durumu ve davranış özellikleri vardır. Bir Nesne, durum ve davranış özelliklerini içinde barındırır.

Oluşturulan her nesnenin durum özelliklerine veri üyesi (data member), davranış özelliklerine üye fonksiyonları (member function) denir.

Örneğin, bir bisikleti yazılım nesnesi olarak tanımlarsak bisiklet sınıfında hız, vites, jant büyüklüğü gibi veri üyeleri tanımlanabilir. Ayrıca vites değiştirmek, fren yapmak ve hızı artırmak için üye fonksiyonları tanımlamak gereklidir. 

Sınıf tanımında yer alan üyelere erişimi, farklı erişim etiketleri kullanarak sınırlandırılabilir:

public:  Bu etiket altında tanımlanan üyelere programın her yerinden erişilebilir.
private: Bu etiket altında tanımlanan üyelere sadece sınıf içerisinden erişilebilir.

Nesne (Object) Kavramı : Sınıf tipinde tanımlanan değişkenlere nesne (object) adı verilir. Sınıf tanımında public veya private belirtilmezse, tanımlanan sınıf üyelerinin erişim etiketleri private olarak varsayılır.

Sınıf Tanımlama Örnek: 
#include <iostream>
using namespace std;
class sinifOrnek
{
    public:
      int x;        //Veri Üyesi (data member)
      void yaz()    //Fonksiyon Üye (member function)
      {
           cout<<"x="<<x<<endl;
      }
};
int main()
{
   sinifOrnek y;  //sinifOrnek sınıfı tipinde y nesnesi tanımlanıyor.
   y.x = 3;      //y nesnesinin x üyesine 3 atanıyor.
   y.yaz();     //y nesnesinin yaz() fonsiyonu çağrılıyor
   return 0;
}

Aynı yapılarda olduğu gibi bir nesnenin veri veya fonksiyon üyelerine erişmek için nokta (.) operatörünü kullanırız. nesneAdı.üyeİsmi
   y.x = 3;
   y.yaz();

Örnek 1:
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
class Ornek
{
      public:
             int i; //Her noktadan erişilebilen üye
             void yaz()
             {
                  t = 6.1; //Üye fonksiyondan özel t üyesine erişilebilir.
                  z = 8;
                  cout<<"i= "<<i<<endl;
                  cout<<"t= "<<t<<endl;
                  cout<<"z= "<<z<<endl;
             }
      private:  //Sadece sınıf içinden erişilebilen üyeler
              float t;
              int z;
};
int main()
{
    Ornek nesne;  //Ornek sınıfı tipinde nesne isimli nesne tanımı
    nesne.i = 6;  //nesne isimli nesnenin i üyesine 6 atanıyor.
    nesne.yaz(); //nesne isimli nesnenin yaz() fonksiyonu çağrılır.
getch();
}

Örnek 2:
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
class Ornek
{
      public:
             int i; //Her noktadan erişilebilen üye
             void yaz()
             {
                  t = 6.1; //Üye fonksiyondan özel t üyesine erişilebilir.
                  z = 8;
                  cout<<"i= "<<i<<endl;
                  cout<<"t= "<<t<<endl;
                  cout<<"z= "<<z<<endl;
             }
      private:  //Sadece sınıf içinden erişilebilen üyeler
              float t;
              int z;
};
int main()
{
    Ornek nesne;  //Ornek sınıfı tipinde nesne isimli nesne tanımı
    nesne.i = 6;  //nesne isimli nesnenin i üyesine 6 atanıyor.
    nesne.yaz(); //nesne isimli nesnenin yaz() fonksiyonu çağrılır.
getch();
}

int main()
{
   ornek3 nesne;
   nesne.i =5;
   nesne.t =6.1;
   nesne.z =8;
   nesne.yaz()
}

Örnek 2'de public olarak etiketlenmiş a üyesine main fonksiyonundan erişim sağlanabilirken, private olarak etiketlenmiş b ve c üyelerine erişim sağlanamayacaktır.

Nesne Tanımlama Örnek: 
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

class NesneOrnek
{
      public:
            int n;
};
int main()
{
    NesneOrnek x,y; //NesneOrnek tipinde x ve y isimlerinde nesneleri tanımlıyoruz.
    y.n=6; //y nesnesinin n üyesine 6 atanır.
    cout<<" y nesnesinin n uyesi: "<<y.n<<endl;
    x=y; //" x nesnesini y nesnesine kopyalıyoruz
    cout<<" x nesnesinin n uyesi: "<<x.n<<endl;
    NesneOrnek &ref=y; //y nesnesini gösteren referans değişkeni ref tanımlıyoruz.
    cout<<" ref referansinin n uyesi: "<<ref.n<<endl;
    ref.n =5; //ref'in referans olduğu nesnenin n üyesine  ataması yapıyoruz.
    cout<<" ref referansinin n uyesi: "<<ref.n<<endl;
    NesneOrnek ndizi[3]; //NesneOrnek tipinde 3 nesneyi içeren bir dizi tanımlıyoruz.
    ndizi[2].n=4; //ndizinin 2.indeksli nesnesinin n üyesine 4 ataması yapıyoruz.
    cout<<" ndizi dizisinin 2.nesnesinin n uyesi: "<<ndizi[2].n<<endl;
getch();
}


Örnek 3: 
Bir  Su Otamatımız olsun ve programımızda SuOtomatı adında bir sınıf tanımlayalım.

Durum özellikleri veri üyeleri (data members) :
  • ŞişeSu Fiyatı
  • Otomatta Kalan Su Sayısı
Davranış özellikleri üye fonksiyonları (member functions):
  • ilkVerilenSu(): fiyat ve Su Şişesi sayısına parametre olarak gelen değerleri atayacak. Varsayılan değeri 1 lira, sayı değeri ise 100 olarak alınacak.
  • suVerme(): Kullanıcıya ücreti gösterecek. Kullanıcı yeterli ücreti girdiyse ve otomatta su mevcut ise kullanıcıya bir şişe su verecek ve kullanıcının para üstünü hesaplayacak.
  • goster(): Su fiyatını ve otomatta kalan şişe sayısını verecek.
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;

class SuOtomati
{
      float fiyat;
      int sayi;
      public:
             void ilkVerilenSu (float f=1, int s=100);
             void suVerme();
             void goster();
};

void SuOtomati::ilkVerilenSu( float f, int s)
{
     fiyat=f;
     sayi=s;
}

void SuOtomati::suVerme()
{
     float odeme,fark;
     cout<<"Bir Sise Su Fiyati: "<<fiyat<<" lira."<<endl;
     cout<<"Odemeniz: ";
     cin>>odeme;
     if((odeme>=fiyat)&&(sayi>0))
     {
       cout<<"Su Veriliyor."<<endl;
       sayi--;
       fark=odeme-fiyat;
       if(fark>0)
       {
                 cout<<"Para Ustunuz: ";
                 if(fark<1.0)
                    cout<<fark<<" lira"<<endl;
                 else
                    cout<<fark*100<<" kurus"<<endl;
       }
}
else
    cout<<"Otomatta Su Mevcut Degil";
}

void SuOtomati::goster()
{
     cout<<"Son Durum:"<<endl;
     cout<<"Bir Sise Su Fiyati: "<<fiyat<<endl;
     cout<<"Otomatta Kalan Su Sayisi: "<<sayi<<endl;
}
int main()
{
    SuOtomati univ;
    univ.ilkVerilenSu();
    univ.suVerme();
    univ.goster();
    getch();
}


Son örneğimizde diğer örneklerden farklı olarak ikili kapsam çözme operatörü (::) binary scope resolution operator kullandık.

void SuOtomati::ilkVerilenSu( float f, int s)

Bu operatörün amacı sınıfın dışında tanımlanan fonksiyonun hangi sınıfın üye fonksiyonu olduğunu belirtmek içindir.

C Programlama Gösterge (Pointer) Kavramı

Değişkenlerin kapladıkları hücrelerin adreslerini saklamak için başka değişkenler de kullanabiliriz. Bu değişkenlere gösterge adı verilir. Göstergeler, diğer değişkenler gibi, sayısal bir değişkenlerdir. Bu sebeple kullanılmadan önce program içinde bildirilmelidir. 

Sözdizimi :   tip_adı *gösterge_adı;

int *bayraktar;
float *x, *y, *z

Gösterge Operatörleri ( & ve *) : "&" değer atama operatörüdür. Örneğin bayraktar = &y; ifadesinde y değişkenini gösteren bayraktar göstergesidir. "*"  yönlendirme operatörünün göstergeyi tanımlamanın dışında bir görevi daha vardır. Örneğin *bayraktar ifadesi, bayraktar'ın gösterdiği hücrenin içeriğine ulaşmak içinde kullanılabilir. *bayraktar = 66; gibi…

Bir göstergenin bellekte herhangi bir hücreyi göstermesini istemediğimiz zaman NULL isimli sabit kullanılır. NULL göstergenin bellekte hiç bir yeri göstermediğini belirten 0 değeridir.
int *bozok = NULL;

Dinamik Bellek Kullanımı: Programın çalışması esnasında özel komutlar kullanarak bellekten yer alınıp kullanılmasına dinamik bellek kullanımı adı verilir. Dinamik değişkenler için bellekte ayrılan yere yığın (heap) adı verilir. Dinamik bellek kullanımını new ve delete komutları ile gerçekleştiririz..

new komutu ile bellekten istediğimiz veri Npi boyutunda bir yer alabiliriz.
int *ornek; //ornek adlı tamsayı gösterecek bir gösterge tanımlıyoruz.
ornek = new int; //bellekten tamsayı kadar yer ayrılır, bu yerin adresi burada ornek'e aktarılır.
*ornek = 9; //bellekten alınan yeni yere 9 atanır.

int *bozok=new int(9); //değişken tanımlanması esnasındada ilk ataması yapılabilir.

Dinamik bir Dizi Oluşturalım ve tekrar bellekten Silelim :
int *ornekdizi; //ornekdizimiz tamsayı gösterecek şekilde tanımlanır.
ornekdizi=new int[10]; //bellekten 10 tamsayı dizisi için yer tahsis edilir ve dizinin adresi ornekdizi'ye atanır.
ornekdizi[2]=16; //bellekten alınan dizinin 1.indeksteki elemanına 15 atanır.
Bellekten new ile aldığımız yerler, kullanımları sona erdiğinde yeniden kullanılamazlar. Bu nedenle bellekten aldığımız hücreleri program bitmeden delete komutu ile silmemiz gerekir.

int *bozok=new int; //bozok göstergesine tamsayı boyutunda yerin adresi atanır.
*bozok=16; //bozok göstergesinin gösterdiği yere 16 atanır.
cout<<*bozok; //atanan 16 değeri yazdırılır.
delete bozok; //ayrılan yer belleğe geri döndürülür.

int *ornekdizi; //ornekdizi adında tamsayı gösterecek bir gösterge tanımlanır.
ornekdizi=new int[8]; //bellekten 8 tamsayı dizisi için yer ayrılır ve dizinin adresi ornekdizi'e atanır.

ornekdizi[1]= 13; //bellekten alınan dizinin 1.indeksteki elemanına 13 atanır.
delete [] ornekdizi; //oluşturulan dizinin tüm elemanları belleğe geri döndürülür.

Örnek:
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

void oku(int[],int);
int main(int argc, char *argv[])
{
   int mevcut, toplam=0;
   int max=0;
   int *notlar;
   cout<<"Sinif mevcudunu Giriniz: ";
   cin>>mevcut; //Sınıf mevcudunu okuyoruz
   notlar=new int[mevcut]; //Sınıf mevcudu kadar dinamik dizi yaratıyoruz
   oku(notlar,mevcut);

   for(int i=0; i<mevcut;i++)
   {
           toplam+=notlar[i];
           if (notlar[i]>max)
           max=notlar[i];
   }
   cout<<"Sinif Ortalamasi= "<<toplam/mevcut<<endl;
   cout<<"En yuksek not = "<<max<<endl;
   delete [] notlar;
   getch();
}
void oku(int notDizi[], int boyut) //Notları okuduğumuz fonksiyon
{
     cout<<"Notlari Giriniz:";
     for(int i=0; i<boyut;i++)
             cin>>notDizi[i];
}

C Programlama Yapılar (Structures)

Herkese selamlar bu makalemde C Programlama Dilinde önemli bir yeri olan Yapılar (Structures) hakkında bildiklerimi paylaşmak istiyorum. 

Yapılar (structures) içinde aynı veya farklı veri tipinde birden fazla eleman saklayabildiğimiz bileşik veri tipidir. Programlarımızda değişkenleri kullandığımız için büyük önemleri vardır. Örneğin dizilerde hafızada bir takım yerler açılır, bu hafıza kısımlarını doldururken belirlemiş olduğunuz değişken tipinin dışına çıkamayız…işte yapılar saysesinde farklı veri tiplerinde birden fazla eleman saklayabiliriz.

struct insan{
       string isim;
       float boy;
       int kilo;
}insan birey; //birey nesnesi

Eğer veri tipi tanımlamayıp sadece değişken tanımlamak istiyorsak bunu şu şekilde gerçekleştirebiliriz;

struct {
       string isim;
       float boy;
       int kilo;
}birey;

Yapılara İlk Değer Atama : Tüm değişkenlere yapabildiğimiz gibi yapı değişkenlerine de tanımları sırasında ilk değer ataması yapabiliriz.
insan birey={"ibrahim bayraktar",1,74,100}; //birey yapı değişkeni

Yapı Elemanlarına Erişim: Yapıda yer alan elemanlara, nokta (.) operatörü ile erişebiliriz.
yapıDegiskeni.elemanAdı

Örnek :
cout<<kitap1.isim;
kitap1.yayinyili+=5;
if(kitap1.baski>35)…

kitaplar kitap1,kitap2;
cin>>kitap1.isim>>kitap1.yayinyili>>kitap1.baski;
kitap2=kitap1;

Yapı Elemanlarına Erişim Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
struct rasyonel_erisim //yapiyi tanımliyoruz.
{
int pay, payda;
};
int main(int argc, char *argv[])
{
    rasyonel_erisim sayi1,sayi2,sonuc;
    cout<<"1.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi1.pay>>sayi1.payda;  //burada sayilar okunuyor
    cout<<"2.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi2.pay>>sayi2.payda;
    sonuc.pay=sayi1.pay * sayi2.pay;
    sonuc.payda=sayi1.payda*sayi2.payda; //pay ve paydaları carpiyoruz
    cout<< sayi1.pay<<"/"<<sayi1.payda<<" x ";
    cout<< sayi2.pay<<"/"<<sayi2.payda<<" = ";
    cout<<sonuc.pay<<"/"<<sonuc.payda<<endl; //sonucu yazdiriyoruz
    getch();
}

İç İçe Structures: Bir yapının elemanı başka bir yapı olabilir. Bu durumdaki yapılara iç içe yapı (nested structures) adı verilir.

struct tarih {
       string ay;
       int yil,gun;
};
struct insan {
       string isim;
       float boy;
       int  kilo;
       struct tarih dogumTarihi;
};
insan icice;
icice.dogumtarihi.gun=17;

İç İçe Structures Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

struct personelBilgi {
    char * isim;
    char * soyisim;
    char * Egitim;

  };

struct personelKayit{
  char * kayitYapanPersonel;
  char * kayitTarihi;
  struct personelBilgi personel;
};

int main(){

  struct personelKayit pk001;

  pk001.kayitYapanPersonel="Ibrahim BAYRAKTAR";
  pk001.kayitTarihi="12.01.2015";
  pk001.personel.isim="FISTIKCI";
  pk001.personel.soyisim="SAHAP";
  pk001.personel.Egitim="Lisans";

  printf("Kayit Islemini Yapan Personel: %s\n", pk001.kayitYapanPersonel);
  printf("Kayit Tarihi: %s\n", pk001.kayitTarihi);

  printf("Personel Isim: %s\n", pk001.personel.isim);
  printf("Personel Soyisim: %s\n", pk001.personel.soyisim);
  printf("Personel Egitim Duzeyi: %s\n", pk001.personel.Egitim);

  getch();
}

C Programlama Dizi Örnekleri

Örnek 1: 10 tamsayıyı 10 elemanlı bir diziye okuyup içlerinden negatif olanları negatif isimli bir diziye, pozitif olanlarını pozitif isimli diziye atan program.


#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
void yazdir(int[], int);
int main(int argc, char *argv[])
{
    int sayilar[10], pozitif[10], negatif[10];
    int poz=0, neg=0;
    cout<<"10 Sayi Giriniz: ";
    for (int i=0; i<10;i++)
    {
        cin>>sayilar[i];
        if (sayilar[i]>0) pozitif[poz++]=sayilar[i];
        else if (sayilar[i]<0) negatif[neg++]=sayilar[i];
    }
    cout<<"Girilen Sayilar: ";
    yazdir(sayilar,10);
    cout<<"Pozitif Sayilar: ";
    yazdir(pozitif,poz);
    cout<<"Negatif Sayilar: ";
    yazdir(negatif,neg);
    getch();
}
void yazdir(int a[], int boy)
{
     for (int j=0; j<boy;j++)
         cout<<a[j]<<" ";cout<<endl;
}
 
Örnek 2: Birincisi 3 karakterden oluşan, ikincisi 6 karakterden oluşan iki kelimeyi iki diziye okutuyoruz. İlk kelimenin tüm harflerinin ikinci kelimede olup olmadığını ekrana yazdıralım.

#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char birincikelime[3], ikincikelime[6];
    bool buldum=true;
    cout<<"Birinci Kelimeyi Giriniz: ";
    cin>>birincikelime;
    cout<<"Ikinci Kelimeyi Giriniz: ";
    cin>>ikincikelime;
    for (int i=0; i<3&&buldum;i++)
    {
        buldum=false;
        for(int j=0; j<6&&!buldum;j++)
        if (birincikelime[i]==ikincikelime[j]) buldum=true;
    }
    if (buldum) cout<<birincikelime<<" kelimesinin tum harfleri "<<ikincikelime<<" kelimesinde bulunmustur.";
    else cout<<birincikelime<<" kelimesinin tum harfleri"<<ikincikelime<<" kelimesinde bulunamamistir.";

    getch();
}


C Programlama Yarıçapı girilen dairenin çevresini ve alanını hesaplama Örnek

#include <cstdlib>
#include <iostream>
#include <conio.h>
#define PI 3.14
int main(int argc, char *argv[])
{
using namespace std;
{
float radius;
float circum, area;
cout << "Dairenin Yaricapini Giriniz= ";
cin >> radius;
circum = 2 * PI * radius;
area = PI * radius * radius;
cout << "Dairenin Cevresi= " << circum << endl;
cout << "Dairenin Alani= " << area << endl;
getch();
}
}

C Programlama SWITCH CASE Örnek

Dışardan girilen bir sayi için;
f:faktöriyel hesabı yapan,
i:girilen sayı kadar isim yazan
t:girilen sayıya kadar kaç tane tek var
y:girilen sayıya kadar kaç tane cift var

İşlemlerini yapan yapan programı switch case ile yazınız.
Program sonunda; Devam etmek istiyormusun(E/H) sorusuyla başa dönmelidir.
Faktöriyel döngüsü do while; isim yazdırma döngüsü while ile yazılmalıdır.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
    gidilecekYer: ;
    system("cls");
    int s;
    int f=1;
 int u=1;
 int x,m;
 char z;

    printf ("Islem Yapilacak Sayiyi Giriniz: ");
    scanf("%d",&s);
 printf("\n\n(f) Faktoriyel Hesapla");
 printf("\n(i) Girilen Sayi Kadar Isim Yaz");
 printf("\n(t) Sayiya kadar kac adet tek sayi var");
 printf("\n(y) Sayiya kadar kac adet cift sayi var\n\n");

 scanf("%s",&z);

      switch (z) {
  case 'f':
   do
   {
   f=f*s;
   s--;
   }
   while (s!=1); //sayi 1 e esit degilse dönecek. do calisacak.
   printf ("Faktoriyel Sonuc: %d",f);
   break;
    case 1:
   printf ("1e");
   break;
        case 'i':
   m=1;
   while (m<s+1)
   {
   printf ("BAYRAKTAR\n");
   m++;
   }
   break;

        case 't':
   for(m=0;m<s+1;m++)
   {
    if(m%2==1)
    {
   printf("tek sayi: %d",m);
    }
   }
   break;

  case 'y':
   x=1;
   for(m=0;m<s+1;m++)
   {
    if(m%2==0)
    {
   printf(x+".cift sayi: %d",+m);
   x++;
    }
   }
   break;

            default: printf("Hatali Deger Girdin"); break;
}

   char x2;
   printf("\n\nDevam Etmek istiyor musunuz ? (e/h)\n");
   scanf("%s",&x2);


   if(x2=='e')
   {
               goto gidilecekYer;
}
}

C Çalışmaları

S1-klavyeden girilen bir sayıdan 0'a kadar ekrana yazan programı yazınız.
S2-klavyeden girilen bir sayıya kadar olan rakamları alt alta ekrana yazdıran programı yazınız .
S3-klavyeden girilen 10 sayıdan tek olanların toplamını bulan programı yazınız.

C1:
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[])
{
    int sayac;
  int sayi; //Sayı değişkenini tanımlıyorum.
  printf("Sayiyi Girin: \n");
  scanf("%d",&sayi); //değişkene dışardan değer aldırıyorum.
 
  if(sayi<0) //eğer sayı sıfırdan küçükse bu alan çalışacak.
  {
            printf("0'a kadar olan sayilar asagida: \n");
            for(sayac=sayi; sayac<=0 ; sayac=sayac+1)
            {
                   printf("%d\n",sayac);
            }
  } else
  if(sayi==0) //Eğer sayı 0 a eşitse bu alan çalışacak..
  {
  printf("Zaten 0 Girmissiniz..");
  }
  else //Eğer sayı 0 dan büyükse bu alan çalışacak..
  {
              printf("\n0'a kadar olan sayilar asagida: \n\n");

            for(sayac=sayi; sayac>=0 ; sayac=sayac-1)
            {
                   printf("%d\n",sayac);
            }
  }
  printf("\nCikis icin herhangi bir tusa basin…");
  getch();
}

C2:

#include <stdio.h>
#include <conio.h>

int main(int argc, char *argv[])
{
    int sayac;
    int sayi;
    printf("Bir Sayi Girin..\n");
    scanf("%d",&sayi);
  
   if(sayi > 0)
   {
    for (sayac=0;sayac <= sayi; sayac ++)
    {
        printf("\n%d",sayac);
    }
}
else if(sayi==0)
{
     printf("0 girdiniz…");
 } else if(sayi<0)
 {
        printf("Sayi sifirdan kucuk");
        for (sayac=sayi;sayac <=0;sayac++)
        {
            printf("\n%d",sayac);
        }
       
       
        } else {
               printf("Harici Hata var. Yanlis Birseyler yapiyor olmalisin..");
               }
               printf("\n\nCikis icin herhangi bir tusa basin..");
  getch();
 
}

C3:

int main(int argc, char *argv[])
{
    int sayac;
    int toplam=0;
    int dizi[9];
    for(sayac=0;sayac<=9;sayac++)
    {
            printf("%d. Elemani girin\n",sayac+1);
            scanf("%d",&dizi[sayac]);
            printf("%d. Eleman Tanimlandi..\n",sayac+1);
            }
  for(sayac=0;sayac<=9;sayac++)
  {
                               if(dizi[sayac]%2==1) //girilen sayıların 2 ile bölümünden kalan 1 ise, yani tek sayılar ise.
                               {
                                      toplam=toplam+dizi[sayac];
                                      printf("Tek Sayilar: %d\n",dizi[sayac]);            
                                                   }
                               }
                               printf("Toplami: %d",toplam);
                               getch();
}

C Kaynakları Faydalı Linkler

C ve C++ Kullanıcıları Derneği
Boost C++ Kütüphanesi
C'de Sık Sorulan Soruların Yanıtları
www.codeguru.com
www.codeproject.com
Programcının Cenneti
C Programlama Wikipedia
Cplusplus.com
Hot Scripts (C & C++) 
Çağatay Cebi C Programlama
C ve Sistem Programcıları Derneği
C Programming Tutorial
CProgramming.com
C Programming Tutorial Beginners
C Programlama Notları
CondingUnit C Tutorials
Programming in C - UNIX System Calls and Subroutines using C
comp.lang.c Frequently Asked Questions
A collection of useful libraries written in C
The C Programming Language Standard
Microsoft C Language Reference
Online C/C++ Tutorials and Documentation
Tutorialspoint C Programming
learn-c.org
w3schools C Programming



C Programlama Diziler (Arrays)

C Programlama

Dizi (array) Nedir? 
Dizi, aynı tip verilerin birbiri arkasına tanımlanmasıdır. Dizi bir kümedir. Aynı tipte verilere tek bir isimle erişmek için kullanılır. Bir dizinin bütün elemanları bellekte peşpeşe saklanırlar. Diziler kullanılarak, aynı isimle birden fazla değişkene erişilebilir ve işlem yapılabilir. Diziler tek ya da çok boyutlu olarak tanımlanabilir ve dizi boyutu ihtiyaca göre ayarlanabilir.char, int, float ve double olarak tanımlanabilen dizilerde sadece aynı veri türünden değişken değerleri yer alabilir.

Dizileri tek boyutlu ve çok boyutlu olarak iki kısma ayırabiliriz. Tek boyutlu dizilere sayı dizilerini ve vektörleri örnek verebiliriz. Çok boyutlu dizilere ise matrisleri örnek verebiliriz..

Tek Boyutlu Diziler (one-dimensional array) : C Programlama Dilinde aynı veri tipinden olan değişkenler tek bir isim altında toplanarak tek boyutlu diziler oluşturulur. Aynı veri türünden ve farklı isimlere sahip çok fazla sayıda değişken tanımlamak yerine, dizi bildirimi yapıp tek isim kullanarak aynı sayıda değişken tanımlamak daha kolaydır.

Tek boyutlu dizilerin bildirimi için kullanılan genel yapı :  veritipi diziAdı [boyut];

Veri Tipi : Dizi elemanlarının tipini belirtir. dizi kaç elemandan oluşur ise oluşsun tipleri aynı olmak zorundadır.
Dizi Adı : Diziye programcının verecegi özerk ismi ifade eder.
Boyut : Dizilerin mutlaka bir boyutu olmak zorundadır. Dizi boyutları "[ … ]" içeriğinde tanımlanır. 

Örnek :
// Örnek Dizi Tanımlama
// 100 elemanlı ve dizi adlı bir double dizisi
double dizi[100];

Örneğimizde 100 elemandan oluşan dizi adlı bir double dizisi oluşturuluyor. Köşeli parantezle içerisindeki 100 sayısı, dizimizin 100 elemanlı olduğunu ifade etmektedir. Tek bir köşeli parantez olduğu için dizimizin tek boyutlu bir dizi olduğunu söyleyebiliriz. 

Tek Boyutlu Dizilerde Atama : Bir dizinin tanımlaması yapıldıktan sonra, atama işlemcisini kullanarak bu diziye değerler atanabilir. C Programlama Dilinde de bir dizinin ilk elemanına 0 değeri ile erişim sağlanır.

Örnek :
int dizi[30];   // 30 elemanlı dizi isimli bir dizi oluşturur. //
dizi[0] = 15;   // Dizinin ilk elemanına 15 değerini atar. //
dizi[16] = 42;  // Dizinin 17. elemanına 42 değerini atar. //