[C++] Operacje na ułamku właściwym


(Jooooooozek) #1

Czesc,

mam problem z operacjami na ułamku właściwym. Mam takie zadanie do wykonania:

Lecz moje próby spełzły na niczym... Miałem taki pomysł:

#include using namespace std;

([alex]) #2
cout<<"0.";fabs(p)1E-10)  {   p*=q;   int x=p;   p-=x;   cout(char)(x+'0'); // jeżeli q jest większe niż 10 to tu trza warunek dawać  }[/code]

(Jooooooozek) #3

Ale zaraz zaraz, jak mam zdefiniować q ? Mam mu nadawać jakąś wartość ?


([alex]) #4

Jeżeli masz ułamek 0.25 to q może mieć wartość 2 lub 4 lub 6 lub 8 lub 10 itd.

dla q=2 wynik: 0.01

dla q=4 wynik: 0.1

Chyba jasne że tego q nie wyliczysz i nie zgadniesz.


(Jooooooozek) #5

No tak, ale tam dałeś linijkę:

p*=q;

I to q musi mieć jakąś wartość na początku...

Więc może spytam inaczej - co robi Twój kod ? :slight_smile:


(Drobok) #6

Pomyśl przeanalizuj, a nie czekaj na gotowca :P, gdybym zrozumiał treść zadania to bym ci dość doradził a tak ;/

wg mnie wychodzi

x

p=-----

   q^z

gdzie q jest mniejsze od 10


(Jooooooozek) #7

To jest proste o ile user poda dwie osobne liczby - licznik i mianownik. Wtedy to mogę sam napisać. Ale nie wiem jak to zrobić kiedy user poda ułamek właściwy w postaci jednej liczby...

EDIT:

Tutaj pewnie chodzi o układ w sensie system liczbowy... Na pewno tak, bo w poprzednich moich zadaniach też występuje takie określenie na system liczbowy, a tam właśnie o niego chodzi.

No ale to dalej nie zmienia kwestii jak wyciągnąć mianownik, jeśli user poda 1 liczbę, zamiast osobno licznika i mianownika...


(Drobok) #8

Czyli np user poda 6/7 a ty chcesz cyferki z tego ? Przeleć for cały ciąg i zmień zmienną na inną jak natrafi na slasha.

for(int i=0;i<nazwa.size();i++)

(Jooooooozek) #9

Nie, treść zadania brzmi:

I teraz nie wiem czy user ma podać dwie liczby - licznik i mianownik czy tylko jedną. W pierwszym przypadku mianownik będę miał podany na tacy, a w drugim... to nie wiem jak go wyciągnę - to rozwiązanie zaprezentował pewnie [alex] tylko, nie wiem na jaką wartość mam zainicjalizować zmienną q.

W każdym razie, w pierwszym przypadku user poda np. 5 i 25, a w drugim 0.2 (5 podzielone na 25 = 0.2).

EDIT:

Odnośnie mojego poprzedniego postu - da się łatwo zamienić ułamek (liczbę p) na inny system liczbowy ?


(Drobok) #10

Pierwsze pytanie 1, pomyśl nie możesz dać 0 bo cały czas wynikiem będzie 0 ...

Drugie jak 0.2 to normalny ułamek, najprościej będzie go zapisać w postaci x=2 y=10 a potem pętlą skracać do oporu.


([alex]) #11

Mój kod dosłownie realizuje podane zadanie.

Jak już pokazałem w poprzednim poście na przykładzie ułamku 0.25 nie da się z niego określić tego q.

ponieważ dla tego ułamku q może być: 2, 4, 6 lub 8

Więc rzecz jasna że to q musi być podane lub zadeklarowane jako stała.


(Jooooooozek) #12

OK, dzięki za pomoc.

Odnośnie zamiany ułamka w systemie dziesiętnym na inny (< 10), to tutaj jest mój kod, może komuś się przyda:

void foo(float fraction, const int& system)

([alex]) #13

j00zek , a sprawdzisz co wyda twoja wersja przy wywołaniu:

foo(0.1,10);

Czyli nie działa poprawnie, dla tego jednak polecam mój kod.

... const int& system) - tylko wydłuża operacji z udziałem tej zmiennej, wystarczy ... int system)

int digit; - chyba piszesz w C++ więc deklaruj zmienne tam gdzie są potrzebne, anie na początku jak w C.

fraction -= static_cast(fraction); - nie jest potrzebne bo w zadaniu napisano że ułamek jest właściwy, obrona w stylu że na wszelki wypadek sprawdzić jest bez sensu bo nie sprawdzasz czy system jest w granicach 2..10

while(fraction != 0) - właśnie to powoduje że nie działa poprawnie

digit = static_cast(fraction); // poco tak komplikować wystarczy digit=fraction;

Po usunięciu wszystkich błędów i niedogodności otrzymasz dokładnie ten kod co ja podałem.


(Jooooooozek) #14

Twój kod z q = 2 i p = 0.75 nie wyświetla nic, zamiast poprawnej odpowiedzi 0.0101 (no wyświetla tylko 0.)

Zakładając, że q to nr systemu liczbowego, a zakładam że o to właśnie chodziło.

A tak z ciekawości - dlaczego ? Przecież to referencja...


([alex]) #15

Co do mojego kodu, rzeczywiście odwrotny warunek w while był (poprawiłem).

Referencja to jest to samo co wskaźnik w bebechach kodu, tylko dla programisty inaczej obsługiwany.