Programowanie Obiektowe i C++

Podobne dokumenty
jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Pliki wykład 2. Dorota Pylak

Pliki wykład 2. Dorota Pylak

Wejście wyjście strumieniowe

Operacje wejścia/wyjścia odsłona pierwsza

Operacje wejścia/wyjścia (odsłona druga) - pliki

Język C++ wykład VIII

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Język C++ Różnice między C a C++

Programowanie w językach

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Pliki wykład. Dorota Pylak

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Pliki wykład. Dorota Pylak

Wykład :37 PP2_W9

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie i struktury danych

Programowanie Obiektowe i C++

Podstawy Programowania

Wstęp do programowania obiektowego

C++ - [3-5] Pliki i strumienie w C++

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

Część 4 życie programu

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony

Wstęp do programowania. Dariusz Wardecki, wyk. X

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Programowanie Obiektowe i C++

Spis treści OBSŁUGA PLIKÓW W JĘZYKU C++ Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Język C++ zajęcia nr 1

Operacje na plikach (niskiego poziomu) < IO.H >

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

TEMAT : KLASY DZIEDZICZENIE

Operatory na rzecz typu TString

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie Procedurale. Pliki w języku C++

Programowanie obiektowe

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Funkcje zawarte w bibliotece < io.h >

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Dziedziczenie & W slajdach są materiały zapożyczone z

Funkcje zawarte w bibliotece < io.h >

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy programowania skrót z wykładów:

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie Obiektowe i C++

Programowanie Obiektowew języku C++ Zadania L4

Podstawy programowania w C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

po ostatnim dopisaniu na standardowe wyjście (cout) powinien zostać wyprowadzony komunikat "Skonczylem";

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Programowanie komputerowe. Zajęcia 1

Projektowanie klas c.d. Projektowanie klas przykład

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wstęp do programowania. Wykład 1

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Strumienie standardowe C

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Wstęp do Programowania 2

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Wprowadzenie do programowania i programowanie obiektowe

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

I - Microsoft Visual Studio C++

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

C++ - strumienie. Strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. Formatowanie strumieni wyjściowych

Wyjątki (exceptions)

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wstęp do Programowania 2

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Rzutowanie i konwersje

Wzorce funkcji (szablony)

Zasady programowania Dokumentacja

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Transkrypt:

Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 13.11.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 157 / 201

Wejście-wyjście Nie jest elementem języka C++ Niezbyt istotne dla użytkownika, ważne dla języka: jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nowa platformę jest mniejszy. Standardowa biblioteka we-wy iostream. Operacje we-wy wykonuje się na strumieniach. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 158 / 201

Strumienie Strumienie sa ciagami znaków. Operacje we-wy polegaja na przekształcaniu obiektów na ciagi znaków i vice versa. Zaleta strumieni: wygodne i jednolite traktowanie typów wbudowanych i zdefiniowanych przez użytkownika. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 159 / 201

Wyjście Standardowe strumienie: cout i cerr. cout odpowiada stdout z C a cerr stderr. Ponadto: clog (jak cerr, ale buforowany) Wszystkie maja swoje odmiany dla Unicode: wcout,... Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 160 / 201

Operator << ostream& operator<<(ostream&, T) T może być (i często jest) typem referencyjnym. typ wyniku umożliwia skróty takie jak: cout << "i=" << i << \n ; zamiast cout<<"i="; cout<<i; cout<< \n ; Operatory << i >> wiaż a w lewo. Priorytet << jest niższy niż operacji arytmetycznych. Dzięki temu można napisać np. cout << "a*x+b"= << a*x+b ; Sa jednak operatory o jeszcze niższych priorytetach: cout << "x^y z=" << x^y z ; // Błąd! cout << "x^y z=" << (x^y z) ; // Tak! Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 161 / 201

Operator << W treści operatora należy jako wynik przekazać strumień będacy parametrem operatora. Ponieważ pierwszy argument pochodzi z klasy ostream, nie można go zdefiniować jako metodę klasy T, lecz tylko jako funkcję. Zwykle powinna to być funkcja zaprzyjaźniona z klasa T. Zamiast operatora << można dla znaków używać funkcji put, np. cout.put( A ) zaś dla napisów funkcji write. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 162 / 201

