8 Eylül 2011 Perşembe

Karakter Katarlari Fonksiyonlari ve Karakter Dizileri

Iste buraya biraz dikkat, kafaniz gerçekten karisabilir. Daha dogrusu hangisi hangisiydi diye ugrasir durursunuz:)

strlen()

Bu fonksiyon bir karakter dizisinin uzunlugunu verir ve "string.h" kitapliginda tanimlidir. Strlen() fonksiyonu, sözcükler (strings) bölümünde bahsettigimiz string ifadeleri okumak için kullanilir. Fakat sondaki "nul terminator" diger sekliyle '''' degerini okumaz. Örnegimizde de oldugu gibi "Deneme" ve ''d'' ''e'' ''n'' ''e'' ''m'' ''e'' sözcükler kisminda ki biz buna 7 karakter demistik, "null" ile birliktedir ama strlen() bunu bize 6 diye okuyacaktir.
int boy = strlen(h);
for (int i = 0; i<=boy; i++)
y[i] = h[i] ;

strcpy()

Bu fonksiyonda sözcük kopyalamaya yarar ve "string.h" kitapligindadir.
#include <iostream.h>
#include <string.h>

#define OTUZ 30

void main(void)
{
 char Dosya1[OTUZ]="C:belgelerimdeneme.txt",
      Dosya2[OTUZ];
   

strcpy(Dosya2, Dosya1);
cout<<Dosya2<<endl;

cout<<"n ikinci dosyayi gir: ";
cin>>Dosya1;

strcpy(Dosya2, Dosya1);
cout<<"n"<<Dosya2<<"n";
}

strcat()

strcat() fonksiyonu iki karakter katarini bir birine ekler.

strcmp()

Iki sözcügün (iki karakter katarinin) ayni olup olmadigini kontrol etmek için kullanilir. Bu fonksiyon büyük/küçük harf duyarli degildir.

atoi()

Bazen sayilari karakter dizisi olarak okumamiz gerekebilir. Ancak esas, bu sayilarin sayi degerlerine gereksinmemiz vardir. Atoi fonksiyon, bir karakter dizisini alir ve onu sayiya çevirir.
Örnegin; "123456" dizisini alir 123456 sayisina döndürür.

strstr()

Bunu bir örnekle anlatayim: "C++ dersleri" gibi bir sözcügümüz var, strstr() fonksiyonu ile bu sözcük içinde "d" harfinin varligini sorgulayabiliriz.

24 Ağustos 2011 Çarşamba

AVL Ağacı (AVL Tree)

AVL Ağaçları sürekli olarak dengeli olan ikili arama ağaçlarındandır. G.M. Adelson-Velsky ve E.M. Landis tarafından geliştirilmiş olan bu ağaç algoritmasının ismi de bu kişilerin isimlerinin baş harflerinden oluşmaktadır.
Algoritma basitçe, bir düğümün kolları arasındaki derinlik farkı 2 ise bu durumda dengeleme işlemi yapılır. Şayet fark 2′den az ise (yani 1 veya 0) ise bu durumda bir dengeleme işlemine gerek yoktur.
Algoritmanın ağacı dolaşma (traverse) algoritması ikili arama ağaçları ile aynıdır. Ancak ağaca ekleme ve silme işlemleri sırasında ağacın dengesinin bozulması söz konusu olduğu için bu fonksiyonlara ilave olarak derinlik kontrolü eklenmiştir.
Ekleme ve silme işlemlerinde ikili arama ağacının ekleme ve silme işleminin aynısını yaptıktan sonra aşağıdaki dengeleme işlemi yapılır.
Ağaçta ekleme veya silme yapılan her düğüm için:
sol <- Düğümün sol kolunun derinliğini ölç
sağ <- Düğümün sağ kolunun derinliğini ölç
şayet sol - sağ >1
sola dengele
şayet sağ - sol < -1
sağa dengele

8 Ağustos 2011 Pazartesi

Strtok ile Okunan Satırı parçalama

  Kullanıcı dosyasında okunan  veriyi bazen parçalamak durumunda kalırsınız.Mesela dosyada öğrencilere ait yazılı notlarını okumanız isteniyorr.
  
   Mehmet Sağlam 80 70  54
   Nergis Şekerci   65  80 44
   Aydın Bulut Kahraman  26 68 71
   Can Sağlam    56 58 74
   Damla Ezgi Demir 89 96 100

      Şeklindeki ogrenci yapısı içindeki isim soyisim ve not dizilerina atamanız isteniyor.Bunun için normalde fscanf gibi fonksiyonları kullanabilirsiniz.Fakat yukarıdaki veriyi bu şekilde okumaya kalktığınızda Aydın Bulut Kahraman adlı öğrencinde Aydın-isim, Bulut-soyisim değişkenine atanır.Dolayısıyla Kahraman kelimesinin not değişkenine atanması gerekir.(not değişkeni char not[] şeklinde bir karakter dizisi olsun.)

  Bu durumda yapıyı kelime kelime, yerine satır satır okuma işlemini kullanabiliriz.
 
   char veri[100];  şeklinde bir char dizisi tanımlayalım.

   getline(veri, 100)  ile bu veriyi okuyalım.

    Şimdi elimizdeki verinin 3 ya da iki isimli oluşuna göre atama yapmamız gerekiyor.Bunun için önce strtok dizgi parçalama fonksiyonu ile  okuduğumuz satırı parçalayalım.

             char *pch;
             pch=strtok(veri," .,-\t\n");
    Şimdi  parça sayısına göre isim, soyisim  dizilerine okuduğmuz verileri kopyalayalım.


   int  i=0;    
    while(pch!=NULL){
        if(i==0)
          strcpy(isim,pch);               /*   İlk okunan değer isim değişkenine atanır.
      if(i==1){
          strcpy(soyisim,pch);          /*İkinci okunan değer soyisim değişkenine atanır.
          strcpy(yedek, pch);          /*İkinci okunan değer 3 isimli olma ihtimaline karşın yedek bir
.                   }                           /*değişkene  atanır
      if(i==2){
        strcat(isim, " ");
        strcat(isim, yedek);              /* i değişkeni 2 olursa 3. isim var demektir.Bu durumda isim
        strcpy(soyisim,  pch);           /*değişkenine ilk okunan ismin yerine boşluk karakteri ve
          }                                      /* ikinci isim atanır. 3. okunan değer ise soyisim değişkenine
         pch=strtok(NULL," .,- \t\n"); /* atanır.
         i++;
      }







    Yukarıdaki yapı dosyadan okuma sırasında oluşabilecek bu tür durumlarda kullanılabilir.

C ile Dosya İşlemleri

Bu yazının amacı C dilinde dosya işlemlerinin nasıl yapıldığını anlatmaktır. C dilindeki dosya işlemlerinden önce bu dilde yazılan programın çalışacağı işletim sisteminin dosya yapısının iyi bilinmesi gerekmektedir. Bu yazının konusu dışında olan işletim sistemlerinin kullandığı dosya sistemlerini lütfen okuyunuz.
C dilinde dosya işlemleri için file.h dosyasının içerilmesi (include) gerekir.
#include <file.h>
Yukarıda gösterildiği şekilde içerilir.
Dosya Açma
Dosya açmak için fopen fonksiyonu kullanılır. Basitçe dosyanın adını ve açma şeklini alan bu fonksiyon geri değer olarak integer döndürür ve açmanın başarılı olup olmadığı anlaşılabilir.
if(fopen(“deneme.txt”,”r”)){
printf(“dosya açıldı”);
}else{
printf(“dosya açılamadı”);
}
yukarıdaki örnek kodda fopen fonksiyonuna parametre olarak “deneme.txt” dosyası verilmiştir. Bunun anlamı programımız ile aynı dizinde bulunan deneme.txt dosyasının açılmasıdır. Şayet farklı bir dizinden okunması isteniyorsa tam yol verilebilir. Örneğin:
c:\deneme\deneme.txt –> C sürücüsundeki deneme dizinin altındaki deneme.txt (WINDOWS)
/usr/bin/deneme.txt –> root dizin / altındaki usr altındaki bin altındaki deneme.txt dosyası (LINUX)
..\dosyalar\deneme.txt –> programımızın bulunduğu dizinin bir altında bulunan dosyalar dizinin altındaki deneme.txt dosyası (WINDOWS)
şeklinde kullanılabilir. Hemen ardından fopen fonksiyonuna verilen ikinci parametre ise dosyanın açılma şeklini belirtir. Bu şekiller:
r or rb
Dosyayı okuma (read) için açar.
w or wb
Dosyayı yazma(write) için açar ve şayet dosya zaten varsa içindekileri temizleyerek yoksa yeni bir dosya oluşturur.
a or ab
Dosyaya ilave (Append) için açar. Bunun anlamaı dosya yoksa oluşturulacak varsa mevcut bilgilerin sonuna yazılacak demektir.
r+ or rb+ or r+b
Mevcut Dosyayı hem okumak hemde yazmak için açar.
w+ or wb+ or w+b
Dosyayı bir önceki şekilde olduğu gibi hem okumak hem de yazmak için açar. Ancak dosya yoksa oluşturur, dosya varsa içindekileri siler.
a+ or ab+ or a+b
Dosyayı ilave şeklinde açar ve şayet dosya yoksa oluşturur, varsa içindekilerin sonuna ilave eder. Bu şekilde açılan dosyalardan hem okuma hemde yazma işlemi yapılabilir.
Yukarıdaki şekillerin “b” sembolü alanları binary mod anlamındadır.
Yukarıdaki bu şekillerden birisi tercih edilerek ilgili sembol fopen’a ikinci parametre olarak verilir. Yukarıdaki örnek kodda da görüldüğü üzere fopen fonksiyonu bir if içerisindedir. Bunun anlamı fopen fonksiyonundan başarılı sonuç dönerse dosyanın açıldığı anlaşılacaktır. Aksi halde dosyanın açılması başarısızlıkla sonuçlanmıştır ve programımızda bu durum için basit bir hata mesajı ekrana basılır.
Dosyadan okuma ve yazma
Dosya açıldıktan sonra dosyaya okuma ve yazma işlemleri yapılabilir. Okuma ve yazma işlemlerinin yapılabilmesi için yukarıda anlatılan dosya açma işlemine ilave olarakaçılan dosyayı gösteren bir göstericiye (pointer) ihtiyaç duyulmaktadır. Bu gösterici fopen fonksiyonu tarafından döndürülmektedir. Kod örneği aşağıdadır:
FILE *fp;
fp = fopen(“dosya.txt”,”r”);
yukarıdaki örnek kodun ilk satırında fp isminde bir dosya göstericisi tanımlanmıştır. İkinci satırında ise bu göstericinin içerisine fopen fonksiyonundan dönen değer atanmıştır. Buna göre dosyaya erişilmesi istendiğinde fp göstericisi üzerinden işlem yapılması yeterlidir.
Dosyalardan okuma ve yazma yapan çok sayıda fonksiyon olmasına karşılık anlaşılması en kolay fonksiyonlar C dili ilk öğrenilirken öğrenilen scanf ve printf fonksiyonlarının birer türevi olan fscanf ve fprintf fonksiyonlarıdır. Birer örnek aşağıda verilmiştir:
int i;
fscanf(fp,”%d”,&i);
fprintf(fp,”%d”,i);
yukarıdaki örneklerde bir i değişkeni integer tipinde tanımlanmıştır. Bu değişkene ikinci satırda fscanf fonksiyonu ile bir değer dosyadan okunmuştur. Bu fonksiyon ilk bakışta da anlaşılacağı üzere scanf fonksiyonundan farklı olarak ilave bir dosya göstericisi parametresi kullanmaktadır. Bu parametre fonksiyonun ilk parametresidir. Yukarıdaki örnekte bulunan “fp” dosya göstericisi de böyle bir dosya gösterici örneğidir.
fprintf fonksiyonu da ilave bir dosya göstericisi almak dışında standart printf fonksiyonundan farklı değildir.
Hatırlanması gereken önemli bir nokta, fscanf fonksiyonunun kullanılması için dosyanın okuma, fprintf fonksiyonunun kullanılabilmesi için ise dosyanın yazma şeklinde açılması gerekmektedir.
Örnek
Örnek olarak basit bir öğrenci kayıt sistemini C dilinde kodlamaya çalışalım. Amacımız “kayit.txt” isimli bir dosyaya, kullanıcıdan öğrenci bilgisi okuyup kaydetmek ve daha sonra kullanıcının istediği bir anda bu dosyayı aratarak kayıtlara ulaşmasını sağlamak olsun.
Öncelikle kullanıcı ile iletişimi sağlayan ufak bir menü tasarımı yapalım:

Yukarıdaki kodda, sonsuz bir döngü (14. satır) içerisinde dönen printf satırları ile yazılmış olan bir menü görülmektedir. Kullanıcının menüden yaptığı seçim bir değişkene okunmakta ve değerine göre if koşulları ile kontrol edilerek ilgili işlem icra edilmektedir. Örneğin yukarıdaki kodda, 20. satırda bulunan if koşuluna girilmesi için kullanıcının menüden 1′i seçmiş olması, diğer bir deyişle, klavyeden 1 yazarak enter’a basması gerekmektedir.
Kodumuzda öğrenci kayıtlarını tutacağımız için bir oluşum (composition) kullanmamız ve bu oluşumu C dilinde yapılar (structs) kullanarak tanımlamamız mümkündür:

Yukarıda, örnek bir öğrenci yapısı (struct) gösterilmektedir. Kodun 5-9.  satırları arasında bu yapıyı oluşturan değişken tipleri tanımlanmıştır. Ayrıca yapının ismi “ogrenci” olarak tanımlanmıştır.
Kodumuzdaki main fonksiyonu içerisinde, 12. satırda, ogrenci yapısından bir tip oluşturulmakta ve bu yeni tipe xyz ismi verilmektedir. Bu tip, C dilinde tanımlı olan diğer tipler gibi (örneğin int, char, float) bir tip olmakta ve bu tipten yeni değişkenler tanımlamamıza imkan tanımaktadır.
Kodumuzdaki seçimlere göre çalışacak olan kayıt ekleme ve silme işlemlerini aşağıdaki şekilde kodlayabiliriz. Öncelikle kayıt ekleyen kısma bakalım:

Yukarıdaki kodda, 21. satırda xyz tipinde bir değişken tanımlanıp, ardından 22-29. satırlar arasında bu değişkenin içerisine klavyeden değer okunmuştur. Okunan değerler yapı (struct) içerisinde ilgili değişkenlere yerleştirilmiş ve hafızada tutulmaktadır.
Kodun 30. satırında bir dosya göstericisi tanımlanıp, göstericinin “kayit.txt” dosyasını göstermesi sağlanmıştır. Buradaki dosyanın açılış şekli, “a” parametresinden de anlaşılacağı üzere ekleme (append) halindedir.
Kodun 31. satırında fprintf fonksiyonu marifetiyle fp göstericisinin gösterdiği yani “kayit.txt” dosyasına okunan yapısındaki isim, soyisim ve no değişkenlerinin değeri bastırılmakta ve nihayetinde 32. satırda dosya kapatılarak kayıt işlemi tamamlanmaktadır.
Kayıtlar arasında arama işlemi yapan kod kısmı ise aşağıda verilmiştir:

Yukarıdaki kodun, 36. satırında, aranan ismi tutmak amacıyla bir dizgi (string) tanımlanmış ve bu değişkenin içerisine kullanıcıdan aranması istenen değer 37. satırda scanf ile okunmuştur.
38. satırda, dosya okuma şeklinde (read) açılmış ve fp isimli dosya göstericisine atanmıştır.
42. satırda feof fonksiyonu ile dosyanın sonuna kadar dönen bir döngü tanımlanmıştır. Buradaki döngü fp göstericisinin dosya sonunu göstermesi durumunda 1 döndürmektedir. Dolayısıyla dosya sonuna kadar 1 dönmesini ve dosya sonuna ulaşılınca 0 dönmesini sağlamak maksadıyla ! işaretiyle dönen değerin tersi alınmaktadır. While döngüsü kısaca dosya sonuna kadar dönen bir döngü halini almıştır.
Döngünün içindeki 43. satırda, dosyadan fscanf fonksiyonu ile okunan isimli yapının içerisine değerler okunmaktadır.
44. satırda okunan değerlerden isim bilgisi, aranan dizgi (string) ile karşılaştırılmakta ve eşitlerse 45. satırdaki printf fonksiyonu çalışmakta ve ekrana aranan öğrenci bilgisini yazmaktadır. Eşit olmaması durumunda bir sonraki öğrenciye devam edilmektedir.
Kodun tamamı aşağıdaki şekildedir:


20 Temmuz 2011 Çarşamba

String Tokenizer ( Dizgi Parçalayıcı )

Bilgisayar bilimlerinde sık kullanılan veri tiplerinden birisi de dizgilerdir (Strings). Bu veri tipinde herhangi bir yazı durabilir. Genellikle verinin bir parçasını elde etmek için dizgi içerisinden bir parça çıkarılması gerekir. Bu işlem için dizginin (string) parçalanması gerektiğinde yapılan işleme parçalama (Tokenize) ismi verilir.
Örneğin çok sık kullanılan virgül ayırmalı veri (Comma seperated values) yapısındaki bir dosyayı ele alalım:
isim,telefon,dogum
ali,123,1970
veli,321,1980
ahmet,333,1981
Yukarıdaki bu dosyayı okuyarak sırasıyla verileri işlememiz gerekirse yapılacak işlem dosyadan satır satır verileri okumak ve “,” karakterinden okunan dizgileri bölmek gerekir.
Bu işlem için örneğin C dilinde bir karakter dizisine okumak ve dizinin her elemanı üzerinden bir döngü ile geçerek , karakteri görünce bölme işlemini tamamlamak gerekir.
Bu işlemi yapan strtok isimli bir fonksiyon string.h dosyasında bulunmaktadır.  Aşağıdaki şekilde kullanılabilir:
/* strtok ornegi */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- Bu, ornek bir dizgidir.";
  char * pch;
  printf ("Girilen \"%s\" mesajini parcaliyoruz:\n",str);
  pch = strtok (str," ,.-");
  // parcalama icin kullanilan ayırıcılar (delimiters)
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;

}
Yukarıdaki programın sonucu aşağıda verilmiştir:
Girilen "Bu, ornek bir dizgidir." mesajini parcaliyoruz:
Bu
ornek
bir
dizgidir
Yukarıda görüldüğü üzere ,.- karakterlerinden parçalanmıştır. Benzer bir hazır fonksiyonda JAVA dilinde bulunmaktadır. StringTokenizer isimli fonksiyonun kullanımı aşağıda verilmiştir:
StringTokenizer st = new StringTokenizer("Bu, ornek bir dizgidir"," ,.");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }
Yukarıdaki kodda da aynı dizgi aynı ayıraçlarla (Deliminator) verilmiştir ve çıktısı aşağıdaki şekildedir:
Bu
ornek
bir
dizgidir

9 Temmuz 2011 Cumartesi

C++ ile 1. Yazılı, 2. Yazılı, Sözlü Ortalama Hesaplamak

Merhabalar,

Bu videomuzda 1. yazılı, 2.yazılı, sözlü ortalama hesaplama programı yapımını öğreneceğiz.

İlk işimiz programı açmak. Yeni kaynak dosyası oluşturup kodumuzu yazıyoruz.


#include#include
main()
{
      float yazil,yazili,sozlu,ort;
      printf("1.yazili notunu girin=");
      scanf("%f",&yazil);
      printf("2.yazili notunu girin=");
      scanf("%f",&yazili);
      printf("sozlu notunu yazin=");
      scanf("%f",&sozlu);
      ort=(yazil+yazil+sozlu)/3;
      printf("sonuc=%.2f",ort);
      getch(); }



Bu kodları yazdıktan sonra programımızı başlatabiliriz.

Fakat değişkenleri kendime göre atadım, siz farklı değişken atayabilirsiniz.

printf("sonuc=%.2f",ort);


Burada %.0f kullanmamızın amacını 2. derste söylemiştim, ama tekrar söyleyeyim: Eğer ki buraya .2 yazmasaydık sonucumuz mesela 50.3333333 gibi şekilde olurdu, şimdi ise 50.33 şeklinde çıkartıyor. İsterseniz burayı .0 yapabilirsiniz. Fakat "." (nokta) 'yı unutmayınız virgül koyarsanız olmaz.

5 Temmuz 2011 Salı

C++ Ders Notları ve Uygulamalar

Bilgisayar programlama 2 (C++) dersinin uygulamaları ve tekrar örnekleri toplu halde bilgisayar labaratuarı ağında paylaşılmıştı. Alamayanlar  ders notlarını buradan indirebilir.
Ders Notlarının ve örneklerinin paylaşıldığı sayfa:
http://nucleus.istanbul.edu.tr/~bilprog2/
Hoca geçen yılın vize sorularınıda yayınlamış. (Kek)
Hepsini tek tek indirmek yerine buradan toplu olarak indirebilirsiniz. (Vize öncesi Ders 6 dahil )
Ayrıca derleyici olarak Dev C++ yı tavsiye ederim ki zaten okulda da onu kullanıyouz. Bu bağlantıda altarnatif  indirme adresi.

Sorularınız olursa bilgimizin yettiği kadarına cevap vermeye çalışırız.
C++ ve diğer diller için videolu ders anlatımlarını bu yazımdan bulabilirsiniz. Mesela Kariyervideo dan C++ derslerini izleyebilirsiniz. ( Üyelik gerekir- Ücretsiz ) Amacınız sadece sınavı geçmekse ders notlarını okusanız da yeter.

8 Haziran 2011 Çarşamba

Faktoriyel

Faktoriyel alan rekürsif bir fonksiyon.
#include "stdio.h"
int faktoriyel(int x);
int main(){
 int deger=1;
 int sonuc=faktoriyel(deger);
 printf("Sonuc=%d",sonuc);
 return 0;
}
int faktoriyel(int x){
 int birim;
 if(x>0){
  birim=faktoriyel(x-1);
  return x*birim;
 }else{
  return 1;
 }
 
}

6 Haziran 2011 Pazartesi

Recursif Fonksiyon Örneği

Aşağıdaki kod decimal(onluk) tabandaki sayıyı ikilik tabandaki sayıya dönüştürür.
#include "stdio.h"

void fonk(int sayi){
 if(sayi==1 || sayi==0){
  printf("%d",sayi);
  }else {
  fonk(sayi/2);
  printf("%d",sayi%2);
  }
 }

int main(int argc, char **argv)
{
 fonk(9);
 return 0;
}

21 Mayıs 2011 Cumartesi

Structure(Yapılar)

Bu yapı paralel dizi oluşturmamıza gerek kalmadan birden fazla değişken türüyle yeni bir değişken türü oluşturmamıza yarayan yapıdır.
Kullanılışı aşağıdaki gibidir. integer ve char değişken türlerinden yeni bir değişken türü oluşturdum.
struct kitap_turu{
 int fiyat;
 char isim[100];
 char yazar[100];
};
Yukarıda yeni bir struct kitap_turu adında değişken türü oluşturduk. Şimdi bu türden bir kitap adında bir değişken oluşturalım.
struct kitap_turu kitap;
//hatta dizi değişken bile oluşturabiliriz.
struct kitap_turu kitap_dizisi[10];
Şimdi bir değişken daha oluşturalım ve değer atayalım.
#include "stdio.h"

struct kitap_turu{
 int fiyat;
 char isim[100];
 char yazar[100];
};

struct kitap_turu kitap2={10,"Define Adasi","Robert Louis Stevenson"};
int main(){
printf("Kitap ismi: %s\n",kitap2.isim);
printf("Kitap fiyat: %d TL\n",kitap2.fiyat);
printf("Kitap yazar: %s\n",kitap2.yazar);
return 0;
}
Structurelara değer atarken içerisindeki değişkenlerin sıralamasına uymalısınız.

26 Nisan 2011 Salı

Hafıza ile Çalışmak (malloc)

Bu dersimizde hafızadan nasıl yer ayrılır(allocate) ve ayrılan yer nasıl tekrar boşaltılır onu göreceğiz. Biz bunun için malloc (memory allocate) fonksiyonunu kullanıyoruz.
int *pointer=null;
pointer=malloc( sizeof(int) );
yukarıdaki kodda en başta bir pointer tanımlıyoruz. Daha sonra malloc ile hafızadan yer ayırıyoruz. Ve hafızanın baş adresini pointera atıyoruz. malloc fonksşyonunu kullanırken içine ayırmak istediğimiz hafıza miktarını yazıyoruz.
2 integer değişkeni tutacağımız kadar hafıza ayıralım ve hafızaların içini dolduralım.
#include "stdio.h"
#include "stdlib.h"
int main()
{
 int *pointer=(int *)malloc((2*sizeof(int)));
 *pointer=10;
 printf("Adres: %d , Deger: %d\n",pointer,*pointer);
 pointer++;
 *pointer=9;
 printf("Adres: %d , Deger: %d\n",pointer,*pointer);
 return 0;
}
Bu fonksiyonu kullanabilmek için stdlib.h kütüphanesini include etmeniz lazım. Daha karışık bir örnek dinamik dizi oluşturmak yazısında var.

15 Nisan 2011 Cuma

Structure (Yapılar) & Pointerlar

Şimdi bir structure oluşturalım ve bu structureın üyelerini 5 elemanlı bir dizi olsun daha sonra bu dizinin elemanlarını pointer kullanarak kullanıcıdan alalım.
#include "stdio.h"

struct yapi_turu{
 int yas;
};

struct yapi_turu insanlar[5];

int main()
{
 struct yapi_turu* pointer;
 pointer=insanlar;
 int i=0;
 for(i=0;i<5;i++)
 {
  printf("gir:");
  scanf("%d",pointer->yas);
  printf("%d degerini girdin!\n",(*pointer).yas);
  pointer++;
 }
 return 0;
}
Yukarıda pointerı tanımlarken türüne dikkat edin. elemanları kullanıcıdan alma işlemini bir fonksiyonla yapabilirsiniz.

7 Nisan 2011 Perşembe

FONKSİYONLAR VE PROGRAM YAPISI

Bir program bir görevi yerine getirmek için yazılır. Eğer yapılacak iş pek kolay değilse, program oldukça uzun olabilir. Bazı programlar onbinlerce satır uzunluğunda olabilir. Böyle durumlarda, esas görevi daha küçük ve kolay idare edilebilir altgörevlere ayırmadan yerine getirmek hemen hemen olanaksızdır.
C, böyle altgörevleri ifade etmek ve birbirinden ayırmak için bir yöntem öngörmektedir. Bu yöntem sayesinde “bilgi saklama” ilkeleri kullanılabilir. C sadece bir tek altprogram çeşidi sağlamaktadır, bu da fonksiyondur. Matematiksel olarak; bir fonksiyon, argümanlarını döndürdüğü değere ilişkilendiren bir “kara kutu” gibidir. Aynı şey C için de geçerlidir, ancak bir fonksiyon birden fazla değer döndürecek, küresel veri yapılarında yan etkiler yapacak veya girdi/çıktı sağlayacak bir şekilde de tasarımlanabilir. Örneğin, printf fonksiyonu, argümanlarının değerlerinin çıktısını yapmak için kullanılır. Geri döndürdüğü değer, yazılan karakterlerin sayısıdır, ancak bu fazla ilgi çekici değildir.
Çok “basit” bir fonksiyon tanımı aşağıda verilmiştir:
void f (void)
{ }
Bu fonksiyon hiçbir şey yapmamasına rağmen, program geliştirmesi esnasında yer tutucu olarak kullanılabilir. Bu bölümde fonksiyon tanımı ve kullanımı hakkında daha fazla şeyler öğreneceğiz.
Kitabın başından beri görmekte olduğumuz main tanıtıcı sözcüğü, programın yerine getirmesi gereken görevi ifade eden fonksiyonun ismidir. Her makul C programı içinde main adı verilen bir fonksiyonun bulunması gerekir, çünkü program yürütülmeye başlandığında, program içinde bağlanmış bulunan bir başlangıç yordamı çalışmaya başlar, bu da kontrolü sonuçta main fonksiyonuna geçirir. Eğer bağlama esnasında, bağlayıcı (linker) main adı verilen bir fonksiyon bulamazsa, sizin için yürütülebilir bir kod oluşturamayacaktır. main’in bir anahtar sözcük olmadığına dikkat edin, yani isterseniz, main adında bir değişken de tanımlayabilirsiniz.
Fonksiyonların gücü, bizim tekrarlanan kod yazmamızdan kaçınmamızı sağlamalarında yatar. Herhangi bir kodu, bir fonksiyon şeklinde, bir defa belirtiriz, ona bir isim veririz ve daha sonra, bu kodu çalıştırma gereksinimi duyduğumuzda, bu fonksiyonu “çağırırız”. Bu iyi, fakat yeterli değildir. Birçok durumda bu kod o anki gereksinmelerimize “uyarlanmalıdır”. Örneğin, bir diziyi sıraya sokan bir kodumuz varsa, bu kodu her çağırdığımızda, değişik sayıda elemandan oluşan değişik bir dizi belirtecek şekilde bunu hazırlamamız daha iyi olur. Bu ise, fonksiyon argümanları kullanılarak yapılabilir.
Her fonksiyon diğerlerinden bağımsız olduğuna, yani bir fonksiyon içinde tanımlanmış değişkenler başka bir fonksiyonda kullanılamadığına göre, fonksiyonların birbirleriyle haberleşmelerini sağlayacak yöntemler geliştirilmiştir. Bir yöntem fonksiyonlara argüman geçirmektir. Başka bir yöntem küresel değişkenler kullanmaktır.
Şimdiye kadar olan örneklerde gördüğümüz bütün değişkenler fonksiyonlar (main fonksiyonu) içinde tanımlanmışlardı. Bu bölümde göreceğimiz gibi; değişken bildirimleri veya tanımlamalarını fonksiyonlar dışında yapmamız da olasıdır. Böyle değişkenlere küresel adını veririz, çünkü fonksiyon içinde tanımlanan yerel değişkenlerin aksine, bunlar, tanımlamadan sonra gelen program metni içindeki bütün fonksiyonlar tarafından kullanılabilirler.

7 Mart 2011 Pazartesi

Switch-case yapısı ve kullanımı

Switch-case  yapısı olasılık ifade eder. “Mesala bir ‘a’ değişkenimiz olsun. Bunun değeri 5 ise şunu yap, 10 ise şunu yap, hiçbiri değilse şunu yap” şeklinde kullanırız. Kullanımı:
1switch(degisken_adi){
2 
3case 3: kodlar;break;
4 
5case 5: kodlar;break;
6 
7default: kodlar;break;
8 
9}
Görüldüğü üzere her olasılığın sonunda break; kullandık. Bunun nedeni ise onu kullanmazsak gerçekleşen olasıktan sonraki her olasılığın kodları da çalışır :(
Şimdi bu şekilde bir hesap makinesi yapalım. Hatırlarsanız if-else yapısıyla bir tane yapmıştık. Bu da obna benzeyecek :) Kodların açıklamasını kodların içinde yaptım. Hemen burada söyleyeyim :
//Burada açıklama
veya
kodlar; //Burada açıklama
şeklindeki satırlarda “//” ile başlayan yerler yorum satırlarıdır. Programın akışını değiştirmez :-)
01#include <iostream>
02 
03#include <windows.h>
04 
05using namespace std;
06 
07main(){
08 
09int sayi1,sayi2,islem;
10 
11cout << "Birinci sayiyi giriniz:  ";
12 
13cin >> sayi1;
14 
15cout << "Ikinci sayiyi giriniz:  ";
16 
17cin >> sayi2;
18 cout << "Islemi seciniz: " << endl;
19 
20cout << "---Menu---" << endl;
21 
22cout << " 1 : Toplama " << endl;
23 
24cout << " 2 : Cikarma " << endl;
25 
26cout << " 3 : Carpma " << endl;
27 
28cout << " 4 : Bolme " << endl;
29 
30cout << " ----------- " << endl;
31 
32cout << "Islem secin ( 1-2-3-4-) : " <<  endl;
33 
34cin >> islem ; //Buraya kadar her şey aynı.
35 
36switch (islem){ //Switch-case yapısını başlattık.
37 
38case 1:{ //Toplama seçildiyse
39cout << "Toplamlari : " << sayi1+sayi2 << endl;}
40break;
41 
42case 2:{ //Çıkarma seçildiyse
43cout << "Farklari : " << sayi1-sayi2 << endl;}
44break;
45 
46case 3:{
47cout << "Carpimlari : " << sayi1*sayi2 << endl;}
48break;
49 
50case 4:{
51cout << "Bolumleri : " << sayi1/sayi2 << endl;}
52break;
53 
54default:{
55cout <<  "Geçerli bir işlem girmediniz" << endl;}
56break;
57}
58 
59system("pause");
60 
61return 0;
62 
63}
Evet arkadaşlar bu dersimizde bu kadar. Bir sonraki dersimizde görüşmek üzere

3 Mart 2011 Perşembe

C Diline Giriş

İlk Programımız (C Dilinde Bir Programın Yapısı)
#include <stdio.h>
main()
{
int i ;
scanf("%d",&i);
i=i*i;
printf("%d",i);
}

Veri Tipleri

Int TipInteger = Tamsayı
Tamsayıları içerir. Bellekte 2 Byte tutar.
5 , -19 , 25000 gibi
Minimum: -2^31 = -32768
Maksimum :2^31-1=32767

Gerçel Tipler (Float, Double)

Gerçel sayıları içerirler.

float: Bellekte 4 Byte yer tutar. 3.4E-38 ile 3.4E+38 aralığında değer alır. Hassasiyet 7-8 basamaktır.
double :Bellekte 8 Byte ter tutar. 1.7E-308 ile 1.7E308 aralığında değer alır. Hassasiyet 15-16 basamaktır.


Char Tip

Char : Karakter: Alfanumerik karakterleri içerir.
'5' , '*' , 'K'

Sabitler (CONST)

Bir program içinde değerinin değişmesini istemediğimiz değişkenler için kullanılır.

const float pi=3.14; gibi


Değişkenler
Değeri programın çalışması boyunca değiştirilecektir. Kullanım biçimi:
Tip Belirleyici [Belirleyici];
int i;
float alan;

Belirleyiciler (Identifier)

Bileşenlere isim verme.(Sabit, değişken, altprogram, etiket, tipler (kullanıcı tanımlı)).

Kısıtlamalar

1.İlk karakteri rakam olamaz
2.Sadece harfler, rakamlar ve _ (underscore) karakterinin birleşiminden oluşabilir.
3.C diline ait saklı (reserved) sözcükler kullanılamaz.
4.En fazla 31 karakter olabilir.
5.Küçük - büyük harf ayırımı vardır.

İsimlerin Seçimi
* Belirleyicinin kullanım amacına uygun anlamlı isim seçin. (Hungarian notation)
* Ne fazla kısa ne de fazla uzun olsun. 3 - 10 karakter uzunluğunda olmasını alışkanlı edinin.

Matematiksel ifadeler
+              toplama
-               çıkarma
*              çarpma
/               bölme
%            tam bölümden kalan (mod)
++          1 artırma
--            1 eksiltme

İşlem Öncelik Sırası
( )
* / %
+ - ++ --
Aynı önceliğe sahip işlemler soldan sağa doğru yapılır


Atama Deyimi (Assignment)

Bir değişkene bir değer(sabit, değişken, ifade) vermek.
DeğişkenAdı = değer;
x = 8 ;
y = x + 15 ;
y = (8 - x) / (2 - x) ;
okul=“Kilis Meslek Yüksekokulu”;

10 Şubat 2011 Perşembe

Dinamik Dizi Oluşturmak

azacağımız program önce kullanıcıdan dizinin kaç elemanlı olacağını sorsun. Daha sonra dizinin elemanlarını kendi atayarak ekrana yazdırsın.
#include "stdio.h"
#include "stdlib.h"

int main()
{
  int boyut=0;
  printf("Dizi boyutunu girin:");
  scanf("%d",&boyut);
  int* dizi;
  dizi=(int *)malloc((boyut*sizeof(int)));
  
  int i=0;
  for(i=0;i<boyut;i++)
  {
   *dizi=i;
   printf("%d",*dizi);
   dizi++;                   
  }
 
  return 0;
}

3 Şubat 2011 Perşembe

Rastgele Sayı Üretmek

C dilinde rastgele sayı üretmek için rand() fonksiyonunu kullanırız. Aşağıda kullanılışını görelim
#include <stdio.h>
/*Kütüphaneleri unutmayın.*/
#include <time.h>
#include <stdlib.>

int main()
{
 srand(time(null));
 int rastgele=rand()%20; //0-19 arasında sayı üretir.
 printf("%d",rastgele);
 return 0;
}
Yukarıdaki örnekte üreteceği sayılar sıfırdan başlar. Peki bir 5 ile 19 arasında sayı üretmesini istersek.
#include <stdio.h>
/*Kütüphaneleri unutmayın.*/
#include <time.h>
#include <stdlib.>

int main()
{
 srand(time(null)); //bu her zaman olacak.
 int rastgele=5+rand()%15;
 printf("%d",rastgele);
 return 0;
}
Yukarıdakini anladıysanız sizde -5 ve 5 arasında sayı üreten kodu yazın.