[pascal] Konwertowanie ułamków dziesiętnych na inny system

0

Witam,
mam program do konwertowania liczby dziesiętnej na dowolny system. Ale robi tylko to na całkowitych.
[code]program NaDowolnySystemm;
uses
crt;
const
SYSTEmM='0123456789ABCDEFGHIJKLMNOPRSTUWXYZ';
var
wynik:string;
NaSystem,JakaLiczba:integer;
begin
repeat
write('Na jaki system chcesz zamienic (max 34): ');
readln(NaSystem);
until NaSystem in [2..34];
write('Podaj jaka liczbe dzesietna chcesz zamienic: ');
readln(JakaLiczba);
repeat
wynik:=SYSTEmM[JakaLiczba mod NaSystem+1] + wynik;
JakaLiczba:=JakaLiczba div NaSystem;
until JakaLiczba=0;
writeln('Wynik: ',wynik);
readln;
end.[/code]

Czy ktoś wie jak wstawić do tego i w którym miejscu konwertowanie ułamków?

Czy coś takiego dobrze wykombinowałem?
[code]repeat
wynik:=SYSTEmM[JakaLiczba mod (Pow(NaSystem,-1):8:7)] + wynik;
JakaLiczba:=JakaLiczba div NaSystem;
until JakaLiczba=0;
writeln('Wynik: ',wynik);
readln;[/code]
Jak to kompiluje to mi nie rozpoznaje tego Pow, a to przecież jest potęga.

albo takie coś:

[code]repeat
if Jakaliczba / Nasystem >= 1
then n:=Jakaliczba div Nasystem
else n:=-(Jakaliczba div Nasystem);
repeat
if Jakaliczba:=Jakaliczba mod (Pow(Nasystem :n))=1 (tu nie wiem jak zrobić z tym n żeby się zmniejszało przy następnym kroku, bo n to ma być ta potega np 2-1, 2-2, itd)
then Jakaliczba - Pow(Nasystem:n)
else Jakaliczba:=Jakaliczba mod (Pow(nasystem:n-1))[/code]

Można coś z tego zrobić?

0
function realtostr(x:real;baza,cyfry:integer):string;
begin
if cyfry<1 then result:=''
else result:=char(byte('0')+trunc(x*baza))+realtostr(frac(x*baza),baza,cyfry-1);
end;
0

w pascalu nie ma result. Nie chce się skompilować.

Dlatego zmieniłem to na realtostr i kod wygląda tak:

program NaDowolnySystemm;
uses
  crt;
const
SYSTEmM='0123456789ABCDEFGHIJKLMNOPRSTUWXYZ';
var
wynik:string;
NaSystem,JakaLiczba:integer;


function realtostr(x:real;baza,cyfry:integer):string;
begin
if cyfry<1 then realtostr:=''
else realtostr:=char(byte('0')+trunc(x*baza))+realtostr(frac(x*baza),baza,cyfry-1);
end;

(*wersja z result

function realtostr(x:real;baza,cyfry:integer):string;
begin
if cyfry<1 then result:=''
else result:=char(byte('0')+trunc(x*baza))+realtostr(frac(x*baza),baza,cyfry-1);
end;*)


begin
  repeat
    write('Na jaki system chcesz zamienic (max 34): ');
    readln(NaSystem);
  until NaSystem in [2..34];
  write('Podaj jaka liczbe dzesietna chcesz zamienic: ');
  readln(JakaLiczba);
  repeat
    wynik:=SYSTEmM[JakaLiczba mod NaSystem+1] + wynik;
    JakaLiczba:=JakaLiczba div NaSystem;
  until JakaLiczba=0;
  writeln('Wynik: ',wynik);
  readln;
end.

, ale po skompilowaniu nie chce liczyć ułamków. wywala się, tzn zamyka się okno konsoli i nie ma wyniku, we freepascalu pokazuje się okienko z komunikatem:

Program {tu ścieżka do programu} exited with exitcode = 106

z wiersza poleceń to takie coś drukuje

C:{ścieżka tu do pliku}
Na jaki system chcesz zamienic (max 34): 2
Podaj jaka liczbe dzesietna chcesz zamienic: 12.3
Runtime error 106 at $004014FF
$004014FF
$00406B30

i nie ważne czy liczbę podam jako 12.3 czy 12,3

A ten błąd 106 oznacza Oczekiwanie wyrażenia typu char. (Character expression expected)

Pytanie jeszcze czy oby na pewno ja tą funkcję wstawiam w dobrym miejscu?

0

Podałeś kod więc myślałem że jesteś nieco zorientowany, wiedzę że się myliłem.

Powinienem wysłać cię do czytania kompendium albo czegoś takiego, ale właczylem się w wąek więc skończę.

Bład który Ci się pokazuje jest wynikiem tego że robisz Readln(Jakaliczba) i Jakaliczba jest typu integer a ty w trakcie uruchominia programu wpychasz tam reala. zmien typ jakaliczba na real kiedy ja wcztujesz.
I poczytaj o funkcjach, sam fakt że umieścisz implementacje funkcji w kodzie nie znaczy że zostanie ona użyta. Musisz ją wywołać np:

Write(realtostr(0.234,10,5));

Zapomniałem dodać : funkcja podaje tylko częśc po przecinku czyli pierwszy parametr < 1.

Ależ zostałem dziś trzepnięty przez altruizm. Aż 5 postów. Korzystaj bo szybko mi przejdzie.

0
program NaDowolnySystemm;
uses SysUtils;
 (*uses crt;*)  
const
SYSTEmM='0123456789ABCDEFGHIJKLMNOPRSTUWXYZ';

function Int(c:extended):extended;
    begin
    Writeln (FloatToStr(Int(c)));
    Readln;
  end;

function Frac(u:real):real;
  begin
    Writeln (FloatToStr(Frac(u)));
    Readln;
  end;


var
wynik:string;
NaSystem:integer;
JakaLiczba:integer;

begin
  repeat
    write('Na jaki system chcesz zamienic (max 34): ');
    readln(NaSystem);
  until NaSystem in [2..34];
  write('Podaj jaka liczbe dzesietna chcesz zamienic: ');
  readln(JakaLiczba);
  repeat
    wynik:=SYSTEmM[JakaLiczba mod NaSystem+1] + wynik;
    JakaLiczba:=JakaLiczba div NaSystem;
  until JakaLiczba=0;
  writeln('Wynik: ',wynik);
  readln;
end.

A czy te funkcję w tym kodzie mogą być?

function Int(c:extended):extended;
    begin
    Writeln (FloatToStr(Int(c)));
    Readln;
  end;

function Frac(u:real):real;
  begin
    Writeln (FloatToStr(Frac(u)));
    Readln;
  end;

Czy dałoby się to jakoś przerobić, żeby działało?

1 użytkowników online, w tym zalogowanych: 0, gości: 1