Temat C2. Wybrane struktury danych w językach C++ i Python

przez | 21 sierpnia 2020

Wszystkie treści na stronie ir.migra.pl chronione są prawami autorskimi. Więcej informacji znajdziesz tutaj.

Uwaga: Zapoznaj się wcześniej z tematami C2 (C++) lub C3 (Python) i C4 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I” albo z tematami 54 i 56 (C++) lub 66 i 68 (Python) z podręcznika „Informatyka 1-3. Podręcznik dla szkoły ponadpodstawowej. Zakres podstawowy”. Wykonaj zawarte tam ćwiczenia i zadania.

Zapisy podstawy programowej realizowane w temacie:

I. Rozumienie, analizowanie i rozwiązywanie problemów.

Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. do realizacji rozwiązania problemu dobiera odpowiednią metodę lub technikę algorytmiczną i struktury danych;

II. Programowanie i rozwiązywanie problemów z wykorzystaniem komputera i innych urządzeń cyfrowych.

Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów;

Spis treści

  1. Typy danych
    1. Typy danych w języku C++
    2. Typy danych w języku Python
  2. Sposoby wprowadzania danych i wyprowadzania wyników
    1. Formatowanie wyprowadzanych wyników w języku C++
    2. Formatowanie wyprowadzanych wyników w języku C++
  3. Dane losowe
    1. Dane losowe w języku C++
    2. Dane losowe w języku Python
  4. Sprawdzanie poprawności danych
    1. Sprawdzanie poprawności danych w języku C++
    2. Sprawdzanie poprawności danych w języku Python

1. Typy danych 

Typ danych określa zbiór wartości, które mogą przyjmować zmienna, wyrażenie lub stała, a format danych określa sposób prezentacji danych określonego typu na urządzeniach wejścia/wyjścia.

Prawie każdy język programowania daje możliwość tworzenia programów przetwarzających różnorodne dane: liczby, znaki, daty i struktury złożone, np. dane tekstowe teksty, tablice (C++), listy (Python).

W tworzonych przez nas wcześniej programach danymi były głównie liczby rzeczywiste i całkowite oraz znaki. W językach programowania typy te należą do prostych typów danych (w języku Python), zwanych też (w języku C++) podstawowymi typami danych.

Aby przechowywać ciągi znaków i wykonywać operacje na tekstach, stosowaliśmy typ tekstowy (łańcuchowy). Poznaliśmy też algorytmy wymagające przetwarzania wielu danych (np. liczb), co wymagało zastosowania tablic (C++), list (Python) lub typów tekstowych (łańcuchy). Typy te należą do typów złożonych (w języku C++ zwane również pochodnymi).

Wśród niektórych typów danych wyróżnia się ich szczegółowe podzbiory (jak pokazano w tabelach 2. i 4.).

1.1. Typy danych w języku C++

Podział typów danych w języku C++
typy proste porządkowe (m.in. całkowity, logiczny, znakowy)
rzeczywiste
typy złożone tablice
łańcuchy
struktury
unie
typ obiektowy  
Tabela 1. Typy danych w języku C++

W języku C++ deklaracja zmiennej określonego typu wiąże się z przydzieleniem jej odpowiedniego obszaru pamięci i wyznaczeniem adresu w pamięci komputera. Na przykład zmienna typu logicznego zajmuje 1 bajt pamięci komputera. Typ logiczny składa się tylko z dwóch elementów (false i true), które odpowiadają wartościom logicznym fałsz i prawda. W języku C++ typ logiczny nosi nazwę bool, a wartościom logicznym fałsz i prawda odpowiadają wartości false i true.

W tabeli 2. przedstawiono typy danych dla znaków, liczb całkowitych i rzeczywistych, dodając informację, ile bajtów pamięci zajmuje zmienna zadeklarowana jako konkretny typ. Standardowo w C++ przyjmuje się, w zmiennych typu całkowitego pamiętane są liczby ze znakiem (można to wymusić słowem kluczowym signed przed nazwą typu  – wymaganym w przypadku zmiennych char). Aby pamiętać liczby bez znaku, należy przed nazwą typu użyć słowa kluczowego unsigned.

