Ahoj,
mám problém s mým projektem do školy. Dumám nad tím už tři dny a nejsem schopný si poradit, proto mě napadlo obrátit se na vás. Předem díky za jakoukoli pomoc.
O co jde? Převodník mezi 2, 10 a 16 soustavou. Všechno mi funguje, krom jedné věci - v proceduře nejsem schopný do readln(vstup) cokoliv načíst, pokud 'vstup' není integer. U převodů z 10 to není vůbec potřeba řešit, u 2 se to dá obejít tak, že je načtu do integeru a až potom převedu na string (na ukázku to tak jednou mám a jednou ne), ale u 16 kvůli písmenům nemůžu načítat do integeru, přičemž potřebuje buď do stringu po jednotlivých znacích do charu, a nikdy se tak nedostanu dál. Více viz kód.
program Prevody;
procedure prevodz10do2; {prevod z desitkove soustavy do dvojkove}
var vysl:string;
vstup:integer;
begin
writeln('Co chces prevest?');
readln(vstup);
vysl:='';
repeat
if odd(vstup) then vysl:='1'+vysl {pomoci lichosti pridavam jednicku nebo nulu}
else vysl:='0'+vysl;
vstup:=vstup div 2;
until vstup=0;
writeln;
writeln('Vysledek je ',vysl);
readln;
end;
procedure prevodz2do10; {prevod z dvojkove soustavy do desitkove}
var pole:array[1..25] of string;
pole2:array[1..25] of integer;
vysl,dvojka,i,j:integer;
vstup:string;
begin
writeln('Co chces prevest?');
readln(vstup);
j:=length(vstup); {zjistim delku}
writeln(j);
for i:=1 to j do
begin
pole[i]:=vstup[i];; {do pole ulozim znaky po jednotlivcich}
val(pole[i],pole2[i]); {prevedu znaky z pole na cisla}
end;
dvojka:=1;
vysl:=0;
for j:=i downto 1 do
begin
vysl:=vysl+pole2[j]*dvojka; {nasobim mocniny dvojky 0 nebo jednickou}
dvojka:=dvojka*2;
end;
writeln;
writeln('Vysledek je ',vysl);
readln;
end;
procedure prevodz10do16; {prevod z desitkove do sestnactkove soustavy}
var vysl:string;
zbytek:integer;
vstup:integer;
begin
writeln('Co chces prevest?');
readln(vstup);
if vstup<0 then writeln('Cislo nesmi byt mensi nez 0')
else begin
vysl:='';
repeat
zbytek:=vstup mod 16;
if zbytek>9 then vysl:=chr(zbytek+55)+vysl {pomoci prevedeni na znaky prevadim na sestnactkovou soustavu}
else vysl:=chr(zbytek+48)+vysl;
vstup:=vstup div 16;
until vstup=0;
writeln();
writeln('Vysledek je ',vysl);
readln;
end;end;
procedure prevodz16do10; {prevod z sestnactkove do desitkove soustavy}
var vysl,d,i,j:integer;
vstup:char;
pole:array[1..25] of char;
begin
writeln('Co chces prevest? (pismena pis malym pismenem)');
writeln();
readln(vstup);
j:=length(vstup); {zjistim delku}
writeln(j);
for i:=1 to j do pole[i]:=vstup[i]; { do pole ulozim znaky po jednotlivcich}
d:=1;
vysl:=0;
for i:=j downto 1 do
begin
if ord(pole[i])<58 then vysl:=vysl+(ord(pole[i])-48)*d
else vysl:=vysl+(ord(pole[i])-87)*d;
d:=d*16;
end;
writeln;
writeln('Vysledek je ',vysl);
readln();
end;
procedure prevodz16do2; {prevod z sestnactkove soustavy do dvojkove}
var a,d,i,j:integer;
vysl,vstup:string;
pole:array[1..10] of char;
begin
writeln('Co chces prevest? (pismena pis malym pismenem)');
i:=0;
repeat
i:=i+1;
read(pole[i]);
until pole[i]=#13;
i:=i-1; {umazu si posledni clen, kde je zapsan enter}
d:=1;
a:=0;
for j:=i downto 1 do
begin
if ord(pole[j])<58 then a:=a+(ord(pole[j])-48)*d {prevadim na desitkovou pomoci ASCII tabulky}
else a:=a+(ord(pole[j])-87)*d;
d:=d*16;
end;
readln();
vysl:='';
repeat
if odd(a) then vysl:='1'+vysl {prevadim na dvojkovou postupnym delenim dvema a zjistovanim lichosti}
else vysl:='0'+vysl;
a:=a div 2;
until a=0;
writeln;
writeln('Vysledek je ',vysl);
readln;
end;
procedure prevodz2do16; {prevod z dvojkove soustavy do sestnactkove soustavy}
var pole:array[1..25] of string;
pole2:array[1..25] of integer;
a,dvojka,i,j,zbytek:integer;
v:longint;
vstup,vysl:string;
begin
writeln('Co chces prevest?');
readln(v);
str(v, vstup);
j:=length(vstup); {zjistim delku}
for i:=1 to j do
begin
pole[i]:=copy(vstup,i,1); {do pole ulozim znaky po jednotlivcich}
val(pole[i],pole2[i]); {prevedu znaky z pole na cisla}
end;
dvojka:=1;
a:=0;
for i:=j downto 1 do
begin {prevadim na desitkovou soustavu}
a:=a+pole2[i]*dvojka; {pricitam dvojka*(0 nebo 1)}
dvojka:=dvojka*2; {nasobim dvojku}
end;
vysl:='';
repeat
zbytek:=a mod 16;
if (zbytek>=10) and (zbytek<=15) then vysl:=chr(zbytek+55)+vysl {prevadim na 16 soustavu, upravuju znaky pomoci ASCII tabulky}
else vysl:=chr(zbytek+48)+vysl;
a:=a div 16;
until a=0;
writeln();
writeln('Vysledek je ',vysl);
readln;
end;
var kam,odkud:integer;
begin {hlavni program}
repeat
writeln('Z jake soustavy chces prevest? 2=dvojkova, 10=desitkova, 16=hexa, 0=konec');
readln(odkud);
if odkud<>0 then begin
writeln('Do jake soustavy chces prevest? 2=dvojkova, 10=desitkova, 16=hexa');
readln(kam);
writeln();
if (odkud=10) and (kam=2) then prevodz10do2;
if (odkud=2) and (kam=10) then prevodz2do10;
if (odkud=10) and (kam=16) then prevodz10do16;
if (odkud=16) and (kam=10) then prevodz16do10;
if (odkud=16) and (kam=2) then prevodz16do2;
if (odkud=2) and (kam=16) then prevodz2do16;
writeln();
end;
until odkud=0;
end.
Zajímavé je, že pokud to není procedura, ale samostatný program, funguje to naprosto v pořádku. Tuším, že to bude mít nějaké úplně triviální řešení, ale nejsem schopný na to přijít. (také je možné, že mám pouze podivnou verzi pascalu a vám to fungovat bude).
Ještě jednou díky za případnou pomoc.