Pracownia specjalistyczna. Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka



Podobne dokumenty
C++ wprowadzanie zmiennych

Część 4 życie programu

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

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

I - Microsoft Visual Studio C++

1 Podstawy c++ w pigułce.

Podstawy Programowania Podstawowa składnia języka C++

Języki i metodyka programowania. Wprowadzenie do języka C

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

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Podstawy c++ w pigułce.

2 Przygotował: mgr inż. Maciej Lasota

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

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

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

MATERIAŁY DO ZAJĘĆ II

Podstawy i języki programowania

Struktura pliku projektu Console Application

Programowanie komputerowe. Zajęcia 1

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do Programowania, laboratorium 02

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

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

Zmienne, stałe i operatory

Odczyt danych z klawiatury Operatory w Javie

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Wstęp do programowania. Wykład 1

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

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

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Programowanie strukturalne i obiektowe

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

4. Funkcje. Przykłady

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Mikrokontroler ATmega32. Język symboliczny

Język ludzki kod maszynowy

Język C - podstawowe informacje

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

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

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

( wykł. dr Marek Piasecki )

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Pytania sprawdzające wiedzę z programowania C++

Programowanie Obiektowe i C++

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie strukturalne. dr inż. Tadeusz Jeleniewski

Wstęp do programowania

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Podstawy programowania w języku C

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Język C zajęcia nr 11. Funkcje

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

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Podstawy programowania C. dr. Krystyna Łapin

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Lab 9 Podstawy Programowania

Wstęp do wskaźników w języku ANSI C

Abstrakcyjne struktury danych w praktyce

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Język C++ zajęcia nr 2

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Wprowadzenie do języka Java

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Operatory, wyrażenia i typy proste

Proste programy w C++ zadania

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

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

Podstawy Programowania C++

7. Pętle for. Przykłady

Wstęp do informatyki- wykład 4 Deklaracja zmiennych Typy

Transkrypt:

Pracownia specjalistyczna Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka

Język C++ 1. Podstawowa struktura pliku źródłowego: #include <iostream> #include "main.h" using namespace std; Pliki nagłówkowe - biblioteki int main() { cout << "Hello world" << endl; return 0; } Definicje zmiennych globalnych, korzystania z przestrzeni nazw, definicje struktur danych i funkcji pomocniczych Główna funkcja programu definiuje kolejnośd operacji w programie Kompilacja: g++ <nazwa pliku źródłowego> -o <nazwa pliku wykonywalnego> Zad 1. Korzystając z ulubionego edytora stwórz plik o nazwie main.cpp i wprowadź do niego przykładowy kod pliku źródłowego. Zad 2. Skompiluj program dając mu nazwę hello. Zad 3. Uruchom program (wpisując./hello).

2. Preprocessor Dyrektywa #include załącza treśd wybranego pliku do pliku bieżącego w miejscu, w którym jest wykorzystana. Przykład: ala.h bajki.cpp Ala ma kota, Kot ma Alę #include "ala.h" #include "dzik.h" #include "ala.h" dzik.h Preprocesing Dzik jest dziki, Dzik jest zły, Dzik ma bardzo ostre kły, Kto spotyka w lesie dzika, Ten na drzewo zaraz zmyka bajki.cpp Ala ma kota, Kot ma Alę Dzik jest dziki, Dzik jest zły, Dzik ma bardzo ostre kły, Kto spotyka w lesie dzika, Ten na drzewo zaraz zmyka Ala ma kota, Kot ma Alę Dyrektywy #define i #undef. Dyrektywa #define służy do zdefiniowania ciągu znaków (nie oddzielonego spacją), który ma byd zamieniany na inny ciąg znaków po wystąpieniu dyrektywy do momentu wystąpienia dyrektywy #undef. Przykład: bajki.cpp Ala ma kota "Ala ma kota" #define Ala Kot Ala ma kota "Ala ma kota" #undef Ala Ala ma kota "Ala ma kota" bajki.cpp Ala ma kota "Ala ma kota" Kot ma kota "Ala ma kota" Ala ma kota "Ala ma kota" UWAGA! Należy zwrócid uwagę, że w ciągu znaków (tj. fragmencie ujętym w cudzysłowiu) nie nastąpiła zamiana. Dyrektywy #ifdef, #ifndef i #endif. Dyrektywa #ifdef warunkowo wstawia blok występujący po niej do momentu dyrektywy #endif w przypadku, gdy zdefiniowano ciąg znaków za pomocą dyrektywy #define. Bardziej przydatna jednak z praktycznego punktu widzenia jest dyrektywa #ifndef, wstawiająca ten blok w przypadku, gdy nie zdefiniowano ciągu znaków za pomocą dyrektywy #define, gdyż może zapobiegad ona powtórnego wstawiania kodu w przypadku, gdy wcześniej został on już wstawiony.

