Nexttürk Forum
 
AnasayfaSSSKayıt OlKullanıcı GruplarıGiriş yap

 

C Ailesine(C/C++) giriş

Önceki başlık Sonraki başlık Aşağa gitmek 
Yazar Mesaj
turknext
Admin
Admin
avatar


Yaş : 38 Kayıt tarihi : 20/07/07 Mesaj Sayısı : 114 Nerden : Tekirdağ

MesajKonu: C Ailesine(C/C++) giriş   Cuma Tem. 20 2007, 23:42

Önsöz:
"Bir düşünceyi anlatmak için neden sayfalarca roman yazayım ?"(L.Borges)
Araçlar:
* MS Visual C++ v.6 (MFC kullanılmayacaktır)
Programlamaya Giriş:
"Program yazamak" için öncelikle "Program"'ı anlamak gerekir. Hepinizin programın ne olduğunu bildiğinizi biliyorum. Ancak "bilmek" ve "kavramak" farklı şeylerdir.
Sorulması gereken soru şu:"Bir program nasıl çalışır ?". Bunun cevabını vermek için önce ünlü "çift tıklama" olayını açıklayalım.
Bir program çalıştırılmak istendiğinde ms win. Çok Kabaca şu olayları gerçekleştirir.
1. Hedef dosyayı oku , dosyada belirtilen miktar kadar bir bellek bölümü ayır ve içine programın kodlarını (dosyanın tamamını değil!) kopyala.
2. Programın ihtiyaç duyduğu ek dosyları(ör: win. Kitaplıkları(kernel32.dll,user32dll vb...)) yine aynı bölgeye kopyala
3. Yine dosyada belirlen program başlama noktasından itibaren programı başlat.
Burdan çıkartacağınız ders şu: siz bir *.exe dosyasını herhangi bir editör ile açtığınızda karşınıza çıkan şey program kodları değil, program bilgileri+program kodları
Artık çalışan bir programımız var....
Fakat prog."Bir Mesaj kutusu göstermek yada dosya işlemi yapmak isterse ne yapar ?"
Kritik Nokta:
Prog. Windows'un konu ile ilgili fonksiyonunu(ki genel adı WinAPI'dir.) çağırır.(Yani siz ister VisualBasic kullanın, ister Delphi kullanın en son derlediğiniz program mutkla windows'un fonksiyonlarını kullanacaktır.)
Not: WinAPI'lerle ilgili detaylı bilgi ve kullanımlarının örneklerini http://msdn.microsoft.com/library/ adresinde bulabilirsiniz.
C Ailesine Giriş:
C soyunun amacı program yazarken sık sık kullanılan rutinlerden kurtulmaktır. Peki onu diğer rakiplerinden ayıran özellik nedir. C++ komut bazı değil hafıza yönetimini bazlı bir dildir.(Ör: VisualBasic komut bazılıdır.) C++'da dosya açma komutu yoktur.(Özellikle bunu bazı tutorial'lerin de dosya işlemi komutları veren kişilere söylüyorum!)
Örnek:
Bir kağıda "Ali Veli Deli" yazdınız ve birine sadece "Veli" kısmını okutmak istiyorsunuz ne yaparsınız ? "5.harften itibaren kelime sonuna kadar(veya 4 harf) oku". İşte C++'ın yaptığı şey bu, sizin yüzlerce defa "5.harften itibaren kelime sonuna kadar(veya 4 harf) oku" komutu tekrarlama zorunluluğunuzu kaldırıyor. Sizin yerinize bu yönetimi o yapıyor.
Değişkenler:
C++ her ne kadar gelişmiş bir dil de olsa da daha telepatik değil. Bu yüzden sizin "Ali Veli Deli" ile ne anlatmak istediğinizi ona söylemelisiniz. Belki "Ali" gerçekten bir yazı, belki de ascii kodları bir sayının basamaklarını temsil ediyor. C++ aradaki ayrımı yapabilmek için bu referansı sizden istiyor.
Temel Değişkenler
"char"(8-bit)
bir byte(karakter=max 0-255 aralığını alabilen) büyüklüğündeki sayıyı temsil eder.
-127 ile 127 aralığını alabilir.(işaretlidir !)
"unsigned char"(8-bit)
char'ın işaretsiz(pozitif tam sayı) olanıdır(0-255 aralığını alabilir.)
"int"(veya long)(32-bit)
bir DoubleWord(dword=4 karater=0-4294967295) uzunluğundadır,işaretlidir.
-2,147,483,648 to 2,147,483,647 aralığını alabilir.
"unsigned int"(32-bit)
"unsigned char"'a bakıp tahmin edin... "unsigned" parametresi bir değişkenin önüne gelirse onu pozitif tam sayı halinde tanımlanmasına neden olur. Böyle bir değişkenin pozitif tavanı yükselir.
Ör: unsigned int'in pozitif tabanın hesaplamak isterseniz. win. hesap makinesibi açın. Bilimsel moda getirin, Bin tabanına alıp 32 tane 1 yazın ve Dec'e tabana alıp ondalık değeri görün...
"float"(!)
3.4*10^-38 ile 3.4*10^+38 arasında değer alır.
"dobule"(!)
1.7*10^-308 ile 1.7*10^+308 arasında değer alır.
"long double"(!)
3.4*10^-4932 to 1.1*10^+4932 arasında değer alır.

(!) ile işaretlenmiş değişkenler üzerinde devasa sayılarla hesaplamalar yapılsada sadece ile 20 rakamı okuyabilirsiniz.Ör: şu işlemin sonucu "1"'dir: 1 - 10^-96=1
Diziler
Ardarda tanımlanan değişkenlerden(veya yine dizilerdern) oluşmuş serilerdir.
Ör: "Ali" kelimesini 3 farklı char'la teker teker tanımlamaktansa bir tek dizide tanımlamak daha pratik olacaktır.
Örnek:

char abc[10]; //11 elemanlı bir dizi
a=char[3]; //a= dizinin 4. elemanı
char xyz[]={"WOW"}//4 elemanlı bir dizi
//char[0]'ın değeri 'W''ini ascii koduna eşit olur.
int fff[]={123,345,345}


Fonksiyonlar
Sizin devamlı kullandığınız bir rutin olsun.
Ör: [(a+b)/2]^5 gibi bunu her seferinde tekrar yazmak hem yer israfı hemde sıkıcı bir işlem olur. onun yerine bu işlemi bir fonskiyona atayabilirsiniz.
Tanımlama: geri dönen değişken tipi fonksiyon_adı(parametreler){ yapılan işlemler }
Şeklinde tanımlanır.
Değişkenlerin ve Fonsiyonların Tanımlanması ve İlk programım

1. Visual C++'ı açın.... File-->New-->Projects--> Win32 Console Application...
Proje adına herhangi bir şey yazın(ör: test). Adımlarda "An empty project"'i şeçin.
2. Çalışma alanınız belirlendi.
3. File-->New-->Files-->C++Source File Dosya adı"test"
Win32 Console Applicaiton nedir?
Burda çoooook yapılan bir yanlışı anlatmak istiyorum. Windows altında çalışmak için tasarlanmış programlar bazen DOS konsoluna ihtiyaç duyabilirler. Bu konsolu ister sonradan winapi'ler ile isterse program bilgilerinde belirterek ,yükleme sırasında windowsun ona bir konsol atamasını isteyebilirler.Eğer bir program, bilgilerinde konsol isteğinin belirtiyorsa "Win32 Console Application" olarak adlandırılır. Bu O PROGRAMIN DOS'TA ÇALIŞTIĞINI GÖSTERMEZ !!!
(küçük bir not: bazen çevrenizde "visual c/c++ veya visual c" gibi şeyler duycaksınız bölye diller yoktur sadece visual c++ vardır. Bu yanılgının sebebi win32 con. App'nin anlaşılmamasından ileri gelmektedir.)
"//" C++'da o satırın işleme tâbi tutulmayacağı anlamına gelir.
";" C++ satırın bittiğini böyle anlar...
Ewet, şimdi test.cpp'ye söyle bir şeyler karalayalım.


int x1=100;
int x2=23;
//veya int x1=100,x2=23;
int abc(int a,int b)
{
return a+b;
}
void main()
{
int sonuc;
sonuc=abc(12,13);
sonuc=abc(x1,x2);
//Son satır
}


Analiz:
"void main()" programımızın başlangıç noktasınını temsil ediyor. "void" fonksiyonun geriye hiç bir değer döndürmediğini ifade ediyor. "sonuc" değişkeni sadece main fonksiyonu içinde tanımlıdır başka bir fonksiyon için böyle bir değişken yoktur !, ama x1 ve x2 değişkenleri tüm projede tanımlıdır. Programı anlamak istiyorsanız "sonuc=abc(12,13);"'un olduğu satıra sağ tuşla tıkayın ve "Insert/Remove Break Point" ile bir break point koyun. "F5"'e basın. Programı şu an çalışırken inceliyorsunuz.adım adım ilerlemek için Step intro(F11)'i kullanabilirsiniz. İlerlerken altaki bilgilerde o anda değişkenlerin değerlerini verecektir.(Tavsiyem pencereyi biraz büyütmeniz daha rahat gözükecektir.) Son satıra geldiğinizde Ctrl+F10 ile programdan çıkınız.(Run To Cursor)
Değişkenlerin birbirine döştürülmesi
Küçük hacimdeki bir değişken kendinden daha çok (veya eşit) yer kaplayan bir değişkene veri kaybı olmaksınızın dönüştürlebilir.
Ör:
int a,b;
unsigned int c;
char x,y;
double d,f;

d=(double)a;
f=(double)b;
b=(int)x;
a=(int)y;
c=(unsigned int)a;
a=b;

Fakat büyük hacimdeki bir değişken daha küçük hacimdeki bir değişkene dönüştürülmek istenirse veri kaybı meydana gelir.
Ör:
x=(char)a;

Sihirli karakterler "*" ve "&"
Hemem şimdi C Ailesine Giriş-->Örnek'i tekrar okuyup geliyorsunuz....
"&" karakteri eğer böyle kullanırsa "ve" mânasına gelir "c=a&b"
fakat şöyle kullanılırsa anlamı çooook değişir.
c=&a;
buradaki anlamı a değişkeninin hafızadaki yerini ifade eder.
"5.harften itibaren kelime sonuna kadar(veya 4 harf) oku". örnekteki 5 değerini verir.
&a değerine a'ının pointer'i denir.(Değişkendlerin oduğu gibi fonksiyonlarında pointerları vardır.)
"*" karakteri ise c=a*b denildiğinde a ile b 'yi çarp demektir.Ancak.....
c=*a ise ; a'ının 123 olduğunu farz edelim, 123 noktsasındaki değişkenin değerinin c'ye aktar mânası taşır.(o a ne ise o bölgedeki değişkenini o cins olduğu kabul edilir.)

Örnekler:
char *a; //bu tanımlama ile (*a) char'dır ama salt a değişkenin pointeridir.
char b;
b='x'; //b= x'in ascii kodu
a=&b; //a= b'inin pointeri
*a='y'; // (*a) artık b'ye eşittir ve (*a)'da yapılan işlemler b'yi etkiler. b= y'in ascii kodu



Şartlar
"eğer şu şöyle ise" veya " şöyle değilse,büyükse,küçükse" gibi işlemler yapmanız gerekecektir bu durumda "if ve else" komutları yardımınıza koşacaktır.
ör:

if(a==1) //a=1 ise
{
//Yapılacaklar...
}else{ //a,1'e eşit değil ise
//Yapılacaklar...
}

if(!(a<0)) //a, 0'dan küçük DEĞİL ise
{
//Yapılacaklar...
}else{ //a, 0'dan küçük değil değil ise (a, 0'dan küçük ise)
//Yapılacaklar...
}

if(a!=10) //a,10'a eşit değil ise
{
//Yapılacaklar...
}else{ //a,10'a eşit değil değil ise(a=10 ise)
//Yapılacaklar...
}

if(b=>50) //b,50'ye eşit veya büyük ise
{
//Yapılacaklar...
}

if((b>50) && (b<100)) //b,50'den büyük VE 100'den küçük
{
//Yapılacaklar...
}

if((b==10) || (b==32))//b=10 VEYA b=32 ise
{
//Yapılacaklar...
}


Döngüler
Bir komut dizesini belirli bir koşul sağlana kadar veya belirli bir sayıda tekrarlamak için kullanılırlar.
Ör:
/*
for(ilk atama,kontrol edilecek değer,artış-azalış vb komutu)
*/
int i;
for(i=0;i<100;i++) // i,100'den küçük olduğu sürece devam et herseferinde i'e 1 ekle
{
//Tekrar
}

for(int i=0;i<100;i++)
{
//Tekrar
}

for(int x=100;x>0;x--) //x,0'dan büyük olduğu sürece devam et ve her seferinde x'den 1 çıkart
{
//Tekrar
}

for(long d=0;d<10;d=d+2 // d,10'dan küçük olduğu sürece devam et herseferinde d'e 2 ekle
{
//Tekrar
}


/*
while(kontrol) Kontrol doğru olduğu sürece tekrar edilir.
{
}
*/
while(1) //Durmadan tekrarla
{
}

int j=0;
while(j<100) //j<100 ifadesi doğru ise tekrarla

{
j++; //j=j+1
}

int x=0;
while(x!=100) //x,100'e eşit olmadığı sürce tekrarla
{
x=x+10; //x'e 10 ekle.
}


Artık Şarkı Söylemek İstiyorum...
İlk örneğimize devam edelim.... test.cpp'ini içini boşaltın...

#include
/*
Biraz windows.h'den "#include"'dan söz edelim, "#include" tam anlamıyla belitilen dosyayı kopyala ve buraya yapıştır demektir. eğer #include şeklinde tanımlanırsa dosya varsayılan "include" dizininde aranır,yok #include "xxx" şeklinde tanımlanırsa dosya proje dizininde aranır.

windows.h nedir? bu dosya windowsun pek çok sabit değerini ve temel sistem kitaplıklarının fonksiyonlarının tanımlarını (yani fonksiyonları barındırmaz )barındırır.
bu dosya olmadanda aynı şeyleri yapabilirsiniz.(2.bölümde değineceğim.)
*/
char *szMsg="Hello World"; //bir dizi tanımladık....11+1 elementen oluşuyor... szMsg dizi pointeridir.
char *szTitle="???";
char szMsg2[]={"Hello World2"}; //buda bir dizidir.
char *szBuffer=new char[13]; //14 elemanlı boş bir dizi oluşturalım.
void main()
{
MessageBox(0,szMsg,szTitle,MB_OK); //Dikkat edin hep pointer !
//MessageBox(0,"Bu bir test","ABC",MB_OK); bu kullanımda geçerldir. C++ otomatik olarak geçici değişken atayacaktır.
//Aşağıdaki döngü szBuffer'a szMsg2'i kopyalacaktır.
int j=0;
while(szMsg2[j]!=0) //szMsg2'inin sonu gelmemişse tekrarla
{
szBuffer[j]=szMsg2[j]; //szBuffer'in j'inci elemanı szMsg2'in j'inci elemanına eşit olsun
j++; //j'i 1 arttır.
}
szBuffer[j]=0; //szBuffer'ın son elemanın 0' yapıyoruzki mesajın sonunu geldiği anlaşılabilsin.
//Aşağıdaki ne acaba onu size bırakıyorum
for(int i=2;i<9;i++)
{
MessageBox(0,szBuffer,szTitle,MB_OK);
szBuffer[11]++;
}
Sayfa başına dön Aşağa gitmek
Kullanıcı profilini gör http://turkmoney.ws.tc

C Ailesine(C/C++) giriş

Önceki başlık Sonraki başlık Sayfa başına dön 
1 sayfadaki 1 sayfası

Bu forumun müsaadesi var: Bu forumdaki mesajlara cevap veremezsiniz
www.nextturk.com :: C ve C++ -
Forum Nextturk
stats counter
Yetkinforum.com | © phpBB | Bedava yardımlaşma forumu | Suistimalı göstermek | Yetkinblog.com