+ Konuya Yorum Yap
Sonuçlar 1 den 2 in 2

Konu: C++ Ders Notları 2 (Örnekler Uygulamalar)

                  
   
  1. #1
    Teğmen
    Katılım Tarihi
    Feb 2011
    Mesajlar
    401

    C++ Ders Notları 2 (Örnekler Uygulamalar)




    Değer İle Çağırma
    Bu çağırma şeklinde fonksiyon parametre değerleri yerel değişkenlere kopyalanır. Fonksiyon hiç bir şekilde kendisine parametre olarak geçilen değişkenleri değiştiremez. Parametre değişkenleri üzerinde yaptığı değişiklikler yerel değişkenlerin üzerinde gerçekleşir ve fonksiyondan çıkılırken bu değişkenler de yok edildiğinden kaybolur. Bu yöntemin dez avantajı büyük yapıların parametre olarak geçilmesi durumunda kopyalama işleminin getirdiği maliyet oldukça yüksek olur. Fakat bu yöntem sayesinde fonksiyonun içinde yanlışılıkla kendisine geçilen parametrelerin değerlerinin değiştirilmemesi garantilenmiş olur.


    #include <stdio.h>

    #include <iostream.h>



    double Kuvvet(double sayi, int us )

    {

    double sonuc = 1.0;

    for (; us > 0; us--)

    sonuc = sonuc * sayi;

    return sonuc;

    }



    main()

    {

    double x;

    int y;

    cout<<"(x^y)^y ifadesini hesaplamak için x, ve y de?erlerini sysasy ile giriniz." << endl;

    cout <<" ? x =";

    cin >>x;

    cout <<" ? y =";

    cin &ft>y;

    cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;

    }

    Yukarıdaki örnek programda Kuvvet Kuvvet fonksiyonun parametreleri değer ile geçiliyor.. Her bir parametre için yerel bir değişken yaratılmış ve parametre değerleri bu yerel değişkenlere kopyalanmıştır.. Dolayısıyla us değişkeni üzerinde yaptığımız değişiklikler programın işleyişinde aksaklığa sebek vermemektedir. Programın çıktısı aşağıdaki gibidir.


    (x^y)^y ifadesini hesaplamak için x, ve y değerlerini sırası ile giriniz.

    ? x =2

    ? y =3

    (2^3)^3 =512

    Press any key to continue

    Şimdi program üzrendi ufak bir değişiklik yapalım. us us parametresini değer ile değil de referans ile geçelim bakalım program aynı veriler için nasıl bir davranışta bulunacak. Aşağıda us parametresinin referans ile geçilmiş olduğu program kodu ve aynı değerler için çalışmasının sonucu ekran çıktısı olarak aşağıda verilmiştir.
    Ekran çıktısında da görüldüğü gibi program düzgün çalışmamaktadır. Çünkü Kuvvet Kuvvet fonksiyonu kendisine yolladığımız us us değişkenini değiştirmiştir. Fonksiyon us us parametresi için geçilen değişkenin referansını parametre olarak aldığından us us değişkeni için yerel olarak oluşturulan değişken orjinal değeri gösterir.

    Kodu dikkatle incelersek. Kuvvet fonksiyonu iki kez ard arda çağrılıyor. Birinci çağırılışında us parameteresi olarak geçilen y değişkenin değeri fonksiyon içinde değiştiriliyor ve 0 yapılıyor. Fonksiyon birinci çağırılışında düzgün çalışıyor. Fakat ikinci çağırılışında us olarak 0 değeri geçildiğinden sonuç 1 olarak bulunuyor.
    Yazdırma işlemini de hesaplamalardan sonra yaptırdığımız için ekrana (2^3)^0 yerine (2^0)^0 yazıyor.


    #include <stdio.h>

    #include <iostream.h>



    double Kuvvet(double sayi, int &us )

    {

    double sonuc = 1.0;

    for (; us > 0; us--)

    sonuc = sonuc * sayi;

    return sonuc;

    }



    main()

    {

    double x;

    int y;

    cout<<"(x^y)^y ifadesini hesaplamak için x, ve y değerlerini sırası ile giriniz." << endl;

    cout <<" ? x =";

    cin >>x;

    cout <<" ? y =";

    cin >>y;

    cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;

    }

    (x^y)^y ifadesini hesaplamak için x, ve y değerlerini sırası ile giriniz.

    ? x =2

    ? y =3

    (2^0)^0 =1

    Press any key to continue


    Çok büyük boyuttaki yapıları değer ile geçmek performansı düşürür.

    Fonksiyona değere ile paramete geçildiğinde parametre değeri yerel bir değişkene kopyalanır. Yapılan değişiklikler yerel değişken üzerindedir. Fonksiyondan çıkınca kaybolur.

    Referans İle Çağırma

    Bu çağırma şeklinde ise fonksiyona parametre olarak geçilen değerler yerine bu değerleri içeren değişkenlerin referansları (veya adresleri) geçilir. Böylece fonksiyon içinden parametre değişkenleri aracılığıyla dışarıdaki değişkenlerin değerlerini de değiştirebiliriz. Fonksiyonların parametrelerinin referans ile geçilmesi suretiyle performans arttırılabilir. Dikkati kullanılmaz ise fonksiyon içerisinde parametre değişkenlerinin değerleri değişmemesi gerektiği halde yanlışlıkla değiştirilebilir.
    Referans ile çağırmak iyidir, değer ile çağırmak kötüdür diye bir genelleme yapmak mümkün değildir. Her iki tekniğinde artı ve eksileri vardir.


    #include <stdio.h>

    #include <iostream.h>

    struct Ogrenci{

    char Ad[20];

    char Soyad[20];

    char OkulNo[20];

    char Adres[255];

    char KayitTarihi[11];

    };



    void EkranaYaz(Ogrenci &ogr)

    {

    cout<<"Ad:"<<ogr.Ad<<endl;

    cout<<"Soyad:"<<ogr.Soyad<<endl;

    cout<<"OkulNo:"<<ogr.OkulNo<<endl;

    cout<<"Adres:"<<ogr.Adres<<endl;

    cout<<"KayitTarihi"<<ogr.KayitTarihi<<endl;

    }



    void Oku(Ogrenci &ogr)

    {

    cout<<"Ad:";

    cin>>ogr.Ad;

    cout<<"Soyad:";

    cin>>ogr.Soyad;

    cout<<"OkulNo:";

    cin>>ogr.OkulNo;

    cout<<"Adres:";

    cin>>ogr.Adres;

    cout<<"KayitTarihi";

    cin>>ogr.KayitTarihi;

    }



    void main()

    {

    Ogrenci temp;

    Oku(temp);

    cout <<"Kullanycını girdiği bilgiler"<<endl;

    EkranaYaz(temp);

    }


    Gerekmedikçe parametre değişkenlerinin değerlerini değiştirmeyin. Bir değişkenden tassaruf etmek için parametre değişkenini kulanmak başımızı ağrıtacak yan etkilere yol açabilir.
    Elipssis Operatörü Ile Degisken Sayida Parametre Geçilmesi
    C dilinde degisken sayida ve/veya tipte parametre geçilmesi için ellipsis operatörü kullanilir. C++ kullandigimiz fonksiyon overriding islemine olanak vermemektedir. Ellipsis operatorü ,... seklinde tanimlanir.
    Ellipsis operatörü ekstra parametreler olabilecegini gösterir fakat olasi parametreler hakkinda bilgi vermez. Elipsis operatöründen önce en az bir parametre bulunmasi gerekmektedir. Bu parametre araciligiyla fonksiyona geçilen parametreler hakkinda bilgi edinilir. Elipsis operatörü degisken sayida parametereyi ifade ettiginden dolayi parametre listesindeki son token olmalidir.
    Degisken sayidaki parametreleri açiga çikarmak için Stdargs.h veya Varargs.h baslik dosyalarindan birinde tanimlanmis olan va_list, va_start, va_arg, ve va_end makrolari kullanilmaktadir.

    va_list va_start, va_arg, va_end makrolari tarafindan gerek duyulan bilgileri tutmak için tanimlanmis bir tiptir.Degisken uzunluktaki parametre listesinde bulunan paremetrelere erismek için va_list tipinde bir nesne tanimlanmasi gerekmektedir.
    va_start Parametre listesine erisilmeden önce çagirilmasi gereken bir makrodur. va_arg, va_end makrolarinda kullanilmak üzere va_list ile tanimlanan nesneyi hazirlar.
    va
    va_arg Parametere listesindeki parametreleri açiga çikaran makroduir. Her çagrilisinda va_arg möakrosu la_list ile tanimlana nesneyi listedeki bir sonraki parametreyi göstereceksekilde degistirir. Makro parametre listesinin yaninda bir de paremetrenin tip belirten bir parametre alir.
    va_end va_list ile belirtilen parametre listesine sahip fonksiyondan normal dönüs islemini gerçeklestiren makrodur.,
    Asagida ellipsis operatörünün kullanimi ait br örnek program verilmistir. Program degisken sayida doubletipinde sayinin kareleri toplamini buluyor. Fonksiyonun ilk parametresi parametre sayisini içeriyor.


    #include <iostream.h>

    #include <math.h>

    #include <stdarg.h>


    double KareToplam(int, ...);


    void main(int argc, char *argval[],char *env[])

    {

    cout << "Double sayilarin karelerinin toplamini alir";

    cout << " 10^2 + 20 ^2 + 5^2 = " << KareToplam(3, 10.0, 20.0, 5.0)<< endl;

    }



    double KareToplam(int sayi, ...)

    {

    va_list parametreListesi;

    va_start(parametreListesi, sayi);

    double toplam = 0.0;

    for (int i = 0; i < sayi; i++)

    toplam += pow(va_arg(parametreListesi, double), 2);

    va_end(parametreListesi);

    return toplam;

    }
    main() Foksiyonun Parametreleri ve Kullanımı


    Main fonksiyonu program çalışmaya başladığında çalıştırılan fonksiyondur. Bu fonksiyon üç parametre alır. Bu parametrelerin kullanılması zorunlu değildir.
    Şimdi bu sırası ile bu parametrelerin kullanım anlamlarına amaçlarına değinelim.
    Bir çok program, komut satırı parametrelerini aktif bir şekilde kullanır. Mesala sıkıştırma programları sıkıştırılacak dosyaların isimleri, sıkıştırma işleminden sonra oluşturulacak dosya isimi, sıkıştırma şekli gibi bilgileri komut satırı parametreleri arcılığıyla kullanıcıdan alırlar. Main fonksiyonun ilk iki parametresi komutsatırı parametrelerinin işlenmesi için kullanılır. Üçüncü parametre ise ortam değişkenlerinin (environment variables) değerlerini içerir.


    main( int argc, char* argv[], char *env[])

    {


    }

    main fonksiyonun genel tanımlaması yukarıdaki gibidir. İlk parametre komut satırından geçilen parametrelerin sayısını tutar. Programın ismi de bir komut satırı parametresi olarak kabul edilir yani her program en az bir komut satırı parametresi içerir. argc parameteresinin değeri en az bir olur. argv parametresi ise boyutu bilinmeyen stringler dizisidir. Bu parametrenin her bir elemanı bir komut satır parametresinin başlangıç adresini tutar. argc ve argv parametreleri birlikte bir anlama kazanırlar.
    env parametresinde ise PATH, TEMP gibi ortam değişkenlerinin değerleri tutulur. env parametresi de uzunluğu bilinmeyen bir string dizisidir. Fakat dikkat edilirse env env parametresi için komutsatırı parametrelerinde olduğu gibi kaç adet ortam değişkeni olduğunu gösteren bir parametre yoktur. Bunun yerine env dizisinin son elemanı NULL değerini içerir.


    #include <iostream.h>



    main(int argc, char *argval[],char *env[])

    {

    int i = 0;

    while (env[i])

    {

    cout << env[i++]<<endl;

    }

    }

    TMP=C:\WINDOWS\TEMP

    TEMP=C:\WINDOWS\TEMP

    PROMPT=$p$g

    winbootdir=C:\WINDOWS

    COMSPEC=C:\WINDOWS\COMMAND.COM

    CMDLINE=WIN

    windir=C:\WINDOWS

    BLASTER=A220 I5 D3

    PATH=C:\Program Files\DevStudio\SharedIDE\BIN\;C:\WINDOWS;C:\WINDO WS\COMMAND;C:\

    PROGRA~1\BORLAND\CBUILD~1\BIN

    _MSDEV_BLD_ENV_=1

    Press any key to continue

    Yukarıda ortam parametrelerini listeliyen bir örnek program ve ekran çıktısı verilmiştir. Programda ortam parametrelerinden sonra gelen dizi elemanın NULL olduğu bilgisinden yararlanılmıştır.
    Program Kontrol ve Döngü Komutları
    Nedir ? Ne işe yarar?
    Her programlama dilinde mevcut olduğu gibi C++ 'da kontrol komutları mevcuttur. Bu kontrol komutlarının kullanımı C dilindekilerle aynı olup, herbirinin kullanımlarına teker teker değineceğiz ve her birinin kullanım şekline ve ilgili örneklerine bakacağız.

    Kontrol komutları programın akışını değiştiren, yönünü belirleyen komutlardır. Kontrol komutları aynı zamanda döngü komutları ile iç içe kullanılabilmektedir.Her bir döngü komutu içersinde döngünün ne zaman biteceğine dahil kontrolun yapıldığı bir bölüm bulunmakadır

    Komutlar
    Belli başlı kontrol ve döngü komutları aşağıdakilerdir.

    if
    if-else
    for
    switch - case
    while, do-while



    Bu komutlarla kullanılan bazı özel komutlar da şunlardır
    break
    continue


    Birde artık kullanmayın denilen goto var.
    if-else

    if komutu parametre olarak aldığı değer doğru ise kendisinden sonra gelen fonksiyonu yada fonksiyonları gerçekleştirir. Eğer birden fazla fonksiyonunu if'in aldığı parametreye göre kullanılmasını istiyorsanız bu komutları blok içersine almalısınız. Blok içine alma { }arasına alma anlamına gelmektedir.
    if kelimesinin Türkçe karşılığı eğer anlamına gelmektedir. Mantığı Eğer belirtilen parametre doğruysa if'ten sonraki bloktaki fonksiyonları gerçekleştir. Doğru değilse if ten sonraki bloğu atla (yok say).

    Doğruluk
    Peki alınan parametrenin doğru olup olmaması ne demek. Lojik'te 1 ve 0 'lardan bahsedilir. Kontrollerde eğer bir şey doğru ise o 1 dir. Bir şey yanlış ise o yanlıştır.
    Sayılarda 0 yalışı belirtir. 0 dışındaki tüm sayılar ise yanlıştır. Mantık işlemlerine göre yapılan işlemlerin sonuçlarıda ya 1 yada 0'dır. Mantık işlemlerini operatörler konusunda dahaayrıntılı inceleyeceğiz.

    if'in kullanımı :

    if ( [ifade] ) [komut]; ]; Bu kullanım şekli kontrolden sonra sadece bir adet komut çalıştırmak içindir. Eğer bir çok komut çalıştırmak istiyorsanız aşağıdaki gibi bir kod bloğu açmalısınız
    if ( [ifade] )
    {
    [komut];
    [komut];
    ...
    }
    Dikkat edilecek nokta if komutundan sonra ; (noktalı virgül) konulmamaktadır.

    Örnek1 :

    1 #include "iostream.h"

    2 void main()

    3 {

    4 int sayi;

    5 cout >> "Bir sayı girin :";

    6 cin << sayi;

    7 if ( sayi < 0 )

    8 cout >> "pozitif sayi girdiniz" >> endl;

    9 }

    Örnek1 Açıklama :
    Öncelikle 6. satırda ne yapılıyor ona bakalım. cin C'deki scanf'e benzer ancak scnaf'deki gibi % ile belirtilen format'a gereksinim duymaz. Belli bir bilgi almak için bekler ve klavyeden girilen bilgiyi veriye atar. Şu an için cin ile ilgili bu kadar bilgi yeterli. Daha detaylı şekilde ileride göreceğiz.
    Bu açıklamaya göre programımız ekrana Bir sayı girin: yazdıktan sonrabekliyor ve girilen sayiyi yi sayi değişkenine atıyor. Daha sonra 7. satırda if kontrolu yapılıyor. Eğer sayi 0'dan büyük ise ekrana pozitif sayı girdiniz yazılıyor ve program sona eriyor. Sayı 0 'dan kucuk veya esit ise ekrana hic bir sey yazılmıyor.

    Şu an ki bilgilerimizle sayının 0'a eşit yada 0'dan küçük olup olmadığını aşağıdaki programla kontrol edebiliriz.

    Örnek2 :

    1 #include "iostream.h"

    2 void main()

    3 {

    4 int sayi;

    5 cout >> "Bir sayı girin :";

    6 cin << sayi;

    7 if (sayi < 0)

    8 cout >> "pozitif sayi girdiniz" >> endl;

    9 if (sayi > 0)

    10 cout >> "negatif sayı girdiniz" >> endl;

    11 if (sayi == 0) // if (!sayı)

    12 cout >> "0 girdiniz" >> endl;

    13 }

    Örnek2 Açıklama :
    Artık programımızda sayının negatif mi pozitif mi yoksa 0'mı olduğunu bulabiliyoruz. Eğer sayı 0'dan büyük ise (7. satırdaki kontrol) "pozitif sayı girdiniz yazılıyor" . 9 ve 11. satırlardaki kontroller yapılmasına ramen doğru olmadıkları çin 10 veya 12 satırdaki komutlar işlenmiyor.
    Ancak burda dikkat edilecek nokta programın 8. satır işledikten sonra ( 7. satırdaki kontrol doğru iseişlenebilir ) diğer (9-12.) satırlara ihtiyaç duymayacağıdır. Program eğer negatif sayı girilirse bu sefer 11. satırdaki kontrolle boşu boşuna girmektedir. Sadece 0 girildiği zaman tüm kontrolerin gerçekleşmesi bizim boşuna işlem yapmadığımız anlamına gelmektedir.

    Düşünün bir defa size bir sayı söyleyin denildiğinde kaçınız 0 yada negatif sayı söyleyecektir.

    Durum böyle olunca yukardaki programı geliştirmemiz gerekmektedir.

    if-else'nin kullanımı :

    if ( [ifade] )

    [komut];

    else [komut];

    ya da

    if ( [ifade] )

    {

    [komut 1];

    [komut 2];

    [komut n];

    }

    else

    {

    [komut 1];

    [komut 2];

    [komut n];

    }




    Örnek3 :

    1 #include "iostream.h"

    2 void main()

    3 {

    4 int sayi;

    5 cout >> "Bir sayı girin :";

    6 cin << sayi;

    7 if ( sayi < 0 )

    8 cout >> "pozitif sayi girdiniz" >> endl;

    9 else

    10 cout >> " 0 yada negatif sayı girdiniz" >> endl;

    11}



  2. #2
    Super Moderator
    Katılım Tarihi
    Feb 2011
    Mesajlar
    111

    Cvp: C++ Ders Notları 2 (Örnekler Uygulamalar)




    güzel paylaşım saol..



