Написать Паскаль программу, которая будет переводить из 4-х систем счисления (двоичная, восьмеричная, десятеричная, шестнадцатеричная)
Программа первоначально должна запрашивать систему исчисления в которой находится исходное число(двоичная, восьмеричная, десятеричная, шестнадцатеричная). После программа требует ввод исходного числа, в этот момент программа должна проводить проверку(возможно ли существования исходного числа в данной системе). Если число дробное то программа должна запрашивать до какого знака требуется округлить будущий перевод. Программа запрашивает систему(двоичную, восьмеричную, десятеричную, шестнадцатеричную) в которую нужно перевести исходное число. Вывод на экран переведенного числа из одной системы в другую Программа затрагивает только 4 системы исчисления(2-ая,8-ая,10-ая,16-ая) переводы осуществляются только между ними и даже если нужно перевести число в систему счисления в которой оно уже представлено, программа все равно должна выполняться. Если запрашиваемая система счисления не является одной из 4-х, то программа должна предложить выбор другой системы исчисления.
program PascalGuru; {funkciya dlya preobrazovaniya chisla v stroku} function roundex(x:real;k:integer):string; var i:integer; s:string; begin Str(x:1:k,S);{preobrazovanie v stroku s zadannim kol-vom znakov} roundex:=s; end; {funkciya dlya polucheniya zadannoy stepeni chisla} function potens(x , e :longint): real; var i : longint; p : real; begin p := 1; if e = 0 then p := 1 else{0-vaya stepen} if e < 0 then{esli otricatelnaya stepen} begin for i := -1 downto e do p := p / x; end else begin for i := 1 to e do p := p * x; {vozvedenie v stepen} end; potens:=p; end; {funkciya dlya polucheniya nomera cifri} function digt(ch: char): byte; const numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var i: byte; n: byte; begin n := 0; for i := 1 to length(numstring) do{poisk simvola} if ch = numstring[i] then n := i - 1; digt := n;{vozvrat nomera} end; {preobrazovanie iz desyatichnoy v zadannyu sistemu} function dec2basen(base: integer; dec: real; nd:integer): string; const numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var num : string; i, j: integer; c : longint; r: real; snum:string; begin if (dec = 0) or (base <2) or (base >36) then num := '0' else begin num := ''; i := 0; c:=trunc(dec); r:=dec-c; while potens(base, i + 1) <= c do i := i + 1;{vozvedenie v naivishuy stepen} for j := 0 to i do begin {nakoplenie chisla} num := num + numstring[(c div trunc(potens(base, i - j))) + 1]; c := c mod trunc(potens(base, i - j)); end; end; if (nd <> 0) then{drobnaya chast} begin num:=num+'.';{tochka} for j:=1 to nd do begin r:=r*base; {nakoplenie drobnoy chasti} num := num + numstring[trunc(r) + 1]; r:=r-trunc(r); end; end; dec2basen := num; end; {preobrazovanie iz zadannoy sistemu v desyatichnuy} function basen2dec(base: integer; num: string; nd:integer): string; const numset: set of char = ['0'..'9', 'A'..'Z']; var j,t,k,len,point : integer; error: boolean; dec : real; begin dec := 0; error := false; if (base <2) or (base >36) then error := true;{esli netdopustimaya baza} len:=length(num); point:=0; for j:=1 to length(num) do{poisk kol-vo znakov do tochki} if num[j] = '.' then begin len:=j-1; point:=j; break; end; k:=0; for j := 1 to length(num) do if (num[j] <> '.') then begin k:=k+1; if (not (upcase(num[j]) in numset)) or (base < Digt(num[j]) + 1) then error:= true; {nakoplenie chisla} dec := dec + digt(upcase(num[j])) * potens(base, len - k); end; {esli korretno vozvrashaem chislo} if error then basen2dec := '0' else basen2dec := roundex(dec,nd); end; {proverka korrektnosti zadaniya chisla} function check(base: integer; num: string): integer; const numset: set of char = ['0'..'9', 'A'..'Z']; var j:integer; begin check := 1; for j := 1 to length(num) do if (num[j] <> '.') then begin if (not (upcase(num[j]) in numset)) or (base < Digt(num[j]) + 1) then {proverka prinadlegnosti diapazonu cifr} check:=0; end; end; var c:char; s1,s2:integer; z,f:integer; x,t:string; tmp:real; code:integer; begin while c<>'0' do{poka ne vyhod} begin {vyvod menu} writeln('1. Perevod chisla'); writeln('0. Exit'); write('=>'); readln(c); if c='1' then begin s1:=1; repeat{poka ne vvedem nugnuy sistemu} writeln('Vvedite ishodnyu sistemy shisleniya(2,8,10,16):'); readln(s1); until (s1=2)or(s1=8)or(s1=10)or(s1=16); repeat{poka ne vvedem nugnuy sistemu} writeln('Vvedite resultiruyshuy sistemy shisleniya(2,8,10,16):'); readln(s2); until (s2=2)or(s2=8)or(s2=10)or(s2=16); repeat{poka ne vvedem korrektnoe chislo} writeln('Vvedite chislo:'); readln(x); f:=check(s1,x); if (f=0) then writeln('Chislo zadano neverno povtorite vvod!'); until f=1; writeln('Vvedite kol-vo znakov posle tochki(dlya resultata):'); readln(z); if (s1 <> 10) then t:=basen2dec(s1,x,2*z) else t:=x;{perevod v desytichnuy} write('result = '); val(t,tmp,code); writeln(dec2basen(s2,tmp,z));{perevod v zadannuy sistemu} end else break; end; end.