Programowanie w C++ Adam Szmagliński, p. F215 Środowisko programistyczne: MS Visual Studio 2012
|
|
- Sebastian Górecki
- 7 lat temu
- Przeglądów:
Transkrypt
1 Programowanie w C++ Adam Szmagliński, p. F215 Środowisko programistyczne: MS Visual Studio 2012 Literatura: Jerzy Grębosz, Symfonia C++ standard, t. 1 i 2
2 Wykonywanie programu w języku C++ zaczyna się od funkcji main. Ciało tej funkcji zawierające instrukcje zawarte są między nawiasami klamrowymi: { oraz }. Nazwy tworzy się z liter i cyfr pierwszym znakiem musi być litera. Znak podkreślenia _ jest traktowany jak litera. W języku C++ rozróżnia się wielkie i małe litery. Czas przeznaczony na pisanie komentarzy nie jest czasem straconym. Komentarze są ignorowane przez kompilator. Można je umieszczać na 2 sposoby: pomiędzy sekwencjami znaków /* oraz */ nie mogą one być zagnieżdżone na prawo od // do końca linii
3 1. Instrukcje sterujące Instrukcje w języku C są zakończone średnikiem. Nawiasy klamrowe { i } są używane do grupowania deklaracji i instrukcji w blok, składniowo równoważny jednej instrukcji. Po nawiasie klamrowym zamykającym blok nie występuje średnik. Sam średnik oznacza tzw. pustą instrukcję. Kilka wyrażeń oddzielonych przecinkiem (tutaj operatorem) oblicza się od lewej strony do prawej. Typem i wartością wyniku jest typ i wartość prawego argumentu (po ostatnim przecinku). Przecinki oddzielające argumenty funkcji, zmienne w deklaracjach, itp. nie są operatorami i nie gwarantują obliczeń od lewej strony do prawej.
4 if(wyrażenie) instrukcja1 else instrukcja2 Instrukcja if-else Część else (w drugiej linii) jest opcjonalna. Najpierw oblicza się wyrażenie. Jeśli jest prawdziwe (wartość różna od 0), wykonuje się instrukcja1. Gdy jest fałszywe i istnieje część else, wykonuje się instrukcja2. W ciągu zagnieżdżonych instrukcji if każda z części else jest przyporządkowana najbliższej z poprzednich instrukcji if nie zawierającej części else. W celu innego przyporządkowania stosuje się nawiasy {}. Często występującym zastosowaniem jest konstrukcja else-if, jako sposób zapisania decyzji wielowariantowych: if(wyrażenie) instrukcja else if(wyrażenie) instrukcja else if(wyrażenie) instrukcja else instrukcja
5 Instrukcja switch Instrukcja switch służy do podejmowania decyzji wielowariantowych, w których sprawdza się, czy wartość pewnego wyrażenia pasuje do jednej z kilku całkowitych stałych wyrażeń i wykonuje odpowiedni skok. switch(wyrażenie) { case wyrażenie-stałe: instrukcje case wyrażenie-stałe: instrukcje default: instrukcje } Z każdym wariantem instrukcji jest związana jedna lub kilka całkowitych wartości bądź wyrażeń stałych. Gdy dany przypadek (case) jest zgodny z wartością wyrażenia, to od niego rozpocznie się dalsze wykonywanie programu. Przypadek default jest opcjonalny i może występować w dowolnej kolejności z innymi. Zostaje wykonany gdy żaden przypadek nie jest zgodny z wartością wyrażenia. Instrukcja break powoduje natychmiastowe wyjście z instrukcji switch, a także z pętli while, for i do.
6 switch czy if-else? Do wielowariantowych wyborów lepsza jest instrukcja switch, poza przypadkami gdy jest to niemożliwe: obiekt porównywany nie da się zmienić na typ całkowity operacja porównania nie sprawdza równości dwóch elementów wyrażenia z którymi porównujemy w momencie kompilacji nie są stałe
7 Pętle while i do-while W pętli: while(wyrażenie) instrukcja obliczane na początku jest wyrażenie. Gdy jest ono różne od zera wykonywana jest instrukcja i cykl się powtarza. Jeśli jest równe zeru, sterowanie wychodzi z pętli. do instrukcja while(wyrażenie); Najpierw wykonuje się instrukcję, następnie oblicza wyrażenie. Reszta jak w pętli while.
8 for(wyr1;wyr2;wyr3) instrukcja Pętla for jest równoważna rozwinięciu: wyr1; while(wyr2){ instrukcja wyr3; } Wszystkie wyrażenia pętli for są opcjonalne i dowolne średniki muszą pozostać. wyr1 i wyr3 najczęściej stanowi przypisania lub wywołania funkcji, a wyr2 wyrażenie warunkowe jeśli go brak przyjmuje się je za prawdziwe.
9 Instrukcja goto i etykiety Instrukcję goto stosuje się najczęściej do jednoczesnego przerwania działania kilku pętli. Po niej należy wpisać nazwę etykiety, do której ma zostać przekazane sterowanie, następnie średnik. Etykieta ma postać nazwy zmiennej i zakończona jest dwukropkiem. Można nią opatrzyć każdą instrukcję w funkcji zawierającej goto. Instrukcja continue Instrukcja continue powoduje przerwanie bieżącego i wykonanie od początku następnego kroku zawierającej ją pętli for, while lub do. W pętli while i do przechodzi natychmiast do sprawdzenia warunku zatrzymania, w for przechodzi do części przyrostowej.
10 2. Typy Typ obiektu określa zbiór jego wartości i operacje, jakie można na nim wykonać. Deklaracja powiadamia kompilator o typie obiektu reprezentowanego przez daną nazwę np. extern int a; Definicja spełnia funkcję deklaracji i dodatkowo rezerwuje miejsce w pamięci, powołując obiekt do istnienia np. int a; Zmienne w programie powinny zostać zadeklarowane przed użyciem. W deklaracji określa się typ, a następnie wymienia jedną lub kilka zmiennych. W deklaracjach można nadawać zmiennym wartości początkowe. Systematyka typów: Wbudowane Fundamentalne (podstawowe) Złożone (wykorzystują typy fundamentalne) Zdefiniowane przez użytkownika
11 Typy fundamentalne Podstawowe typy danych: char jeden bajt, mieszczący jeden znak z lokalnego zbioru znaków int całkowity float zmiennopozycyjny double zmiennopozycyjny podwójnej precyzji Kwalifikatory stosowane razem z podstawowymi typami danych: short signed long unsigned Łączenia kwalifikatorów: short int lub short (zajmuje co najmniej 2 bajty) long int lub long (zajmuje co najmniej 4 bajty) long double signed char (od -128 do 127) unsigned char (od 0 do 255) signed i unsigned łączą się też z dowolnym typem całkowitym
12 wchar_t przechowuje rozszerzony zestaw znaków alfanumerycznych enum typ wyliczeniowy bool deklaruje obiekty logiczne o wartościach: true albo false Przedział liczb możliwych do przechowywania w obiektach różnych typów fundamentalnych zależy od typu komputera i kompilatora. Różne typy dają możliwość wyboru pomiędzy dokładnością a szybkością obliczeń i użyciem pamięci. W języku C++ zmienne można definiować w biegu, tzn. między kolejnymi instrukcjami. Można również definiować w części inicjalizacyjnej pętli for, w części warunkowej pętli while oraz warunku instrukcji if zmienne te mają zasięg ograniczony do zakresu tych instrukcji.
13 Stałe dosłowne Stałe będące liczbami całkowitymi Stała całkowita, taka jak 1234, jest obiektem typu int. W stałej typu long na końcu występuje mała lub wielka litera L, np L. Jeśli stała całkowita nie mieści się w zakresie typu int, jest traktowana jak stała typu long. W stałych typu unsigned na końcu występuje litera u lub U, a końcówka ul lub UL oznacza stałą typu unsigned long. Początkowe zero w stałej całkowitej oznacza liczbę ósemkową, a początkowe znaki 0x lub 0X liczbę szesnastkową. Stałe reprezentujące liczby zmiennoprzecinkowe Stałe zmiennopozycyjne zawierają kropkę dziesiętną lub wykładnik zawierający literę E lub e np. liczba to: lub E4. Występująca na końcu litera f lub F oznacza obiekt typu float, a brak litery oznacza typ double.
14 Stałe znakowe Stała znakowa to jeden znak ujęty w apostrofy. Można je również zapisywać liczbowym kodem znaku, ujętym w apostrofy, w postaci ósemkowej lub szesnastkowej np. a zapisujemy \0141 lub \x61. Stałe takie są typu char. Poprzedzone literą L mają typ wchar_t. Typy przechowujące znaki są typami całkowitymi czyli arytmetycznymi można na nich wykonywać operacje matematyczne. Znaki specjalne: \b backspace \\ odwrotny ukośnik \f nowa strona \ apostrof \n nowa linia \ cudzysłów \r powrót karetki \? pytajnik \t tabulator poziomy \0 null, czyli znak o kodzie 0 \v tabulator pionowy \a sygnał dźwiękowy
15 Stałe tekstowe Stała napisowa lub napis lub C-string jest ciągiem złożonym ze znaków zawartych między znakami cudzysłowu. Stała napisowa jest tablicą, której elementami są znaki ostatnim elementem tej tablicy jest dodatkowy znak \0. Sąsiadujące C-stringi są sklejane podczas kompilacji programu. C-string składający się z n znaków jest typu: const char[n+1].
16 Typy złożone Nazwa typu złożonego składa się z nazwy typu i operatora: [ ] tablica obiektów danego typu * wskaźnik do pokazywania na obiekty danego typu ( ) funkcja zwracająca wartość danego typu & referencja obiektu danego typu Typ void Słowo void występuje tylko jako typ prosty w deklaracji typu złożonego np.: void *p; p jest wskaźnikiem pokazującym na obiekt nieznanego typu void funkcja(); deklaracja funkcji nie zwracającej żadnej wartości
17 Typy wyliczeniowe enum Z typu wyliczeniowego korzystamy gdy chcemy w obiekcie typu całkowitego przechować pewien rodzaj informacji, zamiast liczby. enum dzientyg {Pn=1, Wt, Sr, Cz, Pt, So, N }; dzientyg dzien = Wt; Kolejne nazwy przyjmują kolejne wartości całkowite poczynając od zera, chyba że wystąpi jawnie podana wartość. Reprezentacje liczbowe nie muszą się różnić. Do zmiennej danego typu wyliczeniowego mogą być podstawiane tylko elementy listy wyliczeniowej nie mogą to być liczby. enum jest typem arytmetycznym. Typ wyliczeniowy nie musi mieć nazwy. Wtedy można w wygodny sposób zdefiniować kilka stałych całkowitych.
18 Zakres ważności nazwy obiektu Czas życia obiektu to okres od momentu jego definicji, do momentu gdy przestaje on istnieć. Obiekt może istnieć i nie być dostępny np. gdy znajdujemy się poza zakresem ważności jego nazwy. Zakres ważności nazwy obiektu to część programu, w której on jest dostępny, jego nazwa jest znana. Zakres lokalny Nawiasy klamrowe { i } są używane do grupowania deklaracji i instrukcji w blok, składniowo równoważny jednej instrukcji. Po nawiasie klamrowym zamykającym blok nie występuje średnik. Zdefiniowane w tym bloku nazwy mają zakres ważności od miejsca ich zdefiniowania, do klamry } kończącej lokalny blok.
19 Zakres bloku funkcji Zakres ważności obiektów jak w bloku lokalnym, za wyjątkiem etykiety jest ona znana w całej funkcji. Poza funkcją jest ona nieznana. Zakres obszaru pliku Nazwa zadeklarowana na zewnątrz bloku funkcji oraz poza przestrzenią nazw nazywana jest nazwą globalną. Zakres ważności jej nazwy zaczyna się od miejsca deklaracji do końca pliku.
20 Przestrzenie nazw Aby uniknąć konfliktu powtórzenia nazw m.in. z różnych bibliotek, nazwy można grupować w przestrzenie nazw namespace. Do bloku przestrzeni nazw dołącza się deklaracje nazw ujęte pomiędzy nawiasami klamrowymi { i }, poprzedzonymi słowem kluczowym namespace i nazwą przestrzeni nazw np. namespace nazwa { int a,b; double c; } Można wielokrotnie dodawać deklaracje nazw obiektów globalnych, deklaracje czy definicje funkcji, definicje klasy. Można też dodać dyrektywę #include wstawiającą plik nagłówkowy zawierający wiele deklaracji. Dostęp do nazw danej przestrzeni realizowany jest na 3 sposoby: poprzedzenie nazwy nazwą przestrzeni i operatorem zakresu :: wypisanie dyrektywy using, słowa namespace i nazwy przestrzeni do końca pliku nazwy wymienionej przestrzeni są rozpoznawane wypisanie deklaracji using, nazwy przestrzeni, :: i danej nazwy
21 Zasłanianie nazw Zdefiniowany obiekt lokalny zasłania w jego lokalnym zakresie obiekt globalny o tej samej nazwie. Dostęp do obiektu globalnego w tym lokalnym zakresie możliwy jest poprzez operator zakresu poprzedzający tę nazwę. Obiekt lokalny może zasłaniać też inny obiekt lokalny o tej samej nazwie. Operator zakresu nie umożliwia jednak dostępu do poprzedniego obiektu lokalnego.
22 Specyfikator const Inicjalizacja to nadawanie obiektowi wartości w momencie jego tworzenia. Przypisanie jest podstawieniem wartości w późniejszym momencie. Obiekty const można inicjalizować, lecz nie można im nic przypisać. Słowo const stawia się w definicji przed nazwą typu.
23 Obiekty register Specyfikator register można dodać do definicji zmiennej automatycznej typu całkowitego przed nazwą typu. Kompilator zwykle uwzględnia to polecenie i zapisuje tę zmienną w rejestrze, przez co dostęp do niej jest szybszy. Jeśli zażądamy jej adresu, kompilator umieści ten obiekt w zwykłej pamięci.
24 Specyfikator volatile Słowo volatile poprzedzające nazwę typu w definicji obiektu ostrzega kompilator o możliwej zmianie obiektu bez wiedzy kompilatora np. gdy jest on umieszczony w obszarze pamięci komputera, która reprezentuje układ sprzęgający z pewnym miernikiem. Z każdym użyciem obiektu kompilator musi dotrzeć do jego miejsca w pamięci, a nie w rejestrze.
25 Instrukcja typedef Instrukcja typedef nadaje dodatkową nazwę już istniejącemu typowi fundamentalnemu lub pochodnemu czy dla funkcji. typedef int calk,*wskcalk,natur; Tutaj nazwy calk i natur są synonimem typu int, a wskcalk synonimem wskaźnika do typu int.
26 3. Operatory Operatory arytmetyczne Dwuargumentowe operatory arytmetyczne: +, -, *, / oraz % dla argumentów typu int. Dzielenie liczb całkowitych / obcina część ułamkową, a x%y daje resztę z dzielenia x przez y. Operatory arytmetyczne są lewostronnie łączne. Operatory mnożenia i dzielenia mają wyższy priorytet niż dodawania i odejmowania. Jednoargumentowy operator + (plus) nie wykonuje żadnego działania, jednoargumentowy (minus) zamienia wartość wyrażenia na liczbę przeciwną. Operatory zwiększania i zmniejszania Operator zwiększania ++ dodaje 1 do zmiennej, a zmniejszania -- odejmuje 1. Jeśli operatory ++ lub -- użyte są jako przedrostkowe (przed zmienną), zostaje ona zmieniona przed jej użyciem, jeśli jako przyrostkowe, zmienna zostaje zmieniona po jej użyciu w wyrażeniu.
27 Operatory przypisania W przypisaniach wartość prawej strony jest przekształcana do typu wyniku z lewej strony. Zamiana typów double lub float na int powoduje obcięcie części ułamkowej. Przypisanie samo w sobie ma wartość równą przypisywanej wartości. Wyrażenia podobne do x=x*(a+b); w których zmienna występująca po lewej stronie operatora przypisania = powtarza się natychmiast po prawej stronie, można zapisać w bardziej zwartej postaci x*=a+b; Dla większości dwuargumentowych operatorów istnieje analogiczny operator przypisania: +=, -=, *=, /=, %=, <<=, >>=, &= (lub and_eq), = (lub or_eq), ^= (lub xor_eq). Operatory przypisania mają najniższy priorytet, nie wliczając operatora przecinkowego i operatora throw.
28 Wyrażenie warunkowe W wyrażeniu wyr1? wyr2 : wyr3 obliczana jest wartość wyr1, następnie jeśli jest ona różna od zera (prawdziwa), obliczana jest wartość wyr2 i będzie ona wartością całego wyrażenia warunkowego. W przeciwnym przypadku wynikiem będzie wyr3. if(a>b) z=a; else z=b; jest równoważna z=a>b?a:b;
29 Operatory logiczne Operatory relacji Operatory relacji: >, >=, <, <= mają wyższy priorytet niż operatory przyrównania ==,!= (lub not_eq), a niższy niż priorytet operatorów arytmetycznych. Logiczna suma, iloczyn i negacja Wyrażenia połączone operatorami logicznymi iloczynu && (lub and), koniunkcji (lub or) oblicza się od lewej do prawej, do momentu określenia wyniku jako prawda (numeryczna wartość 1) lub fałsz (wartość 0). Jednoargumentowy operator negacji! (lub not) zamienia argument różny od zera na 0, a 0 na 1. Np. rok jest przestępny, jeśli jest podzielny przez 4 i nie dzieli się przez 100 z wyjątkiem lat podzielnych przez 400: cout << rok << r << ( r%4==0 && r%100 r%400==0? : nie ) << jest przestepny ;
30 Operatory bitowe Operatory bitowe można stosować do argumentów całkowitych, to znaczy char, short, int oraz long ze znakiem lub bez: & (lub bitand) bitowa koniunkcja (lub bitor) bitowa alternatywa ^ (lub xor) bitowa różnica symetryczna ~ (lub compl) dopełnienie jedynkowe (operator jednoargumentowy) << przesunięcie w lewo >> przesunięcie w prawo Bitowy operator koniunkcji & można stosować do zasłaniania pewnego zbioru bitów, np. n=n&017; zeruje wszystkie oprócz 4 najmniej znaczących bitów zmiennej n. Bitowego operatora alternatywy używa się do ustawiania bitów, np. x=x SET_ON ustawia jedynki w x na tych bitach, które są jedynkami w SET_ON.
31 Operator bitowej różnicy symetrycznej ^ ustawia na każdej pozycji bitowej jedynkę tam, gdzie bity w obu argumentach są różne, zera tam, gdzie bity są jednakowe. Jednoargumentowy operator ~ zamienia każdy bit 1 na 0 i odwrotnie. Np. x = x & ~07; wyzeruje w x ostatnie trzy bity. Operatory << i >> przesuwają bity kopii argumentu stojącego po lewej stronie operatora odpowiednio w lewo lub w prawo, o liczbę pozycji określoną przez dodatni argument po prawej stronie. Zwolnione bity wypełnia zerami. Np. x>>3 odpowiada podzieleniu x przez 8. W przypadku ujemnej danej typu signed w niektórych komputerach operator >> powoduje uzupełnienie brakujących z lewej strony bitów jedynkami, w przypadku innych zerami.
32 Operator uzyskiwania adresu & Operator & działając na dany obiekt daje jego adres w pamięci. W adresie zawarta jest informacja o numerze komórki w pamięci zawierającej początek obiektu oraz o typie obiektu.
33 Operator sizeof Jednoargumentowy operator sizeof daje w wyniku wartość całkowitą równą rozmiarowi wskazanego obiektu lub typu w bajtach. Obiektem może być zmienna, tablica lub struktura. Nazwą typu może być nazwa jednego z typów podstawowych jak int lub double, albo nazwa typu pochodnego jak struktura lub wskaźnik. Np. cout << Typ int ma rozmiar << sizeof(int) << bajtow ;
34 Przekształcenia typów Automatycznie wykonuje się tylko takie przekształcenia, w których argument o mniejszej precyzji zamieniany jest na argument o większej precyzji, bez utraty informacji. Jeśli argumenty operatora dwuargumentowego (np. +, -) są różnego typu, to przed wykonaniem operacji typ mniejszy jest przekształcany do większego. W przypisaniach wartość prawej strony jest przekształcana do typu wyniku z lewej strony. Zamiana float na int powoduje obcięcie części ułamkowej.
35 Operatory rzutowania Stare niezalecane sposoby rzutowania: (nazwa_typu) wyrażenie nazwa_typu (wyrażenie) Nowe operatory rzutowania: static_cast<nazwa_typu> (wyrażenie) stosuje się w sytuacjach bezpiecznych jeśli chodzi o utratę danych lub bezpiecznych na naszą odpowiedzialność const_cast<nazwa_typu> (wyrażenie) może służyć do pozbycia się lub nadania specyfikatora const lub volatile dynamic_cast<nazwa_typu> (wyrażenie) tak jak static_cast tylko w trakcie pracy kompilatora, tak dynamic_cast sprawdza w trakcie wykonywania programu czy rzutowanie ma sens reinterpret_cast<nazwa_typu> (wyrażenie) wykonuje rzutowanie wskaźników na naszą odpowiedzialność
36 Priorytety i łączność operatorów Jednoargumentowe operatory +, -, * oraz & mają priorytet wyższy niż ich odpowiedniki dwuargumentowe. Operatory jednoargumentowe są prawostronnie łączne (działają na argument stojący po ich prawej stronie). Operatory dwuargumentowe są lewostronnie łączne, za wyjątkiem operatora przypisania.
37 Operatory Łączność :: L () [] ->. przyrostkowe typ static_cast L! ~ * & new delete (typ) sizeof P. -> składnik wskaźnikiem L * / % L + - L << >> L < <= > >= L ==!= L & L ^ L L && L L?: P = += -= *= /= %= ^= = <<= >>= P throw P, L
38 4. Funkcje Każda definicja funkcji ma następujący format: typ_powrotu nazwa_funkcji (deklaracje parametrów) { deklaracje i instrukcje } Jeśli funkcja nie zwraca żadnych wartości jej typ powrotu oznaczany jest przez void. Każda nazwa przed jej użyciem musi być zadeklarowana. Każda definicja funkcji jest również jej deklaracją. Jeśli więc definicja funkcji nie znajduje się w pliku powyżej jej wywołania, konieczna jest jej wcześniejsza deklaracja. Takie deklaracje funkcji najlepiej umieszczać na początku pliku: typ_powrotu nazwa_funkcji(deklaracje parametrów);
39 Jeśli brak deklaracji parametrów lub w ich miejscu jest słowo void, mamy brak jakichkolwiek argumentów. Jeśli w ich miejscu są, mamy dowolną liczbę argumentów. Nazwy argumentów (nie typy) w nawiasach deklaracji można pominąć. Wywołana funkcja przekazuje do miejsca wywołania wartość wyrażenia następującego po instrukcji return. W przypadku funkcji zwracającej typ void instrukcję return można opuścić lub dodać po niej sam średnik: return; W funkcji main instrukcję return 0; można opuścić kompilator sam doda ją przed zamykającym ją nawiasem }. Zwrot wartości 0 oznacza poprawne zakończenie całego programu. Zdefiniowane w obrębie funkcji zmienne przechowywane są zwykle na stosie, czyli w podręcznej pamięci. Argumenty funkcji zapisane w jej definicji nazywane są formalnymi, argumenty aktualne podajemy przy wywołaniu funkcji. Argumenty funkcji przekazywane są przez wartość są to kopie zmiennych, do których funkcja nie ma dostępu.
40 Przesyłanie argumentów przez referencję Do funkcji argumenty można przesyłać również przez referencję przesyłany jest wówczas adres danej zmiennej. W deklaracji funkcji w liście argumentów nazwę tej zmiennej poprzedza się operatorem adresu &. W ciele tej funkcji i podczas jej wywołania operator ten nie występuje. Działania na zmiennej podanej przez referencję jako argument funkcji skutkują odpowiednimi zmianami wartości tej zmiennej. double f(int a, double &b){ return a+b; } f(a,b); Sposób przekazywania zmiennych przez referencję znacznie utrudnia śledzenie zmian wartości danej zmiennej. Nie wymaga jednak tworzenia kopii obiektów, co przyspiesza wykonywanie funkcji.
41 Argumenty domniemane Argumenty domniemane w danym zakresie ważności piszemy tylko raz w deklaracji funkcji. W jej definicji tylko wtedy, gdy spełnia ona jednocześnie rolę deklaracji występując w pliku powyżej jej wywołania. W deklaracji pod nazwę argumentu przypisujemy pewną wartość. Argumenty domniemane muszą występować na końcu listy argumentów np. int fun(char a, int b, char c= z, int d=5, float e=4.5f); lub int fun(char, int, char = z, int =5, float =4.5f); Argumenty domniemane można rozpisać w kilku deklaracjach, przesuwając się z domniemanymi wartościami w stronę początku listy, nie pomijając żadnego np. int fun(char, int, char, int, float); int fun(char, int, char, int, float =4.5f); int fun(char, int, char = z, int =5, float);
42 Wartościami domniemanymi mogą być również wyrażenia zawierające obiekty globalne i wywołania funkcji. W nowym lokalnym zakresie ważności, np. po otwarciu bloku nawiasem klamrowym, możemy umieścić ponownie deklarację funkcji z nowymi wartościami domniemanych argumentów. Wtedy wszystkie poprzednie domniemane wartości tracą ważność do końca bieżącego zakresu ważności.
43 Nienazwany argument Gdy w definicji funkcji wpiszemy na liście sam typ argumentu bez jego nazwy, kompilator zinterpretuje funkcję jako wywoływaną z argumentem danego typu, lecz nie wykorzystywanym w tej funkcji.
44 Funkcje inline Dodatkowe słowo inline poprzedzające definicję funkcji daje możliwość kompilatorowi wypisania jej treści w miejscu jej wywołania. Wtedy kod programu wykonywany będzie szybciej, pomijając kilka instrukcji na poziomie języka maszynowego (asemblera), związanych z wywołaniem i zakończeniem funkcji. inline int zaokr(double a){ return a+.5; } Funkcje typu inline przewidziane zostały dla krótkich funkcji. W przypadku bardziej rozbudowanych kompilator utworzy zwykłą funkcję. Polecenie inline nie zostanie uwzględnione, gdy funkcję kompilujemy dla pracy z programem uruchomieniowym (debuggerem). Definicje funkcji typu inline muszą znajdować się przed miejscem ich wywołania np. w dołączonym pliku nagłówkowym obok deklaracji innych zwykłych funkcji.
45 Obiekty automatyczne Są one definiowane w bloku. Przy wyjściu z tego bloku obiekty te automatycznie przestają istnieć. Zmienne automatyczne nie są zerowane w chwili ich definicji. Obiekty te komputer przechowuje na stosie i przydziela wymagany dla nich obszar. Obiekty lokalne statyczne Obiekt statyczny definiowany w obrębie funkcji po zakończeniu jej pracy nie jest niszczony i zachowuje swoją wartość. Nie jest jednak dostępny spoza zakresu funkcji. Obiekt tego typu zapisywany jest w pamięci tam, gdzie zmienne globalne i jest inicjalizowany zerem. W definicji używamy słowa static np. static float predkosc;
46 Funkcje w programie złożonym z kilku plików Program można podzielić na kilka plików. Wtedy można kompilować każdy plik osobno. Program można dzielić na pliki, jednak definicje funkcji już nie. Aby funkcje i zmienne globalne z innych plików były dostępne, należy umieścić deklaracje odpowiednich funkcji i zmiennych globalnych. Deklaracje zmiennych globalnych poprzedza się słowem extern. Wszystkie te deklaracje wygodnie jest umieścić w osobnym pliku nagłówkowym i włączać do innych plików dyrektywą #include. Aby dana nazwa obiektu globalnego lub funkcji była znana tylko w bieżącym pliku, można ją zadeklarować lub zdefiniować w tzw. anonimowej (bez nazwy) przestrzeni nazw. Innym przestarzałym sposobem na ograniczenie dostępu do danej nazwy jest poprzedzenie jej deklaracji czy definicji słowem static.
47 Funkcje rekurencyjne Funkcja może wywołać samą siebie bezpośrednio lub pośrednio. Funkcja przeznaczona do rekurencyjnego wywołania, powinna posiadać warunek, w którym decyduje czy wywołać samą siebie czy zatrzymać rekurencję. Rekurencja pozwala na proste wykonanie skomplikowanego algorytmu. Rekurencja coraz bardziej się zagnieżdża, a po wystąpieniu warunku zatrzymania następują powroty z tych zagnieżdżeń. Dany poziom zagnieżdżenia ma swój własny zestaw zmiennych, którym może nadać pewne wartości obliczone przy zagnieżdżaniu, a skorzystać z nich w trakcie powrotów. Kolejne wywołanie rekurencyjne funkcji sprawia, że na stosie pojawiają się kolejne zmienne automatyczne, związane z kolejnym wywołaniem. Zmienna statyczna w tej sytuacji jest wspólna dla wszystkich rekurencyjnych wywołań funkcji.
48 Funkcje biblioteczne Funkcje matematyczne: nagłówek <cmath> Argumenty x, y oraz zwracane przez funkcje wartości są typu double. sin(x) cos(x) tan(x) tangens x asin(x) arcus sinus x w przedziale [-π/2,π/2], x w [-1,1] acos(x) arcus cosinus x w przedziale [0,π], x w [-1,1] atan(x) arcus tangens x w przedziale [-π/2,π/2] atan2(y,x) arcus tangens y/x w przedziale [-π,π] sinh(x) sinus hiperboliczny x cosh(x) cosinus hiperboliczny x tanh(x) tangens hiperboliczny x exp(x) funkcja wykładnicza o podstawie e log(x) logarytm naturalny ln(x) log10(x) logarytm o podstawie 10
49 pow(x,y) sqrt(x) ceil(x) floor(x) fabs(x) fmod(x,y) x do potęgi y pierwiastek z x najmniejsza liczba całkowita, nie mniejsza niż x największa liczba całkowita nie większa niż x wartość bezwzględna z x zmiennopozycyjna reszta z dzielenia x/y, ze znakiem x
50 Niektóre funkcje operujące na tekstach <cstring> Tutaj s, t są wskaźnikami do znaków, a c, n są typu int. strcat(s,t) dopisuje t na koniec s strncat(s,t,n) dopisuje n znaków z t na koniec s strcmp(s,t) zwraca wartość ujemną gdy s<t, zero dla s=t, dodatnią strncmp(s,t,n) to samo co strcmp, tylko dla początkowych n znaków t strcpy(s,t) kopiuje t do s strncpy(s,t) kopiuje co najwyżej n znaków t do s strlen(s) zwraca długość s strchr(s,c) zwraca wskaźnik do pierwszego wystąpienia c w s lub NULL gdy c nie występuje w s strrchr(s,c) zwraca wskaźnik do ostatniego wystąpienia c w s lub NULL gdy c nie występuje w s
51 Niektóre funkcje przekształcające i badające znaki <cctype> W następujących opisach c jest typu int lub unsigned char łącznie z EOF. Wszystkie funkcje zwracają wartość typu int. isalpha(c) isupper(c) islower(c) isdigit(c) isalnum(c) isspace(c) toupper(c) tolower(c) prawda, jeśli c jest literą, 0 jeśli nie prawda, jeśli c jest wielką literą, 0 jeśli nie prawda, jeśli c jest małą literą, 0 jeśli nie prawda, jeśli c jest cyfrą, 0 jeśli nie prawda, jeśli c jest literą lub cyfrą, 0 jeśli nie prawda, jeśli c jest odstępem, \n, \t, 0 jeśli nie małe litery zmienia na wielkie wielkie litery zmienia na małe
52 5. Preprocesor Preprocesor jest pierwszym krokiem tłumaczenia programu, zanim kompilator zacznie pracę. Pierwszym czarnym znakiem w linii zawierającej dyrektywę preprocesora jest znak #. Najczęściej stosowane polecenia to: #include, wstawia zawartość pewnego pliku podczas kompilacji, #define, umożliwia zastępowanie pewnego zwrotu dowolnym ciągiem znaków. Wyrażenie #include nazwa_pliku lub #include <nazwa_pliku> zastępowane jest zawartością pliku o wskazanej nazwie. W pierwszym przypadku poszukiwanie pliku zaczyna się tam, gdzie znaleziono właściwy program źródłowy. Jeśli go tam nie ma lub gdy nazwa_pliku zawarta jest między znakami < i >, pliku szuka się zgodnie z zasadami obowiązującymi w danej implementacji.
53 #define NAZWA zastepujacy_tekst Dyrektywa ta powoduje, że dalsze wystąpienia NAZWA (za wyjątkiem stałych napisowych) będą zastępowane przez ciąg znaków tworzący zastępujący_tekst. Nazwa w #define ma taką samą postać, jak nazwa zmiennej, zastępujący ją tekst jest dowolny. Długie definicje można kontynuować w następnych wierszach po umieszczeniu na końcu przedłużanego wiersza znaku \. Zasięg nazwy wprowadzanej przez #define rozciąga się od miejsca definicji do końca pliku źródłowego. Definicja może korzystać z poprzednich definicji. Definicję nazwy można skasować za pomocą polecenia: #undef NAZWA Można definiować makrodefinicje z argumentami np.: #define max(a,b) ((A)>(B)?(A):(B)) Wywołanie max powoduje wstawienie rozwiniętego tekstu makra bezpośrednio do tekstu programu.
54 Jeśli w zastępującym tekście parametr sąsiaduje z operatorem ##, to ten parametr zastępuje się aktualnym argumentem, następnie usuwa operator ## wraz z otaczającymi go białymi znakami np.: #define sklej(przod,tyl) przod ## tyl sklej(nazwa,1) daje nazwa1 Jeśli nazwę parametru w zastępującym tekście poprzedza znak #, to ten znak i nazwa parametru zostanie rozwinięta w ciąg znaków ograniczony cudzysłowami, gdzie parametr będzie zastąpiony argumentem aktualnym np.: #define pokaz(x) cout << #x = << (x) << \n ; jest makrem pożytecznym w fazie testowania programu. pokaz(x/y); daje w wyniku: cout << x/y = << (x/y) << \n ;
55 Kompilacja warunkowa Kompilacja warunkowa pozwala na kompilację pewnego fragmentu kodu pod określonym warunkiem. Warunkiem jest wyrażenie, w którym każdy element jest stały już w momencie pracy preprocesora. #if warunek // linie kompilowane warunkowo #endif Operator defined używany jest w wyrażeniach warunkowych preprocesora np. defined NAZWA lub defined(nazwa) Zwraca wartość true w obszarze ważności NAZWA zdefiniowanej operatorem define. #if TEST==1 && defined(nazwa) instrukcje #endif
56 Warunki kompilacji warunkowej można zagnieżdżać. Można też stosować inne dyrektywy: #if warunek instrukcje1 #else instrukcje2 #endif #if warunek1 instrukcje1 #elif warunek2 instrukcje2 #elif warunek3 instrukcje3 #else instrukcje4 #endif Dyrektywa #ifdef NAZWA oznacza to samo co #if defined(nazwa), natomiast #ifndef NAZWA stosuje się zamiast #if!defined(nazwa).
57 Aby zagwarantować jednokrotne włączanie danego pliku dyrektywą #include, stosuje się w tym pliku konstrukcję zwaną strażnikiem nagłówka: #ifndef NAZWAPLIKU #define NAZWAPLIKU // treść pliku #endif Nazwę pliku włączaną dyrektywą #include można tworzyć przy pomocy makrodefinicji zawierających dyrektywy #define i operatora ## #error tekst przerywa kompilację i wypisuje komunikat o błędzie zawierający stałą napisową tekst. #line stała nazwapliku dyrektywa ta powoduje w kompilatorze zamianę numeru odczytywanej linii na stała, i jeśli występuje opcjonalna nazwapliku zamienia nazwę pliku w kompilatorze na nazwapliku.
58 Pusta dyrektywa składająca się ze znaku # jako jedynego w linii jest przez preprocesor ignorowana. #pragma komenda jest dyrektywą z komendą stosowaną przez dany kompilator. Jeśli komenda jest nieznana danemu kompilatorowi jest ignorowana. Predefiniowane nazwy preprocesora (w postaci napisu): FILE nazwa kompilowanego pliku LINE numer bieżącej linii pliku DATE data kompilacji pliku TIME czas kompilacji pliku
59 6. Tablice Tablica jest ciągiem obiektów danego typu, zajmujących ciągły obszar w pamięci. Tablice są typem pochodnym. Rozmiar tablicy musi być stałą całkowitą znaną w momencie kompilacji, np. w definicji: int a[3]; Tablica a jest blokiem trzech kolejnych obiektów: a[0], a[1] i a[2]. Tablice indeksuje się zaczynając od liczby 0. Próba zapisu do elementu a[3] nie jest sygnalizowana jako błąd, jednak niszczy w pamięci coś, co następuje bezpośrednio za tablicą. Tablicę można inicjalizować za pomocą zwykłej operacji przypisania lub za pomocą tzw. inicjalizacji zbiorczej np. int b[3] = {1, 2, 3}; Jedynie w przypadku inicjalizacji kompilator sprawdza, czy rozmiar tablicy jest przekroczony sygnalizując błąd. Gdy lista elementów jest zbyt krótka, pozostałe są inicjalizowane zerami. Inicjalizacja zbiorcza jest jedynym sposobem inicjalizacji tablicy obiektów stałych.
60 Kompilator sam może obliczyć rozmiar tablicy np. int c[] = {1, 2, 3, 4}; Tablice można tworzyć z: typów fundamentalnych (bez void) typów wyliczeniowych wskaźników innych tablic klas wskaźników wskazujących składniki klasy Nazwa tablicy jest adresem jej zerowego elementu. Do funkcji tablicę przesyła się poprzez jej adres czyli nazwę np. fun(r,a); Przykładowa deklaracja funkcji: int fun(int rozmiar, int a[]); Adres i-tego elementu tablicy: &a[i] lub a+i.
61 Tablice znakowe Tekst w tablicy znakowej przechowuje się w postaci ciągu kodów liczbowych liter, po którym następuje znak o kodzie 0 zwany null. Taki ciąg liter zakończony znakiem null ma nazwę string lub C-string. Słowo NULL zdefiniowane jest przez 0. Tablicę znakową można zainicjalizować za pomocą inicjalizacji zbiorczej np. char napis[100] = { dwa }; Inicjalizujący tekst ujmuje się w cudzysłów wtedy w poszczególnych komórkach tablicy znajdują się odpowiednie znaki z dopisanym na końcu ciągu znakiem null. Reszta nie wymieniona w cudzysłowach według zasad inicjalizacji zbiorczej inicjalizowana jest zerami. Definicja tablicy char napis[] = { dwa }; rezerwuje 4 znaki, natomiast char napis[] = { d, w, a }; rezerwuje 3 znaki. Cudzysłów sprawia, że kompilator traktuje ujęte w nim znaki jako C-string dopisując na końcu znak o kodzie 0.
62 Długość C-stringu jest to ilość znaków należących do niego. Jednak rozmiar jest większy o 1 wliczając znak null. Do istniejących tablic tekst wpisujemy do każdej komórki oddzielnie. Można też wykorzystać do tego funkcje zadeklarowane w <cstring>. // kopiuje zawartość tablicy zrodlo do tablicy cel void strcpy(char cel[], char zrodlo[]){ int i=0; while(cel[i]=zrodlo[i]) i++; }
63 Tablice wielowymiarowe Tablice wielowymiarowe są tablicami składającymi się z innych tablic. char tabdni[2][13]={ // w obiektach typu char można przechowywać {0,31,28,31,30,31,30,31,31,30,31,30,31}, // niewielkie {0,31,29,31,30,31,30,31,31,30,31,30,31} // liczby całkowite }; Elementy są umieszczane w pamięci wierszami, a więc skrajnie prawy indeks (nr kolumny) zmienia się najszybciej wraz z położeniem w pamięci. tabdni[1] oznacza ostatni wiersz powyższej tablicy, czyli adres w pamięci pierwszego elementu tego wiersza.
64 Przesyłanie tablic wielowymiarowych do funkcji Gdy funkcji przekazujemy tablicę dwuwymiarową, w jej deklaracji podajemy odpowiednią liczbę kolumn np. f(char tabdni[2][13]) { } z liczby wierszy funkcja nie korzysta więc częściej zapisujemy: f(char tabdni[][13]) { } Kompilator może obliczyć tylko jeden wymiar tablicy wielowymiarowej: pierwszy od lewej w deklaracji musimy podać resztę wymiarów.
65 Operacje Wejścia/Wyjścia Operacje wejścia/wyjścia nie wchodzą w skład definicji języka C++. Operacje te możliwe są dzięki bibliotekom, które dołącza producent danego kompilatora. Mamy dwie podstawowe biblioteki wejścia/wyjścia: stdio (standard input/output) istnieje ze względu na kompatybilność z językiem C iostream (input/output stream) jej założenia weszły w skład obecnego standardu ISO. iostream dołącza się w każdym przypadku korzystania z tej biblioteki fstream przy operacjach we/wy na plikach zewnętrznych sstream przy operacjach we/wy na obiektach klasy string
66 Wprowadzanie i wyprowadzanie informacji można traktować jako płynący strumień bajtów. Wczytywanie lub wypisywanie informacji może odbywać się na dwa sposoby poprzez: operacje we/wy binarne bajty nie są w żaden sposób interpretowane. Służą do komunikacji z programem lub urządzeniem. operacje we/wy tekstowe strumień przesyła i interpretuje (formatuje) informacje. Służą do pokazania pierwotnie binarnej informacji człowiekowi. Kompilator definiuje kilka gotowych strumieni (obiektów danych klas). Po uruchomieniu program zakłada i otwiera te strumienie, a po zakończeniu strumienie zamykane są automatycznie.
67 cout powiązany ze standardowym urządzeniem wyjścia (zwykle ekran) cin ze standardowym urządzeniem wejścia (zwykle klawiatura) cerr ze standardowym urządzeniem, na które wysyłamy komunikaty o błędach (zwykle ekran). Strumień niebuforowany. clog jak wyżej, lecz strumień jest buforowany. Powyższe strumienie pracują na zwykłych znakach char. Do szerokich znaków wchar_t mamy ich odpowiedniki: wcout, wcin, wcerr, wclog. W obrębie klasy ostream operator << został przeładowany tak, że odpowiada za wysyłanie informacji do strumienia. Odwrotny operator >> wczytuje informacje ze strumienia.
68 Domniemania dla standardowych strumieni Gdy wstawiamy do strumienia wypisywane są: w systemie dziesiątkowym typy wbudowane przechowujące liczby całkowite jako pojedyncze znaki ASCII typy char i unsigned char z dokładnością do 6 miejsc, bez zbędnych zer liczby typu float i double jako heksadecymalne wskaźniki (z wyjątkiem char* i unsigned char*) w postaci C-stringu, na który pokazują wskaźniki char* i unsigned char*
69 Gdy wczytujemy ze strumienia: ignorowane są wszystkie białe znaki, poprzedzające każdy z wczytywanych typów interpretowane jako podane w systemie dziesiątkowym, są typy reprezentujące liczby całkowite między znakiem przed liczbą (+ lub -) a tą liczbą nie może być spacji wczytywanie liczby całkowitej zakończy się po napotkaniu znaku różnego od cyfry w liczbie zmiennoprzecinkowej wystąpić może litera oznaczająca wykładnik (e lub E), po niej może być również znak (+ lub -). Wewnątrz nie może być spacji do tablicy znakowej, wczytywanie zaczyna się od pierwszego czarnego znaku, a kończy na ostatnim czarnym znaku. Nie jest sprawdzane zapełnienie tablicy, nadmiarowe wczytywane znaki niszczą pamięć do obiektu klasy string, jak wyżej tyle, że sam się powiększa
70 Sterowanie formatem Zasady formatowania zapisane są w tzw. flagach stanu formatowania. Umieszczono je w klasie ios_base (Input Output State). Klasę ios_base dziedziczy klasa ios, więc możemy także posługiwać się krótszym kwalifikatorem. W klasie ios_base typ składników przechowujących zasady formatowania został instrukcją typedef nazwany fmtflags. Klasa ios jest podstawową dla klas istream i ostream. Dla ułatwienia justownia, konwersji i notacji zdefiniowano grupy flag: maski (pola): adjustfield typ dopasowania: lewe, prawe, wewnętrzne basefield typ podstawy konwersji: dec, hex, oct floatfield typ notacji zmiennopozycyjnej: wykładnicza, dziesiętna
71 Flagi zawierają informację typu tak/nie. Domniemane są wytłuszczone. Flagi odpowiadające za sposób formatowania: skipws ignoruj białe znaki left justowanie lewe (1 z tych 3 może być ustawiona) right justowanie prawe internal justowanie wewnętrzne boolalpha używaj słów true-false, zamiast liczb 1-0 dec konwersja decymalna (najwyżej 1 z 3 może być ustawiona) oct konwersja oktalna hex konwersja hexadecymalna showbase pokaż podstawę konwersji (czyli przed hex 0x, oct 0) showpoint pokaż kropkę dziesiętną i nieznaczące zera uppercase wielkie litery w liczbach (e lub x) showpos znak + przed liczbami dodatnimi scientific notacja wykładnicza fixed notacja dziesiętna unitbuf nie buforuj strumienia
72 Gdy żadna z flag: dec, oct, hex nie jest ustawiona, jest to równoważne ustawieniu flagi dec. Format wypisywanych liczb zmiennopozycyjnych zależy od obowiązującej dokładności. Domniemana dokładność to 6 cyfr. Notacja wykładnicza (ustawiona scientific) składa się z: jednej cyfry, ewentualnej kropki dziesiętnej i dalszej części liczby ograniczonej przez dokładność, litery e i wykładnika liczby dziesięć dla tej liczby. Przy ustawionej fixed, dokładność to ilość cyfr po kropce. Jeśli nie jest ustawiona żadna z flag: fixed, scientific liczby wypisywane są zależnie od ich wartości: w notacji wykładniczej gdy wykładnik jest mniejszy od -4 lub większy od dokładności, w przeciwnym przypadku w dziesiętnej z całkowitą liczbą cyfr nie przekraczającą dokładności. Flagi i maski są publiczne w zakresie klasy ios_base, można więc ich używać poza tą klasą, poprzedzając kwalifikatorem zakresu: np. ios_base::oct lub krócej ios::dec.
73 Klasę ios_base dziedziczą również klasy ostream i istream, a obiektami tych klas są strumienie cout i cin. Klasa ios_base oprócz flag, zawiera też narzędzia do ich ustawiania. Rodzaje narzędzi do modyfikacji parametrów formatowania: elementarne funkcje klasy ios do ustawiania i kasowania flag: setf, unsetf. funkcje klasy ios zmieniające parametry np. szerokość, precyzję manipulatory, wykonujące w prosty sposób oba zadania Funkcja setf ustawia flagi, które są jej argumentami (jedną lub sumę bitową kilku). Zwraca dotychczasowy stan wszystkich flag formatowania, np. cin.setf(ios::skipws ios::boolalpha); Do kasowania flag służy w pełni analogiczna funkcja fmtflags unsetf(fmtflags flagi);
74 Przeładowana funkcja setf służy do prostego ustawiania flag tworzących pole: fmtflags setf(fmtflags flaga, fmtflags maska); Funkcja kasuje wszystkie flagi, a podaną jako pierwszy argument ustawia. Można nią skasować wszystkie flagi tworzące pole np. cout.setf(0, ios::basefield); fmtflags flags(fmtflags flagi); Funkcja flags zwraca dotychczasowy stan flag formatowania. Przypisuje flagi formatowania podane w zestawie jako jej argument. Jej przeładowanie flags() tylko zwraca stan flag. streamsize width(streamsize); Funkcja width ustawia minimalną liczbę znaków, w których wypisana będzie zmienna. Dotyczy to tylko najbliższej operacji we/wy. Dalej obowiązuje domniemana liczba znaków 0. Przy wczytywaniu tekstu ustawia maksymalną liczbę jego znaków. Przeładowana width() zwraca obowiązującą szerokość.
75 char fill(char); Funkcja fill zmienia znak wypełniający (domyślnie spacja) na znak, będący jej argumentem. Zwraca dotychczasowy znak wypełniający. Może pracować również na znakach wchar_t. Przeładowana funkcja fill() zwraca znak wypełniający. streamsize precision(streamsize); Funkcja precision ustawia dokładność wypisywania liczb zmiennoprzecinkowych. Zwraca dotychczasową wartość dokładności. Domniemana dokładność wynosi 6. Przeładowana funkcja precision() zwraca obowiązującą dokładność. ios & copyfmt(ios & strumien); Funkcja copyfmt kopiuje stan strumienia z innego strumienia np. stru2.copyfmt(stru1);
76 Manipulatory Manipulatory wstawiamy do strumienia tak, jak wstawia się obiekt do wypisania. W ten prosty sposób zmieniamy formatowanie. Zostały one umieszczone w klasie ios i przestrzeni nazw std. Manipulatory parametryzowane (wymagają włączenia <iomanip>): setw(int) działa jak funkcja width setfill(char) działa jak funkcja fill setprecision(int) działa jak funkcja precision setbase(int) ustawia podstawę konwersji: 10, 16, 8 lub 0 (domyślna) setiosflags(fmtflags), resetiosflags(fmtflags) działają jak funkcje setf i unsetf
77 Manipulatory bezargumentowe: fixed, scientific ustawiają jedną z tych flag i kasują drugą hex, dec, oct ustawiają odpowiednią flagę i kasują pozostałe dwie left, right, internal ustawiają odpowiednią flagę i kasują pozostałe flush powoduje wypisanie zawartości bufora endl wstawia do strumienia znak \n i wywołuje funkcję flush() ends wstawia do strumienia znak \0 ws usuwa w buforze białe znaki do pierwszego czarnego skipws, noskipws ustawia i kasuje flagę skipws boolalpha, noboolalpha ustawia i kasuje flagę boolalpha showpoint, noshowpoint ustawia i kasuje flagę showpoint showpos, noshowpos ustawia i kasuje flagę showpos unitbuf, nounitbuf ustawia i kasuje flagę unitbuf showbase, noshowbase ustawia i kasuje flagę showbase uppercase, nouppercase ustawia i kasuje flagę uppercase
78 Strumienie wpływające i wypływające z plików Zapisywać do plików możemy dzięki klasie ofstream, odczytywać dzięki ifstream, obie operacje zdefiniowano w fstream. Deklaracje związane z tymi klasami umieszczono w pliku nagłówkowym <fstream>, a nazwy w przestrzeni nazw std. Aby zapisywać (czytać) do pliku: 1. definiujemy strumień, tworząc obiekt odpowiedniej klasy np. ofstream struzapis; 2. otwieramy konkretny plik np. struzapis.open( nazwa.txt ); 3. wykonujemy operacje we/wy np. struzapis << tekst ; 4. likwidujemy strumień np. struzapis.close(); Punkty 1 i 2 łączy się często przy pomocy konstruktora klasy np. ofstream struzapis( nazwa.txt );
79 void open(char* nazwa, ios_base::openmode tryb); Funkcja open otwiera plik. Pierwszy argument to nazwa pliku z ewentualną ścieżką w postaci wskaźnika do C-stringu. Drugi określa tryb pracy. Poprzez domniemanie w klasie ifstream mamy tryb in, a w klasie ofstream tryb out. Tryby stosuje się pojedynczo lub kilka jednocześnie: in czytanie, strumień jest klasy ifstream lub fstream out pisanie, jeśli plik nie istnieje to jest tworzony, jeśli istnieje kasowana jest jego stara zawartość ate ustawia na końcu app dopisuje na końcu trunc kasuje starą zawartość binary - binarny Tryby in i out można stosować równocześnie, gdy strumień jest klasy fstream np. fstream strum( notki.txt, ios::in ios::out);
80 Funkcja close kończy pracę strumienia z plikiem. Jeśli jest to strumień wyjściowy, przedtem wywołana jest funkcja flush. Bity stanu błędów: goodbit bity stanu błędów są wyzerowane eofbit ustawiona flaga, gdy nastąpił koniec pliku failbit po wyzerowaniu flagi, strumień nadaje się do pracy badbit błąd uniemożliwiający dalszą pracę ze strumieniem Funkcje typu bool klasy basic_ios operujące na flagach błędu: good() zwraca true, gdy mamy stan goodbit eof() true, gdy ustawiona flaga eofbit fail() true, gdy ustawione failbit lub badbit bad() true, gdy ustawiona flaga badbit Zamiast cin.fail() można stosować instrukcję!cin Gdy czytanie nie powiedzie się, wartością wyrażenia czytającego ze strumienia jest NULL, zamiast referencji do strumienia.
81 Jeśli w danym strumieniu wystąpi błąd, to dalsze próby wstawiania lub wyjmowania z tego strumienia są ignorowane. Funkcje klasy ios_base pracujące na flagach stanu błędu: io_state rdstate() daje słowo stanu błędu strumienia void clear(io_state = goodbit) zmienia wszystkie flagi błędu, wartość domniemana argumentu to ios_base::goodbit void setstate(io_state) ustawia wybrane flagi
82 Pozycjonowanie wskaźników w pliku Strumień wejściowy ma wskaźnik do czytania get, a wyjściowy do pisania put pokazują one na miejsce pomiędzy dwoma znakami. Domyślnie get znajduje się na początku, a put na końcu pliku. Funkcje informujące o pozycji wskaźników: pos_type tellg(); zwraca pozycję wskaźnika do czytania (ifstream) pos_type tellp(); wskaźnika do pisania (funkcja klasy ofstream) Funkcje do pozycjonowania wskaźników get i put: istream & seekg(off_type, seek_dir = ios::beg); do czytania ostream & seekp(off_type, seek_dir = ios::beg); do pisania Pierwszy argument określa pozycję wskazanego bajtu pliku względem miejsca podanego jako drugi argument. Drugi jest zdefiniowany w klasie ios_base i przyjmuje wartości: beg, cur, end, czyli pozycje początku, bieżącą i końca pliku. Wpisywanie w środku pliku powoduje zastępowanie kolejnych bajtów.
83 Zapis i odczyt z obiektu klasy string Aby kierować strumień do obiektu klasy string, należy włączyć plik nagłówkowy <sstream>, zawierający deklaracje odpowiednich klas: ostringstream do wypisania tekstu do obiektu string, a istringstream do odczytania tekstu z obiektu string. W klasie ostringstream mamy konstruktory: ostringstream(ios_base::openmode) domyślny tryb ios::out np. ostringstream tekst; lub ostringstream komunikat(ios::app); ostringstream(string const &, ios_base openmode) pierwszy argument to tekst inicjalizujący tworzony obiekt, a drugi jak wyżej np. ostringstream tekst( ***** ); lub ostringstream komunikat( *****, ios::app); string str() const; funkcja ta zwraca obiekt klasy string void str(const string &) const; funkcja inicjalizuje nowym tekstem
84 W klasie istringstream mamy konstruktory: istringstream(); tekst dla strumienia podany jest później istringstream(const string &); inicjalizujemy obiekt tekstem string str() const; funkcja zwraca obiekt string void str(const string &) const; daje strumieniowi nowy tekst Klasa stringstream łączy właściwości poprzednich. Jej konstruktory: stringstream(ios_base openmode); domyślnie ios::out ios::in stringstream(string const &, ios_base openmode); string str() const; void str(const string &) const;
85 Rezerwacja pamięci, operatory new i delete Aby utworzyć nowy obiekt, rezerwując pamięć można wykorzystać operator new. Np. dla obiektu (nazwę posiada tylko wskaźnik do niego) typu char: char *wskaznik; wskaznik = new char; lub krócej: char *wskaznik = new char; Likwidujemy obiekt (zwalniając pamięć) operatorem delete poprzedzającym wskaźnik wskazujący na ten obiekt np.: delete wskaznik; Można za pomocą operatora new zainicjalizować obiekt np.: char *wskaznik = new char( a );
86 Tworzenie i kasowanie tablic Tablice tworzymy podając za typem obiektu ich rozmiar ujęty w nawiasy prostokątne [] np.: int * wsktab = new int[rozmiar]; Likwidujemy tablicę podając za operatorem delete dodatkowo [] np.: delete [] wsktab; Operator delete nie zwraca żadnej wartości (jest typu void). Tablice wielowymiarowe tworzymy jako tablicę tablic o z góry podanych stałych wymiarach. Czyli tylko wymiar pierwszy od lewej może być podany przez zmienną np.: double (*tablica)[12][30] = new double[wymiar][12][30]; Tablice wielowymiarowe likwidujemy jak jednowymiarowe np.: delete [] tablica;
87 Poważnym błędem jest kasowanie wcześniej skasowanego obiektu. Aby tego uniknąć, po kasowaniu można wskaźnik ustawić na NULL (wtedy nic nie skasujemy). W przypadku nieudanej próby rezerwacji pamięci, informację o tym możemy uzyskać na trzy sposoby: 1. zwrot adresu NULL 2. rzucenie wyjątku bad_alloc 3. wywołanie danej przez nas funkcji int *wsk = new (std::nothrow) int[wym]; if(!wsk) std::cout << Rezerwacja nieudana ; try{ int *wsk = new int[wym]; } catch(std::bad_alloc) { std::cout << Rezerwacja nieudana ; } #include <new> set_new_handler(naszafunkcjanieudanejrezerwacji); int *wsk = new int[wym];
88 Klasy Klasa jest pewnego rodzaju typem danych. Definicja klasy składa się ze słowa kluczowego class, nazwy danej klasy, ciała klasy ujętego w nawiasy klamrowe i średnika. W skład ciała klasy mogą wchodzić m.in. dane i funkcje składowe, jak również obiekty innych klas. Nazwy deklarowane w klasie mają zakres ważności obejmujący całą klasę np. class ksiazka { public: char tytul[200]; int iloscstron; float cena; void wartosc(float liczba); }; void ksiazka::wartosc(float liczba) { cena = liczba; }
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki
Wykład 2 - podstawy języka C++ Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu. Zmienne i ich nazwy, podstawowe typy: całkowite, rzeczywiste, znakowe i napisowe. Instrukcje:
Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44
Programowanie w C++ Wykład 2 Katarzyna Grzelak 4 marca 2019 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44 Na poprzednim wykładzie podstawy C++ Każdy program w C++ musi mieć funkcję o nazwie main Wcięcia
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()
C++ - [3-5] Pliki i strumienie w C++
Slajd 1 z 13 C++ - [3-5] Pliki i strumienie w C++ Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 19 maja 2013 r. Slajd 2 z 13 Klasy i obiekty do obsługi plików Aby korzystać z obiektów do obsługi
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,
Podstawy programowania w języku C i C++
Podstawy programowania w języku C i C++ Część czwarta Operatory i wyrażenia Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,
Część 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory
1 Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania.
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Zmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI
Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku
Podstawy Programowania Podstawowa składnia języka C++
Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Operacje wejścia/wyjścia (odsłona druga) - pliki
Operacje wejścia/wyjścia (odsłona druga) - pliki Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2005 2008 Bogdan Kreczmer Niniejszy dokument zawiera materiały
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Podstawy programowania w języku C
Podstawy programowania w języku C WYKŁAD 1 Proces tworzenia i uruchamiania programów Algorytm, program Algorytm przepis postępowania prowadzący do rozwiązania określonego zadania. Program zapis algorytmu
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
programowania Wykład: 5 Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD programowania w C++ Instrukcje sterujące 2 dr Artur Bartoszewski
Programowanie strukturalne i obiektowe
Programowanie strukturalne i obiektowe Język C część I Opracował: Grzegorz Flesik Literatura: A. Majczak, Programowanie strukturalne i obiektowe, Helion, Gliwice 2010 P. Domka, M. Łokińska, Programowanie
1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.
1. Pierwszy program // mój pierwszy program w C++ #include using namespace std; cout
Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD
Języki C i C++ Wykład: 2 Wstęp Instrukcje sterujące 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Instrukcje sterujące 2 Pętla for for ( instrukcja_ini ; wyrazenie_warunkowe
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy
ROZDZIAŁ 2. Operatory
Bibliografia [1] Jerzy Grębosz, Symfonia C++, Oficyna Kallimach, Kraków, 1999, [2] Jerzy Grębosz, Pasja C++, Oficyna Kallimach, Kraków, 1999, [3] Bjarne Stroustrup, Język C++, WNT, Warszawa, 1997, [4]
Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41
Programowanie w C++ Wykład 2 Katarzyna Grzelak 5 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41 Reprezentacje liczb w komputerze K.Grzelak (Wykład 1) Programowanie w C++ 2 / 41 Reprezentacje
I - Microsoft Visual Studio C++
I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i
INFORMATYKA Studia Niestacjonarne Elektrotechnika
INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl
Wejście wyjście strumieniowe
PARADYGMATY PROGRAMOWANIA Wykład 6 Wejście wyjście strumieniowe stdin standardowy strumień wejściowy stdout standardowy strumień wyjściowy stderr standardowy strumień komunikatów o błędach pliki - inne
C++ wprowadzanie zmiennych
C++ wprowadzanie zmiennych Każda zmienna musi być zadeklarowana, należy określić jej nazwę (identyfikator) oraz typ. Opis_typu lista zmiennych Dla każdej zmiennej rezerwowany jest fragment pamięci o określonym
Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.
Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Typy c.d. 2 Typy zmiennych Instrukcja typedef -
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++
Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 10 Kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.
Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using
Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:
Podstawy Informatyki Metalurgia, I rok Historia Lata 0-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard Koniec lat 80 standard
/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>
Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch
Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++
Podstawy Informatyki Metalurgia, I rok Wykład 6 Krótki kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.
Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Symfonia C++ standard : programowanie w języku C++ orientowane obiektowo. T. 1 / Jerzy Grębosz. Wyd. 3 C - popr. Kraków, 2015.
Symfonia C++ standard : programowanie w języku C++ orientowane obiektowo. T. 1 / Jerzy Grębosz. Wyd. 3 C - popr. Kraków, 2015 Spis treści 0 Proszę nie czytać tego! 19 1 Startujemy! 24 1.1 Pierwszy program
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40 Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne
Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik
Wykład VII Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Kompilacja Kompilator C program do tłumaczenia kodu źródłowego na język maszynowy. Preprocesor
Temat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
Słowa kluczowe i nazwy
Materiał uzyskany ze strony: http://edu.pjwstk.edu.pl/wyklady/pro/scb/prg2cpp_files/node1.html Słowa kluczowe i nazwy Nazwy (identyfikatory) są wprowadzane do jednostki kompilacji (pliku wraz z innymi
Języki i paradygmaty programowania
Języki i paradygmaty programowania Instytut Teleinformatyki ITI PK Kraków marzec 2012 Spis rzeczy 1 Operatory w C/C++ Operatory Operatory w C/C++ operator - rodzaj funkcji wbudowanej w język; różnica notacja
Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++
Podstawy programowania Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++ 1 dr Artur Bartoszewski - Podstawy programowania, sem. 1- WYKŁAD Część I Wstęp do struktur danych: Tablice 2
MATERIAŁY DO ZAJĘĆ II
MATERIAŁY DO ZAJĘĆ II Zmienne w C# Spis treści I. Definicja zmiennej II. Hierarchia typów (CTS) III. Typy wbudowane IV. Deklaracja zmiennych V. Literały VI. Pobieranie i wypisywanie wartości zmiennych
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 5 1 SPECYFIKATOR const Specyfikator (przydomek) const: Umieszczenie przed nazwą zmiennej specyfikatora const w jej definicji informuje kompilator,
Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Na ekranie monitora zostaną wyświetlone w dwu liniach teksty Pierwsza linia Druga linia
Struktura programu W programach napisanych w C++ litery wielkie i małe są rozróżniane i często po nauce Pascala są przyczyną błędów. Program napisany w języku C++ składa się zazw yczaj z następujących
utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Mikrokontroler ATmega32. Język symboliczny
Mikrokontroler ATmega32 Język symboliczny 1 Język symboliczny (asembler) jest językiem niskiego poziomu - pozwala pisać programy złożone z instrukcji procesora. Kody instrukcji są reprezentowane nazwami
Programowanie komputerowe. Zajęcia 1
Programowanie komputerowe Zajęcia 1 Code::Blocks - tworzenie projektu Create New Project Console Application -> C++ Wybierz nazwę projektu Stworzy się nowy projekt z wpisaną funkcją main Wpisz swój program
1. Wprowadzanie danych z klawiatury funkcja scanf
1. Wprowadzanie danych z klawiatury funkcja scanf Deklaracja int scanf ( const char *format, wskaźnik, wskaźnik,... ) ; Biblioteka Działanie stdio.h Funkcja scanf wczytuje kolejne pola (ciągi znaków),
Tablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1
Operatory Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1 Przypomnienie: operatory Operator przypisania = przypisanie x = y x y Operatory arytmetyczne
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Język C++ Różnice między C a C++
Język C++ Różnice między C a C++ Plan wykładu C a C++ Różnice ogólne Typy Deklaracje zmiennych C++ jako rozszerzenie C Domyślne argumenty funkcji Przeciążanie funkcji Referencje Dynamiczny przydział pamięci
Wstęp do programowania. Wykład 1
Wstęp do programowania Wykład 1 1 / 49 Literatura Larry Ullman, Andreas Signer. Programowanie w języku C++. Walter Savitch, Kenrick Mock. Absolute C++. Jerzy Grębosz. Symfonia C++. Standard. Stephen Prata.
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 5 Katarzyna Grzelak 16 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27 Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły
Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe
Wstęp do programowania obiektowego Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe 1 PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI W C++ 2 W C++
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Wstęp do programowania
wykład 2 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017 Liczby Korzystanie z liczn C++ zna różne rodzaje liczb (różne typy liczbowe) i potrafi wykonywać na nich różne operacje
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo
Operatory w C++ Operatory arytmetyczne + dodawanie - odejmowanie * mnożenie / dzielenie % modulo Operatory relacyjne (porównania) < mniejszy niż większy niż >= większy lub równy
dr inż. Paweł Myszkowski Wykład nr 8 (22.04.2015)
dr inż. Paweł Myszkowski Politechnika Białostocka Wydział Elektryczny Elektronika i Telekomunikacja, semestr II, studia stacjonarne I stopnia Rok akademicki 2014/2015 Wykład nr 8 (22.04.2015) Plan prezentacji:
Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady
Pętle i tablice. Spotkanie 3 Dr inż. Dariusz JĘDRZEJCZYK Pętle: for, while, do while Tablice Przykłady 11/26/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Pętla w największym uproszczeniu służy
Język C++ zajęcia nr 2
Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator
Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest
Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)
Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string) Dorota Pylak Struktura programu działającego na plikach 2 1) Dyrektywa preprocesora #include //zapewnia
Programowanie w językach
Programowanie w językach wysokiego poziomu Obsługa plików za pomocą strumieni Elektronika i Telekomunikacja, semestr III rok akademicki 2013/2014 dr inż. Paweł Myszkowski Plan zajęć a) otwieranie i zamykanie
Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów
Funkcje. Spotkanie 5 Dr inż. Dariusz JĘDRZEJCZYK Tworzenie i używanie funkcji Przekazywanie argumentów do funkcji Domyślne wartości argumentów Przeładowanie nazw funkcji Dzielenie programu na kilka plików
Podstawy programowania w C++
Podstawy programowania w C++ Strumienie wejścia cin>> i wyjścia cout
Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal
Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO Rozdział 1. Wybór i instalacja kompilatora języka Pascal 1.1. Współczesne wersje kompilatorów Pascala 1.2. Jak zainstalować
Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.
M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza
Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak
Katedra Elektrotechniki Teoretycznej i Informatyki wykład 12 - sem.iii M. Czyżak Język C - preprocesor Preprocesor C i C++ (cpp) jest programem, który przetwarza tekst programu przed przekazaniem go kompilatorowi.
3. Instrukcje warunkowe
. Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include
Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char
Programowanie C++ Informacje wstępne #include - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char = -128 do 127, unsigned char = od
4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Struktury, unie, formatowanie, wskaźniki
Struktury, unie, formatowanie, wskaźniki 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12, na rzecz swoich 143209 poddanych uchwalił dekret o 20 procentowej
Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33
Programowanie w C++ Wykład 8 Katarzyna Grzelak 15 kwietnia 2019 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30
Programowanie w C++ Wykład 9 Katarzyna Grzelak 14 maja 2018 K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe plus
Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH
Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 1 Podstawy Wprowadzenie do programowania w języku C Kraków 2010 Twój pierwszy program w C Program w języku C, jak i w wielu innych językach
Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.
Instrukcje warunkowe i skoku. Spotkanie 2 Dr inż. Dariusz JĘDRZEJCZYK Wyrażenia i operatory logiczne Instrukcje warunkowe: if else, switch Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania
Wykład 9 2014-06-20 09:37 PP2_W9
Wykład 9 Przykłady programów z wykorzystaniem klas - przykład funkcji operatorowych - obiektowa implementacja listy jednokierunkowej kopiowanie obiektów - klasa "latający napis" Pozycjonowanie w plikach
Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java
Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java Cechy C++ Język ogólnego przeznaczenia Można programować obiektowo i strukturalnie Bardzo wysoka wydajność kodu wynikowego
C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE
STRUMIENIE Motywacja wprowadzenia nowej biblioteki strumieni: W języku C istnieje intepreter odpowiedzialny za analizę łańcucha formatującego podczas wykonywania programu oraz pobierający zmienną liczbę
C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE
STRUMIENIE Motywacja wprowadzenia nowej biblioteki strumieni: W języku C istnieje intepreter odpowiedzialny za analizę łańcucha formatującego podczas wykonywania programu oraz pobierający zmienną liczbę
Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE
1. Proste typy danych- ciąg dalszy 2. Typy złożone danych : TABLICE Wykład 3 ZMIENNE PROSTE: TYPY WBUDOWANE Typy zmiennoprzecinkowe: float double long double Różne rozmiary bajtowe. W konsekwencji różne
Wykład 2 Operacje wejściawyjścia. Ewa Gajda
Wykład 2 Operacje wejściawyjścia w C++ Ewa Gajda Strumienie Operacje wejścia-wyjścia w C++ realizowane są przy pomocy tak zwanych strumieni. Strumieo można sobie wyobrażad jako ciąg znaków bądź bajtów
Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)
Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Wstęp do programowania
wykład 2 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018 Inicjalizacja zmiennych Zmiennej możemy nadać wartość już w momencie jej definiowania (inicjalizacja zmiennej). Przypisywana