====== Od C do C++ ======
===== Powtórka z C =====
* typy
* operatory
* instrukcje sterujące
* wskaźniki
* dynamiczny przydział pamięci
* struktury
* pliki nagłówkowe i źródłowe
* różnice między C a C%%++%%
===== Ćwiczenia =====
==== Losowanie Lotto ====
Zaimplementuj program w C (potem przerobimy go na C%%++%%) realizujący losowanie ''k'' liczb z ''n'' bez zwracania zgodnie z ponizszym schematem.
Utwórz plik nagłówkowy **beben.h** z poniższą zawartością:
struct beben
{
int rozmiar;
int *kule;
char* opis;
};
struct beben *utworz(int n);
struct beben *wypelnij(struct beben *b);
struct beben *mieszaj(struct beben *b);
void wypisz(struct beben *b, int n);
void zwolnij(struct beben *b);
Funkcje powinny realizować:
* ''utworz'' - tworzy bęben mieszczący ''n'' kul i ustawia opis na ''"Beben stworzony"''
* ''wypelnij'' - wypełnia bęben kulami od 1 do ''n'' i ustawia opis na ''"Beben gotowy do losowania"''
* ''mieszaj'' - miesza zawartość bębna i ustawia opis na ''"Zawartosc wymieszana"''
* ''wypisz'' - wypisuje ''opis'' oraz numery pierwszych ''n'' kul
* ''zwolnij'' - niszczy bęben,
Zdefiniuj powyższe funkcje w pliku źródłowym ''beben.c''.
W osobnym pliku źródłowym ''program.cpp'' napisz program, który korzystając z tych funkcji przeprowadzi losowanie wykonując nastepujace kroki:
- Użytkownik podaje wartości ''k'', ''n''
- Tworzony jest bęben losujący mieszczący ''n'' kul (tablica liczb całkowitych o rozmiarze ''n'')
- Wypełniamy bęben kulami ponumerowanymi od 1 do ''n''
- Mieszamy losowo zawartość
- Podajemy numery ''k'' pierwszych kul
Przydatne funkcje:
* **stdlib.h** : **[[https://en.cppreference.com/w/c/numeric/random/rand|rand]]**, **[[https://en.cppreference.com/w/c/numeric/random/srand|srand]]**, **[[https://en.cppreference.com/w/c/memory/malloc|malloc]]**, **[[https://en.cppreference.com/w/c/memory/free|free]]**
* **time.h** : **[[https://en.cppreference.com/w/c/chrono/time|time]]**
===== Zadanie 1: Od C do C++ =====
Wyeliminuj z programu losującego elementy języka C na rzecz mechanizmów wykorzystywanych w C%%++%%
* Zamień rozszerzenia nazw plików źródłowych z ''*.c'' na ''*.cpp''
* Struktura w C%%++%% jest klasą, usuń zbędne słowo kluczowe ''struct'' przy deklaracjach zmiennych typu ''beben'' lub uczyń typ reprezentujący bęben klasą
* Zamień wywołania funkcji ''malloc()'' i ''free()'' na wywołania operatorów ''new'' i ''delete'' ([[https://pl.wikibooks.org/wiki/C%2B%2B/Zarz%C4%85dzanie_pami%C4%99ci%C4%85|Zarządzanie pamięcią]])
* Użyj strumieni ''std::cin'' i ''std::cout'' z biblioteki ''[[http://www.cplusplus.com/reference/iostream/|]]'' do wczytywania danych i wyświetlania komunikatów ([[https://pl.wikibooks.org/wiki/C%2B%2B/Strumienie|Strumienie]])
* Wykorzystaj obiekt typu ''[[http://www.cplusplus.com/reference/string/string/|]]'' zamiast tablic ''char*'' do reprezentowania napisów
* Jeżeli wykorzystujesz nadal którąkolwiek funkcję z biblioteki standardowej C zastąp ją odpowiednikiem ze [[http://www.cplusplus.com/reference/|standardowej biblioteki C++]]. Np. w C%%++%%11 dostępna jest funkcja [[https://en.cppreference.com/w/cpp/algorithm/random_shuffle|std::random_shuffle]].
* Użyj referencji zamiast wskaźników tam gdzie uznasz to za stosowane ([[https://pl.wikibooks.org/wiki/C%2B%2B/Referencje|Referencje]])
* Dla C%%++%%11 użyj specyfikatora ''auto'' przy deklaracji obiektów i zmiennych ([[https://pl.wikibooks.org/wiki/C%2B%2B/Zmienne#Dedukcja_typ%C3%B3w_-_auto_(C++11)|deklaracja typów auto]])
* Zamień deklarację struktury ''beben'' w klasę ''Beben'', zadbaj o hermetyzację obiektu (pola klasy ''Beben'' powinny być prywatne, a ewentualny dostęp do nich powinien być realizowany przez metody dostępowe (tzw. gettery i settery), zastąp funkcje ''utworz'', ''wypelnij'', ''mieszaj'', ''wypisz'', ''zwolnij'' metodami klasy ''Beben''.
Rozwiązanie w postaci plików nagłówkowych ''*.h'' i źródłowych ''*.cpp'' umieść w Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=282329|Zadanie 1]]