Arkusz 2015, matura maj

Zadanie 4.1 (0-3)

Liczby binarne
Liczby binarne
W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Pierwsze pięć wierszy zawiera następujące liczby:
11010100111
11110111111011101
1010100111010100
1101111111111111111111010100101010101001
1010110011001101010011110101010101010111
Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu językach programowania wartości niektórych z tych liczb nie da się zapamiętać w pojedynczej zmiennej typu całkowitoliczbowego, np. w języku C++ w zmiennej typu int.
Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku
wynik4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie. Podaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek.
Przykład: Dla zestawu liczb:
101011010011001100111
10001001
1000000
101010011100
100010
wynikiem jest liczba 3 (3 podkreślone liczby mają w swoim zapisie więcej zer niż jedynek).
dane = ""
with open("DANE_PR2/liczby.txt") as f:
	dane = f.readlines()

zwoj = 0
for line in dane:
	line = line.strip()
	z = 0
	j = 0
	for char in line:
		if char == "0":
			z += 1
		elif char == "1":
			j += 1
	if z > j:
		zwoj += 1
print("4.1. Wiecej zer od jedynek ma", str(zwoj), "liczb")
Pobierz rozwiązanie
Wytłumaczenie pojawi się niebawem.

Zadanie 4.2 (0-3)

Liczby binarne
Liczby binarne
W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Pierwsze pięć wierszy zawiera następujące liczby:
11010100111
11110111111011101
1010100111010100
1101111111111111111111010100101010101001
1010110011001101010011110101010101010111
Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu językach programowania wartości niektórych z tych liczb nie da się zapamiętać w pojedynczej zmiennej typu całkowitoliczbowego, np. w języku C++ w zmiennej typu int.
Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku
wynik4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie. Podaj, ile liczb w pliku liczby.txt jest podzielnych przez 2 oraz ile liczb jest podzielnych przez 8.
Przykład: Dla zestawu liczb:
101011010011001100000 (*), (**)
10001001
100100 (*)
101010010101011011000 (*), (**)
100011
trzy liczby są podzielne przez 2 (*) i dwie liczby są podzielne przez 8 (**).
dane = ""
with open("DANE_PR2/liczby.txt") as f:
	dane = f.readlines()

d8 = 0
d2 = 0
for line in dane:
	line = line.strip()
	if int(line, 2) % 2 == 0:
		d2 += 1
	if int(line, 2) % 8 == 0:
		d8 += 1
