zbiór zadań z informatyki - Kompetencje kluczowe drogą do kariery

advertisement
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
Download