Hello, while doing a task I've stumbled upon a problem: my function wouldn't work properly, I rewrote in into a program where is was working, rewrote it back into a function, it wouldn't work again.
The purpose of the function is to translate integers from any system from binary to 256th numerical syestem into decimal.
Input goes via string with such format: {A A A ... A base}, where A is a hexagonal number from 00 to FF and 'base' is the base from which number is being translated from.
Output - deciamal int64
Examples with expected result:
FF 256 -> 255 {FF from 256th}
01 01 01 01 2 -> 7 {1111 from binary}
02 01 16 -> 33 {21 from hex}
working program:
program dec_from_any;
var power, number, base, big_to_ten, super_power: int64;
i, count, sub_count: integer;
symbol: char; { current symbol }
input: string; { input }
begin
number:= 0; { digit in 256 numberical sytem }
power:= 1; { power for hex inside digit }
count:= 1; { count of spaces }
sub_count:= 0; { count of digit inside number }
super_power:= 1; { power for digits in 256 system }
big_to_ten:= 0; { result
readln(input);
for i:= length(input) downto 1 do { goes from the end of line to the start }
begin
symbol:= input{i}; { current symbol } <- i should be in [], but makes it cursive, sorry
if symbol = ' ' then { changes when space }
begin
count:= count + 1; { important for distributing base from the whole }
power:= 1; { its here instead of later so it can be used for base }
end
else if count = 1 then
begin { base calculation }
base:= base + (ord(symbol) - ord('0')) * power;
power:= power * 10
end { end of base calculation }
else if count > 1 then begin { calculation of number }
case symbol of
'A': begin number:= number + 10 * power;
power:= power * 16 end;
'B': begin number:= number + 11 * power;
power:= power * 16 end;
'C': begin number:= number + 12 * power;
power:= power * 16 end;
'D': begin number:= number + 13 * power;
power:= power * 16 end;
'E': begin number:= number + 14 * power;
power:= power * 16 end;
'F': begin number:= number + 15 * power;
power:= power * 16 end;
else begin
number:= number + (ord(symbol) - ord('0')) * power;
power:= power * 16 end;
end;
sub_count:= sub_count + 1; { moving to 2nd digit of number }
if (sub_count mod 2) = 0 then { after getting 2nd digit of number, adding it to the result in coresponding "super_power" }
begin
big_to_ten:= big_to_ten + number * super_power;
super_power:= super_power * base;
sub_count:= 0;
number:= 0
end;
end;
end;
writeln(base);
writeln(big_to_ten)
end.
this does work for said examples
Hower, following function that i got by copying previous code and changing the following:
1. removed line №14: readln(input); , removed line №57 writeln(base); , removed line №58: writeln(big_to_ten)
2. program name changed to: program chartrans;
3. big_to_ten, input removed from var
4. Added in between program chartrans; and var following
var input: string;
function big_to_ten(input: string): int64;
5. added before end. the following :
end;
begin
readln(input);
writeln(big_to_ten(input))
resulting function:
program chartrans;
var input: string;
function big_to_ten(input: string): int64;
var power, number, base, super_power: int64;
i, count, sub_count: integer;
symbol: char;
Last Edit: Today at 12:20:52 pm
+ Attachments and other options
shortcuts: hit alt+s to submit/post or alt+p to preview
begin
power:= 1;
count:= 1;
sub_count:= 0;
super_power:= 1;
number:= 0;
big_to_ten:= 0;
for i:= length(input) downto 1 do
begin
symbol:= input;
if symbol = ' ' then
begin
count:= count + 1;
power:= 1;
end
else if count = 1 then
begin
base:= base + (ord(symbol) - ord('0')) * power;
power:= power * 10
end
else if count > 1 then begin
case symbol of
'A': begin number:= number + 10 * power;
power:= power * 16 end;
'B': begin number:= number + 11 * power;
power:= power * 16 end;
'C': begin number:= number + 12 * power;
power:= power * 16 end;
'D': begin number:= number + 13 * power;
power:= power * 16 end;
'E': begin number:= number + 14 * power;
power:= power * 16 end;
'F': begin number:= number + 15 * power;
power:= power * 16 end;
else begin
number:= number + (ord(symbol) - ord('0')) * power;
power:= power * 16 end;
end;
sub_count:= sub_count + 1;
if (sub_count mod 2) = 0 then
begin
big_to_ten:= big_to_ten + number * super_power;
super_power:= super_power * base;
sub_count:= 0;
number:= 0
end;
end;
end;
end;
begin
readln(input);
writeln(big_to_ten(input))
end.
And it doesn't work and I can't understand why, please help.