do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
do koszyka |
KURS JĘZYKA C++ PODSTAWY
00. Informacje ogólne - wstęp 01. Praca z konsolą - początki - cout 02. Zmienne (int, float, double) 03. Konsola cd. - cin 04. Zmienne tekstowe - (char, string) 05. Operatory 06. Instrukcje warunkowe (if - else, switch - case) 07. Pętle (for, while) 08. Instrukcje warunkowe cd. 09. Break, Continue 10. Funkcje 11. Zakresy ważności 12. Tablice zmiennych 13. Mała powtórka :))) 14. Struct - struktury 15. String, Vector - wstęp do STL 16. Wskaźniki, referencje 16a. Wskaźnik do typów prostych 16b. Wskaźnik do funkcji 16c. Operatory new i delete 16d. Referencje 17. Pliki źródłowe i nagłówkowe Zadania powtórzeniowe 18. Class - klasy 19. Konstruktor , destruktor 20. Argumenty domyślne, przeciążanie (przeładowanie) funkcji i operatorów C++ FAQ: 01. Operacje na plikach, odczyt/zapis02. Nie działa mi polecenie gotoxy() co robić ? 03. Jaki podręcznik do nauki C++ ? ostatnia aktualizacja: 29.08.2005 STRING, VECTOR - WSTĘP DO STL
String oraz vector są typami które udostępnia dla nas biblioteka standardowa STL (Standard Template Library), oczywiście
w STL jest "zaszytych" dużo więcej bardzo przydatnych "rzeczy" ale na chwilę obecną omówię moim zdaniem najczęściej wykorzystywane.
STRING Wstępnie już został omówiony, przedstawiłem jego podstawowe możliwości. Dzisiaj garść informacji które mogą wybitnie ułatwić pracę z obiektami typu string. Tworzenie: string str_Tekst; utworzona została zmienna tekstowa o nazwie str_Tekst. Podstawowe operacje przypisania już były wcześniej omówione: str_Tekst = "napisik"; str_Tekst = "napis1 " + "napis2 " + str_Tekst; str_Tekst += "litery"; STL dla typu string udostępnia nam także: - sprawdzanie długości ciągu tekstowego zawartego w zmiennej string str_Tekst; str_Tekst = "programowanie jest latwe"; int i_Dlugosc = str_Tekst.length(); pobiera długość tekstu i zapisuje ją w zmiennej i_Dlugość, i_Długość == 24 - wstawienie tekstu w środek ciągu tekstowego string str_Tekst; str_Tekst = "napis"; str_Tekst.insert(3," nowy "); wstawia w wybrane miejsce ciągu tekstowego dodatkowe znaki, str_Tekst == "nap nowy is" - wydobycie pojedynczego znaku ze zmiennej string str_Nowy,str_Tekst; str_Tekst = "napis"; str_Nowy = str_Tekst.at(2); pobiera pojedynczy znak, str_Nowy == "p", znaki są numerowane od 0 - wycinanie fragmentow tekstów string str_Nowy,str_Tekst; str_Tekst = "probny napis"; str_Nowy = str_Tekst.substr(3,5) wycina fragment tekstu o długości 5 znaków począwszy od znaku numer 3 i zapisuje w zmiennej str_Nowy, str_Nowy == "bny n" - zastępowanie fragmentów tekstów string str_Tekst; str_Tekst = "maly napis"; str_Tekst.replace(2,6," wstawiony tekst "); w zmiennej str_Tekst kasowane jest 6 znaków tekstu począwszy od znaku 2, następnie wstawiany jest nowy fragment tekstu, str_Tekst == "ma wstawiony tekst is"; - konwersja to typu podstawowego string str_Tekst; str_Tekst = "napis testowy"; cout << str_Tekst.c_str(); c_str - dokonuje konwersji do postaci char ze znakiem 0 (zero) na końcu, na chwilę obecną do niczego nam się to nie przyda ale warto pamiętać o takiej możliwości w przyszłości VECTOR Poznaliśmy już wcześniej tworzenie tablic, niestety miały one pewne ograniczenia. Bo wyobraźmy sobie sytuację gdy piszemy program i do czegoś jest nam potrzebna tablica np. zmiennych typu int, jaki ma mieć ona rozmiar? Sytuacją idealną jest jeśli z góry wiemy, że rozmiar tablicy będzie stały np. 100 elementów więc tworzymy taką tablicę i po sprawie int i_Tab[100];, gorzej natomiast gdy rozmiar tablicy jest nam nie znany. Wiemy tylko, że na chwilę obecną będziemy potrzebowali np od 100 do ok 170 elementów, przy takim założeniu możemy utworzyć tablicę o rozmiarze np. 180 i problem z głowy, powinno miejsca zawsze wystarczyć niestety nie jest to takie oczywiste. Jeśli będziemy w stanie przewidzieć zachowanie naszego programu w absolutnie każdej sytuacji wtedy tworzymy tablicę o rozmiarze maksymalnie dużym do naszych potrzeb, niestety nie jest to taki proste. Ma też dodatkowo poważną wadę bo co w sytuacji gdy przez większość czasu działania naszego programu będzie on korzystał z tablicy o rozmiarze 100 a tylko np. raz na tydzień będzie mu potrzebna większa o rozmiarze np 100000? Przydzielenie na stałe tak dużej tablicy jest marnotrawieniem pamięci. Oczywiście język C++ dostarcza nam mechanizmy do zarządzania pamięcią (jej przydzielaniem i zwalnianiem) jednak dla osób początkujących mogą być one dosyć trudne do zrozumienia więc zanim do nich przejdziemy omówimy jeszcze kilka innych rzeczy aby mieć solidniejsze podstawy. Typ z biblioteki STL o nazwie vector jest typem tablicowym, który czyni pracę z tablicami znacznie wygodniejszą. Aby skorzystać z jego możliwości musimy tak jak w przypadku typu string dołączyć odpowiedni plik z opisem: #include <vector> Normalnie tworzymy tablicę 100 obiektów typu int: int i_Tab[100]; Przy wykorzystaniu vector tworzenie takie będzie wyglądało: vector <int> vi_Tab(100); Dostęp do obu tablic wygląda identycznie zobaczmy to na przykładzie czyszczenia zawartości obu tablic: for (int i=0 ; i < 100 ; i++) { i_Tab[i] = 0; vi_Tab[i] = 0; } Niby wszystko identycznie po co więc wprowadzać nowy typ? Już wyjaśniam. Wyobraźmy sobie teraz, że nasz program w pewnym momencie "uzna", że tablica 100 elementowa to dla niego za mało, w przypadku zwykłej tablicy po prostu wyjdzie poza jej zakres i zacznie nam nadpisywać być może istotne informacje w pamięci nie mamy w tym przypadku możliwości obrony przed takim niszczycielskim działaniem. Vector udostępnia nam kilka dodatkowych możliwości które przy umiejętnym wykorzystaniu mogą uczynić nasz program bardziej elastycznym. - sprawdzenie aktualnej wielkości dostępnej tablicy danych vector <int> vi_Tab(100); int i_Rozmiar = vi_Tab.size(); w zmiennej i_Rozmiar znajdzie się liczba 100 - aktualna wielkość tablicy - powiększenie/zmniejszenie tablicy vector <<int> vi_Tab(100); vi_Tab.resize(vi_Tab.size() + 40); pobieramy aktualną wielkość tablicy + ilość danych o jaką chcemy powiększyć tablicę, w efekcie działania resize otrzymamy vi_Tab == 140 , oczywiście operacja w drugą stronę działa na podobnej zasadzie po prostu nie ważne co chcemy zrobić zmniejszyć czy zwiększyć rozmiar tablicy po prostu podajemy jej nowy rozmiar, mechanizmy wbudowane w vector "odwalą czarną robotę" - wyczyszczenie całej tablicy vector <int> vi_Tab(100); vi_Tab.clear(); usunięcie całej tablicy z pamięci - praca na pojedynczych elementach tablicy vector <int> vi_Tab; vi_Tab.push_back(123); vi_Tab.push_back(12); vi_Tab.push_back(8232); na początku tablica nie zawierała żadnych elementów , poleceniem push_back dodajemy do tablicy 1 element określonego typu na jej koniec, w powyższym przykładzie polecenie push_back zostało wykonane 3 razy w związku z tym mamy teraz 3 elementową tablicę obiektów typu int wypełnioną następującymi danymi: 123,12,8232 Oczywiście działanie odwrotne jest także możliwe dzięki pop_back czyli usunięciu ostatniego elementu tablicy. vi_Tab.pop_back() po wykonaniu powyższej instrukcji ostatni element tablicy zostaje usunięty więc teraz mamy 2 elementową tablicę zawierającą odpowiednio:123,12 - wstawianie elementów w środek tablicy vector <int> vi_Tab; vi_Tab.push_back(1234); vi_Tab.push_back(3333); w chwili obecnej mamy 2 elementową tablicę: 1234,3333 vi_Tab.insert(1,5555); nowy element został wstawiony na pozycję 1, otrzymujemy tablicę: 1234,5555,3333 Wszytkie powyższe informacje odnoszące się do typu vector przedstawiane były na przykładzie zmiennych typu int jako najprostszego rodzaju danych. Vector może oczywiście pracować także na danych innego typu: float, double, char oraz na obiektach złożonych takich jak np. wcześniej poznany struct (struktury). - utwórz strukturę TOWAR zawierającą pola: int i_CenaNetto; string str_Nazwa; - utwórz vector ZAMOWIENIE zawierający 10 obiektów struktury TOWAR - do każdego z obiektów przydziel cenę netto oraz nazwę towaru - podlicz łączną kwotę do zapłaty sumując poszczególne ceny towarów w zamówieniu - oblicz podatek vat dla zamówienia (22%) |
|