Zadanie 1. Translacja binarna

Grupa naukowców odebrała tajemniczy sygnał pochodzący z planety Guwbu. Po wnikliwej analizie doszli do wniosku, że sygnał zawiera współrzędne wybranych miast znajdujących się na powierzchni planety oraz ich numery porządkowe. Numery porządkowe, długości oraz szerokości geograficzne zostały zapisane w różnych systemach liczbowych. Długości oraz szerokości zostały zaokrąglone do stopni.

W pliku sygnal.txt zapisano 100 zestawów danych składających się kolejno z liczby porządkowej, długości i szerokości geograficznej danego miasta. Każdy zestaw danych zapisany jest w osobnej linii, a poszczególne informacje o mieście oddzielone są od siebie pojedynczym znakiem odstępu. Liczby zapisane są w postaci łańcuchów znaków. Numery porządkowe miast zapisane są w systemie piątkowym, długość geograficzna w systemie binarnym, a szerokość geograficzna w systemie siódemkowym.

R15IC358ANoXd

Przycisk służy do pobrania pliku txt.

Plik TXT o rozmiarze 1.68 KB w języku polskim

Napisz program, który pozwoli naukowcom na konwersjękonwersja systemów liczbowychkonwersję danych zawartych w odebranym przez nich sygnale do systemu dziesiętnego i zapisze je do pliku translacja.txt w kolejności, w jakiej znajdowały się w pliku źródłowym.

Do oceny oddajesz:

  • plik translacja.txt z odpowiedzią (przekonwertowanymi na system dziesiętny danymi z pliku sygnal.txt; dane o poszczególnych miastach powinny być zapisane w osobnych wierszach w kolejności: numer porządkowy, długość geograficzna, szerokość geograficzna; dane powinny być oddzielone od siebie pojedynczym znakiem odstępu),

  • plik(i) z komputerową realizacją zadania (kodem programu).

Ważne!

Przyjmujemy założenie, że wszystkie liczby występujące w danych do zadania są liczbami nieujemnymi.

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w wybranym języku programowania (C++, Java lub Python).  Zadbaj o prawidłowe wczytanie i zapisanie danych z/do pliku tekstowego. Odpowiedź do zadania znajdziesz w pliku umieszczonym pod omówieniem pseudokodu.

Rozwiązanie

Ważne!

W rozwiązaniu zdefiniowaliśmy funkcję do_liczby(znak). Ma ona swoje wbudowane w języki programowania odpowiedniki.

Funkcja doASCII:

Język C++

Linia 1. int otwórz nawias okrągły c zamknij nawias okrągły.

Język Java

Linia 1. otwórz nawias okrągły int zamknij nawias okrągły znak.

Język Python

Linia 1. int otwórz nawias okrągły znak zamknij nawias okrągły.

Rozwiązanie zadania przedstawimy w postaci pseudokodu, ponieważ na egzaminie maturalnym można korzystać z wybranego języka programowania: C++, Java lub Python.

W rozwiązaniu wykorzystamy dwie funkcje. Pierwsza z nich zapisze liczby całkowite w typie liczbowym (ponieważ liczby zapisano w postaci łańcuchów znaków). Druga dokona konwersji liczby zapisanej w dowolnym systemie na liczbę w systemie dziesiętnym.

Do rozwiązania problemu wykorzystamy schemat Hornera.

Zaczniemy od funkcji przetwarzającej znak liczby na liczbę. Nazwiemy ją do_liczby.

By dokonać przekształcenia, wykorzystamy operację odejmowania od kodu ASCII przetwarzanego znaku kodu ASCII znaku 0. W następnym kroku zwrócimy wynik – liczbę całkowitą (operacja pobrania kodu ASCII znaku będzie w kodzie oznaczona funkcją ascii()).

Przykład takiej funkcji:

Linia 1. funkcja do podkreślnik liczby otwórz nawias okrągły znak zamknij nawias okrągły. Linia 2. zwróć ascii otwórz nawias okrągły znak zamknij nawias okrągły minus ascii otwórz nawias okrągły cudzysłów 0 cudzysłów zamknij nawias okrągły.

Zapiszmy funkcję konwertuj, która pozwoli na konwersję liczby zapisanej w dowolnym systemie liczbowym na liczbę w systemie dziesiętnym. Funkcja ta będzie miała dwa parametry – podstawę systemu przechowywaną w zmiennej podstawa (typu int) oraz liczbę, którą chcemy przekształcić, przechowywaną w zmiennej liczba (typu string).

Linia 1. funkcja konwertuj otwórz nawias okrągły podstawa przecinek liczba zamknij nawias okrągły.

Stwórzmy zmienną pomocniczą wynik – posłuży ona do przechowywania wyniku konwersji.

Zmienną wynik zainicjalizujemy wynikiem wywołania funkcji do_liczby dla pierwszego znaku liczby (o indeksie równym 0).

Linia 1. funkcja konwertuj otwórz nawias okrągły podstawa przecinek liczba zamknij nawias okrągły. Linia 2. wynik ← do podkreślnik liczby otwórz nawias okrągły liczba otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły.

Następnie przetwarzamy ciąg znaków reprezentujący liczbę w danym systemie liczbowym. Zaczynamy od pierwszego znaku (najbardziej znaczącego bitu).

Obliczamy nową wartość zmiennej wynik poprzez pomnożenie aktualnej wartości zmiennej wynik przez wartość zmiennej podstawa i dodanie wartości kodu ASCII analizowanego znaku.

Po przetworzeniu wszystkich znaków zwracamy końcową wartość zmiennej wynik.

