Pobierz arkusz maturalny (PDF)
Pobierz pliki z danymi (ZIP)
Omówienie przygotował Marcin Kasprowicz — czynny egzaminator maturalny z informatyki oraz twórca serwisu algorytm.edu.pl.
Zapraszam — Marcin Kasprowicz
n | Wynik działania funkcji przestaw | Liczba wywołań funkcji przestaw |
---|---|---|
316498 | 134689 | 3 |
43657688 | 34566788 | 4 |
154005710 | 145007501 | 5 |
998877665544321 | 989786756453412 | 8 |
Funkcja dzieli n
przez 100 w każdej rekurencji, czyli przetwarza po dwie cyfry na raz.
Niech k
będzie liczbą cyfr w n
:
k
parzyste: np. k = 6
, to mamy 3 pary → 3 wywołaniak
nieparzyste: np. k = 5
, to 2 pary + 1 cyfra → 3 wywołania
W każdym przypadku potrzebujemy (k + 1) div 2
wywołań (czyli zaokrąglenie w górę z k / 2
).
Nr | Wyrażenie | Czy prawdziwe? | Uzasadnienie |
---|---|---|---|
1. | k / 2 |
❌ F | Tylko dla parzystych k , ale nie ogólnie |
2. | (k + 1) div 2 |
✅ P | Poprawna liczba wywołań |
3. | {k / 2 (gdy parzyste), (k + 1) / 2 (gdy nieparzyste)} |
✅ P | To dokładnie to samo co (2), tylko rozpisane |
4. | (k + 1) / 2 |
❌ F | Działa tylko przy zaokrągleniu w górę, ale w językach bez dzielenia całkowitego może dawać float (niezgodne z div ) |
przestaw(n)
(C++)
// Funkcja przestaw - iteracyjna wersja
long long przestaw(long long n)
{
long long w = 0, mn = 1;
while(n > 9)
{
int r = n % 100;
w += mn * (r % 10 * 10 + r / 10); // odwracam cyfry
mn *= 100;
n /= 100;
}
if(n > 0)
w += mn * n;
return w;
}
#include<bits/stdc++.h>
using namespace std;
bool czy_palindrom(string napis)
{
int i = 0, j = napis.size() - 1;
while(i < j)
{
if(napis[i] != napis[j]) return false;
++i; --j;
}
return true;
}
void zad_2_1(vector<string> tab)
{
cout << "zadanie 2.1\n";
for(string napis: tab)
if(czy_palindrom(napis))
cout << napis << endl;
}
void zad_2_2(vector<string> tab)
{
cout << "zadanie 2.2\n";
int zlicz = 0;
vector<pair<int, int>> wyniki;
for(int i = 0; i <= 2000 - 3; i++)
for(int j = 0; j <= 12 - 3; j++)
{
set<char> znak;
for(int w = i; w < i + 3; w++)
for(int k = j; k < j + 3; k++)
znak.insert(tab[w][k]);
if(znak.size() == 1)
{
wyniki.push_back({i + 2, j + 2});
++zlicz;
}
}
cout << zlicz << " kwadraty\n";
for(auto w: wyniki)
cout << w.first << ' ' << w.second << endl;
}
void zad_2_3(vector<string> tab)
{
cout << "zadanie 2.3\n";
long long Max = 0;
string str_Max;
for(auto napis: tab)
{
long long liczba = 0;
for(auto znak: napis)
{
int cyfra;
if(znak == 'o') cyfra = 0;
if(znak == '+') cyfra = 1;
if(znak == '*') cyfra = 2;
liczba = liczba * 3 + cyfra;
}
if(Max < liczba)
{
Max = liczba;
str_Max = napis;
}
}
cout << Max << ' ' << str_Max << endl;
}
void zad_2_4(vector<string> tab)
{
cout << "zadanie 2.4\n";
long long suma = 0;
for(auto napis: tab)
{
long long liczba = 0;
for(auto znak: napis)
{
int cyfra;
if(znak == 'o') cyfra = 0;
if(znak == '+') cyfra = 1;
if(znak == '*') cyfra = 2;
liczba = liczba * 3 + cyfra;
}
suma += liczba;
}
cout << suma << ' ';
string wynik = "";
while(suma)
{
int cyfra = suma % 3;
if(cyfra == 0) wynik = 'o' + wynik;
if(cyfra == 1) wynik = '+' + wynik;
if(cyfra == 2) wynik = '*' + wynik;
suma /= 3;
}
cout << wynik << endl;
}
int main()
{
ifstream in("symbole.txt");
vector<string> tab(2000);
for(int i = 0; i < 2000; i++)
in >> tab[i];
zad_2_1(tab);
zad_2_2(tab);
zad_2_3(tab);
zad_2_4(tab);
return 0;
}
zadanie 2.1 ++o+o++o+o++ +*+**++**+*+ *+o++**++o+* *oo*o**o*oo* +*++*oo*++*+ +o++oooo++o+ zadanie 2.2 3 kwadraty 399 5 546 2 630 11 zadanie 2.3 531246 *******o+*+o zadanie 2.4 527865439 ++oo*+oo*++ooo*o*++
#include <bits/stdc++.h>
using namespace std;
void zad_3_1(vector<pair<int, int>> tab)
{
cout << "Zadanie 3.1\n";
int licz = 0;
for(auto xy : tab)
licz += __gcd(abs(xy.first), abs(xy.second)) > 1;
cout << licz << endl;
}
void czy_srodek(pair<int, int> A, pair<int, int> B, pair<int, int> C)
{
// sprawdzam, czy B jest środkiem odcinka AC
if (A.first + C.first == B.first * 2 && A.second + C.second == B.second * 2)
{
cout << "(" << A.first << ", " << A.second << "), ";
cout << "(" << B.first << ", " << B.second << "), ";
cout << "(" << C.first << ", " << C.second << ")\n";
}
}
void zad_3_2(vector<pair<int, int>> tab)
{
cout << "Zadanie 3.2 a)\n";
int licz = 0, x = 0, y = 0;
for(auto &xy : tab)
{
x += xy.first;
y += xy.second;
licz += (x > 0 && x < 5000 && y > 0 && y < 5000);
xy.first = x;
xy.second = y;
}
cout << licz << endl;
cout << "Zadanie 3.2 b)\n";
for(int i = 0; i < 100; i++)
for(int j = i + 1; j < 100; j++)
for(int k = j + 1; k < 100; k++)
{
czy_srodek(tab[i], tab[j], tab[k]);
czy_srodek(tab[j], tab[i], tab[k]);
czy_srodek(tab[i], tab[k], tab[j]);
}
}
int main()
{
ifstream in("dron.txt");
vector<pair<int, int>> tab(100);
for(int i = 0; i < 100; i++)
in >> tab[i].first >> tab[i].second;
zad_3_1(tab);
zad_3_2(tab);
return 0;
}
Zadanie 3.1 40 Zadanie 3.2 a) 24 Zadanie 3.2 b) (5832, 1801), (7410, 1990), (8988, 2179)
Program typu keylogger służy do:
1 1 0 0 1 0 1 1 0 1 1 + 1 1 0 0 1 1 0 1 1 1 ----------------------------- 1 0 0 1 1 0 0 1 0 0 1 0
Pobierz arkusz z rozwiązaniem zadania 6 (Excel)
Podaj łączną masę ładunków drona oraz łączną masę martianeum wydobytego przez stację.
a) łączna masa ładunków: 41498,2 kg
b) łączna masa martianeum: 3092,2943 kg
Podaj nazwę obszaru, dla którego średnia masa przywiezionych ładunków jest najmniejsza.
Obszar: Thaumasia
Średnia masa: 17,83571429 kg
Czas pracy stacji dzielimy na kolejne 7-dniowe okresy (pierwszy: 03.03.2033 – 09.03.2033).
Podaj największą łączną masę ładunków przywiezionych w którymkolwiek 7-dniowym okresie oraz datę początku tego okresu.
Największa łączna masa: 174,5 kg
Początek okresu: 13.12.2035
Wykonaj zestawienie, w którym dla każdego obszaru podasz, ile razy dron przewoził ładunek z tego obszaru w poszczególnych latach. Na jego podstawie sporządź wykres skumulowany kolumnowy.
Obszar | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | Suma końcowa |
---|---|---|---|---|---|---|---|
Aeolis | 5 | 7 | 11 | 2 | 13 | 5 | 43 |
Amazonis | 23 | 20 | 21 | 29 | 20 | 25 | 138 |
Amenthes | 10 | 5 | 9 | 12 | 10 | 10 | 56 |
Arabia | 9 | 10 | 15 | 8 | 10 | 7 | 59 |
Arcadia | 7 | 7 | 11 | 14 | 5 | 9 | 53 |
Argyre | 4 | 4 | 3 | 3 | 10 | 7 | 31 |
Casius | 6 | 10 | 7 | 13 | 7 | 7 | 50 |
Cebrenia | 4 | 5 | 1 | 1 | 1 | 1 | 13 |
Coprates | 21 | 27 | 18 | 33 | 30 | 23 | 152 |
Diacria | 2 | 3 | 2 | 3 | 3 | 2 | 15 |
Elysium | 6 | 9 | 5 | 4 | 8 | 7 | 39 |
Eridania | 8 | 19 | 23 | 20 | 22 | 16 | 108 |
Hellas | 1 | 4 | 2 | 1 | 3 | 4 | 15 |
Iapygia | 47 | 51 | 67 | 53 | 51 | 33 | 302 |
Ismenius Lacus | 6 | 4 | 5 | 3 | 9 | 13 | 40 |
Lunae Palus | 11 | 11 | 9 | 10 | 10 | 3 | 54 |
Mare Acidalium | 8 | 14 | 10 | 8 | 14 | 10 | 64 |
Mare Australe | 2 | 3 | 2 | 3 | 2 | 2 | 14 |
Mare Boreum | 14 | 19 | 8 | 13 | 14 | 12 | 80 |
Mare Tyrrhenum | 2 | 5 | 3 | 2 | 2 | 14 | |
Margaritifer Sinus | 4 | 5 | 5 | 2 | 2 | 7 | 25 |
Memnonia | 11 | 24 | 23 | 19 | 14 | 13 | 104 |
Noachis | 13 | 11 | 11 | 25 | 17 | 14 | 91 |
Oxia Palus | 3 | 3 | 1 | 4 | 2 | 13 | |
Phaethontis | 1 | 7 | 2 | 4 | 5 | 4 | 23 |
Phoenicis Lacus | 25 | 22 | 25 | 22 | 15 | 18 | 127 |
Sinus Sabaeus | 14 | 12 | 19 | 13 | 12 | 6 | 76 |
Syrtis Major | 6 | 2 | 5 | 4 | 6 | 3 | 26 |
Tharsis | 29 | 40 | 38 | 41 | 46 | 39 | 233 |
Thaumasia | 2 | 2 | 4 | 1 | 2 | 3 | 14 |
Suma końcowa | 304 | 365 | 365 | 366 | 365 | 307 | 2072 |
Uwzględnij zasady działania stacji opisane na początku zadania i podaj:
a) liczba transportów: 30
b) pierwsza data: 29.05.2033
c) ostatnia data: 01.09.2038
Pobierz bazę danych (Access) – zadanie 7
Podaj nazwę obszaru, na którym znaleziono łącznie (we wszystkich pomiarach) najwięcej m3 wody na głębokości do 100 m włącznie. (Jest jeden taki obszar).
Obszar: Mare Boreum
Podaj nazwę łazika, który wykonywał pomiary w najdłuższym okresie, licząc od pierwszego (najwcześniejszego) do ostatniego (najpóźniejszego) pomiaru. Podaj też datę pierwszego i ostatniego pomiaru.
Nazwa łazika | Początek | Koniec | Okres (dni) |
---|---|---|---|
Spirit 14 | 29.08.2066 | 25.07.2076 | 3618 |
Podaj nazwy obszarów na Marsie, na których żaden z łazików nie wykonał ani jednego pomiaru w tym samym roku, w którym został wysłany z Ziemi.
Amazonis
Arabia
Syrtis Major
Elysium
Sinus Sabaeus
Mare Tyrrhenum
Aeolis
Eridania
Podaj nazwy łazików, które wylądowały na półkuli południowej, ale wykonywały pomiary na obu półkulach: północnej (N) i południowej (S).
Mariner 14
Mariner 15
Mariner 20
Phoenix 13
Phoenix 3
Rosetta 1
Rosetta 8
Spirit 12
Spirit 7
Viking 17
Do tabel utworzonych na podstawie opisanych wcześniej plików dołączamy kolejną – o nazwie Producent, w której zapisano informacje o producentach poszczególnych modeli łazików. Tabela Producent zawiera następujące pola:
kod_producenta – unikatowy kod producenta nazwa – nazwa producenta kraj – kraj producentaDo tabeli Laziki dodano pole kod_producenta. Napisz w języku SQL zapytanie, w wyniku którego otrzymasz listę nazw producentów, których łaziki badały obszar Marsa o nazwie Arcadia w roku 2060. Nazwy producentów nie mogą się powtarzać.
SELECT DISTINCT Producent.nazwa
FROM Producent INNER JOIN Laziki ON Producent.kod_producenta = Laziki.kod_producenta
INNER JOIN Pomiary ON Laziki.nr_lazika = Pomiary.nr_lazika INNER JOIN Obszary ON
Obszary.kod_obszaru = Pomiary. kod_obszaru
WHERE Obszary.nazwa_obszaru = "Arcadia" and YEAR(Pomiary.data_pomiaru) = 2060;