Przeliczanie na zapis stałoprzecinkowy



Podobne dokumenty
Całkowanie numeryczne - metoda prostokątów

Liczby pierwsze - generacja liczb pierwszych

Miejsca zerowe funkcji - Metoda połowienia

Całkowanie numeryczne - metoda Simpsona

Liczby pierwsze - sito Eratostenesa

Miejsca zerowe funkcji - Metoda Newtona

Ilość cyfr liczby naturalnej

Wyszukiwanie największej spośród czterech liczb. Przykładowe rozwiązanie

binit - binary digit, bigit - binary digit

Palindromy. Przykładowe rozwiązanie

Sortowanie stogowe Heap Sort

Liczby pierwsze - algorytm RSA

Podstawy Programowania Podstawowa składnia języka C++

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Wstęp do programowania

Programowanie komputerowe. Zajęcia 1

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Język programowania PASCAL

Funkcje i instrukcje języka JavaScript

Podstawy Programowania

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Sortowanie przez scalanie Merge Sort

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Operacje arytmetyczne w systemie dwójkowym

wagi cyfry pozycje

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Wstęp do informatyki- wykład 7

SCHEMAT OCENIANIA poziom rozszerzony arkusz II

Podstawy programowania w C++

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Część 4 życie programu

Wstęp do Informatyki

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Liczby całkowite i rzeczywiste

Programowanie - wykład 4

Wstęp do informatyki- wykład 6

Informatyka dla klas I wykresy funkcji

Pascal - wprowadzenie

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy programowania

I - Microsoft Visual Studio C++

do instrukcja while (wyrażenie);

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

C++ wprowadzanie zmiennych

Wstęp do programowania

LibreOffice Calc VBA