Korzystając z wcześniejszego przykładu: ala.h bajki.cpp #include "ala.h" #include "dzik.h" #include "ala.h" #ifndef ALA_H #define ALA_H Ala ma kota, Kot ma Alę #endif dzik.h Krok 1 Dzik jest dziki, Dzik jest zły, Dzik ma bardzo ostre kły, Kto spotyka w lesie dzika, Ten na drzewo zaraz zmyka bajki.cpp #ifndef ALA_H #define ALA_H Ala ma kota, Kot ma Alę #endif Dzik jest dziki, Dzik jest zły, Dzik ma bardzo ostre kły, Kto spotyka w lesie dzika, Ten na drzewo zaraz zmyka #ifndef ALA_H #define ALA_H Ala ma kota, Kot ma Alę #endif Krok 2 bajki.cpp Ala ma kota, Kot ma Alę Dzik jest dziki, Dzik jest zły, Dzik ma bardzo ostre kły, Kto spotyka w lesie dzika, Ten na drzewo zaraz zmyka Celem wywołania dla określonego pliku źródłowego preprocessingu bez kompilacji korzystamy z komendy g++ z przełącznikiem E. Wynik preprocessingu pojawi się na standardowym wyjściu. Przykładowo jeśli chcemy dokonad preprocessingu pliku bajki.cpp i rezultat umieścid w pliku pre.txt należy wpisad komendę: g++ bajki.cpp -E > pre.txt Zad 1. Stwórz pliki ala.h, dzik.h oraz main.cpp z przykładu dla dyrektywy #include. Zaobserwuj działanie tejże dyrektywy. Zad 2. Ściągnij ze strony plik wierszyki.txt. Użyj do tego celu komendy: wget www.cs.put.poznan.pl/wfrohmberg/download/wierszyki.txt Korzystając z dyrektyw #include i #define napisz plik zamiana.cpp tak, aby po wykonaniu polecenia: g++ zamiana.cpp -E > zamieniony.txt w pliku zamieniony.txt wszystkie wystąpienia słowa pan były zamienione na Pan. Skorzystaj z własności dyrektywy #include która pozwala załączad plik dowolnego formatu. Zad 3. Zmodyfikuj pliki z zadania pierwszego w taki sposób, aby wielokrotne dołączenie plików.h nie powodowało wielokrotnego załączania ich treści. Przetestuj zmiany.

3. Zmienne Typy podstawowe (ang. Primitive data types) predefiniowane w języku C++ o nazwach zarezerwowanych jako słowa kluczowe: Typ Rozmiar Interpretacja Zakres char 1 bajt Jeden znak kodu ASCII <-2 7 ;-2 7-1>=<-128;127> bool 1 bajt Typ przechowujące informację true, false o wartości logicznej short 2 bajty Typ całkowitoliczbowy <-2 15 ; 2 15-1> = <-32768;32767> int 4 bajty (zależne od kompilatora) Typ całkowitoliczbowy <-2 31 ; 2 31-1>= <-2147483648; 2147483647> long 4 bajty Typ całkowitoliczbowy <-2 31 ; 2 31-1>= <-2147483648; 2147483647> long long 8 bajtów Typ całkowitoliczbowy <-2 63 ;2 63-1> <-2 10 17 ; 2 10 17 > float 4 bajty Typ zmiennoprzecinkowy +/- 3.4 10 +/- 38 (ok. 7 cyfr) double 8 bajtów Typ zmiennoprzecinkowy +/- 1.7 10 +/- 308 (ok. 15 cyfr) Deklaracja zmiennej: typ etykieta (= wartość_domyślna)(, ); np.: int a=4, b=12; char c='m'; Wypisywanie na standardowe wyjście w programie napisanym w C++ odbywa się za pomocą strumieni. Zmienną strumieniową do której będziemy wrzucad rzeczy do wypisania to zmienna cout znajdujące się w namespace ie std. Drukowanie zmiennej odbywa się za pomocą przeciążonego operatora << (temat przeciążania operatorów będzie omówiony w kontekście obiektowości). Przykład: cout << a << endl; cout << b << endl; Wypisze dwie linie z wartościami zmiennych a i b. Zad 1. Zmodyfikuj plik main.cpp z rozdziału o podstawowej strukturze pliku deklarując trzy zmienne: a typu całkowitoliczbowego o domyślnej wartości 3, b typu zmiennoprzecinkowego o domyślnej wartości 11.22, i c typu znakowego o wartości 'L'. Następnie korzystając ze strumieni wypisz je w jednej linii oddzielonej spacjami.

