C++'A Giriş - I -> Merhaba Dünya

kondanta

Katılımcı Üye
29 Tem 2017
910
0
CNCF

Merhaba arkadaşlar, bu konuyu bir seri yapmayı planlıyorum. Benzeri konular sürekli açılıp duruyor, cpp nedir, basit kod parcalari vs seklinde. Bende seriye sizlere nasıl "Hello world!" uygulaması yazacağınızı göstererek baslamayi dusundum.

Buyrunuz kodumuz:
Kod:
/*!
 * Hello world! application
 * 
 * \file hello.cpp
 */

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cassert>

/*!
 * Dispay message.
 */
vo-id displayMessage();

/*!
 * Sentence type
 *
 * Type of sentence, used to decide how to terminate sentence.
 */
enum ESentenceType {
    eStatement,
    eExclamation,
    sQuestion,
    eCommand
};

/*!
 * Utility class to prevent unintended copying of class instances.
 */
class nonCopyable {
protected:
    nonCopyable() {
    }

    ~nonCopyable() {
    }

private:
    nonCopyable(const nonCopyable&);
    const nonCopyable& operator=(const nonCopyable&);
};

/*!
 * Utility function to obtain punctuation mark to end sentence
 * of specified type.
 */
inline char getPunctionMark(ESentenceType sentenceType) {
    char puncMark = '.';
    switch(sentenceType) {
        case eStatement  : puncMark = '.'; break;
        case eExclamation: puncMark = '!'; break;
        case sQuestion   : puncMark = '?'; break;
        case eCommand    : puncMark = '.'; break;
        default: {
            // should never get here
            assert(false);
        }
    }
    return puncMark;
}

/*!
 * Utility class for creation of instances.
 */
template<typename TElem>
class Creatable {
protected:
    Creatable() {
    }

    virtual ~Creatable() {
        clear();
    }

public:
    static TElem* create() {
        TElem* e = new TElem;
        return e;
    }

    vo-id free() {
        delete this;
    }

    virtual **** clear() {
    }
};

template<typename TElem, typename TParam>
class CreatableParam {
protected:
    CreatableParam() {
    }

    virtual ~CreatableParam() {
    }

public:
    static TElem* create(TParam p) {
        TElem* e = new TElem;
        e->initialize(p);
        return e;
    }

    vo-id free() {
        finalize();
        delete this;
    }

    virtual vo-id initialize(TParam /*p*/) {
    }

    virtual vo-id finalize() {
        clear();
    }

    virtual **** clear() {
    }
};

/*!
 * Base class for displayable content
 */
class DisplayElem
: public nonCopyable {
protected:
    DisplayElem() {
    }

    virtual ~DisplayElem() {
    }

public:
    virtual **** display(std::ostream& os) const = 0;
};

/*!
 * STL algorithm for displaying elements
 */
class Displayer
: public std::unary_function<****, const DisplayElem*> {
private:
    std::ostream& m_os;
    char   m_sep;
    size_t m_count;

public:
    Displayer(std::ostream& os, char sep = '\0')
    : m_os(os)
    , m_sep(sep)
    , m_count(0) {
    }

    ~Displayer() {
    }

    vo-id operator()(const DisplayElem* e) {
        if(('\0' != m_sep) && (0 < m_count)) {
            m_os << m_sep;
        }
        e->display(m_os);
        ++m_count;
    }
};

/*!
 * STL algorithm for freeing display elements
 */
template <typename TElem>
class Freer
: public std::unary_function<****, TElem*> {
public:
    vo-id operator()(TElem* e) {
        e->free();
    }
};

/*!
 * Display element for letter.
 *
 * The letter is the fundamental element: it has no substructure.
 */
class Letter
: public DisplayElem
, public CreatableParam<Letter, char> {
private:
    char m_ch;

protected:
    /*virtual*/ ~Letter() {
    }

public:
    Letter() : m_ch('\0') {
    }

    voi-d initialize(char ch) {
        m_ch = ch;
    }

    vo-id finalize() {
        m_ch = '\0';
    }

    vo-id display(std::ostream& os) const {
        os << m_ch;
        // no endLetter()
    }
};

/*!
 * Display element for word.
 *
 * A word is a sequence of letters.
 */
class Word
: public DisplayElem
, public Creatable<Word> {
private:
    std::vector<Letter*> m_letters;

protected:
    /*virtual*/ ~Word() {
        clear();
    }

public:
    Word() {
    }

    vo-id clear() {
        std::for_each(m_letters.begin(), m_letters.end(), Freer<Letter>());
        m_letters.clear();
    }

    vo-id addLetter(Letter* s) {
        m_letters.push_back(s);
    }

    /*virtual*/ vo-id display(std::ostream& os) const {
        std::for_each(m_letters.begin(), m_letters.end(), Displayer(os));
        // no endLetter()
    }
};

/*!
 * Display element for sentence.
 *
 * A sentence is a sequence of words.
 */