for (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Pracownia Komputerowa wykład V

1 Wielokrotne powtarzanie tych samych operacji

Wstęp do programowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Pytania sprawdzające wiedzę z programowania C++

Wstęp do Programowania 2

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

3. Instrukcje warunkowe

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Wprowadzenie do informatyki - ć wiczenia

Struktura pliku projektu Console Application

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Aplikacje WWW - laboratorium

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Aplikacje WWW - laboratorium

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Język C++ zajęcia nr 1

Rekurencja. Przygotowała: Agnieszka Reiter

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

ROZDZIAŁ I. Czym i jak to zrobić, czyli narzędzia i metody.

Ćwiczenia podstawowe, zestaw 5, część 1

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Wstęp do programowania. Różne różności

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Luty 2001 Algorytmy (7) 2000/2001

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Kontrola przebiegu programu

( wykł. dr Marek Piasecki )

Wstęp do informatyki- wykład 9 Funkcje

5. Rekurencja. Przykłady

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy programowania. Wykład: 11. Trochę różnych przykładów. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

while(wyrażenie) instrukcja

Wprowadzenie do programowania w VBA

Transkrypt:

Artykuł pobrano ze strony eioba.pl Przeliczanie na zapis stałoprzecinkowy Nasz problem polega na znalezieniu reprezentacji danej liczby dziesiętnej w docelowym systemie pozycyjnym o podstawie p. Część całkowitą przeliczamy wg poznanych zasad. Znalezienie kolejnych cyfr zapisu części ułamkowej w systemie docelowym jest zadziwiająco proste. Rozpiszmy wzór na część ułamkową liczby: L u = C -1 p -1 + C -2 p -2 + C -3 p -3 +... + C -m+1 p -m+1 + C -m p -m gdzie: L u - wartość części ułamkowej zapisu liczby C i, i = -1,-2,...,-m - kolejne cyfry zapisu części ułamkowej p - podstawa systemu pozycyjnego zapisu liczby stałoprzecinkowej m - liczba cyfr części ułamkowej Pomnóżmy część ułamkową przez podstawę p. Otrzymamy: L u x p = (C -1 p -1 + C -2 p -2 + C -3 p -3 +... + C -m+1 p -m+1 + C -m p -m ) p L u x p = C -1 p -1 p + C -2 p -2 p + C -3 p -3 p +... + C -m+1 p -m+1 p + C -m p -m p L u x p = C -1 p + C -2 p -1 + C -3 p -2 +... + C -m+1 p -m+2 + C -m p -m+1 Co uzyskaliśmy w wyniku? Wynikowa liczba ma przesunięte wszystkie cyfry zapisu o jedną pozycję w lewo. Pierwsza cyfra ułamkowa stała się teraz cyfrą całkowitą. Aby ją wydobyć wystarczy wziąć część całkowitą wyniku mnożenia przez p. Za nową część ułamkową przyjmujemy część ułamkową wyniku mnożenia. Działanie to będziemy kontynuowali dotąd, aż wydobędziemy zadaną ilość cyfr ułamkowych. Znaleźć zapis liczby dziesiętnej 234,13 (10) w systemie czwórkowym z dokładnością do 10 cyfr po przecinku. Rozdzielamy liczbę na część całkowitą i ułamkową: L c = 234, L u = 0,13 Wyznaczamy cyfry zapisu części całkowitej w systemie czwórkowym:

234 div 4 = 58 i reszta 2 58 div 4 = 14 i reszta 2 14 div 4 = 3 i reszta 2 3 div 4 = 0 i reszta 3 - koniec 234 (10) = 3222 (4) Teraz wyznaczamy 10 kolejnych cyfr części ułamkowej 0,13 x 4 = 0,52 - cyfra 0,52 x 4 = 2,08 - cyfra 2 0,08 x 4 = 0,32 - cyfra 0,32 x 4 = 1,28 - cyfra 1 0,28 x 4 = 1,12 - cyfra 1 0,12 x 4 = 0,48 - cyfra 0,48 x 4 = 1,92 - cyfra 1 0,92 x 4 = 3,68 - cyfra 3 0,68 x 4 = 2,72 - cyfra 2 0,72 x 4 = 2,88 - cyfra 2 - koniec, obliczyliśmy zadaną ilość cyfr po przecinku 0,13 (10) = 0,0201101322... (4). Łączymy wyznaczone cyfry części całkowitej i ułamkowej otrzymując wynik: 234,13 (10) = 3222,0201101322... (4). Zwróć uwagę, iż wyznaczając cyfry ułamkowe nie otrzymaliśmy wyniku równego 0. Oznacza to, iż znalezione rozwinięcie zapisu liczby w systemie czwórkowym jest przybliżone - z dokładnością do 10 cyfr ułamkowych systemu czwórkowego. Fakt ten sygnalizujemy w zapisie trzema kropeczkami za ostatnią cyfrą. Dane wejściowe L - liczba rzeczywista, której reprezentację wyznaczamy w systemie docelowym, L R + p - podstawa docelowego systemu pozycyjnego, p N, p 2,3,...,10} m- liczba cyfr części ułamkowej w systemie docelowym, m N Dane wyjściowe Ciąg znaków ASCII reprezentujących zapis liczby L w systemie pozycyjnym o podstawie p. Zmienne pomocnicze i funkcje L c - część całkowita liczby L, L c N L u - część ułamkowa liczby L, L u R + + 0} s - łańcuch znaków, w którym składowane są kolejne cyfry zapisu liczby c - wartość wyliczonej cyfry, c N + 0} znak(kod)- zwraca znak ASCII o podanym kodzie krok 1:Czytaj L, p, m krok 2:L c [L]; L u L - L c ; s "" krok 3: c krok 4: s L c mod p znak(c + 48) + s

