Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Podobné dokumenty
Mělká a hluboká kopie

Programování v C++ 1, 5. cvičení

Ukazatele, dynamická alokace

map, multimap - Asociativní pole v C++.

Programování v C++ 1, 6. cvičení

PB161 Programování v jazyku C++

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

PB161 Programování v jazyce C++ Přednáška 10

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Více o konstruktorech a destruktorech

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Šablony funkcí a tříd (Templates) Genericita

Úvod do programovacích jazyků (Java)

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Abstraktní datové typy

Vector datový kontejner v C++.

Jazyk C++ II. STL knihovna kontejnery část 1

přetížení operátorů (o)

Výrazy, operace, příkazy

PB161 Programování v jazyce C++ Přednáška 4

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

PB161 Programování v jazyce C++ Přednáška 3

Přetěžování operátorů, dynamika objektů 2

Programování v C++ 3, 3. cvičení

Abstraktní třídy, polymorfní struktury

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

přetížení operátorů (o)

PB161 Programování v jazyce C++ Přednáška 4

PB161 Programování v jazyce C++ Přednáška 9

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Přetěžování operátorů

Základy C++ I. Jan Hnilica Počítačové modelování 18

PROGRAMOVÁNÍ V C++ CVIČENÍ

Programování v C++ 2, 4. cvičení

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Konstruktory a destruktory

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Programování v C++ 2, 8. cvičení

Základy programování (IZP)

Standardní algoritmy vyhledávací.

Množina čísel int stl-set-int.cpp

PB161 Programování v jazyce C++ Přednáška 3

Výrazy, operace, příkazy

Programování v C++ 1, 1. cvičení

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

PB161 Programování v jazyce C++ Přednáška 5

Programování se šablonami

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Funkční objekty v C++.

Programování v C++ 2, 7. cvičení

Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

PB přednáška (26. října 2015)

Programování v jazyce C a C++

Jazyk C++ I. Šablony

Objektově orientované programování

Struktury, funkce, reference

Množina v C++ (set, multiset).

Data, výrazy, příkazy

Standardní algoritmy v C++.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Jazyk C++, některá rozšíření oproti C

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

PŘETĚŽOVÁNÍ OPERÁTORŮ

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Generické programování

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

C++ objektově orientovaná nadstavba programovacího jazyka C

PB161 Programování v jazyce C++ Přednáška 8

Programování v C++, 2. cvičení

PREPROCESOR POKRAČOVÁNÍ

Přetěžování operátorů

PB přednáška (23. listopadu 2015)

Jazyk C++ I. Šablony 2

PB161 Programování v jazyce C++ Přednáška 9

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Kolekce, cyklus foreach

Úvod do programování. Lekce 1

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 6

Úvod. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016

Dědění, polymorfismus

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

PB161 Programování v jazyce C++ Přednáška 6

C++ objektově orientovaná nadstavba programovacího jazyka C

Zápis programu v jazyce C#

7. Datové typy v Javě

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

Transkript:

Řetězce Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9c https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

Řetězce v C <string.h> (<cstring>) size_t strlen(char *Retezec); char *strcpy(char *Cil, char *Zdroj); char *strncpy(char *Cil, char *Zdroj, size_t MaxDelka); char *strcat(char *Cil, char *Zdroj); char *strncat(char *Cil, char *Zdroj, size_t MaxDelka); int strcmp(char *Prvni, char *Druhy); int strncmp(char *Prvni, char *Druhy, size_t N); char *strchr(char *Retezec, int Znak); char *strrchr(char *Retezec, int Znak); char *strstr(char *Retezec, char *Podretezec); void *memcpy(void *Cil, void *Zdroj, size_t Delka); void *memmove(void *Cil, void *Zdroj, size_t Delka); int memcmp(void *Prvni, void *Druhy, size_t Delka); void *memchr(void *Adresa, int Byte, size_t Delka); void *memset(void *Adresa, int Byte, size_t Delka); Makro: NULL jako celočíselná konstanta (0 nebor 0L), nebo hodnota typu nullptr_t (nullptr) - (void*)0 Typ: size_t typ pro délku libovolného objektu (jako unsigned int)

