C/C++ ile ilgili sorular-cevaplar

Başlatan bahadirhtp, 02 Nisan 2011 - 23:41:32

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

bahadirhtp


#include<iostream>
using namespace std;

int fnc1(int x)
{ cout<<"Within fnc x="<<x<<endl;
return x=x*x;
}

int fnc2(int& rx)
{ cout<<"Within fnc x="<<rx<<endl;
return rx=rx*rx;
}

int main()
{
int y,x=2;

cout<<"Before fnc call x="<<x<<endl;
y = fnc1(x); //u have see what happend there,func call and result came
cout<<"After fnc call x="<<y<<endl;

cout<<"Before fnc call x="<<x<<endl;
y = fnc2(x); //u have see what happend there,func call and result came
cout<<"After fnc call x="<<y<<endl;

}


bu benım programım ve cıktısıda şu;
Before fnc call x=2
Within fnc x=2
After fnc call x=4
Before fnc call x=2
Within fnc x=2
After fnc call x=4


ama her nasılsa hocadakı cıktı şu
Before fnc call x=2
Within fnc x=4
After fnc call x=2
Before fnc call x=2
Within fnc x=2
After fnc call x=4


yani ilkinde x degısmemelı sadece kullanılmalıydı
ıkıncısınde ıse x degısmelıydı referans durumundan dolayı (fonsıyonun ıcınde de)

