Forum > General
Function doesn't work but program does
(1/1)
ducyk:
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.
Fibonacci:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function big_to_ten(input: string): int64;var power, number, base, super_power: int64; i, count, sub_count: integer; symbol: char;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[i]; 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;
Wesbat:
Your program works but has a compile error.
I changed line 17 from
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---symbol:= input;
to
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---symbol:= input[i];
Edit / correction - initialize base:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---base:=0;
My output:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---FF 256 -> 25501 01 01 01 2 -> -1345312141813925216 (without base:=0)01 01 01 01 2 -> 15 (with base:=0)
ducyk:
Ohhh that's was it...
Thank you!
And sorry for bad formatting my 1st post next time will use code brackets
Navigation
[0] Message Index