Deklaracja zmiennej a pamięd operacyjna komputera: Pamięd operacyjną dostępną przez program można sobie wyobrazid jako kartkę w kratkę. Deklaracją zmiennej może byd wtedy wykorzystanie odpowiedniej liczby kratek zgodnie z rozmiarem typu zmiennej. a b c 0 0 0 4 0 0 1 2 m Deklaracja tablicy zmiennych: typ etykieta[(ilość_elementów)] (= {wartości_domyślne_oddzielone_przecinkami}); np.: int tab[5] = {0, 1, 2, 3, 4}; Tablice w C/C++ adresowane są od 0. Oznacza to że żeby dostad się do pierwszego elementu tablicy trzeba skorzystad z indeksu 0. Kontynuując przykład z pamięcią: a b c tab[0] tab[1] tab[2] tab[3] tab[4] 0 0 0 4 0 0 1 2 m 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 Tablice w C++ muszą byd ciągłym obszarem pamięci, oznacza to że kolejne bajty pamięci operacyjnej tablicy, która ma zostad zadeklarowana nie mogą byd oddzielone żadnym bajtem innej zmiennej. Szczególnym przypadkiem inicjalizowania zmiennej tablicowej dla tablicy znaków jest skorzystanie z faktu iż tekst objęty w cudzysłów jest w C++ definicją stałego ciągu znaków. Można zatem zdeklarowad zmienną tablicową dla ciągu znaków w następujący sposób: char tab[<rozmiar>] = "<tekst>"; Zad 1. Do pliku z poprzedniego zadania dołóż zmienną tablicową o 5-ciu wartościach 1, 2, 4, 8 i 16. Wypisz na standardowe wyjście w kolejnych liniach standardowego wyjścia komórki tablicy o indeksach parzystych. Zad 2. Stwórz jeszcze raz program Hello world. Tym razem wypisywany tekst ma znajdowad się w zmiennej.

Adres zmiennej to numer pierwszego bajtu w pamięci operacyjnej w której mieści się zmienna. Celem wyłuskania adresu korzystamy z operatora & wstawiając za nim etykietę zmiennej, której adres chcemy wyłuskad. Na przykład: &a, &b, &tab[1] Korzystając z analogii kartki w kratkę adresem będzie numer pierwszej kratki z wartością zmiennej której adres chcemy otrzymad: a b c tab[0] tab[1] tab[2] tab[3] tab[4] 0 0 0 4 0 0 1 2 m 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 &a &b &tab[1] Zad 1. Stwórz program z sześcioma zmiennymi typu char trzema zadeklarowanymi jako zmienne globalne (nad funkcją main) i trzema zmiennymi zadeklarowanymi wewnątrz funkcji main. Wypisz w kolejnych liniach standardowego wyjścia ich adresy zrzutowane na typ całkowitoliczbowy ((int)&zmienna). Co zaobserwowałeś? Zad 2.Poszukaj informacji na temat stosu i sterty programu. Które ze zmiennych z zadania znajdują się na stosie a które na stercie? Zad 3. Zadeklaruj tablice znaków o rozmiarze 3 jako zmienną globalną i jako zmienną wewnątrz funkcji main. Podobnie jak w zadaniu 1 wypisz adresy kolejnych elementów tablicy zrzutowane na typ całkowitoliczbowy. Co zaobserwowałeś?

Adres a referencja. Z pojęciem adresu łączy się jednoznacznie pojęcie referencji do zmiennej. Zwyczajowo przyjmuje się że referencja do zmiennej to wykorzystanie zmiennej celem podstawienia pod nią wartości. Przykładem może byd tutaj podstawianie za zmienną wartości stałej, bądź z wykorzystaniem (referencje zmiennych zaznaczone są tutaj na zielono): a = 4; c = 'k'; b = a; tab[1] = b; Zad 1. Utwórz tablicę znakową i zainicjuj ją wartością "Ala ma kota". Zmieo wartośd pierwszego elementu tablicy na 'O'. Wypisz ciąg znaków na standardowe wyjście.