krok 5: L c L c div p krok 6:Jeśli L c, idź do kroku 3 krok 7:s s + "," krok 8: Jeśli m, to pisz s i zakończ algorytm. krok 9: L u L u x p krok 10: c [L u ] krok 11: s s + znak(c + 48) krok 12:m m - 1 i idź do kroku 8 Odczytujemy liczbę L, podstawę docelowego systemu pozycyjnego p, na który mamy przeliczyć liczbę L oraz ilość cyfr po przecinku m, które mają się pojawić w rozwinięciu zapisu liczby L w systemie pozycyjnym o podstawie p. Liczbę L rozdzielamy na dwie części - całkowitą L c oraz ułamkową L u. W pierwszej pętli wyznaczamy kolejne cyfry (od tyłu) zapisu części całkowitej L c w docelowym systemie pozycyjnym. Zastosowany tutaj algorytm opisaliśmy w rozdziale o przeliczaniu liczby na inny system pozycyjny. Po wyznaczeniu tych cyfr dodajemy do zapisu znak przecinka. Druga pętla wyznacza m cyfr rozwinięcia części ułamkowej L u. L u mnożymy przez podstawę p. Cyfrę otrzymujemy z części całkowitej wyniku tego iloczynu. Otrzymaną cyfrę zamieniamy na znak ASCII i dopisujemy do zmiennej s. Za nową część ułamkową L u przyjmujemy część ułamkową iloczynu poprzedniej części ułamkowej L u i podstawy p. Zmniejszamy licznik cyfr m o 1. Pętla jest kontynuowana aż do wyzerowania tego licznika. Po zakończeniu obu pętli w zmiennej s mamy kompletny zapis liczby L w systemie pozycyjnym o podstawie p. Wypisujemy zawartość tej zmiennej i kończymy algorytm. Zwróć uwagę, iż dla prostoty algorytm nie sprawdza poprawności wprowadzonych przez użytkownika danych. Zaproponuj odpowiednią modyfikację algorytmu, aby takie sprawdzenie było wykonywane. Szczególnie niebezpieczna jest sytuacja, gdy podstawa docelowego systemu pozycyjnego p otrzyma wartość 1. Wtedy pętla pierwsza stanie się pętlą nieskończoną (dlaczego?) i program po prostu się zawiesi. DLA GENIUSZA

Poniższe, przykładowe programy są praktyczną realizacją omawianego w tym rozdziale algorytmu. Zapewne można je napisać bardziej efektywnie. To już twoje zadanie. Dokładny opis stosowanych środowisk programowania znajdziesz we wstępie. Programy przed opublikowaniem w serwisie edukacyjnym zostały dokładnie przetestowane. Jeśli jednak znajdziesz jakąś usterkę (co zawsze może się zdarzyć), to prześlij o niej informację do autora. Pozwoli to ulepszyć nasze artykuły. Będziemy Ci za to wdzięczni. Na podstawie algorytmu tworzymy programy przeliczające liczbę w zapisie dziesiętnym na zapis w systemie pozycyjnym o podstawie od 2 do 10. Przy wprowadzaniu liczby zamiast przecinka używaj kropki do oddzielenia części całkowitej od ułamkowej - wymaga tego biblioteka we/wy języka Pascal. Wydruk z uruchomionego programu Przeliczanie stałoprzecinkowej liczby dziesiętnej na zapis w systemie pozycyjnym o podstawie 2...10 ------------------------------------------------- (C)2005 mgr Jerzy Wałaszek I LO Tarnów Podaj liczbę L = 17.127 Podaj p (2..10) = 2 Cyfry ułamkowe = 10 17,127(10) = 10001,0010000010(2) KONIEC. Naciśnij dowolny klawisz... Microsoft Visual Basic 2005 Express Edition

Borland Delphi 7.0 Personal Edition // Przeliczanie dziesiętnej liczby stałoprzecinkowej // na zapis w systemie pozycyjnym o podstawie 2...10 // (C)2005 mgr Jerzy Wałaszek // I Liceum Ogólnokształcące // im. K. Brodzińskiego // w Tarnowie program pldz; $APPTYPE CONSOLE} var s : string; L,Lu : real; p,c,lc,m : cardinal; begin writeln('przeliczanie staloprzecinkowej liczby dziesietnej'); writeln('na zapis w systemie pozycyjnym o podstawie 2...10'); writeln('-------------------------------------------------'); writeln('(c)2005 mgr Jerzy Walaszek I LO Tarnow'); write('podaj liczbe L = '); readln(l); write('podaj p (2..10) = '); readln(p); write('cyfry ulamkowe = '); readln(m); Lc := trunc(l); Lu := L - Lc; s := ''; repeat c := Lc mod p; s := char(c + 48) + s; Lc := Lc div p; until Lc = ; s := s + ','; while m > do begin Lu := Lu * p; c := trunc(lu); s := s + char(c + 48); Lu := Lu - c; dec(m); end; writeln(l::10,'(10) = ',s,'(',p,')'); writeln('nacisnij klawisz ENTER...'); readln; end.