print("4.2 Liczb podzielnych przez 2:", d2, "
Liczb podzielnych przez 8:", d8)
Pobierz rozwiązanie
Wytłumaczenie pojawi się niebawem.

Zadanie 4.3 (0-6)

Liczby binarne
Liczby binarne
W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Pierwsze pięć wierszy zawiera następujące liczby:
11010100111
11110111111011101
1010100111010100
1101111111111111111111010100101010101001
1010110011001101010011110101010101010111
Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu językach programowania wartości niektórych z tych liczb nie da się zapamiętać w pojedynczej zmiennej typu całkowitoliczbowego, np. w języku C++ w zmiennej typu int.
Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku
wynik4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie. Znajdź najmniejszą i największą liczbę w pliku liczby.txt. Jako odpowiedź podaj numery wierszy, w których się one znajdują.
Przykład: Dla zestawu liczb:
101011010011001100111
10001001011101010
1001000
101010011100
1000110
najmniejsza liczba to: 1000110
największa liczba to: 101011010011001100111
Prawidłowa odpowiedź dla powyższego przykładu to: 5, 1.
dane = ""
with open("DANE_PR2/liczby.txt") as f:
	dane = f.readlines()

i = 1
najw = 0
najm = 999999
najw_i = 0
najm_i = 0
for line in dane:
	line = line.strip()
	wd = int(line, 2)
	if wd > najw:
		najw = wd
		najw_i = i
	if wd < najm:
		najm = wd
		najm_i = i
	i += 1
print("4.3. Indeks najmniejszej liczby:", najm_i, "
Indeks najwiekszej liczby:", najw_i)
Pobierz rozwiązanie
Wytłumaczenie pojawi się niebawem.

Zadanie 6.1 (0-2)

Formuła 1
Formuła 1
W następujących plikach zgromadzono dane dotyczące wyścigów samochodowych Formuły 1 z lat 2000–2012. Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól.
W pliku Kierowcy.txt każdy wiersz zawiera informacje o kierowcy, rozdzielone średnikami: Id_kierowcy, Nazwisko, Imie, Kraj.
Przykład:
z10;Irvine;Eddie;Irlandia
W pliku Wyscigi.txt są zawarte informacje o rozegranych wyścigach Grand Prix liczonych do klasyfikacji generalnej: Id_wyscigu, Rok, GrandPrix. Sezon jest reprezentowany przez rok (czterocyfrowa liczba), a GrandPrix jest nazwą miejsca, w którym jest rozgrywany wyścig.
Przykład:
w20;2001;Brazylia
W pliku Wyniki.txt każdy wiersz zawiera informacje o punktach zdobytych przez kierowców w poszczególnych wyścigach, rozdzielone średnikami: Id_kierowcy, Punkty, Id_wyscigu.
Przykład:
z42;6;w7
Wykorzystując dane zawarte w plikach Kierowcy.txt, Wyscigi.txt i Wyniki.txt, wykonaj poniższe polecenia, a odpowiedzi poprzedzone numerem oznaczającym podpunkt zapisz w pliku wynik6.txt. Podaj sezon i nazwę wyścigu Grand Prix, w którym Robert Kubica zdobył najwięcej punktów.
Pierwszym etapem na jakim się skupimy jest wyznaczenie id_wyscigu, w którym Robert Kubica zdobył najwięcej punktów. W tym celu nasze operacje będą wykonywane na dwóch tabelach: Wyniki oraz Kierowcy. Wyniki zwrócą nam liczbę punktów uzyskanych przez kierowcę w danym wyścigu, zaś Kierowcy pozwolą nam określić z imienia i nazwiska na czyich rezultatach zależy nam najbardziej. Zapytanie będzie prezentowało się w następujący sposób:
SELECT TOP 1 id_wyscigu 
FROM Wyniki INNER JOIN Kierowcy ON Wyniki.Id_kierowcy = Kierowcy.id_kierowcy
WHERE imie = "Robert" AND nazwisko = "Kubica"
GROUP BY id_wyscigu
ORDER BY SUM(Punkty) DESCObjaśnienie:
Wybierz pierwszy zwrócony rekord z tabeli Wyniki połączonej relacją z tabelą Kierowcy, gdzie imię kierowcy to Robert ORAZ jego nazwisko to Kubica. Należy pamiętać o złączeniu warunków operatorem AND, gdyż zależy nam aby oba warunki zostały spełnione! Nasz zawodnik musi nazywać się Robert Kubica! Następnie pogrupujmy dane według id_wyscigu. Oznacza to nic innego jak ograniczenie wszystkich zwróconych rekordów o tym samym id_wyscigu do jednego pola. Teraz wystarczy już jedynie posortować nasze wyniki według sumy zwróconych punktów malejąco. 
Pierwsza część polecenia za nami. Teraz to już czysta przyjemność!
Mając id_wyscigu jesteśmy w stanie bezproblemowo podać informacje odnośnie roku i Grand Prix korzystając z tabeli Wyscigi, gdzie te są bezpośrednio identyfikowane z id_wyscigu.

Ostatecznie:
SELECT Rok, Grandprix
FROM Wyscigi
WHERE id_wyscigu IN (
	SELECT TOP 1 id_wyscigu FROM Wyniki
	INNER JOIN Kierowcy ON Wyniki.Id_kierowcy = Kierowcy.id_kierowcy
	WHERE imie = "Robert" AND nazwisko = "Kubica"
	GROUP BY id_wyscigu
	ORDER BY SUM(Punkty) DESC);
Objaśnienie:
Wybierz rok oraz Grand Prix z tabeli Wyscigi, gdzie id_wyscigu jest dokładnie takie samo jak zwrócony rekord z zapytania przygotowanego wyżej! 
 
Pobierz rozwiązanie
Wytłumaczenie pojawi się niebawem.

Zadanie 6.2 (0-2)

Formuła 1
Formuła 1
W następujących plikach zgromadzono dane dotyczące wyścigów samochodowych Formuły 1 z lat 2000–2012. Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól.
W pliku Kierowcy.txt każdy wiersz zawiera informacje o kierowcy, rozdzielone średnikami: Id_kierowcy, Nazwisko, Imie, Kraj.
Przykład:
z10;Irvine;Eddie;Irlandia
W pliku Wyscigi.txt są zawarte informacje o rozegranych wyścigach Grand Prix liczonych do klasyfikacji generalnej: Id_wyscigu, Rok, GrandPrix. Sezon jest reprezentowany przez rok (czterocyfrowa liczba), a GrandPrix jest nazwą miejsca, w którym jest rozgrywany wyścig.
Przykład:
w20;2001;Brazylia
W pliku Wyniki.txt każdy wiersz zawiera informacje o punktach zdobytych przez kierowców w poszczególnych wyścigach, rozdzielone średnikami: Id_kierowcy, Punkty, Id_wyscigu.
Przykład:
z42;6;w7
Wykorzystując dane zawarte w plikach Kierowcy.txt, Wyscigi.txt i Wyniki.txt, wykonaj poniższe polecenia, a odpowiedzi poprzedzone numerem oznaczającym podpunkt zapisz w pliku wynik6.txt. W których z miejsc podanych w plikach rozegrano najmniejszą liczbę wyścigów Grand Prix w latach 2000–2012?
Na zidentyfikowanie, w którym z miejsc rozegrano najmniejszą liczbę wyścigów Grand Prix, pozwoli nam tabela Wyscigi. 
Ostatecznie:SELECT TOP 1 Grandprix
FROM Wyscigi
GROUP BY Grandprix
ORDER BY COUNT(id_wyscigu);Objaśnienie:
Wybierz pierwszy zwrócony rekord z informacją o Grand Prix z tabeli Wyścigi. Pogrupuj nasze wyniki według Grand Prix, a następnie posortuj je według Ilości wystąpień danego wyścigu. W praktyce oznacza to, że każde kilkukrotne zwrócenie rekordu o tym samym Grand Prix zostało zredukowane do jednej wyświetlonej wartości. Następnie każde z unikalnych Grand Prix sortujemy według ilości wystąpień. Brak wyświetlenia ilości rozegranych poszczególnych Grand Prix, nie oznacza że te dane nie istnieją i nie można na nich operować! Wręcz przeciwnie, nawet trzeba! Podczas sortowania celowo nie dodałem ASC, który umożliwia sortowanie rosnące, gdyż jest to standardowa opcja jaką ustala nam Access i nie jest wymagana do pisania.

Pobierz rozwiązanie
Formuła 1
W następujących plikach zgromadzono dane dotyczące wyścigów samochodowych Formuły 1 z lat 2000–2012. Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól.
W pliku Kierowcy.txt każdy wiersz zawiera informacje o kierowcy, rozdzielone średnikami: Id_kierowcy, Nazwisko, Imie, Kraj.
Przykład:
z10;Irvine;Eddie;Irlandia
W pliku Wyscigi.txt są zawarte informacje o rozegranych wyścigach Grand Prix liczonych do klasyfikacji generalnej: Id_wyscigu, Rok, GrandPrix. Sezon jest reprezentowany przez rok (czterocyfrowa liczba), a GrandPrix jest nazwą miejsca, w którym jest rozgrywany wyścig.
Przykład:
w20;2001;Brazylia
W pliku Wyniki.txt każdy wiersz zawiera informacje o punktach zdobytych przez kierowców w poszczególnych wyścigach, rozdzielone średnikami: Id_kierowcy, Punkty, Id_wyscigu.
Przykład:
z42;6;w7
Wykorzystując dane zawarte w plikach Kierowcy.txt, Wyscigi.txt i Wyniki.txt, wykonaj poniższe polecenia, a odpowiedzi poprzedzone numerem oznaczającym podpunkt zapisz w pliku wynik6.txt. Klasyfikacja generalna w danym sezonie jest tworzona na podstawie sumy punktów uzyskanych przez kierowców w wyścigach rozegranych w tym sezonie. Utwórz zestawienie zawierające nazwiska i imiona kierowców – zwycięzców klasyfikacji generalnej w sezonach 2000, 2006 i 2012 wraz z liczbami punktów przez nich uzyskanymi.
Ilość treści z pewnością może spowodować ból głowy. Jednak spokojnie, nie takie rzeczy jeszcze przed nami! 
Z treści zadania wynika, że potrzebujemy imiona, nazwiska oraz ilości uzyskanych punktów przez zwycięzców klasyfikacji generalnej w sezonach 2000, 2006 i 2012. Najprościej będzie wyświetlić zestawienie dla każdego takiego zawodnika, a potem ręcznie wyszukać pierwsze, posortowane malejąco według ilości punktów, wartości w danym sezonie. Do uzyskania naszego pożądanego wyniku będziemy potrzebować wszystkich tabel. Powstanie nam ogromny warunek złączeniowy, który dla uproszczenia pomalujemy na kolor żółty żeby zobaczyć, że to zapytanie wcale takie obszerne i straszne nie jest!

Ostatecznie:
SELECT wyniki.id_kierowcy, imie, nazwisko, SUM(punkty) AS Liczba, rok
FROM (Wyniki INNER JOIN Wyscigi ON Wyniki.id_wyscigu = Wyscigi.id_wyscigu) INNER JOIN Kierowcy ON Wyniki.id_kierowcy = Kierowcy.id_kierowcy
WHERE Rok = 2000 OR Rok = 2006 OR Rok = 2012
GROUP BY wyniki.id_kierowcy, rok, imie, nazwisko
ORDER BY rok, SUM(punkty) DESC;Objaśnienie:
Wybierz id_kierowcy z tabeli Wyniki, imię, nazwisko, sumę uzyskanych punktów (nazwa kolumny jako Liczba) oraz Rok z naszego ogromnego złączenia wszystkich tabel, gdzie rok jest równy 2000 LUB 2006 LUB 2012. Zależy nam na każdym z wymienionych lat dlatego używamy operatora OR. Następnie pogrupuj zwrócone wyniki według id_kierowcy, roku, imienia i nazwiska. Tak jak już wcześniej wspominałem - ograniczy nam to wszystkie powtórzenia do jednej zwróconej wartości w danej grupie, która „w pamięci” wie ile razy wystąpiła bez grupowania. Nasze id_kierowcy powinno wystąpić maksymalnie 3 razy, z uwagi grupowania również po roku! W praktyce oznacza to zwrócenie ilości wystąpień kierowcy w danym roku. Na końcu oczywiście sortujemy zwrócone rekordy malejąco według roku, a następnie sumy punktów. Takowy zabieg pozwoli na wybranie pierwszego wiersza w danym roku bez konieczności martwienia się o to czy nasz zawodnik jest zwycięzcą sezonu. Oczywiście, że jest bo ma najwięcej punktów w danym roku!

Pobierz

Zadanie 6.4 (0-3)

Formuła 1
Formuła 1
W następujących plikach zgromadzono dane dotyczące wyścigów samochodowych Formuły 1 z lat 2000–2012. Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól.
W pliku Kierowcy.txt każdy wiersz zawiera informacje o kierowcy, rozdzielone średnikami: Id_kierowcy, Nazwisko, Imie, Kraj.
Przykład:
z10;Irvine;Eddie;Irlandia
W pliku Wyscigi.txt są zawarte informacje o rozegranych wyścigach Grand Prix liczonych do klasyfikacji generalnej: Id_wyscigu, Rok, GrandPrix. Sezon jest reprezentowany przez rok (czterocyfrowa liczba), a GrandPrix jest nazwą miejsca, w którym jest rozgrywany wyścig.
Przykład:
w20;2001;Brazylia
W pliku Wyniki.txt każdy wiersz zawiera informacje o punktach zdobytych przez kierowców w poszczególnych wyścigach, rozdzielone średnikami: Id_kierowcy, Punkty, Id_wyscigu.
Przykład:
z42;6;w7
Wykorzystując dane zawarte w plikach Kierowcy.txt, Wyscigi.txt i Wyniki.txt, wykonaj poniższe polecenia, a odpowiedzi poprzedzone numerem oznaczającym podpunkt zapisz w pliku wynik6.txt. Dla każdego kraju, którego reprezentanci zdobywali punkty w sezonie 2012, podaj liczbę tych reprezentantów.
Już po pierwszym przeczytaniu czujemy, że w powietrzu unosi się zapach jakiegoś prostego podzapytania! A więc zacznijmy właśnie od niego. Wybierzmy id tych kierowców, którzy w roku 2012 punktowali. Do tego celu potrzebujemy dwóch tabel – wyniki, która określa liczbę uzyskanych punktów przez danego kierowcę – oraz Wyscigi przechowującej informacje o roku. W naszych warunkach określimy rok jako 2012 ORAZ ilość uzyskanych punktów większą niż 0. Całość pogrupujemy według id_kierowcy, gdyż treść naszego zadania bezpośrednio wskazuje na reprezentantów danego kraju! A faktem wiadomym jest, że jeśli Jan Kowalski jest reprezentantem Polski to jest on liczony jako jeden zawodnik, nie obchodzą nas informacje zduplikowane.SELECT wyniki.id_kierowcy
FROM (Wyniki INNER JOIN Wyscigi ON Wyniki.id_wyscigu = Wyscigi.id_wyscigu)
WHERE Rok = 2012 AND Punkty > 0
GROUP BY wyniki.id_kierowcyMając przygotowane zapytanie jesteśmy już na prostej do mety, pędzimy niczym Ci kierowcy!
Interesują nas informacje o liczbie kierowców z danego kraju, którzy uzyskali punkty w sezonie 2012. Mając podzapytanie właściwie pozostało nam skojarzyć id kierowców po ich narodowościach.

Ostatecznie:SELECT COUNT(kraj) AS Liczba, Kraj
FROM Kierowcy
WHERE id_kierowcy IN (
	SELECT wyniki.id_kierowcy
	FROM 
	(Wyniki
	INNER JOIN Wyscigi ON Wyniki.id_wyscigu = Wyscigi.id_wyscigu)
	WHERE Rok = 2012 AND Punkty > 0
	GROUP BY wyniki.id_kierowcy)
GROUP BY kraj;Objaśnienie:
Wybierz ilość wystąpień danego kraju (nazwa kolumny jako Liczba) oraz Kraj z tabeli Kierowcy gdzie id_kierowcy występuje w rekordach, które utworzyło nam nasze stworzone wcześniej podzapytanie! Następnie pogrupuj wszystkie informacje po kraju. Poskutkuje to ograniczeniem duplikatów nazw kraju do wartości jednokrotnej wraz z informacją o ilości jego reprezentantów.

Pobierz rozwiązanie