Zmienna referencyjna. Zmienna referencyjna to zmienna która zastępuje etykietę innej zmiennej. Deklaracja zmiennej referencyjnej: typ& etykieta = referencja_do_zmiennej; W przypadku gdy za zmienną referencyjną podstawimy w dalszych linijkach (po deklaracji) jakąś wartośd w zmiennej do której ta zmienna się odnosi wartośd ta zostanie również zmieniona. Przykład: int tab[5] = {0, 1, 2, 3, 4}; int b = 4; int& ref = tab[1]; ref = 10; // pod zmienną tab[1] znajduje się wartość 10 ref = b; // pod zmienną tab[1] znajduje się wartość 4 Ważne jest by przekazywana referencja do zmiennej miała ten sam typ jak zmienna referencyjna inaczej przed jej podstawieniem nastąpi rzutowanie (o którym mowa będzie później) zmiennej i przed podstawieniem referencji zostanie utworzona nowa zmienna której referencja zostanie zapamiętana w naszej zmiennej referencyjnej. Zad 1. Wprowadź do pliku main.cpp kod z przykładu i zweryfikuj wartości zmiennych w danych miejscach (wypisując je na standardowe wyjście).

Zmienne wskaźnikowe. Kolejnym rodzajem zmiennych są zmienne wskaźnikowe (lub w skrócie wskaźniki). Wskaźniki to zmienne przechowujące adres innej zmiennej. Deklaracja zmiennych wskaźnikowych: typ *etykieta (=adres_do_zmiennej); Przykład: int tab[5] = {0, 1, 2, 3, 4}; int *pointer = &tab[1]; Uwaga! W przypadku deklaracji kilku zmiennych wskaźnikowych w jednej instrukcji należy umieścid symbol * przed każdą ze zmiennych inaczej zmienna ta będzie miała typ bazowy. Przykładowo: int *pointer, a; Zmienna a będzie typu int. Celem wyłuskania referencji zmiennej lub też jej wartości spod wskaźnika, korzystamy z operatora * w kontekście innym niż deklaracja. Przykładowo: int tab[5] = {0, 1, 2, 3, 4}; int *pointer = &tab[1], *pointer2 = &tab[2]; *pointer = *pointer2; *pointer2 = 3; // w zmiennej tab[1] znajduje się teraz 2 a w tab[2] - 3 Dla zmiennych wskaźnikowych, tak jak w przypadku zmiennych referencyjnych, również istotnym jest by typ adresu który przekazujemy był ten sam, jednak z innych względów. Gdy będziemy korzystad ze zmiennej wskaźnikowej celem podstawienia wartości a wskaźnik będzie innego typu niż zmienna na którą owy wskaźnik wskazuje (dajmy na to że mniejszego rozmiaru) podczas podstawiania zostanie nadpisana pamięd innej zmiennej. Wracając do analogii z kartką w kratkę załóżmy że mamy dane instrukcje deklarujące zmienne: char c='m'; int a=4; int *pointer = (int *)&c; //(int *) oznacza rzutowanie które będzie //omówione w dalszej części skryptu c a pointer m 0 0 0 4 Po wykonaniu instrukcji: *pointer = 2;

Pamięd zmieni się następująco: c a pointer 0 0 0 2 4 Alternatywną metodą korzystania ze zmiennych wskaźnikowych celem wydobycia referencji zmiennej, bądź jej wartości jest odwoływanie się przez nawias tablicowy []. Wykorzystanie tutaj *etykieta byłoby równoważne z etykieta[0]. Indeks w nawiasach tablicowych mówi o tym do której z kolei zmiennej typu jednoznacznie identyfikowanego przez typ wskaźnika chcemy się odwoływad tak jak byśmy korzystali z tablicy z zerowym elementem zmienną na którą wskazujemy. Analogia pomiędzy zmiennymi wskaźnikowymi a zmiennymi tablicowymi nie jest przypadkowa. Etykieta zmiennej tablicowej jest również wskaźnikiem na pierwszą zmienną w tablicy. Zad 1. Utwórz zmienną tablicową z 5 zmiennymi typu int o wartościach: 0, 1, 2, 3 i 4. Za zmienną wskaźnikową wsk podstaw adres do 2 elementu w tablicy (tab*1+). Podstaw za kolejne cztery wartości tablicy wsk (wsk*0+, wsk*1+, wsk*2+, wsk*3+) ich wartośd zwiększoną o 2. Skorzystaj z operatora binarnego + (x = x + y;). Wypisz wartości tablicy na standardowe wyjście. Zad 2. Wykonaj powyższe zadanie tym razem nie korzystając z operatora *+. Skorzystaj z własności danej przykładem: *(wskaźnik + indeks)=2;