Rodzaj typu Zajętość pamięci Zakres Nazwa typu
znakowy 1B znaki kodu ASCII char
2B lub 4B znaki kodu Unicode wchar_t
całkowity, ze znakiem 1B 〈-128; 127〉 signed char
2B 〈-32768; 32767〉 short
4B 〈-231; 231 – 1〉 int
8B 〈-263; 263 – 1〉 long long
całkowity, bez znaku 1B <0; 255〉 unsigned char
2B 〈0; 65535〉 unsigned short
4B 〈0; 232 – 1〉 unsigned int
8B 〈0; 264 – 1〉 unsigned long long
rzeczywisty 4B 〈-3,4 · 1038; 3,4 · 1038
7-8 cyfr znaczących
najmniejsze możliwe liczby bliskie zeru dające się przedstawić za pomocą typu float to
-1,18 · 10-38 i 1,18 · 1038
 
float
8B  〈-1,78 · 10308; 1,78 · 10308
15-16 cyfr znaczących
najmniejsze możliwe liczby bliskie zeru dające się przedstawić za pomocą typu double to
-2,23 · 10-308 i 2,23 · 10-308
 
double
16B 〈-1,19 · 104932; 1,19 · 104932
21 cyfr znaczących
najmniejsze możliwe liczby bliskie zeru dające się przedstawić za pomocą typu long double to
-3,36 · 10-4932 i 3,36 · 10-4932
 
long double
Tabela 2. Wybrane zbiory i podzbiory typów w języku C++

Uwaga: Wartości przedstawione w tabeli 2. są przykładowe, w rzeczywistości zależą od wykorzystywanego kompilatora.

Ćwiczenie 1. Określamy typy danych i wielkość pamięci zajmowanej przez zmienne

Do jakiego typu należą zmienne zadeklarowane w każdym z przypadków?

C++
  1. float a;
  2. int x[50];
  3. char c[21];
  4. char d;
  5. unsigned short k;

W języku C++ kompilator z góry wie, ile pamięci musi zarezerwować na zmienną danego typu. Wielkość określającą liczbę bajtów pamięci zajmowanych przez zmienną (lub typ zmiennej) można uzyskać w programie za pomocą operatora sizeof(), którego parametrem jest nazwa zmiennej lub typu, np. dla zmiennych z ćwiczenia 1:

sizeof(a)
sizeof(x)
sizeof(double)


Przykład 1. Stosowanie operatora sizeof()do określania liczby bajtów pamięci zajmowanych przez zmienne

C++

Ćwiczenie 2. Obliczamy i wyświetlamy wielkości pamięci zajmowane przez zmienne wybranych typów

  1. Otwórz plik TC1_c2_p1.cpp, w którym zapisano program z przykładu 1. Objaśnij poszczególne wiersze programu, m.in. podaj jakiego typu zmienne zadeklarowano.
  2. Uzupełnij program, aby obliczał i wypisywał wielkości pamięci zajmowanej przez zmienne typów określonych w tabeli 2.
  3. Zapisz plik pod tą samą nazwą.

Język C++ posiada również wbudowane funkcje pozwalające na uzyskanie najmniejszych i największych wartości dających się zapamiętać w zmiennej określonego typu (przy czym dla zmiennych rzeczywistych przez wartość najmniejszą należy rozumieć możliwie najmniejszą liczbę dodatnią bliską zeru).

C++
numeric_limits<T>::max() uzyskiwanie maksymalnej skończonej wartości reprezentowanej przez typ liczbowy T
numeric_limits<T>::min() uzyskiwanie minimalnej skończonej wartości reprezentowanej przez typ liczbowy T

Przykład 2. Uzyskiwanie najmniejszych i największych wartości dających się zapamiętać w zmiennej określonego typu

C++

Ćwiczenie 3. Obliczamy i wypisujemy minimalne i maksymalne wartości dające się zapamiętać w zmiennej

  1. Otwórz plik TC1_c3_p2.cpp, w którym zapisano program z przykładu 2. Objaśnij, co dzieje się w poszczególnych wierszach programu.
  2. Uzupełnij program, aby obliczał i wypisywał minimalne i maksymalne wartości dające się zapamiętać w zmiennej pozostałych typów podanych w tabeli 2. Porównaj otrzymane wyniki z wartościami umieszczonymi w tabeli 2.
  3. Zapisz plik pod tą samą nazwą.