class Sentence
: public DisplayElem
, public CreatableParam<Sentence, ESentenceType> {
private:
    std::vector<Word*> m_words;

    ESentenceType m_sentenceType;

protected:
    /*virtual*/ ~Sentence() {
        clear();
    }

    vo-id endSentence(std::ostream& os) const {
        const char puncMark = getPunctionMark(m_sentenceType);
        os << puncMark;
    }

public:
    Sentence()
    : m_sentenceType(eStatement) {
    }

    vo-id initialize(ESentenceType sentenceType) {
        m_sentenceType = sentenceType;
    }

    vo-id finalize() {
        m_sentenceType = eStatement;
    }

    vo-id clear() {
        std::for_each(m_words.begin(), m_words.end(), Freer<Word>());
        m_words.clear();
    }

    vo-id addWord(Word* w) {
        m_words.push_back(w);
    }

    vo-id display(std::ostream& os) const {
        std::for_each(m_words.begin(), m_words.end(), Displayer(os, ' '));
        endSentence(os);
    }
};

/*!
 * Display element for message.
 *
 * A message is a sequence of sentences.
 */
class Message
: public DisplayElem
, public Creatable<Message> {
private:
    std::vector<Sentence*> m_sentences;

protected:
    /*virtual*/ ~Message() {
        clear();
    }

    vo-id endMessage(std::ostream& os) const {
        os << std::endl;
    }

public:
    Message() {
    }

    vo-id clear() {
        std::for_each(m_sentences.begin(), m_sentences.end(), Freer<Sentence>());
        m_sentences.clear();
    }

    **** addSentence(Sentence* s) {
        m_sentences.push_back(s);
    }

    vo-id display(std::ostream& os) const {
        std::for_each(m_sentences.begin(), m_sentences.end(), Displayer(os, ' '));
        endMessage(os);
    }
};

/*!
 * Main entrance point.
 */
int main() {
    displayMessage();
    return 0;
}

/*!
 * Display message.
 */
voi-d displayMessage() {
    Word* first_word = Word::create();
    first_word->addLetter(Letter::create('H'));
    first_word->addLetter(Letter::create('e'));
    first_word->addLetter(Letter::create('l'));
    first_word->addLetter(Letter::create('l'));
    first_word->addLetter(Letter::create('o'));

    Word* second_word = Word::create();
    second_word->addLetter(Letter::create('w'));
    second_word->addLetter(Letter::create('o'));
    second_word->addLetter(Letter::create('r'));
    second_word->addLetter(Letter::create('l'));
    second_word->addLetter(Letter::create('d'));

    Sentence* sentence = Sentence::create(eExclamation);
    sentence->addWord(first_word);
    sentence->addWord(second_word);

    Message* message = Message::create();
    message->addSentence(sentence);

    message->display(std::cout);

    message->free();
    // sentences, etc freed by parent
}


vo-id lerdeki dash(-)leri silip çalıştırabilirsiniz.

659GNd.png



 

Ariss

Kıdemli Üye
8 Mar 2016
4,583
1
114
uzay
Elinize sağlık, diğer serileri bekliyorum.
 
Son düzenleme:

AngelRayt

Uzman üye
13 Eki 2015
1,352
15
Python
kondanta

Eline sağlık, her gün yüzlerce açılan cout helloworldden, printf hellodan print hello dan inan kafayı yemek üzereydim. Umarım seri devam eder.


Ama bu kadar detaylı yazacaksan açıklamalarıda o şekilde yap.


vo-id display(std::eek:stream& os) const {
std::for_each(m_sentences.begin(), m_sentences.end(), Displayer(os, ' '));
endMessage(os);
}
};


Os modülü parametrelere göre işletim sisteminde pencere gösteriliyoruz bla bla...
 

Hll qnq

Uzman üye
17 May 2016
1,399
1
hello world için amma kod yazmışsın.
şuan bıraktım c++ yı başlamıyorum :D
 

AngelRayt

Uzman üye
13 Eki 2015
1,352
15
Python
Evet, cout ile çalışıyor. Ama sadece dependency injection benzeri mantık uygulanmış, bu kadar. :)

Enum vb. de içeriyor, fazla bir şey yok.

Yine cout ile %100 aynı işlem. Assembly vb. çalıştırmadıkça, aynı kalacaktır. High-level diller her ne olur olsun kolaydır.

Ben de asıl uzmanlığım olan Assembly'de hello world'ü anlatayım madem.
Kod:
; Sistem sabitlerini tanımlıyoruz.
SYS_EXIT  equ 1
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

section .text
    global _start ; Linker için C'deki main gibi bir yapı bu

_start:
    mov eax, SYS_WRITE ; Ekrana yazı yazdırma modunu bildiriyoruz
    mov ebx, STDOUT ; Ekrana yazıyı basacağımızı bildiriyoruz
    mov ecx, STRING ; Yazıyı moda bildiriyoruz
    mov edx, LENGTH ; Yazının uzunluğunu moda bildiriyoruz
    int 0x80 ; Kerneli çağırıyoruz

    mov eax, SYS_EXIT ; Çıkış modunu açıyoruz
    int 0x80 ; Kerneli çağırıyoruz