Řetězce jako třída String s operátory class String { int pocet; // aktuální délka řetězce char *znaky; // ukazatel na dyn. alokované pole public: String(); // vytvoří prázdný řetězec String(const String&); // vytvoří řetězec jako kopii jiného String(const char *); // konverze z C-Stringu ~String(); // destruktor int delka() const; // vrátí délku řetězce String& operator=(const String&); // přiřazení řetězců friend ostream& operator<<(ostream&, const String&); // výstup řetězce do streamu bool operator>=(const String&) const; // porovnání řetězců String operator+(const String&) const; // sřetězení operator const char *() const; // konverze na C-String private: String(const String&, const String&); // podpora sřetězení ;

Třída String s operátory přiřazení: String& String::operator=(const String& p) { if (this!= &p) { delete[] znaky; pocet = p.pocet; znaky = new char[pocet + 1]; strcpy(znaky, p.znaky); return *this; výstup do datového proudu: ostream& operator<<(ostream& str, const String& p) { return str << p.znaky;

konverze na C-string: Třída String s operátory String::operator const char *() const { return znaky; zpřístupnění i-tého znaku (pro čtení): char String::operator[](int i) const { if (i < 0 i >= pocet) throw ChybnyIndex(); return znaky[i]; zpřístupnění i-tého znaku (pro změnu): char& String::operator[](int i) { if (i < 0 i >= pocet) throw ChybnyIndex(); return znaky[i];

Třída String s operátory použití: int main() { String A, B("abc"), C(B); A = B; // přiřazení C = A + "de"; // sřetězení, konverze if (C >= B) // porovnání cout << C << " je větší nebo rovno " << B; else cout << C << " je menší než " << B; cout << endl << "Délka " << C << " je: " << C.delka() << endl; return 0;

Počítané reference Sdílení dynamické části: je třeba vyřešit dva problémy: modifikaci a destrukci cil = zdroj;

Počítané reference class Ref { public: int reference; int pocet; char *znaky; public: Ref(const char *str) { reference = 1; pocet = strlen(str); znaky = new char[pocet + 1]; strcpy(znaky, str); Ref(int delka) { reference = 1; pocet = delka; znaky = new char[pocet + 1]; ~Ref() { delete[] znaky; pocet = 0; reference = 0; znaky = 0; ; Ref prazdny("");

Počítané reference class String { Ref *ref; String(const String& l, const String& p); // konstruktor pro sretezeni public: String() { // prazdny retezec ref = &prazdny; prazdny.reference++; String(const char *str) { // C-string ref = new Ref(str); String(const String& str) { // kopie jineho retezce ref = str.ref; ref->reference++; ~String() { // destruktor ref->reference--; if (ref->reference == 0) { delete ref; ref = 0; int delka() const { // délka řetězce return ref->pocet; operator const char *() const { // konverze na C-string return ref->znaky;

Počítané reference (pokr.) String& operator=(const String& p) { // přiřazení if (ref!= p.ref) { this->~string(); // explicitní volání destruktoru! ref = p.ref; ref->reference++; return *this; friend String operator+(const String& l, const String& p) { // sřetězení return String(l, p); char operator[](int i) const; // vrať i-tý znak - později void zmen(int i, char novy); // změň i-tý znak - později bool operator>=(const String& p) const { // větší nebo rovno return strcmp(ref->znaky, p.ref->znaky) >= 0; bool operator==(const String& p) const { // rovnost return strcmp(ref->znaky, p.ref->znaky) == 0; ; class ChybnyIndex {; // třída pro výjimku

Počítané reference (pokr.) String::String(const String& l, const String& p) { ref = new Ref(l.ref->pocet + p.ref->pocet); strcpy(ref->znaky, l.ref->znaky); strcat(ref->znaky, p.ref->znaky); char String::operator[](int i) const { if (i < 0 i >= ref->pocet) throw ChybnyIndex(); return ref->znaky[i]; void String::zmen(int i, char novy) { if (i < 0 i >= ref->pocet) throw ChybnyIndex(); if (ref->reference > 1) { ref->reference--; ref = new Ref(ref->znaky); // vytvoříme dynamickou kopii ref->znaky[i] = novy; bool String::operator==(const String& p) const { // rovnost return strcmp(ref->znaky, p.ref->znaky) == 0; class ChybnyIndex {; // třída pro výjimku

Dva základní typy: Knihovna <string> pro C++ basic_string generická šablona pro řetězce char_traits generická šablona pro množinu znaků Generické instance char_traits: char základní znaková sada (velikosti 1 byte) wchar_t sada širokých znaků (stejná velikost, znaménko a zarovnání, jako jiný celočíselný typ) char16_t - reprezentuje 16-bitové kódové jednotky (stejná velikost, znaménko a zarovnání, jako celočíselný typ uint_least16_t) char32_t - reprezentuje 32-bitové kódové jednotky (stejná velikost, znaménko a zarovnání, jako jiný celočíselný typ uint_least32_t) Generické instance basic_string: string řetězce znaků (char) wstring řetězce širokých znaků (wchar_t) u16string - řetězce 16-bitových znaků u32string - řetězce 32-bitových znaků

Konverze v knihovně <string> Konverze z řetězců string: stoi - konverze string na int stol - konverze string na long int stoul - konverze string na unsigned long stoll - konverze string na long long stoull - konverze string na unsigned long long stof - konverze string na float stod - konverze string na double stold - konverze string na long double Konverze na řetězce string: to_string - konverze numerické hodnoty na string to_wstring- konverze numerické hodnoty na string

Iterátory: Iterátory v knihovně <string> begin vrací iterátor na začátek end vrací iterátor za konec rbegin vrací iterátor na poslední znak (reverse beginning) reverzní iterátory iterují pozpátku rend vrací iterátor před první znak (reverse end) cbegin vrací const_iterator na začátek cend vrací const_iterator za konec crbegin vrací const_reverse_iterator na poslední znak crend vrací const_reverse_iterator před první znak

Příklad // string::crbegin/crend #include <iostream> #include <string> int main() { std::string str("lorem ipsum"); for (auto rit = str.crbegin(); rit!= str.crend(); ++rit) std::cout << *rit; std::cout << '\n'; return 0; muspi merol

Kapacita řetězců v knihovně <string> size délka řetězce length počet znaků max_size maximální velikost řetězce resize změna velikosti řetězce capacity velikost alokované paměti reserve požadavek na změnu kapacity clear vymaže řetězec empty test na prázdnot řetězce shrink_to_fit nastaví kapacitu dle aktuální délky

Příklad // string::shrink_to_fit #include <iostream> #include <string> int main() { std::string str(100, 'x'); 1. capacity of str: 100 2. capacity of str: 100 3. capacity of str: 10 std::cout << "1. capacity of str: " << str.capacity() << '\n'; str.resize(10); std::cout << "2. capacity of str: " << str.capacity() << '\n'; str.shrink_to_fit(); std::cout << "3. capacity of str: " << str.capacity() << '\n'; return 0;

Přístup k elementům v knihovně <string> operator[] indexace at() totéž back() poslední znak front() první znak int main() { std::string str("test string"); for (unsigned i = 0; i<str.length(); ++i) { std::cout << str.at(i); cout << endl; cout << str.front() << endl; cout << str.back() << endl; Test string T g

Další možnosti knihovny <string> Modifikátory: operator+= append push_back assign insert erase replace swap pop_back Práce s řetězci: c_str data get_allocator copy find rfind find_first_of find_last_of find_first_not_of find_last_not_of substr compare Další možnosti: operator+ relational operators swap operator>> operator<< getline

The End

Vektory Příklad: třída pro 3D vektorový prostor nad reálnými čísly const int dim = 3; typedef double Skalar; class Vektor { Skalar slozky[dim]; public: Vektor(); Vektor(Skalar x, Skalar y, Skalar z); Vektor operator-() const; Vektor operator+(const Vektor& p) const; Skalar operator*(const Vektor& p) const; Skalar operator[](unsigned index) const; Skalar& operator[](unsigned index); Skalar delka() const; friend Vektor operator*(skalar k, const Vektor& v); friend ostream& operator<<(ostream&, const Vektor& v); bool operator==(const Vektor& p) const; ;

konstruktor prázdného vektoru: Vektor::Vektor() { for (int i = 0; i < dim; i++) slozky[i] = 0; opačný vektor: Vektory (pokr.) Vektor::Vektor(Skalar x, Skalar y, Skalar z) { slozky[0] = x; slozky[1] = y; slozky[2] = z; Vektor Vektor::operator-() const { Vektor vysledek; for (int i = 0; i < dim; i++) vysledek.slozky[i] = -slozky[i]; return vysledek;

součet vektorů: Vektory (pokr.) Vektor Vektor::operator+(const Vektor& p) const { Vektor vysledek; for (int i = 0; i < dim; i++) vysledek.slozky[i] = slozky[i] + p.slozky[i]; return vysledek; skalární součin: Skalar Vektor::operator*(const Vektor& p) const { Skalar vysledek = 0; for (int i = 0; i < dim; i++) vysledek += slozky[i] * p.slozky[i]; return vysledek;

indexace (i-tá složka): velikost vektoru (délka): Vektory (pokr.) Skalar Vektor::operator[](unsigned index) const { if (index >= dim) throw "chybny index"; return slozky[index]; // použije se na konstantní vektory Skalar& Vektor::operator[](unsigned index) { if (index >= dim) throw "chybny index"; return slozky[index]; // pro nekonstantní vektory; umožňuje modifikaci Skalar Vektor::delka() const { return sqrt(*this * *this); // sqrt vyžaduje #include <cmath>

násobení vektoru skalárem: Vektory (pokr.) Vektor operator*(skalar k, const Vektor& v) { Vektor vysledek; for (int i = 0; i < dim; i++) vysledek.slozky[i] = k * v.slozky[i]; return vysledek; výstup vektoru: ostream& operator<<(ostream& str, const Vektor& v) { str << "[" << v.slozky[0]; for (int i = 1; i < dim; i++) str << "," << v.slozky[i]; return str << "]";

Vektory (pokr.) použití: int main() { const Vektor b1(1, 0, 0), b2(0, 1, 0), b3(0, 0, 1); Vektor x = -b1 + 3 * b2 + 2 * b3; Vektor y = -x; y[2] = 5; cout << "Vektory x=" << x << " a y=" << y; if (x * y == 0) cout << " jsou kolmé." << endl; else cout << " nejsou kolmé." << endl; return 0;