Borland C++ Builder 6.0 Personal Edition // Przeliczanie dziesiętnej liczby stałoprzecinkowej // na zapis w systemie pozycyjnym o podstawie 2...10 // (C)2005 mgr Jerzy Wałaszek // I Liceum Ogólnokształcące // im. K. Brodzińskiego // w Tarnowie #include <cmath> #include <iostream> #include <iomanip> #include <string> using namespace std; main() string s; double L,Lu; unsigned p,c,lc,m; char z[1]; cout.precision(10); // 10 cyfr po przecinku cout.setf(ios::fixed); // format stałoprzecinkowy cout << "Przeliczanie staloprzecinkowej liczby dziesietnej\n" "na zapis w systemie pozycyjnym o podstawie 2...10\n" "-------------------------------------------------\n" "(C)2005 mgr Jerzy Walaszek I LO Tarnow\n\n" "Podaj liczbe L = "; cin >> L; cout << "\npodaj p (2..10) = "; cin >> p; cout << "\ncyfry ulamkowe = "; cin >> m; cout << endl; Lc = (unsigned) floor(l); Lu = L - Lc; s = ""; do c = Lc % p; s = (char) (c + 48) + s; Lc = Lc / p; } while(lc); s += ","; while(m) Lu *= p; c = (unsigned) floor(lu); s += (char) (c + 48); Lu -= c; m--; }; cout << L << "(10) = " << s << "(" << p << ")\n\nnacisnij ENTER...\n"; cin.getline(z,1); cin.getline(z,1); }

Microsoft Visual Basic 2005 Express Edition ' Przeliczanie dziesiętnej liczby stałoprzecinkowej ' na zapis w systemie pozycyjnym o podstawie 2...10 '-------------------------------------------------- ' (C)2005 mgr Jerzy Wałaszek ' I Liceum Ogólnokształcące ' im. K. Brodzińskiego ' w Tarnowie '-------------------------------------------------- Option Explicit On Module Module1 Sub Main() Dim s As String Dim L, Lu As Double Dim p, c, Lc, m As UInteger Console.WriteLine("Przeliczanie stałoprzecinkowej liczby dziesiętnej") Console.WriteLine("na zapis w systemie pozycyjnym o podstawie 2...10") Console.WriteLine("-------------------------------------------------") Console.WriteLine("(C)2005 mgr Jerzy Wałaszek I LO Tarnów") Console.Write("Podaj liczbę L = ") : L = Val(Console.ReadLine) Console.Write("Podaj p (2..10) = ") : p = Val(Console.ReadLine) Console.Write("Cyfry ułamkowe = ") : m = Val(Console.ReadLine) Lc = Int(L) : Lu = L - Lc s = "" Do c = Lc Mod p s = Chr(c + 48) + s Lc \= p Loop Until Lc = s += "," While m > Lu *= p c = Int(Lu) s += Chr(c + 48) Lu -= c m -= 1 End While Console.WriteLine("0}(10) = 1}(2})", L, s, p) Console.WriteLine("KONIEC. Naciśnij dowolny klawisz...") Console.ReadLine() End Sub End Module Python # -*- coding: cp1250 -*- # Przeliczanie dziesiętnej liczby stałoprzecinkowej # na zapis w systemie pozycyjnym o podstawie 2...10 #-------------------------------------------------- # (C)2005 mgr Jerzy Wałaszek # I Liceum Ogólnokształcące # im. K. Brodzińskiego # w Tarnowie #-------------------------------------------------- import math "Przeliczanie staloprzecinkowej liczby dziesietnej" "na zapis w systemie pozycyjnym o podstawie 2...10" "-------------------------------------------------" "(C)2005 mgr Jerzy Walaszek I LO Tarnow" L = float(raw_input("podaj liczbe L = ")) p = int(raw_input("podaj p (2..10) = ")) m = int(raw_input("cyfry ulamkowe = ")) Lc = int(math.floor(l)) Lu = L - Lc s = "" while Lc: c = Lc % p s = chr(c + 48) + s Lc //= p if s == "": s = "0" s = s + "," while m: Lu *= p c = int(math.floor(lu)) s += chr(c + 48) Lu -= c m -= 1 "%f(10) = %s(%d)" % (L, s, p) raw_input("nacisnij klawisz ENTER...")

