Sortowanie przez wstawianie – przykładowe zadania maturalne
Zadanie 1. Słówka
Pani Kasia jest nauczycielką języka polskiego. W ramach urozmaicenia zajęć wymyśliła konkurs odgadywania słów, w których pozamieniano miejscami litery. Ze względu na dużą liczbę słów poprosiła Maćka, aby napisał program, który przygotuje wybrane przez nią słówka na konkurs.
Dany jest plik słowa.txt, który zawiera 30 słów. Każdy wyraz zapisany jest w osobnej linii i składa się wyłącznie z małych liter. Napisz program, który w każdym z wyrazów z pliku ułoży liter w kolejności odwrotnej niż porządek alfabetyczny, a następnie wypisze zmienione słowa (każde w nowej linii).
Plik słowa.txt:
RpHXo6L18PxVV
Przykład 1
Dla słowa sortowanie program powinien zwrócić ciąg znaków wtsrooniea.
Do oceny oddajesz:
plik wyniki.txt z odpowiedzią (plik tekstowy zawierający w każdej linii odpowiadający wyraz z pliku słowa.txt o literach posortowanych w kolejności odwrotnej niż porządek alfabetyczny)
plik(i) z komputerową realizacją zadania (kodem programu)
Praca domowa
Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python. Odpowiedź do zadania znajdziesz po omówieniu rozwiązania zapisanego za pomocą pseudokodu.
Rozwiązanie:
Rozwiązanie przedstawimy w postaci pseudokodu.
Wczytujemy dane z pliku. SortowaniesortowanieSortowanie dla każdego z wyrazów będzie odbywało się oddzielnie. Aby skorzystać z sortowania przez wstawianie, potrzebujemy zmiennych przechowujących aktualny znak oraz indeks, pod który dany znak wstawimy:
Linia 1. slowa otwórz nawias kwadratowy 1 kropka kropka 30 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów słowa kropka txt cudzysłów.
Linia 3. aktualnyZnak ← cudzysłów cudzysłów.
Linia 4. aktualnyIndeks ← 0.
Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 30 wykonuj dwukropek.
W każdym przypadku sortujemy nierosnąco, zatem będziemy porównywać element z jego sąsiadem o niższym indeksie. W związku z tym zaczynamy od znaku z indeksem równym 2 (wyrazy indeksowane są od 1). Korzystamy z funkcji długość() przyjmującej łańcuch znaków i zwracającej jego długość. Jest ona dostępna w każdym języku programowania dostępnym na maturze:
Linia 1. slowa otwórz nawias kwadratowy 1 kropka kropka 30 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów słowa kropka txt cudzysłów.
Linia 3. aktualnyZnak ← cudzysłów cudzysłów.
Linia 4. aktualnyIndeks ← 0.
Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 30 wykonuj dwukropek.
Linia 7. slowo ← slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. dla j znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły slowo zamknij nawias okrągły wykonuj dwukropek.
Linia 9. aktualnyZnak ← slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 10. aktualnyIndeks ← j.
Następnie porównujemy aktualnyZnak z jego wcześniejszymi sąsiadami i dopóki jest on od nich większy, przesuwamy sąsiadów w prawo. Sortujemy jednak znaki, a nie liczby. Korzystamy zatem z funkcji ascii(), która zwraca kod ASCIIkod asciikod ASCII dla znaku podanego jako argument i umożliwia porównywanie liter. Jej działanie można zaimplementować w każdym dostępnym języku i jest to zadanie ucznia:
Linia 1. slowa otwórz nawias kwadratowy 1 kropka kropka 30 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów słowa kropka txt cudzysłów.
Linia 3. aktualnyZnak ← cudzysłów cudzysłów.
Linia 4. aktualnyIndeks ← 0.
Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 30 wykonuj dwukropek.
Linia 7. slowo ← slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. dla j znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły slowo zamknij nawias okrągły wykonuj dwukropek.
Linia 9. aktualnyZnak ← slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 10. aktualnyIndeks ← j.
Linia 12. dopóki aktualnyIndeks zamknij nawias ostrokątny 0 oraz ascii otwórz nawias okrągły aktualnyZnak zamknij nawias okrągły zamknij nawias ostrokątny ascii otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy zamknij nawias okrągły wykonuj dwukropek.
Linia 13. slowo otwórz nawias kwadratowy aktualnyIndeks zamknij nawias kwadratowy ← slowo otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy.
Linia 14. aktualnyIndeks ← aktualnyIndeks minus 1.
Po zakończeniu pętli zmienna aktualnyIndeks zawiera właściwą pozycję dla porównywanego znaku. Wstawiamy go zatem z powrotem do tablicy.
Linia 1. slowa otwórz nawias kwadratowy 1 kropka kropka 30 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów słowa kropka txt cudzysłów.
Linia 3. aktualnyZnak ← cudzysłów cudzysłów.
Linia 4. aktualnyIndeks ← 0.
Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 30 wykonuj dwukropek.
Linia 7. slowo ← slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. dla j znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły slowo zamknij nawias okrągły wykonuj dwukropek.
Linia 9. aktualnyZnak ← slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 10. aktualnyIndeks ← j.
Linia 12. dopóki aktualnyIndeks zamknij nawias ostrokątny 0 oraz ascii otwórz nawias okrągły aktualnyZnak zamknij nawias okrągły zamknij nawias ostrokątny ascii otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy zamknij nawias okrągły wykonuj dwukropek.
Linia 13. slowo otwórz nawias kwadratowy aktualnyIndeks zamknij nawias kwadratowy ← slowo otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy.
Linia 14. aktualnyIndeks ← aktualnyIndeks minus 1.
Linia 16. slowo otwórz nawias kwadratowy aktualnyIndeks zamknij nawias kwadratowy ← aktualnyZnak.
Na koniec zapisujemy posortowane słowo do pliku i kontynuujemy algorytm dla kolejnych wyrazów z tablicy.
Linia 1. slowa otwórz nawias kwadratowy 1 kropka kropka 30 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów słowa kropka txt cudzysłów.
Linia 3. aktualnyZnak ← cudzysłów cudzysłów.
Linia 4. aktualnyIndeks ← 0.
Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 30 wykonuj dwukropek.
Linia 7. slowo ← slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. dla j znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły slowo zamknij nawias okrągły wykonuj dwukropek.
Linia 9. aktualnyZnak ← slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 10. aktualnyIndeks ← j.
Linia 12. dopóki aktualnyIndeks zamknij nawias ostrokątny 0 oraz ascii otwórz nawias okrągły aktualnyZnak zamknij nawias okrągły zamknij nawias ostrokątny ascii otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy zamknij nawias okrągły wykonuj dwukropek.
Linia 13. slowo otwórz nawias kwadratowy aktualnyIndeks zamknij nawias kwadratowy ← slowo otwórz nawias kwadratowy aktualnyIndeks minus 1 zamknij nawias kwadratowy.
Linia 14. aktualnyIndeks ← aktualnyIndeks minus 1.
Linia 16. slowo otwórz nawias kwadratowy aktualnyIndeks zamknij nawias kwadratowy ← aktualnyZnak.
Linia 18. dopisz slowo do pliku cudzysłów wyniki kropka txt cudzysłów.
Odpowiedź do zadania
Plik wyniki.txt:
Rl71vI19IF0Di
Słownik
kod ascii
kod ascii
siedmiobitowy system używany we współczesnych komputerach oraz sieciach komputerowych, a także innych urządzeniach wyposażonych w mikroprocesor; przyporządkowuje liczbom z zakresu 0−127: litery alfabetu łacińskiego języka angielskiego, cyfry, znaki przestankowe i inne symbole oraz polecenia sterujące, np. litera „a” jest kodowana jako liczba 97, a znak spacji jest kodowany jako 32