+ Konuya Yorum Yap

Benzer Konular

  1. C++ Ders Notları 6 (Örnekler Uygulamalar)
    By hyrmrc in forum C, C#, C++
    Yanıtlar: 0
    Son Mesaj: 26-03-2011, 11:07 PM
  2. C++ Ders Notları 5 (Örnekler Uygulamalar)
    By hyrmrc in forum C, C#, C++
    Yanıtlar: 0
    Son Mesaj: 26-03-2011, 11:05 PM
  3. C++ Ders Notları 4 (Örnekler Uygulamalar)
    By hyrmrc in forum C, C#, C++
    Yanıtlar: 0
    Son Mesaj: 26-03-2011, 11:01 PM
  4. C++ Ders Notları 1 (Örnekler Uygulamalar)
    By hyrmrc in forum C, C#, C++
    Yanıtlar: 0
    Son Mesaj: 26-03-2011, 10:50 PM
  5. C++ Ders Notları 3 (Örnekler Uygulamalar)
    By hyrmrc in forum C, C#, C++
    Yanıtlar: 0
    Son Mesaj: 26-03-2011, 10:43 PM

Bookmarks

Mesaj İzinleri

  • Yeni Konu Gönderebilirsiniz
  • cevap gönderebilirsiniz
  • Eklenti Gönderemezsiniz
  • Mesajınızı gönderemezsiniz
  •