JavaScript <html> <head> </head> <body> <div align="center"> <form style="border-right: #ff9933 1px outset; PADDING-RIGHT: 4px; BORDER-TOP: #ff9933 1px outset; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: #ff9933 1px outset; PADDING-TOP: 1px; BORDER-BOTTOM: #ff9933 1px outset; BACKGROUND-COLOR: #ffcc66" name="frmprzelicz"> <h3 id="data_out" style="text-align: center"> Przeliczanie stałoprzecinkowej liczby dziesiętnej<br> na zapis w systemie pozycyjnym o podstawie 2...10 </h3> <p style="text-align: center"> (C)2005 mgr Jerzy Wałaszek I LO w Tarnowie </p> <hr> <div align="center"> <table border="0" cellpadding="4" style="border-collapse: collapse"> <tr> <td align="right">liczba =</td> <td> <input value="32.7125" name="inp_l" size="20" style="text-align: right"> </td> </tr> <tr> <td align="right">podstawa (2...10) =</td> <td> <input value="8" name="inp_p" size="20" style="text-align: right"> </td> </tr> <tr> <td align="right">ilość cyfr po przecinku =</td> <td> <input type="text" name="inp_m" size="20" value="10" style="text-align: right"> </td> </tr> </table> </div> <p style="text-align: center"> <input onclick="main();" type="button" value="przelicz" name="b1"> </p> <p id="out_t" style="text-align: center">...</p> </form> <script language=javascript> // Przeliczanie dziesiętnej liczby stałoprzecinkowej // na zapis w systemie pozycyjnym o podstawie 2...10 // (C)2005 mgr Jerzy Wałaszek // I Liceum Ogólnokształcące // im. K. Brodzińskiego // w Tarnowie function main() var s,t,l,lu,p,c,lc,m; L = parsefloat(document.frmprzelicz.inp_l.value); p = parseint(document.frmprzelicz.inp_p.value); m = parseint(document.frmprzelicz.inp_m.value); if(isnan(l) isnan(p) isnan(m)) t = "<font color=red><b>złe dane</b></font>"; else Lc = Math.floor(L); Lu = L - Lc; s = ""; do c = Lc % p; s = String.fromCharCode(c + 48) + s; Lc = Math.floor(Lc / p); } while(lc); s += ","; while(m) Lu *= p; c = Math.floor(Lu); s += String.fromCharCode(c + 48); Lu -= c; m--; }; t = L + "<sub>(10)</sub> = " + s + "<sub>(" + p + ")</sub>"; }; document.getelementbyid("out_t").innerhtml = t; } </script> </div> </body> </html>

Podany algorytm jest niejednorodny. Czy można go przekształcić tak, aby cała liczba stałoprzecinkowa była wyznaczana w jednym przebiegu bez podziału na część całkowitą i ułamkową? Czy potrafisz ocenić wady takiego rozwiązania? Dokument ten rozpowszechniany jest zgodnie z zasadami licencji GNU Free Documentation License. Autor: mgr Jerzy Wałaszek Przedruk ze strony: http://www.i-lo.tarnow.pl/edu/inf/alg/num/index.html Artykuł pobrano ze strony eioba.pl