Linia 1. funkcja konwertuj otwórz nawias okrągły podstawa przecinek liczba zamknij nawias okrągły. Linia 2. wynik ← do podkreślnik liczby otwórz nawias okrągły liczba otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 3. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek dlugosc otwórz nawias okrągły liczba zamknij nawias okrągły minus 1 wykonuj. Linia 4. wynik ← wynik asterysk podstawa plus do podkreślnik liczby otwórz nawias okrągły liczba otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 5. zwróć wynik.
Ważne!

Zwróć uwagę, że w funkcji konwertuj zaczynamy iterację od indeksu 1, ponieważ pierwszy znak jest już uwzględniony w początkowej wartości zmiennej wynik.

W ten sposób zapisaliśmy dwie funkcje, które będą nam potrzebne do konwersji sygnału.

Wczytajmy dane z pliku.

Otwieramy plik sygnal.txt.

Wczytujemy dane z pliku sygnal.txt do tablicy liczby, po czym otwieramy plik translacja.txt.

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów.

Następnie zapisujemy pętlę dla, która będzie iterować przez kolejne wiersze tablicy liczby.

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj.

W pętli tworzymy trzy zmienne – numer, dlugosc oraz szerokosc. Będą one przechowywać kolejno numer porządkowy danego miasta, jego długość geograficzną oraz jego szerokość geograficzną.

Następnie zmiennym będziemy przypisywać wartość wywołania funkcji konwertuj dla odpowiednich danych.

Zmiennej numer przypisujemy wartość wywołania funkcji konwertuj dla podstawy systemu o wartości 5 oraz elementu tablicy liczby, który znajduje się w i-tym wierszu oraz pierwszej kolumnie (o zerowym indeksie).

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj. Linia 6. numer ← konwertuj otwórz nawias okrągły 5 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły.

Zmiennej dlugosc przypisujemy wartość wywołania funkcji konwertuj dla podstawy systemu o wartości 2 oraz elementu tablicy liczby, który znajduje się w i-tym wierszu oraz drugiej kolumnie (o indeksie równym 1).

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj. Linia 6. numer ← konwertuj otwórz nawias okrągły 5 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 7. dlugosc ← konwertuj otwórz nawias okrągły 2 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły.

Zmiennej szerokosc przypisujemy wartość wywołania funkcji konwertuj dla podstawy systemu o wartości 7 oraz elementu tablicy liczby, który znajduje się w i-tym wierszu oraz trzeciej kolumnie (o indeksie równym 2).

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj. Linia 6. numer ← konwertuj otwórz nawias okrągły 5 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 7. dlugosc ← konwertuj otwórz nawias okrągły 2 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. szerokosc ← konwertuj otwórz nawias okrągły 7 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy zamknij nawias okrągły.

Wartości zmiennych numer, dlugosc oraz szerokosc (w tej kolejności) dopisujemy do pliku translacja.txt i zamykamy pliki.

Linia 1. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 2. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 3. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj. Linia 6. numer ← konwertuj otwórz nawias okrągły 5 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 7. dlugosc ← konwertuj otwórz nawias okrągły 2 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. szerokosc ← konwertuj otwórz nawias okrągły 7 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. dopisz numer przecinek dlugosc przecinek szerokosc do pliku cudzysłów translacja kropka txt cudzysłów. Linia 11. zamknij cudzysłów sygnal kropka txt cudzysłów. Linia 12. zamknij cudzysłów translacja kropka txt cudzysłów.

Kompletny kod rozwiązania:

Linia 1. funkcja do podkreślnik liczby otwórz nawias okrągły znak zamknij nawias okrągły. Linia 2. zwróć ascii otwórz nawias okrągły znak zamknij nawias okrągły minus ascii otwórz nawias okrągły cudzysłów 0 cudzysłów zamknij nawias okrągły. Linia 4. funkcja konwertuj otwórz nawias okrągły podstawa przecinek liczba zamknij nawias okrągły. Linia 5. wynik ← do podkreślnik liczby otwórz nawias okrągły liczba otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek dlugosc otwórz nawias okrągły liczba zamknij nawias okrągły minus 1 wykonuj. Linia 7. wynik ← wynik asterysk podstawa plus do podkreślnik liczby otwórz nawias okrągły liczba otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. zwróć wynik. Linia 10. otwórz plik cudzysłów sygnal kropka txt cudzysłów. Linia 11. liczby otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów sygnal kropka txt cudzysłów. Linia 12. otwórz plik cudzysłów translacja kropka txt cudzysłów. Linia 14. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 wykonuj. Linia 15. numer ← konwertuj otwórz nawias okrągły 5 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 16. dlugosc ← konwertuj otwórz nawias okrągły 2 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 17. szerokosc ← konwertuj otwórz nawias okrągły 7 przecinek liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 18. dopisz numer przecinek dlugosc przecinek szerokosc do pliku cudzysłów translacja kropka txt cudzysłów. Linia 20. zamknij cudzysłów sygnal kropka txt cudzysłów. Linia 21. zamknij cudzysłów translacja kropka txt cudzysłów.

Odpowiedź do zadania

Odpowiedź do zadania dla danych znajdujących się w pliku sygnal.txt

Ru9CptXxEk0ea

Przycisk służy do pobrania pliku txt.

Plik TXT o rozmiarze 1.09 KB w języku polskim

Słownik

konwersja systemów liczbowych
konwersja systemów liczbowych

zamiana sposobu zapisywania liczby; przekształcenie zapisu liczby z jednego systemu liczbowego do zapisu w innym systemie liczbowym (np.: 1111Indeks dolny (2) → EIndeks dolny (16))