ZBIÓR ZADAŃ Z INFORMATYKI OPRACOWANY W RAMACH PROJEKTU „KOMPETENCJE KLUCZOWE DROGĄ DO KARIERY” WSPÓŁFINANSOWANEGO ZE ŚRODKÓW UNII EUROPEJSKIEJ W RAMACH EUROPEJSKIEGO FUNDUSZU SPOŁECZNEGO opracowany przez zespół z6i pod opieką mgr Jerzego Nowosielskiego BIAŁOGARD 2013 Spis treści. Spis treści ...................................................................................... 1 Wstęp ........................................................................................... 2 Sprawdzanie, czy tekst jest palindromem .................................... 3 Badanie, czy liczba jest liczbą pierwszą ........................................ 12 Algorytmy badające własności liczb ............................................. 16 1 WSTĘP Zbiór zadań z informatyki zawiera zadania maturalne z programowania, które wystąpiły podczas egzaminów maturalnych, jakie odbyły się w latach 2006 –2012. Mimo tego, że standardach wymagań egzaminacyjnych można znaleźć aż trzynaście algorytmów, które musi opanować maturzysta, dotychczasowe zadania dotyczyły jedynie trzech. Zadania zostały pogrupowane tematycznie i poprzedzone odpowiednim wprowadzeniem teoretycznym, przykładami, algorytmami zapisanymi w postaci listy kroków oraz schematu blokowego. Ponadto przedstawione zostały implementację w języku C++. Nauczyciele maturalnego zamieszczanych przygotowujący z w uczniów informatyki korzystają arkuszach maturalnych do z egzaminu materiałów CKE ponieważ dotychczas na polskim rynku wydawniczym nie ukazał się ani jeden zbiór zadań zawierający zadania o charakterze maturalnym. Dodatkowo ani CKE, ani OKE nie organizuje próbnych egzaminów co czyni niniejsze opracowanie szczególnie przydatnym. 2 I. Sprawdzanie, czy tekst jest palindromem. 1. Czym jest palindrom? Palindrom (z greckiego palindromeo, inaczej: anagram odwrotny) jest to wyraz, który tak samo brzmi czytany wspak (od końca). Palindromami są wyrazy: kajak, sedes, oko, mam, Ala, zaraz, zakaz itp. Współcześnie palindromy pełnią funkcję gry słownej. W każdym języku powstają setki całych zdań, a nawet wierszy będących palindromami. Angielski Do geese see God? — Czy gęsi widzą Boga? Devil lived - Diabeł żył. Rats live on no evil star. - Szczury nie żyją na żadnej złej gwieździe. Chiński (Mandaryński) 我爱妈妈,妈妈爱我- Ja kocham mamę, mama mnie kocha. Polski A to idiota! Jadzi w gębę gwizdaj. Kobyła ma mały bok. 3 Nam orła dał Roman? Ino gile Roman na moreli goni. Ile Roman ładny dyndał na moreli? Zakopane i nie na pokaz. Nowy Targ, góry, Zakopane - na pokazy róg, graty won! Najdłuższy na świecie palindrom liczy 33 tys. znaków. Umieścił go na swojej stronie Tadeusz Morawski. Palindromami mogą być liczby w danym systemie liczbowym, od najprostszych, dwucyfrowych, począwszy. Każdy palindrom liczbowy w systemie dziesiętnym złożony z parzystej liczby cyfr jest podzielny przez 11 (np. 279972:11=25452). 2. Algorytm w postaci listy kroków. Specyfikacja algorytmu: Dane wejściowe: ciąg znaków s Dane wyjściowe: komunikat „tak” lub „nie” w zależności od tego, czy ciąg znaków s jest palindromem, czy nie Zmienne pomocnicze: i, j – liczby naturalne Krok 1: Wczytaj ciąg znaków s. Krok 2: Zmiennej i przypisz wartość 1, a zmiennej j liczbę znaków ciągu s. Krok 3: Jeśli i jest większe niż lub równe j, wtedy wypisz 4 komunikat „tak” i zakończ działanie algorytmu. Krok 4: Jeśli s[i] jest różne od s[j], wypisz komunikat „nie” i zakończ działanie algorytmu. Krok 5: Powiększ zmienną i o 1, a zmienną j pomniejsz o 1. Krok 6: Przejdź do kroku 3. 3. Schemat blokowy algorytmu. NIE TAK TAK NIE 4. Program w języku C++. Implementacja algorytmu sprawdzającego, czy podany ciąg znaków jest palindromem w języku C++ mogłaby wyglądać następująco: 5 #include <iostream.h> using namespace std; int main() { char s[100]; cout << "Podaj ciag znakow: "; cin >> s; int i, j; i = 0; j = strlen(s)-1; while(i<j) { if(s[i]!=s[j]) { cout << "Wprowadzony ciag znakow nie jest palindromem\n"; exit(0); } i++; j--; } cout << "Wprowadzony ciag znakow jest palindromem\n"; cin.ignore(); getchar(); return 0; } 6 5. Zadania do samodzielnego rozwiązania. Zadanie 1. (CKE - matura podstawowa 2010) Palindromem nazywamy słowo, które czytane od lewej i od prawej strony jest takie samo. Na przykład palindromami są słowa: JABFDFBAJ HAJAHAJAH ABBA Słowo JANA nie jest palindromem. W pliku dane.txt umieszczono w kolejnych wierszach 1000 słów o długościach od 2 do 25 znaków, składających się z wielkich liter A, B, C, D, E, F, G, H, I, J. Napisz program, który przegląda słowa zapisane w pliku dane.txt i wypisuje te z nich, które są palindromami, po jednym w wierszu. Kolejność wypisywania palindromów powinna być taka sama jak w pliku z danymi. Wyniki zapisz w pliku zadanie4.txt. Zadanie 2. (CKE - matura rozszerzona 2006) W pliku dane.txt w oddzielnych wierszach znajdują się słowa o długości od 2 do 20 znaków, składające się z wielkich liter A, B, C, D, E i F. Palindromem nazywamy słowo, które czytane od lewej i od prawej daje to samo słowo. Na przykład słowa ABCDCBA i AEEFFEEA są palindromami. Napisz program, który policzy, ile jest 7 palindromów w pliku dane.txt. Ocenie będzie podlegać poprawność Twojego programu i metoda sprawdzania, czy dane słowo jest palindromem. Liczbę palindromów zapisz w pliku wyniki.txt. Zadanie 3. (CKE - matura rozszerzona 2008) Infobank oferuje swoim klientom internetowe konta osobiste. Do korzystania z tych kont potrzebna jest lista haseł jednorazowych. Jesteś pracownikiem Wydziału Bezpieczeństwa. Wydział ten zajmuje się tworzeniem dla klientów list haseł jednorazowych na podstawie słów wcześniej wygenerowanych przez Wydział Statystyk, według ustalonych przez bank algorytmów. Plik slowa.txt, zawiera 1000 słów o długościach nie większych niż 30 znaków. Każde słowo jest zapisane w osobnym wierszu i złożone jest z wielkich liter alfabetu angielskiego. a) Na początku swojej działalności bank stosował następującą metodę generowania haseł. Hasłami jednorazowymi są zapisane od końca słowa Wygenerowane przez Wydział Statystyk. Przykład. EGZAMIN – NIMAZGE KAJAK – KAJAK MATURA – ARUTAM 8 Dla danych z pliku slowa.txt utwórz listę haseł jednorazowych i umieść ją w pliku hasla_a.txt (każde hasło w osobnym wierszu). Dodatkowo w pliku slowa_a.txt podaj najdłuższe i najkrótsze hasła oraz ich długości. Metoda tworzenia haseł opisana w punkcie a) okazała się zawodna, dlatego Wydział Bezpieczeństwa postanowił zmienić algorytm. Palindrom to takie słowo, które czytane od lewej do prawej i od prawej do lewej jest takie same. Algorytm tworzenia hasła ze słowa w: wyznacz najdłuższe słowo w1 takie, że w1 jest początkiem słowa w oraz w1 jest palindromem oznaczmy w=w1w2 hasło powstaje przez złączenie dwóch słów: w2 zapisanego od prawej do lewej i w. Przykład. Słowo Najdłuższy palindrom rozpoczynający słowo Utworzone hasło KAJAK KAJAK KAJAK KAJAKARSTWO KAJAK OWTSRAKAJAKARSTWO KAKTUS KAK SUTKAKTUS Dla danych znajdujących się w pliku slowa.txt, utwórz listę haseł według nowego algorytmu. Utworzone hasła jednorazowe umieść w pliku hasla_b.txt (każde hasło w osobnym wierszu). 9 Dodatkowo odpowiedzi do poniższych podpunktów umieść w pliku tekstowym slowa_b.txt. Odpowiedź do każdego podpunktu poprzedź cyfrą oznaczającą podpunkt. 1. Podaj wszystkie hasła o długości 12. 2. Podaj najdłuższe i najkrótsze hasło. 3. Podaj sumę długości wszystkich haseł. Zadanie 4. (CKE - matura podstawowa 2011) Informatyk z firmy „KompOK” zapisał w pliku hasla.txt 200 haseł. Każde hasło umieszczone jest w osobnym wierszu pliku. Hasło składa się tylko z małych liter alfabetu angielskiego, zaś jego długość wynosi od 3 do 10 znaków. Wykorzystując dane zawarte w tym pliku, wykonaj poniższe polecenia. Odpowiedzi do poszczególnych podpunktów zapisz w plikach tekstowych o nazwach wynik4a.txt, wynik4b.txt. a) W pliku wynik4a.txt podaj, ile haseł ma parzystą, a ile nieparzystą liczbę znaków. b) W pliku wynik4b.txt utwórz zestawienie haseł (po jednym w wierszu), które są palindromami. Palindrom to wyraz brzmiący tak samo przy czytaniu z lewej strony do prawej, jak i odwrotnie, np. kajak, potop. Rozwiązanie: #include <iostream> #include <fstream> 10 using namespace std; int main(){ int i,j,p=0,n=0; char slowo[25]; fstream plik; plik.open("hasla.txt"); while (!plik.eof()) { bool palindrom=true; plik >> slowo; i = 0; j = strlen(slowo)-1; if (strlen(slowo)%2==0) p++; else n++; while(i<j) { if(slowo[i]!=slowo[j]) { i=j+1; palindrom=false; } i++; j--; } if (palindrom==true) cout << slowo << endl; } plik.close(); cout << "Hasel znakow jest " << o nieparzystej liczbie n << ", a o parzystej liczbie znakow " << p; 11 cin.ignore(); getchar(); return 0; } II. Badanie, czy liczba jest liczbą pierwszą. 1. Czym jest liczba pierwsza? Liczba pierwsza to liczba naturalna, która ma dokładnie dwa dzielniki naturalne: jedynkę i siebie samą. Liczbami pierwszymi są: 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, itp. Liczby naturalne większe od 1, które nie są pierwsze, nazywa się liczbami złożonymi. Z podanych definicji wynika, że liczby 0 i 1 nie są ani pierwsze, ani złożone. Największa liczba pierwsza składa się z siedemnastu milionów cyfr i wynosi 257,885,161 - 1. Odkrył ją Curtis Cooper z University of Central Missouri. Prace odbywały się w ramach projektu do którego zaprzęgniętego 360 tysięcy procesorów połączonych ze sobą komputerów. 2. Algorytm w postaci listy kroków. Specyfikacja algorytmu: Dane wejściowe: liczba naturalna n>1 12 Dane wyjściowe: komunikat „tak” lub „nie” w zależności od tego, czy liczba n jest liczbą pierwszą, czy złożoną Zmienne pomocnicze: p – kolejny dzielnik naturalny liczby n Krok 1: Wczytaj liczbę n. Krok 2: Zmiennej p przypisz wartość 2. Krok 3: Jeśli p jest równe n, wtedy wypisz komunikat „tak” i zakończ działanie algorytmu. Krok 4: Jeśli (n mod p) jest równe 0, wypisz komunikat „nie”| i zakończ działanie algorytmu. Krok 5: Powiększ zmienną p o 1 i przejdź do kroku 3. 3. Algorytm w postaci schematu blokowego. NIE TAK TAK NIE 13 4. Program w języku C++. Implementacja algorytmu sprawdzającego, czy dana liczba jest pierwsza w języku C++ mogłaby wyglądać następująco: #include <iostream.h> using namespace std; int main() { int n; cout << "Podaj liczbe naturalna: "; cin >> n; for(int p=2; p<n; p++) if(n % p == 0) { cout << "To nie jest liczba pierwsza" << endl; exit(0); } cout << "Jest to liczba pierwsza" << endl; cin.ignore(); getchar(); return 0; } 5. Zadania do samodzielnego rozwiązania. Zadanie 1. (CKE - matura podstawowa 2009) Liczba pierwsza to liczba naturalna większa od 1, która ma dokładnie dwa dzielniki naturalne: 1 i samą siebie. 14 Przykłady liczb pierwszych: 7 11 29 Liczba 21 nie jest liczbą pierwszą, ponieważ oprócz liczby 1 i 21 jej dzielnikami są także 3 i 7. W pliku o nazwie liczby.txt umieszczono w kolejnych wierszach 500 liczb całkowitych dodatnich, po jednej w wierszu, z których każda liczba ma co najwyżej 6 cyfr. Napisz program, za pomocą którgo otrzymasz tylko te liczby z pliku liczby.txt, które są kwadratami liczb pierwszych. Na przykład liczba 49 jest kwadratem liczby pierwszej . Wyniki zapisz w pliku zad_5.txt. Twój program powinien działać poprawnie również wtedy, gdy plik liczby.txt będzie zawierał 500 innych liczb całkowitych dodatnich, o co najwyżej 6 cyfrach, każda liczba w osobnym wierszu. Zadanie 2. (CKE - matura rozszerzona 2007) Liczba „super pierwsza”, to taka liczba naturalna, która spełnia następujące warunki: • jest liczbą pierwszą • suma cyfr tej liczby jest również liczbą pierwszą. Liczba „super B pierwsza”, oprócz wymienionych dwóch warunków, spełnia warunek trzeci: 15 • suma cyfr w jej zapisie binarnym jest także liczbą pierwszą. a) Dla każdego z podanych niżej przedziałów oblicz, ile jest liczb „super B pierwszych” w tym przedziale. Wyniki wpisz do tabeli. Dodatkowo, w plikach o nazwach 1.txt, 2.txt i 3.txt zapisz wszystkie liczby „super B pierwsze” odpowiednio z przedziałów 1., 2. i 3., po jednej liczbie w każdym wierszu. Nr przedziału Przedział 1. <2; 1000> 2. <100;10000> 3. <1000;100000> Liczba wystąpień liczb „super B pierwszych” w przedziale b) Odpowiedz na następujące pytania: Ile jest liczb w przedziale <100; 10000>, których suma cyfr jest liczbą pierwszą? Czy suma wszystkich liczb „super B pierwszych” z przedziału <100; 10000> jest liczbą pierwszą? III. Algorytmy badające własności liczb. Zadanie 1. (CKE - matura podstawowa 2012) W kolejnych wierszach pliku cyfry.txt znajduje się 1000 liczb naturalnych, mniejszych niż 109 (jeden miliard), po jednej liczbie w każdym wierszu. Napisz program, który da odpowiedzi do poniższych podpunktów. Każdą odpowiedź zapisz w pliku zadanie4.txt, poprzedzając ją oznaczeniem odpowiedniego podpunktu. a) Ile liczb parzystych jest w pliku cyfry.txt? 16 b) Podaj liczbę z pliku cyfry.txt, której suma cyfr jest największa oraz liczbę z tego pliku, której suma cyfr jest najmniejsza. W obu przypadkach jest tylko jedna taka liczba. Przykład: Dla danego zbioru liczb: 121324 66562 675100 1187010 odpowiedzią są liczby: 66562 oraz 121324, ponieważ suma cyfr liczby 66562 jest równa 25 (6+6+5+6+2) i jest największą taką sumą, zaś suma cyfr liczby 121324 (1+2+1+3+2+4) jest równa 13 i jest najmniejszą taką sumą. c) Wypisz wszystkie liczby z pliku cyfry.txt, których cyfry tworzą ciąg rosnący. Przykład: Cyfry liczby 123579 tworzą ciąg rosnący, ponieważ 1<2<3<5<7<9. Cyfry liczby 1232 nie tworzą ciągu rosnącego, ponieważ ostatnia cyfra (2) nie jest większa od przedostatniej (3). 17 Cyfry liczby 34556 nie tworzą ciągu rosnącego, ponieważ cyfra trzecia (5) i cyfra czwarta (5) są sobie równe. Rozwiązanie do pkt. a: #include <iostream> #include <fstream> using namespace std; int main(){ int ilosc=0; unsigned int liczba; fstream plik; plik.open("cyfry.txt"); while (!plik.eof()) { plik >> liczba; if (liczba%2==0) ilosc++; } plik.close(); cout << "Liczb parzystych jest " << ilosc; cin.ignore(); getchar(); return 0; } 18 Rozwiązanie do pkt. b: #include <iostream> #include <fstream> using namespace std; int main(){ int max=0; string liczba, szukana; fstream plik; plik.open("cyfry.txt"); while (!plik.eof()) { int suma=0; plik >> liczba; int dlugosc=liczba.length(); for (int i=0; i<dlugosc; i++) suma=suma+liczba[i]; if (suma>max) { max=suma; szukana=liczba; } } plik.close(); cout << "Szukana liczba to: " << szukana; cin.ignore(); getchar(); return 0; } 19