ayrıca hocamın yazımı şu şekilde
void fnc3(int& rx)
{ rx=rx*rx;
cout<<"within fnc3"<<rx<<endl;
ve fonsıyonuda su sekılde kullanmıs
fnc3(x);
yanı benım gıbı y'ye esıtlememıs benım hatam bu mu acaba dedım onun yaptıgı gıbı yaptım ozamanda butun x'lerın degerı 2 oluyor
cıkamadım işin ıcınden bır turlu...!!! 


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 03 Nisan 2011 - 00:38:52

GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

Erdem


#include<iostream>

using std::cout;

int foo (int x)
{
    x = 1;
    cout << "Within function x = : " << x << '\n';
    return x;
} // normal bir parametre gönderdiğimiz için x'e yapılan değişiklikler kaybolur

int foo2 (int & x) // referans olarak gönderdiğimiz parametreler
                   // fonksiyondan çıktıktan sonra değişir
{
    x = 1;
    cout << "Within function x = : " << x << '\n';
    return x;
}



int main ()

{
    int x = 4;
    int y = 4;
   
    cout << "Before function call x = " << x << " y = " << y << '\n';
    y = foo (x);
    cout << "After function call x = " << x << " y = " << y << '\n';


    cout << "Before function call x = " << x << " y = " << y << '\n';
    y = foo2 (x);
    cout << "After function call x = " << x << " y = " << y << '\n';
   
}


Burada tek olay şu. Referans ya da & fonksiyona gönderdiğimiz nesne ya da değişken için takma isimdir.

Örneğin ilk fonksiyonu çağırmazdan önce x'in değeri 4'tü. Fonksiyon içinde x'in değerini 1 yaptık. Ama fonksiyonun dışına çıkınca tekrar 4 oldu. Bunun nedeni değişkenin yaşam alanı { ve } arasıdır. Yani bir fonksiyona normal bir değişkeni parametre olarak gönderirsek burada (int x) yapılan değişiklikler fonksiyon dışına çıkıldığı zaman kaybolur.

İkinci fonksiyonda (int & x) burada x'i referans olarak gönderdik. Yani gönderirken yaptığımız değişikliklerin x üzerinde etkili olmasını istiyoruz diyoruz. Bu nedenle fonksiyon içinde olmasına rağmen yapılan değişiklikler x'in değerini değiştirir. x fonksiyondan çıkıldıktan sonra 1 olur.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

bahadirhtp

#2
#include<iostream>
#include<string>
using namespace std;
class Student
{ private:
   int id; char name[20]; float grade;
  public:
   Student(); //Constructor
   int getid() {return id;}
   char* getname() {return name;}
   float getgrade(){return grade;}
};

Student::Student() //class::constructor
{cout<<"Enter id,name and grade please...\n";
cin>>id;cin>>name;cin>>grade;}



int main()
{Student first_student;
cout<<"Student's id,name and grade are  "<<first_student.getid()<<"\t"<<first_student.getname()<<"\t"<<first_student.getgrade()<<endl;}


program sorunsuz calısıyor ama şu var sevgili hocam cin okutmalarından sonra şu satırı eklemiş
int Student::getid(){return id;}
char* Student::getname() {return name;}
float Student::getgrade(){return grade;}

ve benim pc dıyorkı bunlar zaten tanımlı ne gerek var
bu satırı okudugumda student classının ıcınde id name ve grade tanımla denek ıstedıgını dusunuyorum ve bende ıster ıstemez zaten tanımlı degılmı dıyorum kendı kendıme!!!
Constructor'un sadece yapıcı oldugu dısında net baska bı bılgı edınemedıgımden sanrım
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

sem

Alıntı yapılan: Erdem - 03 Nisan 2011 - 02:55:39

Örneğin ilk fonksiyonu çağırmazdan önce x'in değeri 4'tü. Fonksiyon içinde x'in değerini 1 yaptık. Ama fonksiyonun dışına çıkınca tekrar 4 oldu. Bunun nedeni değişkenin yaşam alanı { ve } arasıdır. Yani bir fonksiyona normal bir değişkeni parametre olarak gönderirsek burada (int x) yapılan değişiklikler fonksiyon dışına çıkıldığı zaman kaybolur.

Hatta biraz daha açık olursak aslında fonksiyon parametresine gönderdiğiniz değişken örneğin sizin örneğinizdeki x değişkeni için herhangi bir değişiklik yapılmaz. Akış buraya geldikten sonra sizin değişkeninizin bir alakası kalmaz durumla; değişkenin akıştaki tek etkisi değeri olur.

void func (int a);

bu gibi bir fonksiyona func(c); şeklinde bir çağrı yapıldığı zaman olayın c değişkeni ile alakası şurada biter;

c nesnesinin adres içerisndeki değer; bilinirlik ve ömrü func fonksiyonu ile sınırlı a değişkenine ilk değer olarak atanır. Yani bu noktadan itibaren akışı c den bağımsız olarak ilerler. O nedenle ilgili değişiklikler a ile saklı kalacaktır.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Alıntı yapılan: sem0900 - 03 Nisan 2011 - 21:37:06
Alıntı yapılan: Erdem - 03 Nisan 2011 - 02:55:39

Örneğin ilk fonksiyonu çağırmazdan önce x'in değeri 4'tü. Fonksiyon içinde x'in değerini 1 yaptık. Ama fonksiyonun dışına çıkınca tekrar 4 oldu. Bunun nedeni değişkenin yaşam alanı { ve } arasıdır. Yani bir fonksiyona normal bir değişkeni parametre olarak gönderirsek burada (int x) yapılan değişiklikler fonksiyon dışına çıkıldığı zaman kaybolur.

Hatta biraz daha açık olursak aslında fonksiyon parametresine gönderdiğiniz değişken örneğin sizin örneğinizdeki x değişkeni için herhangi bir değişiklik yapılmaz. Akış buraya geldikten sonra sizin değişkeninizin bir alakası kalmaz durumla; değişkenin akıştaki tek etkisi değeri olur.

void func (int a);

bu gibi bir fonksiyona func(c); şeklinde bir çağrı yapıldığı zaman olayın c değişkeni ile alakası şurada biter;

c nesnesinin adres içerisndeki değer; bilinirlik ve ömrü func fonksiyonu ile sınırlı a değişkenine ilk değer olarak atanır. Yani bu noktadan itibaren akışı c den bağımsız olarak ilerler. O nedenle ilgili değişiklikler a ile saklı kalacaktır.

Biraz daha açık anlatabilirmisiniz  :D Ne demek istediğinizi ve neden alıntı yaptığınızı anlamadım.

Burada adres derken bir değişkenin adresi & ile gene aynı sembolle gösterilen referansları karıştırmıyorsunuzdur umarım. Burada { ve } arasında C++'nin ad alanları (namespaces) olanağını çok kısa da olsa anlatmaya çalışıyordum. Sizin de bildiğiniz üzere bir değişkenin ömrü bu iki kapsam parantezi arasındadır.

Gerçekten ne demek istediğinizi ve benim yazdığım bölümde size mantıksız gelen bir bölüm varsa açıkça anlatabilirseniz sevinirim. Bir kod üzerinde gösterirseniz daha iyi anlayacağıma eminim  ;)
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Alıntı yapmamın nedeni aslında tam olarak şu cümle;