Przykład class Zespolone { double re,im ; public: friend ostream& operator<<(ostream& os, Zespolone& z); } ostream& operator<<(ostream& os, Zespolone& z) { os<< ( z.re<<, <<z.im<<")"; return os ; // Bardzo ważne! } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 163 / 201

Klasa ostream W uproszczeniu: class ostream: public virtual ios{ //... public: ostream& operator<<(char); ostream& operator<<(const char*); ostream& operator<<(int); //... ostream& operator<<(ostream& (*pf)(ostream &); ostream& put(char); ostream& write(const char *); ostream& flush() ; }; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 164 / 201

Wejście Standardowy strumień cin. Operator >> istream& operator>>(istream&, T) zwykle implementujemy go tak: istream& operator>>(istream& is, T& zmienna) { // pomiń białe znaki: spacja, tab, nowa linia... // wczytaj tekstową reprezentację T na zmienną return is ; } Uwaga: pamiętajmy, że strumienie wyjściowe maja typ ostream, a wejściowe istream. Istnieje również typ mieszany iostream. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 165 / 201

Czy udało się odczytać? Zapis if(s>>zmienna)... jest poprawny i oznacza sprawdzenie, czy wczytanie zmiennej się powiodło. Taki zapis jest możliwy dzięki operatorowi konwersji typu istream do int. Przykład: main() { int i; while(cin>>i) cout<<i ; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 166 / 201

Metody get Zamiast operatora >> możemy użyć jednej z metod get: char buf[100]; cin >> buf; // Tu grozi nam wyjście poza tablicę cin.get(buf,100); // Tu jesteśmy bezpieczni class istream : public virtual ios { //... istream& get(char* s, int n, char delim= \n ); istream& get(char c); cin>>c pomija białe znaki, cin.get(c) nie. cin>>buf wczyta tylko do pierwszego białego znaku, cin.get(buf) do pierwszego wystapienia delim (domyślnie koniec linii). Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 167 / 201

Funkcje pomocnicze Nagłówek ctype.h zawiera użyteczne funkcje klasyfikacji znaków, np. isspace(char) czy biały znak isalpha czy litera isdigit czy cyfra...i wiele innych Metoda putback(char) pozwala na wstawienie znaku z powrotem do strumienia (ale ostrożnie). Metoda peek() pozwala na podejrzenie następnego znaku, bez jego pobierania. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 168 / 201

Stany strumienia Z każdym strumieniem zwiazany jest jego stan. Klasa podstawowa strumieni ios definiuje metody testowania stanu, np. int eof() ; // napotkano koniec strumienia int good(); // operacja się udała int fail(); // operacja się nie udała int bad() ; // strumień jest do niczego Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 169 / 201

Bity stanu W rzeczywistości stan strumienia jest reprezentowany przez ciag bitów, które można ustawiać, zerować i testować: int s = cin.rdstate(); // odczytaj bity stanu if(s & ios::goodbit){ // operacja się udała } else if (s & ios::failbit){ // niedobrze } else if (s & ios::badbit){ // pacjent nie przeżył } cin.clear(ios::badbit) // wbrew nazwie ustawia badbit Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 170 / 201

Przykład istream& operator>>(istream& s, Zespolona& z) { double re=0,im=0; char c = 0; s << c; if(c== ( ) { s>>re>>c; if(c==, ) s>>im>>c; if(c!= ) ) s.clear(ios::badbit); } else {s.putback(c);s>>re;} if(s) z=zespolona(re,im); return s; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 171 / 201

Formatowanie Klasa ios zawiera operacje służace do określania sposobu wypisywania danych, np. int width(int w); określa minimalna szerokość pola, na którym będzie wypisywany następny element, np. cout << ( ; cout.width(4); cout << 12 << ) ; Spowoduje wypisanie 12 w polu szerokości 4: ( 12) Uwaga: width dotyczy tylko jednej, następnej operacji. Domyślnie jest 0, czyli (tylko) tyle znaków ile potrzeba. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 172 / 201

Manipulatory Manipulatory sa pojedynczymi elementami wstawianymi do strumienia, wpływajacymi na realizację wyjścia. Poznaliśmy już manipulator endl: cout << "Kaczka dziwaczka" << endl ; Powoduje on przejście do nowej linii i opróżnienie bufora, czyli cout << \n ; cout.flush() ; Zamiast width można żyć manipulatora: cout << ( << setw(4) << 12 << ) ; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 173 / 201

Implementacja manipulatorów Dzięki przeciażaniu, tworzenie własnych manipulatorów nie jest trudne: ostream& flush(ostream&); class Flushtype {} ; // potrzebujemy nowego typu ostream& operator<<(ostream& os, Flushtype) { return flush(os) ; } Flushtype FLUSH; Teraz możemy wymuszać opróżnienie bufora przez wysłanie FLUSH: cout << x << FLUSH << y << FLUSH; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 174 / 201

Lepsza implementacja Powyższa metodę można uogólnić na wszystkie funkcje takiego typu jak flush: typedef ostream& (*manip)(ostream&); czyli manip jest wskaźnikiem do funkcji o zarówno argumencie jak i wyniku typu ostream& ostream& operator<<(ostream& os, manip f) { return f(os) ; } Teraz śmiało możemy napisać cout << flush ; W rzeczywistości klasa ostream ma już odpowiednie metody. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 175 / 201

Strumienie i pliki Mechanizmu strumieni można używać dla wejścia wyjścia plikowego. Należy w tym celu właczyć nagłówek <fstream> Plik otwiera się dla wyjścia przez utworzenie obiektu klasy ofstream z nazwa pliku jako argumentem. Podobnie dla wejścia, tyle, że używamy ifstream. W obu wypadkach warto sprawdzić stan strumienia, y przekonać, że udało się otworzyć plik. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 176 / 201

Przykład int main(int argc, char* argv[]){ ifstream skad(argv[1]); if!(skad) cerr << "Blad:..."; ofstream dokad(argv[2]); if!(dokad) cerr << "Blad:..."; char ch; while(skad.get(ch)) dokad.put(ch); } if(!skad.eof() dokad.bad()) cerr << "Blad:..."; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 177 / 201

Zamykanie strumieni Strumień zwiazany z plikiem powinien być na końcu zamknięty. Zwykle nie musimy się o to martwić - załatwia to destruktor strumienia. Jeśli jednak potrzeba zamknać strumień przed końcem jego zasięgu, można to uczynić metoda close() Oczywiście zamkniętego strumienia nie można już używać. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 178 / 201

Jeszcze o napisach Do tej pory do przechowywania napisów używaliśmy tablic. Wada tablic jest ich stały rozmiar Mechanizm klas pozwla na lepsze rozwiazania. Biblioteka standardowa C++ zawiera klasę string, implementujac a ciagi składajace się ze zmiennej liczby znaków. By jej używać, należy właczyć nagłówek <string> Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 179 / 201

Konstruowanie napisów string x0; // pusty napis string x2( a ); // "a" string x3( a,5); // "aaaaa" string x4("abcde");// "abcde" string x4("abcdef",5);// "abcde" string x6(x5); // "abcde" string x7(x5,1); // "bcde" string x8(x5,0,3); // "abc" Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 180 / 201

Wycinanie x0[1] // drugi znak x0 x0.substr() // kopia całości x0.substr(pos) // od pozycji pos x0.substr(pos,n) // max n znaków od pozycji pos x0.remove(pos) // usuń od pozycji pos x0.remove(pos,n) // max n znaków od pozycji pos Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 181 / 201

Sklejanie string stringone("hello"); string stringtwo("world"); stringone += " " + stringtwo; stringone = "hello"; stringone.append(" world"); string stringthree("hello"); // doklej " world": stringthree.append(stringone, 5, 6); cout << stringthree << endl; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 182 / 201

Porównywanie i wyszukiwanie x0 == x1 x0 < x1 // Można używać relacji x0.find(c) // znajdź znak x0.find(s) // znajdź napis x0.find(s,m,n) // znajdź w wyznaczonym fragmencie x0.rfind(...) // to co find, tylko od tyłu Oczywiście napisy współpracuja ze strumieniami: string x; cin >> x; cout << x; getline(cin,x0); Marcin Benke (IIUW) Programowanie Obiektowe i C++ 13.11.2006 201 / 201