Sortowanie pozycyjne operuje na zbiorach porządkowalnych leksykograficzniezbiór porządkowalny leksykograficzniezbiorach porządkowalnych leksykograficznie. Aby wykorzystać algorytm do uporządkowania tablicy dat, należy najpierw zamienić tablicę w zbiór, który będzie porządkowalny leksykograficznie, a także umożliwi łatwe przetworzenie przez komputer.
Przykładem takiego zbioru jest zbiór liczb naturalnych. Najprostszym sposobem konwersji dat na liczby jest zapisanie ich w kolejności: rok - miesiąc - dzień, co spowoduje, że cyfry znajdujące się po lewej stronie wpływają na datę w stopniu najwyższym, a te po prawej są coraz mniej znaczące. Ten schemat zapisu nazywamy standardem zapisywania dat ISO 8601standard ISO 8601ISO 8601.
Po przetworzeniu danych wejściowych możemy zająć się właściwym sortowaniem. Algorytm wykorzystuje dowolny stabilny algorytm sortujący, np. sortowanie bąbelkowe czy sortowanie przez zliczanie. Sortowanie jest pozycyjne i odbywa się od najmniej do najbardziej znaczącej pozycji.
W ten sposób uzyskujemy dane wejściowe dla kolejnych iteracji algorytmu, które będą się powtarzać, dopóki wszystkie cyfry w każdej liczbie nie zostaną rozpatrzone.
Zadanie 1. Jakub Jabłecznik i jego sad
Jakub Jabłecznik jest właścicielem sadu, w którym rosną jabłonie. Sad jest podzielony na trzy części – na każdej z nich rośnie inna odmiana jabłoni (ligol, gala lub lobo). Jakub odnotowuje sprzedaż jabłek w pliku sprzedaz.txt. Każdą transakcję zapisuje w oddzielnej linii - podaje w niej datę sprzedaży jabłek w formacie RRRR‑MM‑DD, ich odmianę w formie pełnej nazwy zapisanej wielkimi literami bez polskich znaków oraz masę w kilogramach. Poszczególne dane rozdziela za pomocą pojedynczej spacji. W roku 2021 Jakub sprzedał jabłka 12 razy (każdą z odmian dokładnie po cztery razy), wyłącznie we wrześniu i październiku.
Do zadania został dołączony plik tekstowy sprzedaz.txt, który składa się z linii. Odnotowano w nim sprzedaż jabłek - każda transakcja zapisana jest w pojedynczej linii zgodnie z formatem:
Zaprezentowane rozwiązania zakładają, że dane zostały poprawnie wczytane z pliku, a informacja o każdej z transakcji została podzielona i zapisana w odpowiednich tablicach: dataTransakcji, gatunekJablka i masaSprzedanychJablek. Aby zachować integralność danych, odczytujemy dane z każdej z tablic zawarte pod indeksem i, gdzie uzyskujemy komplet informacji o -tej transakcji.
Na potrzeby zadania zakładamy istnienie funkcji zamien(i, j). Jej zadaniem jest zachowanie spójności danych. Przyjmuje ona dwa indeksy: i, j, a następnie zamienia miejscami w tablicach elementy umieszczone pod tymi indeksami: dataTransakcji, gatunekJablka oraz masaSprzedanychJablek.
Przedstawiony sposób przechowywania danych jest jednym z możliwych. Innym rozwiązaniem może być wczytanie danych np. do dwuwymiarowej tablicy łańcuchów znaków bądź skorzystanie z programowania obiektowego.
Na egzaminie maturalnym uczeń ma możliwość wyboru języka programowania. W tym e‑materiale kod został zapisany za pomocą pseudokodu, w którym tablice oraz znaki w łańcuchach są indeksowane od 0.
Zadanie 1.1
Jakub nie prowadzi rejestru sprzedaży na bieżąco, przez co transakcje umieszczone w pliku nie są ułożone zgodnie z kolejnością, w jakiej faktycznie następowały. Napisz program, który posortuje transakcje od najwcześniejszej do najpóźniejszej. Wynik zapisz do pliku wynik1.txt.
Do oceny oddajesz:
plik wynik1.txt z odpowiedzią (posortowane transakcje od najwcześniejszej do najpóźniejszej),
plik(i) z komputerową realizacją zadania (kodem programu).
Rozwiązanie
Zgodnie z przedstawionymi założeniami udało nam się wczytać dane do tablic. Mamy do dyspozycji funkcję zamien, która pozwoli nam na zachowanie integralności danych.
Zadanie rozwiążemy, wykorzystując algorytm sortowania pozycyjnego dat. Zaczynając od najmniej znaczącej części daty (w tym wypadku cyfry jedności dnia), a kończąc na cyfrze tysięcy w roku, sortujemy stabilnie daty – cyfra po cyfrze.
Algorytm sortowania pozycyjnego dat wymaga stabilnego algorytmu sortującego. W implementacji wykorzystamy niezoptymalizowany algorytm sortowania bąbelkowegoPCfvfjgLksortowania bąbelkowego.
Deklarujemy funkcję sortowanieBabelkowe(indeks). Funkcja przyjmuje jeden parametr – indeks. Posłuży on nam do wskazania, którą cyfrę daty aktualnie przetwarzamy.
Wewnątrz funkcji tworzymy dwie zagnieżdżone pętlę dla. Iterator pierwszej pętli (i) będzie przyjmował wartości od 1 do liczby elementów w tablicach minus 1, czyli 11. Z kolei iterator drugiej zagnieżdżonej pętli (j) będzie przyjmował wartości od 1 do liczby elementów w tablicach minus i, czyli kolejno do 11, 10, ..., 1. Operacja ta pozwoli na pominięcie dat ustawionych już na swoich pozycjach, jak również uniknięcie wyjścia poza zakres tablicy i błędnego działania programu.
Linia 1. funkcja sortowanieBabelkowe otwórz nawias okrągły indeks zamknij nawias okrągły.
Linia 2. dla i ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 3. dla j ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus i wykonuj dwukropek.
funkcja sortowanieBabelkowe(indeks)
dla i ← 1, 2, ..., długość(dataTransakcji) - 1 wykonuj:
dla j ← 1, 2, ..., długość(dataTransakcji) - i wykonuj:
Wewnątrz zagnieżdżonej pętli porównujemy sąsiednie elementy wskazywane przez iterator j. Zawsze rozpatrujemy tę samą cyfrę daty, przekazaną do funkcji jako argument indeks. Pamiętajmy o konwersji znaku cyfry na liczbę całkowitą.
Linia 1. funkcja sortowanieBabelkowe otwórz nawias okrągły indeks zamknij nawias okrągły.
Linia 2. dla i ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 3. dla j ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus i wykonuj dwukropek.
Linia 4. jeżeli konwertujNaLiczbeCalkowita otwórz nawias okrągły dataTransakcji otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny konwertujNaLiczbeCalkowita otwórz nawias okrągły dataTransakcji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły wykonuj dwukropek.
funkcja sortowanieBabelkowe(indeks)
dla i ← 1, 2, ..., długość(dataTransakcji) - 1 wykonuj:
dla j ← 1, 2, ..., długość(dataTransakcji) - i wykonuj:
jeżeli konwertujNaLiczbeCalkowita(dataTransakcji[j - 1][indeks]) > konwertujNaLiczbeCalkowita(dataTransakcji[j][indeks]) wykonuj:
Jeżeli aktualnie przetwarzana cyfra elementu dataTransakcji[j - 1] jest większa od cyfry elementu dataTransakcji[j], to zamieniamy je miejscami, wykorzystując wcześniej wspomnianą funkcję zamien.
Linia 1. funkcja sortowanieBabelkowe otwórz nawias okrągły indeks zamknij nawias okrągły.
Linia 2. dla i ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 3. dla j ← 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus i wykonuj dwukropek.
Linia 4. jeżeli konwertujNaLiczbeCalkowita otwórz nawias okrągły dataTransakcji otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny konwertujNaLiczbeCalkowita otwórz nawias okrągły dataTransakcji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły wykonuj dwukropek.
Linia 5. zamien otwórz nawias okrągły j minus 1 przecinek j zamknij nawias okrągły.
funkcja sortowanieBabelkowe(indeks)
dla i ← 1, 2, ..., długość(dataTransakcji) - 1 wykonuj:
dla j ← 1, 2, ..., długość(dataTransakcji) - i wykonuj:
jeżeli konwertujNaLiczbeCalkowita(dataTransakcji[j - 1][indeks]) > konwertujNaLiczbeCalkowita(dataTransakcji[j][indeks]) wykonuj:
zamien(j - 1, j)
Algorytm sortowania pozycyjnego dat wdrażamy poprzez przygotowanie pętli dla, której iterator będzie przyjmował kolejne wartości od 9 do 0 (po każdym przebiegu pętli wartość iteratora zostanie zmniejszona o 1). Wewnątrz pętli upewniamy się, że nie będziemy sortować symboli separujących części daty (kryją się pod indeksami 4 i 7) oraz uruchamiamy przygotowane sortowanie bąbelkowe.
Po zakończonym przebiegu pętli drukujemy informacje o każdej transakcji.
Linia 1. dla i ← 9 kropka kropka kropka 0 wykonuj dwukropek.
Linia 2. jeżeli i znak równości 4 LUB i znak równości 7 wykonuj dwukropek.
Linia 3. kontynuuj.
Linia 5. sortowanieBabelkowe otwórz nawias okrągły i zamknij nawias okrągły.
Linia 7. dla i ← 0 kropka kropka kropka długość otwórz nawias okrągły dataTransakcji zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 8. wypisz otwórz nawias okrągły dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 9. wypisz otwórz nawias okrągły gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 10. wypisz otwórz nawias okrągły masa otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
dla i ← 9 ... 0 wykonuj:
jeżeli i = 4 LUB i = 7 wykonuj:
kontynuuj
sortowanieBabelkowe(i)
dla i ← 0 ... długość(dataTransakcji) - 1 wykonuj:
wypisz(dataTransakcji[i])
wypisz(gatunekJablka[i])
wypisz(masa[i])
Poprawne wyniki dla danych w pliku sprzedaz.txt:
R18cnnSDCwMff
Przycisk do pobrania pliku TXT z poprawnymi wynikami dla danych.
Napisz program, który wskaże, ile dni minęło między pierwszą a ostatnią transakcją dla każdego z gatunków jabłek. Wynik zapisz do pliku wynik2.txt.
Ważne!
Pamiętaj o poprawnym obliczaniu liczby dni dzielących dwie daty (np. między a września 2021 minęło 20 dni).
Do oceny oddajesz:
plik wynik2.txt z odpowiedzią (liczbami naturalnymi oznaczającymi, ile dni minęło między pierwszą a ostatnią transakcją dla każdego z gatunków jabłek),
plik(i) z komputerową realizacją zadania (kodem programu).
Rozwiązanie
Zadanie można rozwiązać na wiele sposobów. Zaprezentowane tu rozwiązanie polega na posortowaniu transakcji według dat ich wykonania, a następnie wyszukaniu najwcześniejszej i najpóźniejszej sprzedaży dla każdego z gatunków jabłek. Na potrzeby rozwiązania załóżmy, że został wykonany kod z zadania 1.1 i dane zostały posortowane niemalejąco względem dat jako klucza.
Implementację rozwiązania zaczynamy od zadeklarowania funkcji obliczIleMinelo. Funkcja jako argument będzie przyjmować napis – gatunek jabłek.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
funkcja obliczIleMinelo(gatunek)
Wewnątrz funkcji deklarujemy dwie zmienne pomocnicze: najwczesniejsza i najpozniejsza. Pierwsza z nich będzie przechowywać datę pierwszej sprzedaży, a druga – ostatniej.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Tworzymy dwie pętle dla. Pierwsza z nich będzie wyszukiwać datę najwcześniejszej transakcji. W tym celu iterujemy po kolejnych elementach tablicy gatunekJablka. Jeśli łańcuch znaków przekazany jako argument do funkcji jest taki sam jak ten aktualnie przetwarzany w tablicy gatunekJablka, to zapisujemy do zmiennej najwczesniejsza datę sprzedaży odczytaną z tablicy dataTransakcji. Pamiętajmy, że zgodnie z przyjętymi założeniami tablice pod indeksem i zawsze przechowują komplet informacji o pojedynczej transakcji.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Linia 5. dla i ← 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 6. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 7. najwczesniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. przerwij.
funkcja obliczIleMinelo(gatunek)
najwczesniejsza ← ""
najpozniejsza ← ""
dla i ← 0, 1, ..., długość(gatunkiJablka) - 1 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najwczesniejsza ← dataTransakcji[i]
przerwij
Podobną operację wykonamy, aby znaleźć ostatnią sprzedaż. Ponieważ transakcje zostały posortowane w kolejności od najwcześniejszej do najpóźniejszej, możemy przejść do końca po tablicy z gatunkami jabłek. Pierwsze dopasowanie będzie ostatnią sprzedażą wskazanego gatunku jabłek.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Linia 5. dla i ← 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 6. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 7. najwczesniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. przerwij.
Linia 10. dla i ← długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek.
Linia 11. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 12. najpozniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 13. przerwij.
funkcja obliczIleMinelo(gatunek)
najwczesniejsza ← ""
najpozniejsza ← ""
dla i ← 0, 1, ..., długość(gatunkiJablka) - 1 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najwczesniejsza ← dataTransakcji[i]
przerwij
dla i ← długość(gatunkiJablka) - 1, długość(gatunkiJablka) - 2, ..., 0 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najpozniejsza ← dataTransakcji[i]
przerwij
Znaleźliśmy pierwszą i ostatnią sprzedaż przetwarzanego gatunku. Teraz skupimy się na policzeniu, ile dni minęło między transakcjami.
Tworzymy zmienną pomocniczą najwczesniejszaDzien. Daty zapisane są w formie napisów. Informacja o dniu znajduje się na pozycjach 8 i 9. Dokonujemy konwersji znaku w zmiennej najwczesniejsza, znajdującego się pod indeksem 8, na liczbę całkowitą. Mnożymy tę wartość przez 10 oraz dodajemy do niej przekonwertowany na liczbę całkowitą znak znajdujący się pod indeksem 9. Taką samą operację wykonujemy, tworząc zmienną najpozniejszaDzien, dane pobierając ze zmiennej najpozniejsza.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Linia 5. dla i ← 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 6. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 7. najwczesniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. przerwij.
Linia 10. dla i ← długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek.
Linia 11. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 12. najpozniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 13. przerwij.
Linia 15. najwczesniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 16. najpozniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
funkcja obliczIleMinelo(gatunek)
najwczesniejsza ← ""
najpozniejsza ← ""
dla i ← 0, 1, ..., długość(gatunkiJablka) - 1 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najwczesniejsza ← dataTransakcji[i]
przerwij
dla i ← długość(gatunkiJablka) - 1, długość(gatunkiJablka) - 2, ..., 0 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najpozniejsza ← dataTransakcji[i]
przerwij
najwczesniejszaDzien ← konwertujNaLiczbeCalkowita(najwczesniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najwczesniejsza[9])
najpozniejszaDzien ← konwertujNaLiczbeCalkowita(najpozniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najpozniejsza[9])
Sprawdzamy, czy obie transakcje odbyły się w tym samym miesiącu. W tym celu porównujemy znaki znajdujące się na pozycjach 5 i 6. Jeśli obie pary znaków są identyczne, odejmujemy od najpoznijeszyDzien wartość odczytaną ze zmiennej najwczesniejszyDzien. Jeżeli warunek jest nieprawdziwy, czyli transakcje miały miejsce w rożnych miesiącach, odejmujemy od (czyli liczby dni września) wartość zmiennej najwczesniejszyDzien oraz dodajemy wartość zmiennej najpozniejszyDzien.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Linia 5. dla i ← 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 6. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 7. najwczesniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. przerwij.
Linia 10. dla i ← długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek.
Linia 11. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 12. najpozniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 13. przerwij.
Linia 15. najwczesniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 16. najpozniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 18. wynik ← 0.
Linia 20. jeżeli najwczesniejsza otwórz nawias kwadratowy 5 zamknij nawias kwadratowy znak równości najpozniejsza otwórz nawias kwadratowy 5 zamknij nawias kwadratowy ORAZ najwczesniejsza otwórz nawias kwadratowy 6 zamknij nawias kwadratowy znak równości najpozniejsza otwórz nawias kwadratowy 6 zamknij nawias kwadratowy wykonuj dwukropek.
Linia 21. wynik ← najpozniejszaDzien minus najwczesniejszaDzien.
Linia 22. w przeciwnym przypadku wykonuj dwukropek.
Linia 23. wynik ← 30 minus najwczesniejszaDzien plus najpozniejszaDzien.
funkcja obliczIleMinelo(gatunek)
najwczesniejsza ← ""
najpozniejsza ← ""
dla i ← 0, 1, ..., długość(gatunkiJablka) - 1 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najwczesniejsza ← dataTransakcji[i]
przerwij
dla i ← długość(gatunkiJablka) - 1, długość(gatunkiJablka) - 2, ..., 0 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najpozniejsza ← dataTransakcji[i]
przerwij
najwczesniejszaDzien ← konwertujNaLiczbeCalkowita(najwczesniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najwczesniejsza[9])
najpozniejszaDzien ← konwertujNaLiczbeCalkowita(najpozniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najpozniejsza[9])
wynik ← 0
jeżeli najwczesniejsza[5] = najpozniejsza[5] ORAZ najwczesniejsza[6] = najpozniejsza[6] wykonuj:
wynik ← najpozniejszaDzien - najwczesniejszaDzien
w przeciwnym przypadku wykonuj:
wynik ← 30 - najwczesniejszaDzien + najpozniejszaDzien
Rozwiązanie zadania kończymy, drukując informacje na standardowym wyjściu oraz wywołując funkcję.
Linia 1. funkcja obliczIleMinelo otwórz nawias okrągły gatunek zamknij nawias okrągły.
Linia 2. najwczesniejsza ← cudzysłów cudzysłów.
Linia 3. najpozniejsza ← cudzysłów cudzysłów.
Linia 5. dla i ← 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 6. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 7. najwczesniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. przerwij.
Linia 10. dla i ← długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 1 przecinek długość otwórz nawias okrągły gatunkiJablka zamknij nawias okrągły minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek.
Linia 11. jeżeli gatunekJablka otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości gatunek wykonuj dwukropek.
Linia 12. najpozniejsza ← dataTransakcji otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 13. przerwij.
Linia 15. najwczesniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najwczesniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 16. najpozniejszaDzien ← konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 8 zamknij nawias kwadratowy zamknij nawias okrągły asterysk 10 plus konwertujNaLiczbeCalkowita otwórz nawias okrągły najpozniejsza otwórz nawias kwadratowy 9 zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 18. wynik ← 0.
Linia 20. jeżeli najwczesniejsza otwórz nawias kwadratowy 5 zamknij nawias kwadratowy znak równości najpozniejsza otwórz nawias kwadratowy 5 zamknij nawias kwadratowy ORAZ najwczesniejsza otwórz nawias kwadratowy 6 zamknij nawias kwadratowy znak równości najpozniejsza otwórz nawias kwadratowy 6 zamknij nawias kwadratowy wykonuj dwukropek.
Linia 21. wynik ← najpozniejszaDzien minus najwczesniejszaDzien.
Linia 22. w przeciwnym przypadku wykonuj dwukropek.
Linia 23. wynik ← 30 minus najwczesniejszaDzien plus najpozniejszaDzien.
Linia 25. drukuj otwórz nawias okrągły gatunek plus cudzysłów dwukropek cudzysłów plus wynik zamknij nawias okrągły.
Linia 27. gatunki ← otwórz nawias kwadratowy cudzysłów LIGOL cudzysłów przecinek cudzysłów LOBO cudzysłów przecinek cudzysłów GALA cudzysłów zamknij nawias kwadratowy.
Linia 29. dla i ← 0 kropka kropka kropka długość otwórz nawias okrągły gatunki zamknij nawias okrągły minus 1 wykonuj dwukropek.
Linia 30. obliczIleMinelo otwórz nawias okrągły gatunki otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
funkcja obliczIleMinelo(gatunek)
najwczesniejsza ← ""
najpozniejsza ← ""
dla i ← 0, 1, ..., długość(gatunkiJablka) - 1 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najwczesniejsza ← dataTransakcji[i]
przerwij
dla i ← długość(gatunkiJablka) - 1, długość(gatunkiJablka) - 2, ..., 0 wykonuj:
jeżeli gatunekJablka[i] = gatunek wykonuj:
najpozniejsza ← dataTransakcji[i]
przerwij
najwczesniejszaDzien ← konwertujNaLiczbeCalkowita(najwczesniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najwczesniejsza[9])
najpozniejszaDzien ← konwertujNaLiczbeCalkowita(najpozniejsza[8]) * 10 + konwertujNaLiczbeCalkowita(najpozniejsza[9])
wynik ← 0
jeżeli najwczesniejsza[5] = najpozniejsza[5] ORAZ najwczesniejsza[6] = najpozniejsza[6] wykonuj:
wynik ← najpozniejszaDzien - najwczesniejszaDzien
w przeciwnym przypadku wykonuj:
wynik ← 30 - najwczesniejszaDzien + najpozniejszaDzien
drukuj(gatunek + ": " + wynik)
gatunki ← ["LIGOL", "LOBO", "GALA"]
dla i ← 0 ... długość(gatunki)-1 wykonuj:
obliczIleMinelo(gatunki[i])
Oto poprawny wynik zadania:
R1Ps7wG7Kyeun
Przycisk do pobrania pliku TXT z wynikiem zadania.
międzynarodowa norma określająca format zapisu daty i godziny, zatwierdzona przez Międzynarodową Organizację Normalizacyjną; daty kalendarzowe zapisujemy w kolejności: rok - miesiąc - dzień
zbiór porządkowalny leksykograficznie
zbiór porządkowalny leksykograficznie
zbiór przydatny przy rozwiązywaniu niektórych problemów kombinatorycznych, np. przy generowaniu wszystkich permutacji danego zbioru skończonego, wszystkich podzbiorów takiego zbioru bądź tylko podzbiorów o określonej liczbie elementów, wszystkich macierzy nad danym ciałem skończonym itd.; w zbiorze porządkowalnym leksykograficznie można porównywać cyfry bądź litery ułożone np. w różnej kolejności, niekoniecznie znajdujące się na tej samej pozycji