" yapılan değişiklikler fonksiyon dışına çıkıldığı zaman kaybolur. "

Buradan şu sonuç çıkıyor gibi durmuş sadece ona binaen alıntı yaptım...;

.....
.....
....

void fonk(int a){
......
}

int main()
{
...
...
...
int x;
fonk(x);
....
}



Burada fonk fonksiyonuna gönderilen x üzerinde değişiklik yapılıyor daha snra fonksiyon faaliyet alanı sona erdiğinde yapılan değişiklikler geri alınıyor (kayboluyor) gibi bir anlam çıkabilir.


Benim demek istediğim ise x'i fonksiyona gönderdiğimiz için (adresini değil);  "int a" değişkeni yaratılıp, x'in o anda sakladığı değer ilk değer olarak verilir. Yani yeni bir değişken yaratılmış oluyor. Bundan sonra yapılan bütün işlemler bu yerel değişiken üzerinde yapılıyor. main içerisindeki x üzerinde yapılan bir değişiklik yok.

Bu durumu yanlış anlayabilecek arkadaşlar için, altını çizmek istedim sadece.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Alıntı yapılan: sem0900 - 03 Nisan 2011 - 23:07:11


void fonk(int a){
}

int main()
{
int x;
fonk(x);
}



Benim demek istediğim ise x'i fonksiyona gönderdiğimiz için (adresini değil);  "int a" değişkeni yaratılıp, x'in o anda sakladığı değer a değişkenine ilk değer olarak verilir. Yani yeni bir değişken yaratılmış oluyor. Bundan sonra yapılan bütün işlemler bu yerel değişiken üzerinde yapılıyor. main içerisindeki x üzerinde yapılan bir değişiklik yok.

Bu durumu yanlış anlayabilecek arkadaşlar için, altını çizmek istedim sadece.

Evet haklısın. Ben fonksiyon içindeki x ve main fonksiyonu içindeki x aynı isimi aldığı için o şekilde söyledim. Hatta daha doğrusu: "Fonksiyona parametre olarak geçilen değişken üzerinde yaptığımız değişiklikler fonksiyonun dışına çıkıldığı zaman kaybolur. Bunun nedeni fonksiyona bir değişkeni parametre olarak geçtiğimizde fonksiyon içinde bu değişkenin yerel bir kopyası oluşturulur"

Teşekkürler böyle daha açık olmuş oldu  ;)
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Rica ederim =)

Paylaştığnız bilgiler için yeni C++'a yeni başlayan arkadaşlar adına (kendim dahil) biz teşekkür ederiz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

#8
Alıntı yapılan: bahadirhtp - 03 Nisan 2011 - 16:23:15
program sorunsuz calısıyor ama şu var sevgili hocam cin okutmalarından sonra şu satırı eklemiş
int Student::getid(){return id;}
char* Student::getname() {return name;}
float Student::getgrade(){return grade;}

ve benim pc dıyorkı bunlar zaten tanımlı ne gerek var

Şimdi sınıfın bir bildirimi var bir tanımı var. Bunları genelde basit sınıflarda beraber yazabiliriz. Ya da sevgili hocanın yaptığı gibi ayırabiliriz:


class Student
{
public:
  float getgrade() const;
};

float Student::getgrade () const { return grade; }


Burda ayırmış olduk.  Ayrıca ilklendirme listesi kullanabiliriz. Böylece ortalıkta geçersiz öğrenci kalmamış olur.

class Student
{
private:
  int id_;
public:
  Student (int id): id_ (id) {}
   
  /* ... */
};