section .data
    STRING db 'Hello, world!', 0xa
    LENGTH equ $ - STRING
FoxZoby

section .text kullanmadan da yazsak ::::
 

ALcatraz'

Kıdemli Üye
30 May 2013
4,338
4
İstanbul
Evet, cout ile çalışıyor. Ama sadece dependency injection benzeri mantık uygulanmış, bu kadar. :)

Enum vb. de içeriyor, fazla bir şey yok.

Yine cout ile %100 aynı işlem. Assembly vb. çalıştırmadıkça, aynı kalacaktır. High-level diller her ne olur olsun kolaydır.

Ben de asıl uzmanlığım olan Assembly'de hello world'ü anlatayım madem.
Kod:
; Sistem sabitlerini tanımlıyoruz.
SYS_EXIT  equ 1
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

section .text
    global _start ; Linker için C'deki main gibi bir yapı bu

_start:
    mov eax, SYS_WRITE ; Ekrana yazı yazdırma modunu açıyoruz.
    mov ebx, STDOUT ; Ekrana yazıyı basacağımızı belirtiyoruz
    mov ecx, STRING ; Yazıyı moda geçiriyoruz
    mov edx, LENGTH ; Yazının uzunluğunu moda bildiriyoruz
    int 0x80 ; Kerneli çağırıyoruz

    mov eax, SYS_EXIT ; Çıkış modunu açıyoruz
    int 0x80 ; Kerneli çağırıyoruz

section .data
    STRING db 'Hello, world!', 0xa
    LENGTH equ $ - STRING

Uzmanliginiz konusunda bizi bilgilendirmeniz kondanta gibi seri yönünde veyahut bir konu altında yararlı bilgiler vermeniz ( vaktiniz oldukça) eminim bir çok üyenin derdine derman olacaktır. Şahsi olarak benimde bazı şeyleri öğrenmeme bile sebep olabilir.

Ellerine sağlık lakin üyelerin çoğunun fazla ingilizce bilmemesi misal ben, keywordler hariç sade bir biçimde Türkçe açıklamalar eklemen cok sağlıklı olur. Bana kalırsa almanca bile ekleyebilirsin :)

Tekrardan ellerine sağlık, serinin devamını bekliyorum..
 

Hll qnq

Uzman üye
17 May 2016
1,399
1
ben oradan bir c# alayım başlangıç için :D
bu arada c# öğrenmek için tavsiye ettiğini yıtıbır var mı? yada video link
 

kondanta

Katılımcı Üye
29 Tem 2017
910
0
CNCF
Hmm, konu düşündüğümden daha fazla ilgi görmüş. O yüzden küçük bir insight verme gereği duydum.
Öncelikle, neden Türkçe değil de İngilizce diyenlere cevaben; Türkçe kod yazma alışkanlığım yok maalesef. Gerek yorum satırları, gerek döküman stringleri, gerek git commit mesajları olsun. Lakin haklısınız, konuyu buraya açıyorsam daha verbose olması gerekiyordu. Şayet devam konularını açtığım taktirde, bu yönde olmasına dikkat edeceğim. Ek not da düşeyim, konuların hepsinde olabildiğince abartılı olacağım, amaç ise, sürekli paylaşılan basit if elsele konularının aksine, dilin biraz daha (forum içerisinde)kullanılmayan/bilinmeyen kısımlarını gün yüzüne çıkartmak olacak.

İkincil olarak, FoxZoby 'nin "Hello world için fazla kod yazmak bir şey ifade etmez bence." ile başlayan yorumuna değinmek istiyorum. Alt maddlere ayıracağım bunu.
i -) Konunun amacı zaten google'da arayıp bulunabilecek bir "hello world" kodu yazmak değildi. Onu yapan bir sürü konuyu C++ bölümü içerisinde aradığında bulacaksındır, garantisini veriyorum. Codegolfdaki gibi cryptic şekilde one liner da atılabilir buraya, lakin yukarıda da belirttiğim üzere amaç biraz daha farklı. Bu bağlamda değerlendirilir ise memnun olurum.
ii -) DSA da Patternslerde çok iyi olabilirsin, lakin burası konu dahilinde off bir bilgi ne yazık ki. Ayrıca, şahsi yorumum olarak konu açarsan zevkle takip ederim. Ek olarak, engin bilgilerin olduğunu belirttiğin için, "using namespace" furyasının neden sevilmediğini bildiğini düşünüyorum C++'cılar içerisinde. Ki standartları da bildiğini düşünerek bunu uzatmıyorum. Yine de düzelttiğin için teşekkür ederim.
 

aksit

Üye
14 Mar 2017
93
0
Hocam hazır kod vermek yerine kodların ne işe yaradığını iskelet oluşturmayı if else while vs kullanmayı öğretseydiniz çok daha faydalı olabilirdi
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.