INFORMATYKA Z MERMIDONEM Programowanie Moduł 5 / Notatki Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego. Realizator projektu: Opracowano w ramach projektu Nowa Era Informatyki www.mermidon.edu.pl 2 .edu.pl Moduł 5. Tablice jedno i dwuwymiarowe Notatki do wszystkich części TWORZENIE TABLICY JEDNOWYMIAROWEJ Tablicę tworzymy poprzez zdefiniowanie typu zmiennych, które będą przechowywane w tablicy, jej nazwy i ilości elementów: typ_zmiennej nazwa_tablicy [liczba elementów] np.: int mojaTablica[7]; char tab[20]; Tablicę możemy wypełnić w chwili deklaracji. Tego sposobu używamy, gdy wiemy, co dokładnie będziemy chcieli przechowywać w tablicy. int dniMesiaca[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} int imie[6] = {'m', 'i', 'c', 'h', 'a', 'l'}; OPERACJE NA TABLICY JEDNOWYMIAROWEJ Do operowania na tablicy np. do wypisywania zawartości używamy pętli. Pętle pozwalają na przechodzenie od pierwszego elementu do ostatniego. int tablica[100]; for (int a = 0; a < 100; a++) { cout << tablica[a] << " "; } Tablice indeksowane są od zera, pierwszy element ma indeks zero (nie jeden): tablica[0] – pierwszy element tablica[1] – drugi element tablica[99] – setny element – ostatni element w tablicy Zadanie: Rozważmy napisanie programu, który pobierze z klawiatury n liczb, umieści je w tablicy a następnie wyświetli. Program powinien wczytać liczbę „n” mówiącą ile liczb będziemy wczytywać a następnie je pobrać, zapisać i wypisać. 3 .edu.pl Rozwiązanie: Tworzymy tablicę np. 100 elementową („n” w tym przypadku jest w przedziale od 1 do 100). Pobieramy z klawiatury liczbę „n”. W pętli od zera do „n” pobieramy kolejne liczby i umieszczamy je w tablicy. W kolejnej pętli od zera do „n” pobieramy kolejne elementy z tablicy i wypisujemy je na ekran. Fragment kodu źródłowego, którego możemy użyć do pobierania zmiennej ilości danych z klawiatury: int tablica[1000]; – rezerwujemy miejsce, nie koniecznie musimy całe użyć int wielkosc; cin >> wielkosc; – wczytujemy ile liczb będziemy wczytywać (ile liczb oczekujemy) for (int a = 0; a < wielkosc; a++) – pętla od zera do „n” { cin >> tablica[a]; } TWORZENIE TABLICY DWUWYMIAROWEJ Tablice dwuwymiarowe tworzymy poprzez określenie typu tablicy, jej nazwy oraz dwóch wymiarów (ilości wierszy i kolumn): typ_zmiennej nazwa_tablicy [wymiar1][wymiar2]; np.: int tablica[10][10]; Tak jak w przypadku tablicy jednowymiarowej, dwuwymiarową również możemy wypełnić w chwili tworzenia. int tablica[3][2] = {{1,2}, {3,4}, {5,6}}; OPERACJE NA TABLICY DWUWYMIAROWEJ Do operowania na tablicy dwuwymiarowej używamy dwóch pętli. Jedna jest odpowiedzialna za iterowanie (przechodzenie) po wierszach a druga po kolumnach. Jedna jest zagnieżdżona w drugiej, – czyli na jeden obrót pierwszej pętli, druga zagnieżdżona przechodzi przez wszystkie elementy. 4 .edu.pl int tablica[100][50]; for (int w = 0; w < 100; w++) – iterujemy po wierszach { for (int k = 0; k < 100; k++) – iterujemy po kolumnach { cout << tablica[w][k] << " "; } cout << endl; – po wypisaniu wiersza z tablicy, przechodzimy do nowej linii } LICZBY PIERWSZE Liczbą pierwszą jest liczba naturalna, która ma dokładnie dwa różne dzielniki naturalne i są nimi: jeden, ona sama. Kolejne liczby pierwsze: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, itd. Zadanie: Rozważmy napisanie programu, który sprawdzi czy podana z klawiatury liczba jest liczbą pierwszą. Rozwiązanie: Pobieramy z klawiatury liczbę. W pętli od 2 do „n” sprawdzamy czy któraś liczba dzieli „n” bez reszty. Sprawdzamy, czy w poprzednim kroku znaleźliśmy dzielniki dla „n”, jeśli nie, to liczba „n” jest liczbą pierwszą. Fragmentu kodu źródłowego szukającego dzielników dla „n”: for(int a=2; a<n; a++) { if(n % a == 0) – dzielenie modulo { //znaleźliśmy dzielnik } } 5 .edu.pl LICZBY DOSKONAŁE Liczbą doskonałą jest liczba naturalna taka, że suma jej naturalnych dzielników jest równa jej samej. 6=1+2+3 Kolejne liczby doskonałe: 6, 28, 496, 8128, 33550336, 8589869056 Zadanie: Rozważmy napisanie programu, który sprawdzi czy podana z klawiatury liczba jest liczbą doskonałą. Rozwiązanie: Pobieramy z klawiatury liczbę, którą będziemy sprawdzać. Tworzymy tablicę o wielkości 100 (nie musimy całej wykorzystywać), w której będziemy trzymać dzielniki . W pętli od 1 do „n” sprawdzamy czy któraś liczba dzieli „n” bez reszty, jeśli tak, liczbę zapisujemy w tablicy z kroku poprzedniego. W kolejnej pętli od 1 do k, (gdzie k jest liczbą mówiącą ile znaleźliśmy dzielników) wykonujemy sumowanie. Sprawdzamy czy suma dzielników równa się wczytanej liczbie, jeśli tak to znaleźliśmy liczbę doskonałą. LICZBY BLIŹNIACZE Liczbami bliźniaczymi są liczby pierwsze, różniące się między sobą o 2. Przykład: 3 5, 5 7, 11 13, 17 19. Zadanie: Rozważmy napisanie programu, który wypisze wszystkie liczby bliźniacze w zbiorze od 1 do „n”. Rozwiązanie: Rozwiązań problemu jest co najmniej kilka: Możemy szukać liczb bliźniaczych w tablicy z wartościami od 1 do n, przeszukując komórki leżące w odległości dwóch indeksów od siebie. Możemy przygotować sobie tablicę liczb pierwszych i to w niej szukać liczb bliźniaczych, porównując komórki leżące obok siebie. 6 .edu.pl Tworzymy tablicę, w której będziemy poszukiwali liczb bliźniaczych (np. 100 elementową). W pętli od 0 do 100 wpisujemy wartości poszczególnym komórkom w tablicy (dla indeksu 0, wpisujemy wartość 1, itd.). Tworzymy nową tablicę, do której przepiszemy liczby pierwsze. W pętli od 0 do 100 sprawdzamy główną tablicę czy znajdują się w niej liczby pierwsze, jeśli takową znajdziemy, przepisujemy do tablicy z liczbami pierwszymi. W pętli od 1 do ilości liczb pierwszych w tablicy, porównujemy pola obok siebie, dany element jest porównywalny z poprzednim. Jeśli różnica między nimi wynosi 2, oznacza to ze znaleźliśmy parę liczb bliźniaczych. LICZBY CZWORACZE Liczbami czworaczymi są liczby pierwsze, które można zapisać w postaci: p, p+2, p+6, p+8 np.: 5, 7, 11, 13 821, 823, 827, 829 Zadanie: Rozważmy napisanie programu, który wypisze wszystkie liczby czworacze w zbiorze od 1 do „n”. Rozwiązanie: Tworzymy tablicę, w której będziemy szukać liczb czworaczych (np. 100 elementową). W pętli od 0 do 100 wpisujemy wartości poszczególnym komórkom w tablicy (dla indeksu 0, wpisujemy wartość 1, itd.). Tworzymy nową tablicę, do której przepiszemy liczby pierwsze. W pętli od 0 do 100 sprawdzamy główną tablicę czy znajdują się w niej liczby pierwsze, jeśli takową znajdziemy, przepisujemy do tablicy z liczbami pierwszymi. W pętli będziemy sprawdzać czy znaleźliśmy liczby czworacze. W pętli będziemy przechodzić od 1 do „n” – 8. Pobierzemy pierwszy element z tablicy, sprawdzimy czy jest liczbą pierwszą, jeśli tak, sprawdzimy czy następny element w tablicy liczb pierwszych jest równy p+2, kolejny p+6 i jeszcze jeden p+8. Sprawdzamy czy wszystkie liczby (p, p+2, p+6, p+8) są liczbami pierwszymi. Jeśli tak, znaleźliśmy liczby czworacze. 7 .edu.pl LICZBY GERMAIN Liczbą Germain jest liczbą pierwszą, dla której 2·p+1 również jest liczbą pierwszą. Kolejne liczby Germain: 2, 3, 5, 11, 23, 29, 41, 53, 83 sprawdźmy: 2·2+1=5 2·3+1=7 Zadanie: Rozważmy napisanie programu, który sprawdzi czy liczba wczytana z klawiatury jest liczbą Germain. Rozwiązanie: Pobieramy liczbę z klawiatury. Sprawdzamy czy wczytana liczba jest liczbą pierwszą. Jeśli tak, podstawiamy wartość do wzoru. Sprawdzamy czy wartość wyrażenia również jest liczbą pierwszą. ROZKŁAD LICZBY NA CZYNNIKI PIERWSZE Rozkład liczby na czynniki pierwsze polega na zapisaniu jej jako iloczynu liczb pierwszych. np.: 14 = 2 · 7 15 = 3 · 5 Każda liczba naturalna większa od jeden jest albo liczbą pierwszą albo iloczynem liczb pierwszych (liczbą złożoną). Zadanie: Rozważmy napisanie programu, który rozłoży liczbę na czynniki pierwsze Rozwiązanie: Pobieramy liczbę z klawiatury, którą chcemy rozłożyć, niech nią będzie liczba „k”. Tworzymy tablicę, w której będziemy przechowywać czynniki pierwsze. W pętli dzielimy liczbę „k” przez liczbę „p” i sprawdzamy czy otrzymaliśmy resztę z dzielenia czy nie. Jeśli nie ma reszty, oznacza to, że znaleźliśmy czynnik pierwszy, więc przepisujemy go 8 .edu.pl do odpowiedniej tablicy na liczby pierwsze. Kroki powtarzamy. W następnym obiegu pętli liczbą „k” będzie równa „k”/„p”. Jeśli w pętli z poprzedniego kroku podczas dzielenia otrzymamy resztę z dzielenia to powiększamy liczbę „p” i krok powtarzamy. Rozkład liczby 90 na czynniki pierwsze: 90 | 2 = 45 45 | 3 = 15 15 | 3 = 5 5|5 = 1 1 Czynnikami pierwszymi są 2, 3, 3, 5. 9 .edu.pl