1.2. Typy danych w języku Python

Podział typów danych w języku Python
typy proste logiczny
całkowity
rzeczywisty
typy złożone listy
łańcuchy
zbiory
słowniki
typ obiektowy  
Tabela 3. Wybrane typy danych w języku Python

W języku Python, podobnie jak w języku C++, każda zmienna jest przechowywana w pamięci i zajmuje w niej określone miejsce. Jednak to, ile miejsca zużywa każda zmienna, często zależy od konkretnej wartości tej zmiennej.

W typach reprezentujących liczby w języku Python nie występują znane z języka C++ warianty różniące się zakresem i możliwością użycia znaku.

Rodzaj typu Zajętość pamięci Zakres Nazwa typu Przykład
logiczny do 28B dwie (True oraz False) boolean a = True
całkowity od 24B ograniczony ilością pamięci dostępną dla programu int n = 100000
rzeczywisty 24B 〈-1,79769 · 10308; 1,79769 · 10308
do 15 cyfr znaczących
najmniejsze możliwe liczby bliskie zeru dające się przedstawić za pomocą typu float to
-2,23 · 10-308 i 2,23 · 10-308
float f = 0.0
g = 1252.0
g = 1e10
Tabela 4. Wybrane zbiory i podzbiory typów w języku Python

Uwaga: Zajętość pamięci wszystkich typów danych oraz zakres danych typu float mogą się różnić w zależności od komputera, na którym jest uruchamiany program.

Warto zauważyć, że obszar pamięci zajmowany przez zmienne w języku Python jest o wiele większy niż ten, który zajmowałyby podobne zmienne w języku C++. Jest to spowodowane tym, że nawet zmienne typów prostych są reprezentowane w pamięci jako obiekty. W praktyce nieczęsto spotyka się sytuacje, gdy wielkość pamięci jest mocno ograniczona i znacząco wpływa na kształt programu. W takich przypadkach trzeba zastanowić się, czy język Python jest najlepszym narzędziem do rozwiązania danego problemu albo użyć bardziej oszczędnych reprezentacji zdefiniowanych w specjalnych bibliotekach dla języka Python.

Ćwiczenie 4. Określamy typy danych i wielkość pamięci zajmowanej przez zmienne

Do jakiego typu należą zmienne zadeklarowane w każdym z przypadków?

  1. a = 1.123
  2. liczby = [10, 20]
  3. n = -6439
  4. flaga = False
  5. b = 5.4574e20

Wielkość pamięci zajmowanej przez dany typ prosty można dokładnie sprawdzić, używając funkcji getsizeof() z modułu sys. Zwraca ona liczbę użytych bajtów.

Funkcja getsizeof() zwraca również całkowity rozmiar pamięci użyty dla łańcuchów znaków, jednak dla innych złożonych typów i obiektów funkcja nie uwzględni obiektów, do których odwołuje się dana zmienna. Przykładowo dla listy funkcja nie uwzględni pamięci zużytej przez jej elementy. Aby sprawdzić jakiego typu jest dana zmienna, można użyć wbudowanej funkcji type().

Przykład 3. Zastosowanie funkcji getsizeof() i type()

Ćwiczenie 5. Obliczamy i wyświetlamy wielkości pamięci zajmowane przez zmienne wybranych typów

  1. Otwórz plik TC1_c5_p3.py, w którym zapisano program z przykładu 3. Objaśnij, co dzieje się w poszczególnych wierszach programu.
  2. Zmień program tak, aby sprawdzał typ i miejsce zajęte przez bardzo długi napis.
  3. Zapisz plik pod tą samą nazwą, uruchom i wyjaśnij rezultat działania programu.

2. Sposoby wprowadzania danych i wyprowadzania wyników