Operator sizeof. W celu wydobycia informacji na temat rozmiaru zmiennej (w bajtach) możemy wykorzystad operator sizeof. Uwaga typ tablicowy ma tyle bajtów ile wynosi suma rozmiarów wszystkich jego elementów. Dlatego na przykład: char c='m'; int a=2; int *pointerint; // sizeof(c)==1 // sizeof(a)==4 // sizeof(pointerint) == 4 lub 8 w zależności od // tego czy system jest 32 czy 64 bitowy // a dokładniej na jaką architekturę // kompilowany jest program char *pointerchar; // sizeof(pointerchar) == sizeof(pointerint) // zmienna wskaźnikowa nie zależnie od typu na // jaki wskaźnik wskazuje ma ten sam rozmiar! int tab[5]; // sizeof(tab) == 5*4 // bo typem jest tutaj int[5] Zad 1. Zweryfikuj wartości wielkości danych typów podane w przykładzie. Zad 2. Operator sizeof można stosowad również podając w nawiasach typ zmiennych. Korzystając z tabelki umieszczonej na piątej stronie skryptu wypisz na standardowe wejście w nowych liniach nazwę każdego typu wraz z wielkości pamięci jaką zajmuje.

4. Operatory języka C++ Operatory zmieniające wartośd zmiennej Operator Użycie Opis = ref = val; Podstawienie za zmienną której referencję przekazujemy jako pierwszy argument wartości podanej jako drugi argument += ref += val; Zwiększenie zmiennej której referencję podajemy jako pierwszy argument o wartośd podaną jako drugi argument -= ref -= val; Zmniejszenie zmiennej której referencję podajemy jako pierwszy argument o wartośd podaną jako drugi argument *= ref *= val; Zwiększenie zmiennej której referencję podajemy jako pierwszy argument wartośd podaną jako drugi argument razy /= ref /= val; Zmniejszenie zmiennej której referencję podajemy jako pierwszy argument wartośd podaną jako drugi argument razy %= ref %= val; Operator podstawiający resztę z dzielenia referencji zmiennej podanej jako pierwszy argument przez wartośd podaną jako drugi argument &= ref &= val; Operator bitowego mnożenia referencji zmiennej podanej jako pierwszy argument przez wartośd podaną jako drugi argument = ref = val; Operator bitowej sumy referencji zmiennej podanej jako pierwszy argument z wartością podaną jako drugi argument ^= ref ^= val; Operator bitowej sumy modulo 2 (xor) referencji zmiennej podanej jako pierwszy argument z wartością podaną jako drugi argument >>= ref >>= val; Operator przesunięcia bitowego w prawo zmiennej podanej jako pierwszy argument o ilośd bitów podaną jako drugi argument <<= ref <<= val; Operator przesunięcia bitowego w lewo zmiennej podanej jako pierwszy argument o ilośd bitów podaną jako drugi argument ++ ref++, ++ref Unarny operator inkrementacji wartości zmiennej -- ref--, --ref Unarny operator dekrementacji wartości zmiennej Wszystkie operatory powyższe operatory (z wyjątkiem postfiksowych operatorów inkrementacji i dekrementacji) zwracają referencję do zmienianej zmiennej. Dlatego można sobie wyobrazid ciąg podstawieo typu a-=b+=5;, który to będzie wykonywany od kooca (b+=5) do początku (a-=b). Przykłady: a = 5; // W zmiennej a będzie wartość 5 a += 3; // W zmiennej a będzie wartość 8 a *= a; // W zmiennej a będzie wartość 64 a /= 4; // W zmiennej a będzie wartość 16 a %= 7; // W zmiennej a będzie wartość 2 a = 5; // W zmiennej a będzie wartość 7 (5 to 101, 2 = 010) a &= 9; // W zmiennej a będzie wartość 1 (9 to 1001, 7 = 111) a <<= 3; // W zmiennej a będzie wartość 8 a >>= 1; // W zmiennej a będzie wartość 4

