C++ 2 (Kitap - Selami KOÇLU)
March 9, 2017 | Author: gsahmet2013 | Category: N/A
Short Description
Download C++ 2 (Kitap - Selami KOÇLU)...
Description
C/C++ Kütüphaneler
Selami KOÇLU
1.BÖLÜM
Standart C++ kütüphanesi Standart C++ kütüphanesi standart C kütüphanesinin tamamını içerdiği gibi, küçük ekleme ve değişikliklerle tip güvenliğini destekleyen kendine özgü kütüphaneyi de kapsar. Bu yüzden Standart C++ kütüphanesi standart C kütüphanesinden daha güçlüdür. Kitabımızda Standart C++ kütüphanesini ayrıntıları ile inceleyeceğiz. Aslında Standart C++ için en iyi kaynak bizzat standardın kendisidir. Şimdi gelelim kitabımızda ele alacağımız konulara; birinci bölümde
Standart C++ string sınıfını ele alacağız. string sınıfı, metin süreçlerini geliştirirken kullanılır. Kelime işlemlerinde string'e yoğun olarak rastlanır. C kodları ile gerçekleştirilen metin işlemleri, C++ da, string sınıfının üye işlevleri tarafından da rahatlıkla yapılabilir. string sınıfının üye işlevleri; append( ), assign( ), insert( ), remove( ), resize( ), replace( ), copy(), find( ), rfind( ), find_first_of( ), find_last_of( ), find_first_not_of( ), find_last_not_of( ), substr( ), compare( ), at( ), capacity( ), empty( ), erase( ), length( ), max_size( ), size( ), ve swap( ) dir. Bunlardan başka atama(=), toplama (+=) ve köşeli ayraç işleçleri([]) de bindirime uğratılarak işlemler gerçeklenebilir. Ayrıca uluslararası karakterleri desteklemek için "geniş" bir wstring sınıfı tasarlanmıştır. Hem string hem de wstring ( biçiminde bildirilirler, C deki ile karıştırmayın, bu C++ da olarak kullanılır), basic_string ortak kalıp sınıfından oluşturulmuştur. Hemen bir konuyu belirtelim; string sınıfı iostream'lerle etle tırnak gibi tümleşiktir ve bu yüzden strstream kullanılmaz. Bir sonraki bölümde iostream kütüphanesi yer almaktadır. Tanı kütüphanesi. Buradaki öğeler sayesinde C++ programları hataları algılar ve raporlar. başlığı, standart istisna sınıflarını bildirir ve, ise C dilindeki assert.h ile aynı işi görür. Genel yarara dönük kütüphane. Buradaki öğeler Standart C++ kütüphanesinin diğer kısımlarıdır, ama isterseniz programlarınızda kullanabilirsiniz. !=, =, > işleçlerinin kalıp sürümleri bulunur (kısaltılmış tanımları engellemek için), tuple yapan kalıp işlevini bulunduran pair kalıp sınıfı, Standart Kalıp İşlevlerini (STL) desteklemek için işlev nesneleri kümesi, Standart Kalıp İşlevleri ile kullanmak için, saklama yeri yerleşim işlevleri. Bu sayede belleğe yerleşim mekanizmalarını kolaylıkla değiştirebilirsiniz. Yöreleştirme kütüphanesi. Bu kütüphaneleri kullanarak programlarınızı farklı ülke koşullarına (alfabe, para,sayı, zaman v.d.) uyarlayabilirsiniz. Kap kütüphanesi. Standart Kalıp Kütüphanesinin içerdiği gibi, ve teki bits ve bitstring sınıflarını da kapsar Yineleyici kütüphane. Standart Kalıp Kütüphane araçları ile beraber akış ve akış tamponları yer alır. Algoritmalar kütüphanesi. Bunlar SKK (standart kalıp kütüphanesi) kaplarında yineleyicileri kullanarak işlem gerçekleştiren kalıp işlevleridir. Standart C++ kütüphanesi hedef kodların (.o uzantılı) programımızda kullanılmasına yardım etmektedir. SKK ise doğrudan kaynak kodları kullandırmaktadır. Bundan dolayı kalıplar üzerine ayrı bir bölüm açıp
konuyu ayrıntıları ile irdeleyeceğiz. Zira kaynak kodları (değiştirerekte olsa) doğrudan kullanabilmek, aynı tasarım düzenekleri (design patterns) gibi programcılıkta verimliliği üst düzeye çıkarır. Bunlardan başka kalıplar ile üst programlama da yapılabilmektedir. Üst programlama C++ da (C dilinde yok), derleyicinin yorumlayıcı gibi kullanıldığı bir uygulamadır. Biraz zor bir konu gibi görünse de, sağladığı olanaklar inanılacak gibi değildir. Üst program; programı programlayan program olup kod işlemler, uygulamada C++ yeni bir dil gibi davranır. Aslında bu konu bir kitap kaplayacak kadar girift bir mevzudur. Buradan da anlayacağınız gibi C++ dili ile kalıplı (SKK yolu ile), nesnel yönelim ve yapısal (C dili yolu ile) paradigmaları uygulayabildiğimiz gibi, derleyici sayesinde üst programlama da yapılabilmektedir. Bu da C++ dilinin, kullanmayı bildikten sonra rakipsiz olduğunu göstermektedir. Ama hiçbir zaman unutulmaması gereken; ışık vermek için yanmalı. Tabii siz.
String'ler string C dilinde üzerinde en fazla vakit harcanan ve yanlış anlamalara yol açan konulardan biridir. C string kütüphane işlevleri, ünlü kelime işlem
programlarının vazgeçilmezidirler. C string işlevlerini C++ da kullanmak için #include yazılır. C++ kütüphanesinin string sınıfını C++ da kullanmak için ise #include yazılır. C++ da kullanılan string sınıfının çok sayıdaki yapıcı işlevi her türlü kelime işlem sorununu çözebilir. Gerek C dili string işlevleri gerekse C++ dilinin string sınıfı yapıcı işlevlerini ayrıntıları ile inceleyeceğiz. Önce string nedir onu açıklayalım; string C dilinde son öğesi sıfır (sıfır sonlandırıcı olarak adlandırılır) olan karakter dizisidir. Karakter dizileri harf ve rakamlardan oluşur. C stringleri ile C++ stringleri arasında iki fark vardır; birincisi, karakter dizisi olan C++ string nesneleri, yönetmek ve işlemlemek için gereken işlevlere sahip string sınıfı tarafından oluşturulurlar. Bir string, verilerin saklama alanı ve boyutu hakkında da bilgiler taşır. Özellikle, C++ string nesnesi bellekteki başlangıç yerini, içeriğini, karakter uzunluğunu, ve arttırılabilecek uzunluğu bilir. Bu da ikinci farkı ortaya çıkarır; C++ string nesneleri C string karakter dizileri gibi sıfır öğe ile sonlanmaz. Genellikle açıklamalarda; C char dizi, C++ string nesne kullanılır. C++ string nesneleri, C char dizilerinden kaynaklanan hataları en aza indirir. C stringlerinde rastlanan en berbat hatalar; dizi üzerine yeniden yazma, diziye doğru değer atanmamış veya ilk değer ataması (başlatması) yapılmamış göstergeçle erişmeye çalışma, bir dizi bellekten silinirken göstergeçin buraya o sırada yeniden yazım yapması (sallantıdaki göstergeç). Böyle C hataları, sistemi çökertirler. C++ dilinde string sınıfının bellek kullanım düzeni tam olarak bilinemez. Bu daha ziyade derleyici üreticisinin yaklaşımına bağlıdır. Yani bir string nesne verilerinin nerede hangi koşullarda tutulduğu hususunda, önceden tam bilgi sahibi olunamaz. C dilinde string işlevlerini kullanmak için #include , karakter işlevlerini kullanmak için #include başlıkta yazılır. C++ dilinde, C dilinin bu işlevlerini kullanmak için #include ve #include başlıkları yazılır. Anlaşılacağı üzere bunlar C dilinden gelen işlevlerdir. Siz C++ programcısı olarak bunları da kullanabilirsiniz. Ama bizim önerimiz C++ dilinin kendi standart kütüphanesinde bulunan string sınıf işlevlerinin kullanılmasıdır. C++ string sınıf işlevlerini kullanmak için başlıkta #include yazmak yeterlidir. (C++ string sınıf işlevleri, C dilinde kullanılamaz hatırlatalım). Şimdi C++ da kullanılabilecek C string ve karakter işlevlerini verelim; int isalnum(int ch) ; cctype
int isalpha(int ch) ; cctype int isblank(int ch) ; cctype int iscntrl(int ch) ; cctype int isdigit(int ch) ; cctype int isgraph(int ch) ; cctype int islower(int ch) ; cctype int isprint(int ch) ; cctype int ispunct(int ch) ; cctype int isspace(int ch) ; cctype int isupper(int ch) ; cctype int isxdigit(int ch) ; cctype void* memchr(const void* buffer, int ch, size_t count) ; cstring int memcmp(const void* buf1, const void* buf2, size_t count) ; cstring void* memcpy(void* to, const void* from, size_t count) ; cstring void* memmove(void* to, const void* from, size_t count) ; cstring void* memset(void* buf, int ch, size_t count) ; cstring char* strcat(char* str1, const char* str2) ; cstring char* strchr(const char* str, int ch) ; cstring int strcmp(const char* str1, const char* str2) ; cstring int strcoll(const char* str1, const char* str2) ; cstring char* strcpy(char* str1, const char* str2) ; cstring size_t strcspn(const char* str1, const char* str2) ; cstring char* strerror(int errnum) ; cstring size_t strlen(const char* str) ; cstring char* strncat(char* str1, const char* str2, size_t count) ; cstring int strncmp(const char* str1, const char* str2, size_t count) ; cstring char* strncpy(char* str1, const char* str2, size_t count) ; cstring char* strpbrk(const char* str1, const char* str2) ; cstring char* strrchr(const char* str, int ch) ; cstring size_t strspn(const char* str1, const char* str2) ; cstring char* strstr(const char* str1, const char* str2) ; cstring char* strtok(char* str1, const char* str2) ; cstring size_t strxfrm(char* str1, const char* str2, size_t count) ; cstring int tolower(int ch) ; cctype int toupper(int ch) ; cctype Burada cstring ve cctype açıklamalarını, ilgili işlevi C++ dilinde kullanırken, yazılacak başlık biçimini hatırlatmak için verdik. Örnek;
#include #include İşlevlerin kullanım ayrıntılarını, C standartlarının bulunduğu herhangi bir kitapta bulabilirsiniz. Aslında yukarıdaki yazım biçimlerine bakarak birçok özelliği siz kendiniz de keşfedebilirsiniz. Biraz gayret. Burada bir konuyu yeri gelmişken belirtelim cstringte yer alan memcpy, memset gibi bellek yerleşim işlevleri bazen C++ daki new işleci yerine tercih edilebilmektedir. O nedenle bu tür bellek yerleşim işlevlerinin ayrıntılarını öğrenmeniz sizin yararınızadır. Burada C ile ilgili daha fazla ayrıntı vermememizin nedeni ise asıl hedefimizin C++ dili olmasıdır.
C++ standart kütüphane string'leri Şimdi bu bölümde basic_string< > temel kalıp kütüphanesi ve onun özelleşmiş standardı string ile wstring'i inceleyeceğiz. Bilindiği gibi bir sınıfı kullanabilmek için, o sınıfın public arayüzünü iyi bilmek gerekir. String sınıfının oldukça geniş yöntemler kümesi bulunmaktadır. Bunların içinde çok sayıda yapıcı işlev, string atamaları için bindirilmiş işleçler, string birleştiricileri, karşılaştırıcıları ve her öğeye ayrı ayrı erişebilme yöntemleri ve daha birçokları sayılabilir. Kısaca string sınıfı bir sürü iş yapar.
string nesnesi oluşturmak Önce string sınıfı yapıcı işlevlerini inceleyelim. Daha sonra, sınıfın nesnesi oluşturulurken en önemli şeyi dikkate alalım; sınıfla ilgili seçenekler. String sınıfına ait 6 adet yapıcı işlev aşağıda ayrıntıları ile verilmiştir. String sınıfının yapıcı işlevleri Yapıcı işlev
Açıklamalar
1-string(const char* s)
string nesnesini SBSS s göstergeçi ile başlatır
2-string(size_type n, char c)
n tane öğesi olan string nesnesi oluşturur, herbiri c karakteri ile başlar. 3-string(const string& str, string string nesnesini str nesnesi ile başsize_type pos=0, size_type n=npos) latır, str deki pos dan başlayarak str nin sonuna kadar gider veya n tane karakter kullanır. (hangisi önce ise) 4-string( ) 0 büyüklüğündeki varsayılan string nesnesini oluşturur 5-string(const char* s, size_type n) string nesnesini s nin gösterdiği SBSS ile başlatır, bu SBSS boyutu aşılsa bile sürer 6-template string nesnesini [begin, end) arası string(Iter begin, Iter end) değerlerle başlatır. begin ve end göstergeç gibi davranır, yer belirler. Değerlere begin dahil ama end değil. Not; SBSS= sıfır bayt sonlanmalı string, yani C-string demektir. Bunlardan başka += bindirilmiş işleci stringleri birbirinin arkasına ekler, bindirilmiş = işleci bir stringi diğerine atar, bindirilmiş first' bir map değerinin (string) anahtarıdır, ve 'ret.first->second' ise değerdir (int). map::iterator insert(pos, keyvalue) : Bu yolla bir map::value_type, pos gözardı edilerek map e yerleştirilir, eklenen öğenin yineleyicisi döner. void insert(first, beyond) : Bu üye işlev [first, beyond) alanındaki yineleyicilerin gösterdiği yerlere map::value_type öğeleri yerleştirir. -- map::iterator map::lower_bound(key) : Bu üye işlev en azından önceden belirlenmiş anahtara eşit olan key in ilk anahtar değerini işaret eden yineleyiciyi döndürür. Böyle bir öğe yoksa o zaman map::end( ) döner. -- map::reverse_iterator map::rbegin( ) : Bu üye işlev map teki son öğeyi işaret eden yineleyiciyi döndürür. -- map:.reverse_iterator map:.rend( ) : Bu üye işlev map teki ilk öğeden öncesini işaret eden yineleyiciyi döndürür. -- unsigned map::size( ) : Bu üye işlev map teki öğe sayısını döndürür. -- void map::swap(argumant) : Bu üye işlev özdeş anahtar/değer tiplerine sahip iki map i birbiri ile takas eder. -- map::iterator map::upper_bound(key) : Bu üye işlev önceden belirlenmiş key değerini aşan ilk key e ait olan anahtar değer (keyvalue) öğesini gösteren yineleyiciyi döndürür. Böyle bir öğe yoksa o zaman map:.end( ) döner. Aşağıda verdiğimiz örnekte equal_range( ), lower_bound( ) ve upper_bound( ) üye işlevleri kullanılmıştır: //B05:map_uye.cpp
//equal_range, lower_bound, upper_bound #include #include using namespace std ; int main( ){ pair pa[]={ pair(“bir”, 10), pair(“iki”, 20), pair(“uc”, 30), }; map object(&pa[0], &pa[3]) ; map::iterator it ; if((it=object.lower_bound(“ik”)) !=object.end( )) cout
View more...
Comments