Wykonując ćwiczenia dotyczące tworzenia i uruchamiania programów w językach C++ i Python, dane do programów wprowadzaliśmy z klawiatury, a wyprowadzaliśmy na monitor. Czasem jednak wygodniej jest, jeśli program korzysta z danych generowanych losowo lub też wczytuje je z przygotowanego wcześniej pliku.

Sposoby wprowadzania danych:

  • wprowadzanie danych z klawiatury – obiekt cin (C++), funkcja input() (Python,
  • generowanie liczb losowo – funkcje rand()  i srand() (C++), funkcja … (Python),
  • wprowadzać dane z pliku (temat C9, część II Materiału edukacyjnego).

Sposoby wyprowadzania danych:

  • wyprowadzanie wyników działania programu na ekran monitora – obiekt cout (C++), funkcja printf() (C++), funkcja print() (Python),
  • wyprowadzać wyniki działania programu do pliku (temat C9, część II Materiału edukacyjnego).

2.1. Formatowanie wyprowadzanych wyników w języku C++

W języku C++:

  • Możliwe jest formatowanie danych wyprowadzanych za pomocą obiektu cout poprzez użycie różnego rodzaju poleceń, np. setprecision(dokładność), setiosflags(atrybut), setw(szerokość), setfill(znak-wypełnienia).
  • Do formatowania wyprowadzanych danych często wykorzystywana jest istniejącą już w języku C funkcja printf(format, dana1, dana2, ..., danaN), gdzie format to łańcuch określający sposób formatowania, a dana1, dana2, …, danaN to kolejne dane podlegające formatowaniu.
Symbol formatowaniaZnaczenie
\nprzejście do nowego wiersza
\tznak tabulacji
%dwyprowadzenie wartości całkowitej w postaci dziesiętnej
%xwyprowadzenie wartości całkowitej w postaci szesnastkowej
%ewyprowadzenie wartości zmiennoprzecinkowej w notacji naukowej
%ewyprowadzenie wartości zmiennoprzecinkowej w postaci ułamka dziesiętnego
%cwyprowadzenie znaku
%swyprowadzenie ciągu znaków
%%wyprowadzenie znaku „%”
Tabela 5. Wybrane elementy formatowania wykorzystywane przez funkcję printf()

Uwaga: Szczegółowy opis funkcji printf() i wszystkich wykorzystywanych w niej specyfikacji formatu można znaleźć w dowolnym podręczniku do języka C.

Przykład 5. Wyprowadzanie wartości za pomocą funkcji printf() w języku C++

C++

Ćwiczenie 6. Analizujemy gotowy program

  1. Otwórz plik TC1_c6_p5.cpp. Uruchom program.
  2. Objaśnij sposób formatowania poszczególnych wyników.

2.2. Formatowanie wyprowadzanych wyników w języku Python

W języku Python najprostszym sposobem formatowania jest użycie funkcji print() z wieloma argumentami podobnie, jak zostało to pokazane w przykładzie 3. W takim przypadku na ekran zostanie wyprowadzony każdy z podanych argumentów rozdzielonych separatorem, który domyślnie jest znakiem spacji.

Przy definiowaniu ciągów znaków można, podobnie jak w języku C++, używać \n i \t jako reprezentacje znaków nowej linii i tabulacji.

Przy użyciu funkcji print() w języku Python nie ma potrzeby dodawać znaku nowej linii na końcu napisu. Ta funkcja automatycznie przechodzi do nowej linii po wyprowadzeniu napisu na ekran.

Do zaawansowanego formatowania w języku Python używa się mechanizmu f-łańcuchów (ang. f-string), który został zastosowany w przykładzie 6.

Przykład 6. Wyprowadzanie wartości za pomocą funkcji print() i f-łańcuchów w języku Python

Ćwiczenie 7. Analizujemy gotowy program

  1. Otwórz plik TC1_c7_p6.py. Uruchom program.
  2. Objaśnij sposób formatowania poszczególnych wyników.

3. Dane losowe

W wielu zastosowaniach (np. szyfrowanie, symulacje, gry komputerowe, grafika komputerowa) konieczne jest wprowadzenie do programu elementu przypadkowości. Wówczas wygodniej jest, jeśli program korzysta z danych generowanych losowo lub też wczytuje je z przygotowanego wcześniej pliku.

Większość języków programowania posiada generatory liczb pseudolosowych, umożliwiające wybieranie „przypadkowych” liczb. Przypadkowość jest tu pojęciem umownym, ponieważ tak naprawdę liczby te tworzone są według z góry ustalonego schematu.

3.1. Dane losowe w języku C++

W języku C++ do losowania liczb służą funkcje rand() i srand().
Funkcja rand() generuje i zwraca liczbę całkowitą z przedziału 〈0; RAND_MAX〉.
Aby uzyskać liczbę z zadanego przedziału lewostronnie domkniętego 〈0; n), należy obliczyć resztę z dzielenia wartości uzyskanej za pomocą funkcji rand() przez n.