Sınıfın veri üyelerini ayırmak için yazarken bunun sınıfın bir üyesi olduğunu belirtmek üzere önüne ya da arkasına bir alt çizgi konulabilir.



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 04 Nisan 2011 - 00:15:45

@sem0900: C++ gerçekten çok başarılı bir dil oldu ama gözardı edilemeyecek bir gerçek var ki C++ karmaşık bir dil. Bu karmaşıklık C++'nin geniş tabanlı kullanıma sahip iki takipçisi C# ve Java'nın tasarımını da etkiledi. Her ikisi de C++'nin karmaşıklığından uzak durarak - sağladığı işlevselliği kolay kullanılabilir bir şekilde sağlamaya çalıştılar. Eğer hızlı bir şekilde kod üretmek istiyorsanız Java ve C#, C++'ye göre daha iyi bir seçim olabilir.

Fakat C++ sadece üretken bir dil olarak tasarlanmadı; C++ bir sistem programlama dili. Yani C++'nin tasarım amaçlarından bir tanesi C'ye bu yönde rakip olmak. Burada sistem programlama derken donanımla haberleşmek, gömülü sistemler ve sürücüler yazmak, kısacası üzerinde çalıştığı donanımın son damla performansını kullanacak şekilde tasarlandığını düşünebiliriz. Örneğin bir sistem programlama dili ile bir işletim sistemi yazılabilir.

D ise bu noktada sistem programlama konusunda C++'nin yeni nesil geleceği olarak düşünebiliriz. Java ve C# gibi C++'nin karmaşıklığından mümkün olduğu kadar uzak bir dil. Bellek yönetimi konusunda çöp toplama mekanizması var ama eğer isterseniz belleği kendiniz de yönetebiliyorsunuz. Örneğin C++ Unicode desteği vermiyor ama D daha başlangıçtan Unicode desteği veriyor. Bu da demek oluyor ki değişken isimlerini D'de kendi dilinizde kullanabiliyorsunuz. C++00x sadece çok kısıtlı olarak Unicode desteği veriyor.  C++ çok karmaşık ve güçlü bir dilken, D en az C++ kadar güçlü ve daha az karmaşık bir dil olarak karşımıza çıkıyor.

Uzun süre C++ ile uğraşıp da daha sonra D'ye geçen Scott Meyers, Andrei Alexandrescu ve  Bartosz Milewski gibi isimlerin D diline geçiş yapmaları bir tesadüf değil. Daha da aslında bu konuda belki bir sayfa yazabilirim ama ben de direkt C++ yerine D'ye geçiş yapmanızı tavsiye ederim  :D


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 04 Nisan 2011 - 00:59:57

Alıntı yapılan: Erdem - 03 Nisan 2011 - 23:45:30
Ayrıca ilklendirme listesi kullanabiliriz. Böylece ortalıkta geçersiz öğrenci kalmamış olur.

İşte ilklendirme listelerine bir örnek. Burada El ve Eldiven sınıflarının : işaretinden sonra nasıl ilklendirildiğini görebilirsin.


#include <iostream>
using std::cout;                               
   
class El
{
public:
    El (int parmak)
        : parmak_ (parmak)
    {
        cout << parmak_ << " parmaklı bir el\n";
    }
   
private:
    const int parmak_;
   
};


class Eldiven
{
public:
    Eldiven (int parmaksayisi)
        : el_ (parmaksayisi), parmaksayisi_ (parmaksayisi)
        // parmaksayisi_ (parmaksayisi), el_ (parmaksayisi0)
    {
        cout << parmaksayisi_ << " parmaklı bir eldiven\n";
    }
   
private:
    const El el_;
    const int parmaksayisi_;
};


int main ()
{
    Eldiven (3);
}
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Tavsiyeleriniz için teşekkür ederim @Erdem. Verdiğiniz bilgiler için de.

Dediğiniz gibi özellikle C'den sonra C++ epey bir karmaşık yer ediyor insanın zihninde. Tabii C'de zor, her şeyi kendiniz yapıyorsunuz. ama nedir kullanılacak araçlar bellidir. C++ içinse bir araç kullanırken, fonksiyon mudur, işlev şablonu mudur, inline mıdır gibi başka bir sürü araç giriyor devreye.