Zad 1. Wprowadź do programu kod z powyższego przykładu. Zweryfikuj wartości zmiennej na poszczególnych jego etapach. Zad 2. Zaimplementuj algorytm zamiany dwóch zmiennych bez użycia bufora dany w pseudokodzie: X X XOR Y Y X XOR Y X X XOR Y Tak by był zapisany w jednej instrukcji (tj. bez operatora średnika)

Arytmetyczne Bitowe Porównania Logiczne Pozostałe operatory Operator Krotność Użycie Opis + binarny val+val Zwraca sumę wartości podanych w argumentach - binarny val-val Zwraca różnicę wartości podanych w argumentach - unarny -val Zwraca przeciwną wartośd do podanej w argumencie * binarny val*val Zwraca iloczyn wartości podanych w argumentach / binarny val/val Zwraca iloraz wartości podanych w argumentach % binarny val%val Zwraca resztę z dzielenia wartości z pierwszego argumentu przez drugi argument & binarny val&val Zwraca iloczyn bitowy wartości podanych w argumentach binarny val val Zwraca sumę bitową wartości podanych w argumentach ^ binarny val^val Zwraca sumę reszta 2 (xor) bitową wartości podanych w argumentach ~ unarny ~val Zwraca negację bitową wartości podanej w argumencie << binarny val<<val Zwraca wartośd podaną w pierwszym argumencie przesuniętą w lewo o wartośd podaną w drugim argumencie bitów >> binarny val>>val Zwraca wartośd podaną w pierwszym argumencie przesuniętą w prawo o wartośd podaną w drugim argumencie bitów == binarny val==val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest równa wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false)!= binarny val!=val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest różna od wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false) <= binarny val<=val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest mniejsza lub równa od wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false) >= binarny val>=val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest większa lub równa od wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false) < binarny val<val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest mniejsza od wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false) > binarny val>val Zwraca wartośd logiczną prawda (true) jeśli wartośd podana jako pierwszy argument jest większa od wartości podanej jako drugi argument w innym wypadku zwraca wartośd logiczną fałsz (false) && binarny val&&val Zwraca logiczny iloczyn zdao logicznych podanych jako argumenty binarny val val Zwraca logiczną sumę zdao logicznych podanych jako argumenty! unarny!val Zwraca logiczną negację zdania logicznego podanego jako argument

Wskaźnikowe Operator Krotność Użycie Opis?: trójargum. (val)? (val) : (val) W przypadku, gdy wartośd pierwszego argumentu zdania logicznego jest prawdą zwraca wartośd drugiego argumentu, w innym wypadku zwraca wartośd trzeciego argumentu * unarny *val Operator wyciągnięcia referencji spod wskaźnika & unarny &ref Zwraca adres zmiennej podanej w argumencie [] binarny val[val] Operator wyciągnięcia elementu spod indeksu określonego przez drugi argument z tablicy lub spod wskaźnika określonego przez pierwszy argument. binarny ref.field Operator dostępu do pola wyspecyfikowanego drugim parametrem operatora struktury lub obiektu określonego pierwszym argumentem -> binarny val->field Operator dostępu do pola wyspecyfikowanego drugim parametrem operatora struktury lub obiektu, do którego wskaźnik znajduje się w pierwszym argumencie operatora Należy zwrócid uwagę że dodawanie wartości do wskaźników zwiększa wartośd o rozmiar typu który mieści się pod wskaźnikiem razy wartośd dodawana. Przykładowo: int *pointer = (int *)0; pointer = pointer + 3; // we wskaźniku pointer znajdzie się teraz // wartość 3*sizeof(int) Zad 1. Sprawdź wynik operatorów ^ & dla zmiennych a i b o wartościach odpowiednio 45 i 3. Zad 2. Sprawdź wynik operatora ~ dla zmiennych a, b i c o wartościach odpowiednio 52, 1999 i -26. Zad 3. Znajdź maksymalną wartośd z dwóch liczb znajdujących się w zmiennych a i b (domyślnie 70, -100) korzystając z operatora trójargumentowego. Zad 4. Rozszerz powyższy program o przyjmowanie wartości do zmiennych a i b ze standardowego wejścia. Składnia pobierania wartości zmiennej to: cin >> zmienna;