Przykład 7. Symulacja rzutów sześcienną kostką do gry w języku C++

C++

Uruchamiając program kilka razy pod rząd, zauważymy, że za każdym razem są losowane te same liczby. Nie jest to jednak błąd programistyczny, lecz specyfika generowania liczb losowych. Polega ona na tym, że przy każdym uruchomieniu programu generator liczb pseudolosowych startuje „od początku”, dając w efekcie te same wartości. Aby wyeliminować ten problem, należy przed pierwszym wywołaniem funkcji rand() użyć funkcji srand() z parametrem odpowiadającym aktualnemu czasowi: srand(time(NULL)). Wówczas generator liczb pseudolosowych będzie inicjalizowany aktualnym czasem systemowym.

Ćwiczenie 8. Stosujemy dane losowe w języku C++

  1. Otwórz plik TC1_c8_p7.cpp. Uruchom kilkukrotnie program. Sprawdź otrzymane każdorazowo wyniki.
  2. Zmodyfikuj program tak, by eksperyment za każdym razem dawał inne rezultaty. Uruchom kilkukrotnie zmodyfikowany program.
  3. Zapisz plik pod nazwą TC1_c8_kostka.cpp .
  4. Wskazówka: Dołącz do programu bibliotekę ctime, które zawiera funkcje time():
    #include <ctime>

3.2. Dane losowe w języku Python

W języku Python liczby losowe generuje funkcja randint().
Na przykład randint(1, 100) – wygeneruje losowo liczbę naturalną z przedziału (1, 100〉.
Na początku programu musimy zaimportować moduł, w którym zdefiniowano funkcję randint():
from random import randint
Aby uzyskać liczbę z zadanego przedziału lewostronnie domkniętego 〈0; n), należy obliczyć resztę z dzielenia wartości uzyskanej za pomocą funkcji randint() przez n.

Przykład 8. Symulacja rzutów sześcienną kostką do gry w języku Python

W języku Python funkcja randint() przyjmuje dwa argumenty, pierwszy to początek przedziału liczb wynikowych, a drugi to jego koniec. Przedział jest obustronnie domknięty.

Stosując bezpośrednio funkcję randint(), używamy generatora liczb pseudolosowych, który jest zainicjalizowany aktualnym czasem, więc przy kolejnych uruchomieniach programu wyniki będą różne.

Aby powtórzyć tę samą sekwencję losowań, należy samodzielnie zainicjalizować generator liczb pseudolosowych i wywoływać funkcję randint() tak, jak w programie poniżej.

Uwaga: Aby inicjalizować generator, czasem wystarczy usunąć argumenty i zamiast:
r = Random(10) napisać r = Random().

Ćwiczenie 9. Stosujemy dane losowe w języku Python

  1. Otwórz plik TC1_c9_p8.py. Uruchom kilkukrotnie program. Sprawdź otrzymane każdorazowo wyniki.
  2. Zmodyfikuj program tak, by eksperyment za każdym razem dawał takie same rezultaty. Uruchom kilkukrotnie zmodyfikowany program.
  3. Zapisz plik pod nazwą TC1_c9_kostka.py.

4. Sprawdzanie poprawności danych

Niezmiernie istotnym zagadnieniem jest sprawdzanie poprawności danych wprowadzanych do programu. Dzięki temu jesteśmy zabezpieczeni przed niespodziewanym przerwaniem pracy programu oraz zapewniamy zgodność danych wejściowych ze specyfikacją zadania.

4.1. Sprawdzanie poprawności danych w języku C++

Ćwiczenie 10. Analizujemy gotowe rozwiązanie

  1. Otwórz plik TC1_c10.cpp. Zapisano w nim program pokazany na rysunku 1.
  2. Uruchom program. Gdy program będzie czekał na wprowadzenie wartości zmiennej x, wpisz dowolny ciąg znaków, który nie jest liczbą całkowitą. Zaobserwuj i skomentuj efekty.
C++
Rys. 1. Program w języku C++ do ćwiczenia 10.

W języku C++ po podaniu jako wartości zmiennej ciągu znaków innego niż liczba całkowita wykonanie programu nie ulega przerwaniu, jednak program wprowadzony ciąg traktuje jako liczbę 0. W tej sytuacji nie ma możliwości rozróżnienia, czy wprowadzona została błędna dana wejściowa, czy też rzeczywiście liczba 0. Rozwiązaniem tego problemu jest wczytanie danej wejściowej do zmiennej łańcuchowej, a następnie jej zamiana na liczbę przy użyciu jednej z funkcji standardowych: strtol(), strtoul(), strtof() lub strtod().

Pełne wykorzystanie tych funkcji wymaga użycia tzw. zmiennych wskaźnikowych (temat C10, część II Materiału edukacyjnego).

Przykład 9. Sprawdzanie poprawności danych liczbowych (całkowitych i rzeczywistych) w języku C++

W przykładzie zdefiniowano funkcje strtoint() i strtofloat(), które zamieniają ciąg tekstowy podany jako pierwszy parametr na liczbę i zapisują ją w zmiennej przekazanej jako drugi parametr (mamy tu do czynienia z przekazywaniem parametru przez referencję). Wynikiem działania funkcji jest wartość logiczna true (jeżeli przekazany parametr jest prawidłową liczbą) lub wartość logiczna false – w przeciwnym przypadku.

C++

Ćwiczenie 11. Sprawdzamy poprawność danych w języku C++

  1. Napisz program obliczający pola powierzchni kwadratu i sześcianu dla długości boku wprowadzonej z klawiatury, przy czym program powinien sprawdzać, czy wprowadzona dana jest poprawną liczbą całkowitą i wypisywać stosowny komunikat, jeżeli tak nie jest. Zastosuj jedną z funkcji zapisaną w pliku TC1_c11_p9.cpp.
  2. Zapisz plik pod nazwą TC1_c11_pola.cpp.

4.2. Sprawdzanie poprawności danych w języku Python

Ćwiczenie 12. Analizujemy gotowe rozwiązanie

  1. Otwórz plik TC1_c12.py. Zapisano w nim program pokazany na rysunku 2.
  2. Uruchom program. Gdy program będzie czekał na wprowadzenie wartości zmiennej x, wpisz dowolny ciąg znaków, który nie jest liczbą całkowitą. Zaobserwuj i skomentuj efekty.
Rys. 2. Program w języku Python do ćwiczenia 12.

W języku Python po podaniu jako wartości zmiennej ciągu znaków innego niż liczba całkowita wykonanie programu zostanie przerwane i na ekranie zostanie wypisany komunikat błędu. Aby tego uniknąć, powinniśmy w jakiś sposób sprawdzić ciąg znaków, będący wynikiem funkcji input() zanim zostanie on przekazany do funkcji int(). Najlepiej jest to zrobić, używając funkcji sprawdzającej, czy w podanym ciągu znaków znajdują się wyłącznie cyfry i opcjonalnie znak minus na pierwszym miejscu.

Przykład 10. Sprawdzanie poprawności danych liczbowych całkowitych w języku Python

Funkcja czy_liczba() zwraca wartość True, gdy podany napis zawiera wyłącznie cyfry lub znak „-” na pierwszym miejscu i cyfry. W tym celu używa metody isnumeric(), która jest zdefiniowana dla ciągów znaków. Zwraca on True, gdy wszystkie znaki w napisie są cyframi.

Ćwiczenie 13. Sprawdzamy poprawność danych w języku Python

  1. Napisz program obliczający pole kwadratu i sześcianu dla długości boku wprowadzonej z klawiatury, przy czym program powinien sprawdzać, czy wprowadzona dana jest poprawną liczbą całkowitą i wypisywać stosowny komunikat, jeżeli tak nie jest. Zastosuj funkcję zapisaną w pliku TC1_c13_p10.py.
  2. Zapisz plik pod nazwą TC1_c13_pola.py.

Zadania

  1. Oblicz wielkość pamięci zajmowanej przez następujące zmienne:
    C++
    1. char s1[21];
    2. char t1[101][21];
    3. float t2[51];
    4. long t3[11][11][11];
    1. a = 1.123
    2. liczby = [10, 20]
    3. napis = "To jest jakiś napis"
    4. n = -6439
    5. flaga = False
    6. b = 5.4574e20
  2. Otwórz wybrany plik własnego programu i omów, jakie typy zmiennych w nim zastosowano. Czy potrafisz powiedzieć, ile zajmują miejsca w pamięci?
  3. Napisz program wyświetlający na ekranie pierwiastki kwadratowe z liczb od 1 do 100, w ten sposób, by w każdym wierszu znalazła się liczba i jej pierwiastek (np. „Pierwiastek z 1 = 1.000”). Pierwiastki powinny być wypisane z dokładnością do trzech miejsc po przecinku. Wyrównaj liczby do prawej strony. Zapisz program w pliku pod nazwą TC1_z3_pierwiastki.
  4. Napisz w języku C++ funkcje strtoint_range() i strtofloat_range() umożliwiające bezpieczne wprowadzenie danych typu int i float oraz sprawdzające, czy wprowadzone dane należą do przedziału obustronnie domkniętego (którego granice powinny być parametrami funkcji). Wykorzystaj funkcje strtoint() i strtofloat() z przykładu 8. Zadbaj o właściwą postać parametrów i wyników funkcji.
  5. Napisz program symulujący dziesięciokrotny rzut dwiema sześciennymi kostkami do gry i wypisujący sumy wyrzuconych oczek. Zapisz plik pod nazwą TC1_z5_dwie_kostki.cpp.
  6. Napisz funkcję losuj(m, n), zwracającą losową liczbę całkowitą z przedziału obustronnie domkniętego 〈m; n〉, gdzie m i n są liczbami całkowitymi.
  7. Napisz program losujący 6 liczb z przedziału 〈1; 49〉. Użyj funkcji losuj() z zadania 6. Napisz funkcję kostka(k, s), symulującą rzut k kostkami, każda o s ściankach. Kostki takie wykorzystywane są np. w grach RPG (z ang. Role Playing Games).
  8. Użyj funkcji rand() (w języku C++) lub randint() (w języku Python) do wypełnienia liczbami tablicy (listy) n liczb całkowitych (n zdefiniuj jako stałą). Wyprowadź zawartość tablicy (listy) po 10 liczb w wierszu ekranu. Posortuj zawartość tablicy (listy) i wyprowadź ponownie na ekran.
  9. Dla zainteresowanych
  10. Napisz program umożliwiający wprowadzenie daty w postaci trzech liczb, określających kolejno: rok, miesiąc i dzień. Program powinien odrzucać niepoprawne daty (np. 31 kwietnia) i w takim przypadku prosić użytkownika o ponowne wprowadzenie odpowiedniej wartości. Wykorzystaj funkcję strtoint_range() zdefiniowaną w zadaniu 4. Uwzględnij w programie lata przestępne. Jaka formuła określa przestępność roku?
  11. Zmodyfikuj program z zadania 7. tak, aby niemożliwe było wielokrotne wylosowanie tej samej liczby.
  12. Korzystając z funkcji kostka(k,s) utworzonej w zadaniu 5., zasymuluj wynik doświadczenia polegającego na tysiąckrotnym rzuceniu dwiema sześciennymi kostkami i zliczaniu, ile razy wypadną poszczególne sumy oczek. Przedstaw wyniki w postaci histogramu.