Wiem co ów błąd oznacza ale testowałem już na setki sposobów, dawałem różne typy danych i zawsze mam pokrewne błędy.
uses crt,math;
var
lDwojkowa : string;
function BinToDec (a: string):integer;
var
x,y,z : integer;
begin
BinToDec:=0;
for x:= length(a) downto 0 do
begin
y:= length(a) + 1 - x;
if a[y] = '1' then
begin
z:=ldexp(2,x);
BinToDec:=BinToDec + z;
end;
end;
BinToDec:=z;
end;
begin
clrscr;
write('DWOJKOWO : ');
read(lDwojkowa);
writeln();
writeln('DZIESIETNIE: ', BinToDec(lDwojkowa));
readln;
end.
Ale tego się tak nie robi! Po co obliczać kolejne potęgi dwójki, jak można sobie z tym poradzić poprzez zwykłe mnożenie.
Algorytm pracuje tak:
ustawiasz wartość początkową (wynikowej) liczby na 0 (zero);
bierzesz kolejno cyfry od lewej do prawej (od bardziej znaczących do mniej znaczących - tu decydujesz o kierunku pętli, w zależności od tego, jak trzymasz liczbę binarną);
mnożysz wynikową liczbę przez 2 i dodajesz wartość bieżącej cyfry (0 lub 1);
po przejściu całej pętli masz w wynikowej liczbie obliczoną wartość.
Ok Pablo, dzięki za algorytm, muszę go sobie napisać i porównać z tym moim ale jak już go zacząłem to i chciałbym skończyć więc mam jeszcze jedno pytanie odnośnie do funkcji ldexp i tego co napisał Alex.
Zrobiłem sobie nowy program do testowania ów funkcji(w programie, który podałem w pierwszym poście jest błąd bo powinno być ldexp(1,x) nie (2,x) ale to moje niedopatrzenie, pierwszy raz używam tej funkcji.
Uses crt,math;
var x,y:integer;
begin
clrscr;
read(x);
writeln(ldexp(1,x):0:2);
//y:=ldexp(1,x);
readln;
end.
Chodzi mianowicie o dwa wiersze, ten writeln oraz ten zakomentowany pod spodem. Gdy kompiluje program jest ok, funkcja ldexp działa poprawnie i potęguje dwójkę do pobranej ze zmiennej x potęgi. Niestety gdy odkomentuję linijkę gdzie przypisuję zmiennej y wynik to pojawiają mi się już wymienione przeze mnie w pierwszym poście błędy.
Najprawdopodobniej wynika to z mojej niewiedzy na temat tego zwracanego typu danych, o którym mówił Alex, próbowałem ustawiać typ double dla zmiennych x oraz y ale to nie działa.