Aslında dediğiniz gibi C# bakındım bir ara. Fakat sonradan soğudum, nedenini tam olarak ben de bilmiyorum ama soğudum,  kaç ay oldu iki satır kod yazmayalı. C# bile daha az karmaşık gerçekten C++'dan ama şimdilik C++ üzerinde ilerlemeyi düşünüyorum. Kolay gelsin...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

bahadirhtp

void setx(int x1) {x=x1}


void setx(int x1);
..};

void örnek::setx(int x1){x=x1}


şimdi aralarında ki farkları şöyle tanımlamak gerekirse
ilkinde sınıf değerlendirmesinin bi anlamı yok yanı bence kullanmamış ama ıkıncısınde kullanmıs ama ikisinde de class örnek tanımlı
dogru mudur?
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

sem

#11
Aynen doğrudur...

İkincisinde örnek (tabii gerçek programda isimlendirmede hata verecektir) sınıfının public bölümündeki setx fonksiyonu çağrılmış...


Ek; soruyu yanlış okumuşum.... Maalesef doğru değildir... ilkinde global bir fonksiyon çağrılmış...

ek2: Hatta kodları da yanlış okumuşum; çağrılma yok tanımlama var... Bir tane global setx fonksiyon bir tane örnek sınıfı için setx fonksinyonu tanımlanmış...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

bahadirhtp

ozaman SEVGİLİ hocaman butun programlarının calısmaması yada benım programların hata vermemesi lazım (:
public'ten fonksıyon cagırılmaz mı yanı
using namespace std;
class Bank_Account

{ private:
   int acc_num;
.
.
  public:
   int get_acc_num();
.
.
  void setacc_num(int num1);
.
.
};

int Bank_Account :: getacc_num()
{return acc_num;}
.
.
void Bank_Account :: setacc_num(int num1)
{acc_num=num1;}
.
.

olmaması lazım ise
nasıl duzeltıcem
acıklar mısın lutfen?

EK:Sen hafif hafif demleniyor msun? doğru söyle bak ;)
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

Erdem

Evet bunların ikisi arasında hiç bir fark yok.  Örneğin bu sınıfın setx üye işlevinin { } kısmını sınıfın dışına taşımak istediğinde bu işlevin bizim yazdığımız sınıfa ait olduğunu belirtmek üzere sınıf ismini de yazman gerekir.

class Student
{
public:
  float getgrade() const; 

Örneğin burada getgrade üye işlevini bildiriyoruz (declare) Tek başına bu hiç bir şey yapmaz.

};                                       

float Student::getgrade () const { return grade; }

Burada ise tanımlıyoruz (define) yani yapacağı işi burada belirtiyoruz ki o da bir not  döndürmek. { ve } arasındaki kısım. Ayrıca sınıfın dışındayız. O yüzden bu işlevin sınıfa ait olduğunu belirtmek üzere başına sınıfın ismini burada Student ekliyoruz.

class Student
{
public:
    float getgrade() const   
    {                                         
        return grade;             
    }
   
};

Burada her ikisini birleştiriyoruz.  Hem bildiriyoruz hem tanımlıyoruz.  Yani derleyiciye benim böyle bir fonksiyonum var dikkat et derken hem de yapacağı işi de belirtiyoruz.

Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

bahadirhtp

get secmek(selector method)
set degıstırmek(modifier method)
sonuçta ikisinde de classlarını bildirmem gerekıyor ama bu seferde
error: no 'int Bank_Account::getacc_num()' member function declared in class 'Bank_Account'


diyor.

   int get_acc_num();
  void setacc_num(int num1);
};

int Bank_Account :: getacc_num()
{return acc_num;}
void Bank_Account :: setacc_num(int num1)
{acc_num=num1;}
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

Erdem

Alıntı yapılan: bahadirhtp - 05 Nisan 2011 - 00:38:01
int Bank_Account :: get_acc_num()

Yazım hatası altta _ 'yi unutmuşsun ..
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik