C Ailesine(C/C++) giriş

C Ailesine(C/C++) giriş

(MS Windows)

     Ö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]++;

            }

      

       }


                    Devamı 2.bölümde

               Copyright 2003 Criminal2

      

      Bakalım Microsoft MessageBox için ne düşünüyor ??

      

       The MessageBox function creates, displays, and operates a
message box. The message box contains an application-defined message
and title, plus any combination of predefined icons and push buttons.
      

       int MessageBox(

      

           HWND hWnd,     // handle of owner window

           LPCTSTR lpText,     // address of text in message box

           LPCTSTR lpCaption,     // address of title of message box  

           UINT uType      // style of message box

          );     

        

      

      Parameters

      

hWnd

       Identifies the owner window of the message box to be
created. If this parameter is NULL, the message box has no owner
window.
lpText

       Points to a null-terminated string containing the message to be displayed.

lpCaption

       Points to a null-terminated string used for the dialog box
title. If this parameter is NULL, the default title Error is used.
uType

       Specifies a set of bit flags that determine the contents and
behavior of the dialog box. This parameter can be a combination of
flags from the following groups of flags.
       Specify one of the following flags to indicate the buttons contained in the message box:

      

      

      

      Flag     Meaning

       MB_ABORTRETRYIGNORE     The message box contains three push buttons: Abort, Retry, and Ignore.

       MB_OK     The message box contains one push button: OK. This is the default.

       MB_OKCANCEL     The message box contains two push buttons: OK and Cancel.

       MB_RETRYCANCEL     The message box contains two push buttons: Retry and Cancel.

       MB_YESNO     The message box contains two push buttons: Yes and No.

       MB_YESNOCANCEL     The message box contains three push buttons: Yes, No, and Cancel.

        

      

       Specify one of the following flags to display an icon in the message box:

      

      Flag     Meaning

       MB_ICONEXCLAMATION,

       MB_ICONWARNING

            An exclamation-point icon appears in the message box.

       MB_ICONINFORMATION, MB_ICONASTERISK

            An icon consisting of a lowercase letter i in a circle appears in the message box.

       MB_ICONQUESTION     A question-mark icon appears in the message box.

       MB_ICONSTOP,

       MB_ICONERROR,

       MB_ICONHAND

            A stop-sign icon appears in the message box.

        

      

       Specify one of the following flags to indicate the default button:

      

      Flag     Meaning

       MB_DEFBUTTON1     The first button is the default button.
MB_DEFBUTTON1 is the default unless MB_DEFBUTTON2, MB_DEFBUTTON3, or
MB_DEFBUTTON4 is specified.

       MB_DEFBUTTON2     The second button is the default button.

       MB_DEFBUTTON3     The third button is the default button.

       MB_DEFBUTTON4     The fourth button is the default button.

        

      

       Specify one of the following flags to indicate the modality of the dialog box:

      

      Flag     Meaning

       MB_APPLMODAL     The user must respond to the message box
before continuing work in the window identified by the hWnd parameter.
However, the user can move to the windows of other applications and
work in those windows. Depending on the hierarchy of windows in the
application, the user may be able to move to other windows within the
application. All child windows of the parent of the message box are
automatically disabled, but popup windows are not.MB_APPLMODAL is the
default if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.

       MB_SYSTEMMODAL     Same as MB_APPLMODAL except that the
message box has the WS_EX_TOPMOST style. Use system-modal message boxes
to notify the user of serious, potentially damaging errors that require
immediate attention (for example, running out of memory). This flag has
no effect on the user’s ability to interact with windows other than
those associated with hWnd.

       MB_TASKMODAL     Same as MB_APPLMODAL except that all the
top-level windows belonging to the current task are disabled if the
hWnd parameter is NULL. Use this flag when the calling application or
library does not have a window handle available but still needs to
prevent input to other windows in the current application without
suspending other applications.

        

      

       In addition, you can specify the following flags:

      

       MB_DEFAULT_DESKTOP_ONLY

      

       The desktop currently receiving input must be a default
desktop; otherwise, the function fails. A default desktop is one an
application runs on after the user has logged on.

      

       MB_HELP

      

       Adds a Help button to the message box. Choosing the Help button or pressing F1 generates a Help event.

      

       MB_RIGHT

      

       The text is right-justified.

      

       MB_RTLREADING

      

       Displays message and caption text using right-to-left reading order on Hebrew and Arabic systems.

      

       MB_SETFOREGROUND

      

       The message box becomes the foreground window. Internally,
Windows calls the SetForegroundWindow function for the message box.

      

       MB_TOPMOST

      

       The message box is created with the WS_EX_TOPMOST window style.

      

       MB_SERVICE_NOTIFICATION

      

       Windows NT only: The caller is a service notifying the user
of an event. The function displays a message box on the current active
desktop, even if there is no user logged on to the computer.

       If this flag is set, the hWnd parameter must be NULL. This
is so the message box can appear on a desktop other than the desktop
corresponding to the hWnd.

       For Windows NT version 4.0, the value of
MB_SERVICE_NOTIFICATION has changed. See WINUSER.H for the old and new
values. Windows NT 4.0 provides backward compatibility for pre-existing
services by mapping the old value to the new value in the
implementation of MessageBox and MessageBoxEx. This mapping is only
done for executables that have a version number, as set by the linker,
less than 4.0.

      

       To build a service that uses MB_SERVICE_NOTIFICATION, and
can run on both Windows NT 3.x and Windows NT 4.0, you have two
choices.

      

       1.     At link-time, specify a version number less than 4.0; or

       2.     At link-time, specify version 4.0. At run-time, use
the GetVersionEx function to check the system version. Then when
running on Windows NT 3.x, use MB_SERVICE_NOTIFICATION_NT3X; and on
Windows NT 4.0, use MB_SERVICE_NOTIFICATION.
        

      

       MB_SERVICE_NOTIFICATION_NT3X

      

       Windows NT only: This value corresponds to the value defined for MB_SERVICE_NOTIFICATION for Windows NT version 3.51.

      

        

      

       Return Values

      

       The return value is zero if there is not enough memory to create the message box.

       If the function succeeds, the return value is one of the following menu-item values returned by the dialog box:

      

      Value     Meaning

       IDABORT     Abort button was selected.

       IDCANCEL     Cancel button was selected.

       IDIGNORE     Ignore button was selected.

       IDNO     No button was selected.

       IDOK     OK button was selected.

       IDRETRY     Retry button was selected.

       IDYES     Yes button was selected.

        

      

       If a message box has a Cancel button, the function returns
the IDCANCEL value if either the ESC key is pressed or the Cancel
button is selected. If the message box has no Cancel button, pressing
ESC has no effect.
      

       Remarks

      

       When you use a system-modal message box to indicate that the
system is low on memory, the strings pointed to by the lpText and
lpCaption parameters should not be taken from a resource file, because
an attempt to load the resource may fail.
       When an application calls MessageBox and specifies the
MB_ICONHAND and MB_SYSTEMMODAL flags for the uType parameter, Windows
displays the resulting message box regardless of available memory. When
these flags are specified, Windows limits the length of the message box
text to three lines. Windows does not automatically break the lines to
fit in the message box, however, so the message string must contain
carriage returns to break the lines at the appropriate places.
      

       If you create a message box while a dialog box is present,
use the handle of the dialog box as the hWnd parameter. The hWnd
parameter should not identify a child window, such as a control in a
dialog box.
       Windows 95: The system can support a maximum of 16,364 window handles.

Kaynak

Bu yazı Programlama içinde yayınlandı. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s