Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Konwersje liczba <-> napis
Ćwiczenia 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 zniżce podatków. Twoim zadaniem jest wyłuskać wszystkie liczby i wyświetlić ich sumę. 2. Uzupełnij swój kalkulator o obsługę błędów. Zadbaj o to, aby program nie zawieszał się po podaniu litery zamiast liczby.
Typy strukturalne Takie kontenery, typy złożone z kilku pól różnych typów Żeby z niego skorzystać, trzeba zadeklarować nową zmienną o typie przez nas zdefiniowanym
Unie Takie kontenery, typy złożone z kilku pól różnych typów, ale tylko jedno pole może być na raz ustawione Służą do zmniejszenia zajętości pamięci
Ćwiczenia 1. Napisz program do obsługi książki adresowej. Każdy kontakt to oddzielna struktura (imię, nazwisko, gg). Program ma umożliwiać zapisanie do 100 kontaktów, odczyt całej książki adresowej, szukanie konkretnej osoby po nazwisku, zapis i odczyt całej struktury do pliku tekstowego. Wykorzystaj funkcje! 2. Napisz program wykonujący działania na dwóch liczbach zespolonych podawanych z klawiatury (każda liczba to struktura): dodawanie, odejmowanie, mnożenie.
Printf Jest to funkcja służąca do pięknego wyświetlania na ekran
Scanf Taki printf, tylko odwrotnie: czyta wartości do zmiennych Referencja! Scanf() nie nadaje się do stringów!
Ćwiczenia 1. Wyświetl ładnie tabliczkę mnożenia (10x10) na ekran. Ładnie, to znaczy tak, aby poszczególne elementy były wyrównane do prawej i zajmowały tyle samo miejsca (użyj prinf, potem spróbuj z cout). 2. Dokonaj normalizacji danych w pliku. Załóżmy, że plik input.txt wygląda tak: 1. Dla każdego przypadku testowego wyświetl średnią z trzeciej kolumny 2. Znormalizuj wszystkie dane w trzeciej kolumnie do przedziału [0 1] 3. Zapisz taki przetworzony plik do nowego pliku tekstowego.
Nie taki diabeł straszny
Organizacja pamięci operacyjnej 0x0128 0x0129 0x012A 0x012B 0x012C 0x0005 0x 00 06 0x0007 Wskaźnik na: 012A:0006
Wskaźniki w C++ Wskaźniki to po prostu adresy pamięci w której coś jest zapisane Wskaźnik musi mieć podany typ, na jaki wskazuje
Wskaźniki w C++ Ad1: deklaracja zmiennej typu całkowitoliczbowego Ad2: deklaracja wskaźnika na int Ad4: przypisanie do wskaźnika adresu zmiennej Ad5: wyłuskanie wartości na którą wskazuje wskaźnik
Wskaźniki w C++
Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp do pamięci Zmiana adresu 1 typ* zwykły wskaźnik odczyt i zapis TAK 2 const typ* wskaźnik na stałą tylko odczyt TAK 3 typ* const stały wskaźnik odczyt i zapis NIE 4 const typ* const stały wskaźnik na stałą tylko odczyt NIE
Rodzaje wskaźników Typ wskaźnikowy Nazwa Dostęp do pamięci Zmiana adresu 1 typ* zwykły wskaźnik odczyt i zapis TAK 2 const typ* wskaźnik na stałą tylko odczyt TAK 3 typ* const stały wskaźnik odczyt i zapis NIE 4 const typ* const stały wskaźnik na stałą tylko odczyt NIE
Referencja Teraz już wiesz czemu ten dziwny znaczek
Ćwiczenia 1. Zadeklaruj wskaźnik na typ całkowity. Spróbuj go przypisać tak, aby wskazywał na typ double. 2. Zadeklaruj poprawny wskaźnik, sprawdź czy wyłuskuje wskazywaną wartość. Sprawdź jakie operatory działają na wskaźnikach (dodaj wskaźniki, odejmij, dodaj/odejmij stałą wartość liczbową, pomnóż, itp.) 3. Czy jest możliwe zadeklarowanie takiego uniwersalnego wskaźnika na cokolwiek?
Wskaźnik uniwersalny Deklaracja wskaźnika uniwersalnego jest następująca: void *nazwa; W deklaracji takiego wskaźnika nie podajemy typu na jaki będzie on wskazywał. Pozwala nam to przypisać obiekt każdego typu. Niemożliwe jest wówczas wykorzystanie operatorów wyłuskania * oraz -> bez odwoływania się do rzutowania, bo kompilator nie wie nic o typie wartości przechowywanej pod adresem wskazywanym przez wskaźnik uniwersalny. Programista jest odpowiedzialny za kontrolę typów!
Wskaźniki a struktury Przy strukturach operator wyłuskania -> działa podobnie jak operator wyłuskania *, natomiast jest po prostu wygodniejszy i szybszy. Po co więc nawiasy w linii 7? Nie lepiej *wsk.dzien = 5? Operator -> pozwala również wywołać metodę w strukturze: int x = wsk->getdzien(); //równoważne (*wsk).getdzien();
Wskaźniki a funkcje Wskaźnik na funkcję różni się od zwykłego wskaźnika budową i faktem, że adres wskaźnika oznacza miejsce w pamięci w którym rozpoczyna się kod funkcji. Wskaźnik taki deklaruje się następująco: <typ> (*nazwa)( <parametry_funkcji> ); Nie ma uniwersalnego wskaźnika na funkcję!
Wskaźniki a tablice Nazwa tablicy to wskaźnik, na blok elementów z których składa się tablica. W C++ podobnie jak w C można stosować arytmetykę wskaźników (do wskaźnika dodawać i odejmować liczby całkowite). Kompilator sam pomnoży dodawaną liczbę przez rozmiar typu wskaźnika aby dodać do adresu odpowiednią ilość bajtów.
Nazwa tablicy a wskaźnik na jej początek
Wskaźnik to nie tablica!
Dynamiczny przydział pamięci Sterta wydzielony obszar wolnej pamięci kontrolowany ręcznie przez programistę, przeznaczony do przechowywania danych dynamicznych.
Dynamicznie tworzone tablice
Dynamiczne tablice dwuwymiarowe Zapis typ_zmiennej *tablica=new typ_zmiennej[x][y]; Nie stworzy tablicy dwuwymiarowej. Trzeba inczej:
Ćwiczenia 1. Używając dynamicznego przydziału pamięci, stwórz dwuwymiarową tablicę, której rozmiar wierszy będzie zależy od ilości liczb wprowadzonych przez użytkownika. Następnie wyświetl tablicę wylicz sumę liczb w pierwszej kolumnie tablicy. Przykład:
Ćwiczenia Korzystając z następującej struktury (symbolizującej element stosu): Zaimplementuj podstawowe operacje stosowe: Położenie elementu na wierzchołku stosu void push (elem* &stos, int x) Położenie ostatnio odłożonego elementu i zwrócenie go jako wartości funkcji int pop(elem* &stos) Zwrócenie elementu znajdującego się na wierzchołku stosu bez jego usuwania int topel(elem *stos) Sprawdzenie czy stos jest pusty bool isempty(elem *stos)