клавишу ВВОД, после чего напротив исходного числа через
знак равно появится эквивалент исходного числа, но уже
в нужной системе исчисления.
Если Вы ошиблись при вводе исходного числа, то можно
нажать клавишу ЗАБОЙ, и последний введенный символ сот-
рется.
Чтобы завершить выполнение программы или осуществить
перевод из другой системы исчисления, нужно нажать кла-
вишу ESC (о чем указано в нижней строке экрана). В этом
случае Вы окажетесь в начальном меню. Если Вы хотите
продолжить перевод, то опять клавишами ВВЕРХ и ВНИЗ
подведите курсор к нужной строке меню и нажмите ВВОД.
Если же Вы хотите завершить выполнение программы, то
это можно сделать двумя вышеописанными способами.
- 8 -
Program Perevod;
Uses Crt;
Const P1='Перевод из '; { константы для начального меню }
s:array [1..7] of string[50]=(p1+'десятеричного кода в двоичный.',
p1+'двоичного кода в десятеричный.',
p1+'десятеричного кода в шестнадцатиричный.',
p1+'шестнадцатиричного кода в десятеричный.',
p1+'двоичного кода в шестнадцатиричный.',
p1+'шестнадцатиричного кода в двоичный.',
' ESC - ВЫХОД В DOS');
Var Promeg,Chast:Longint;
Znach,j:Integer;
Klav:Char;
i,Stroka,Isx,Kon,y,Kol,Help:Byte;
Keys: Set of '0'..'F';
a: Array [1..255] of Char;
Otv,Pom: string;
Procedure Zast; { процедура вывода меню }
begin
Window(1,1,80,24); { выделить окно 80х24 }
ClrScr; { очистить окно }
TextColor(15); { установить цвет - белый }
FOR I:=1 TO 7 do begin { цикл по строкам }
GoToXY (15,I*2); Write (s[i]); { формирование меню }
end;
end { zast }; { конец процедуры меню }
Function Stepen (Chis,St: Byte): Longint; { функция возведения в степень }
var c: Byte;
Res: longint;
begin
Res:=1;
For c:=1 to st do Res:=Res*chis;
Stepen:=Res; { присвоение функции значения }
End { Stepen }; { конец функции возведения в сепень }
Begin { НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ }
y:=1; { y - текущая строка в меню }
Zast; { вывести меню }
Repeat { цикл для перемещения в меню }
TextColor(13);
GoToXY (13,y*2); Write(Chr(16)); { вывести метку текущей строки меню }
klav:=ReadKey; { считывание клавиши в klav }
GoToXY (13,y*2); Write(' '); { стирание старой метки текущей строки }
if Ord(Klav)=72 then if y > 1 then y:=y-1 else y:= 7; { если клавиша ВВЕРХ }
if Ord(Klav)=80 then if y < 7 then y:=y+1 else y:= 1; { если клавиша ВНИЗ }
if Ord(Klav)=27 then begin y:=7; klav:=Chr(13) end; { если клавиша ESC }
if (Ord(Klav)=13) and (y<7) then begin { если клавиша ВВОД не на выходе }
ClrScr; { очистить экран }
TextCOLOR (13); GoToXY (20, 1); Write (s[y]); { вывести название перевода }
TextCOLOR (10); GoToXY (31,24); Write ('ESC - ВЫХОД В МЕНЮ'); { вывести клавишу для выхода }
TextColor(15); { поменять цвет - белый }
Window(1,2,80,23); { установить окно со 2 по 23 строки }
Stroka:=2; { текущая строка }
- 9 -
Case y of { определение клавиш которые можно будет нажимать }
1,3 : begin { если перевод из десятиричного кода }
Isx:=10;
Keys:=['0'..'9']; { возможные клавиши }
If y=1 Then Kon:=2 else Kon:=16; { присвоение системы исчисления результата }
end;
2,5 : begin
Isx:= 2;
Keys:=['0','1']; { определение клавиш которые можно будет нажимать }
If y=2 Then Kon:=10 else Kon:=16; { присвоение системы исчисления результата }
end;
4,6 : begin
isx:=16;
keys:=['0'..'9','A'..'F']; { определение клавиш которые можно будет нажимать }
if y=4 then kon:=10 else kon:=2; { присвоение системы исчисления результата }
end;
end;
Repeat { основной цикл для перевода }
Write('? '); Promeg:=0; Kol:=0; Otv:=''; { подготовительные действия }
Repeat { цикл для ввода числа }
klav:=ReadKey; { чтение клавиши }
if UpCase(Klav) in Keys then begin { если клавиша допустимая }
kol:=kol+1; { количество символов в исходном числе }
a[kol]:=UpCase(Klav); { запоминание введенного символа }
Write (a[kol]); { вывод нажатого символа }
end;
if (Ord(Klav)=8) and (Kol>0) then begin { если клавиша ЗАБОЙ }
kol:=kol-1;
GoToXY(WhereX-1,WhereY);
ClrEol;
end;
Until (Ord(klav)=13) or (Ord(klav)=27); { пока не нажата ВВОД или ESC }
if Ord(klav)=13 then begin { если клавиша ВВОД - начало обработки результата }
for i:=1 to kol do begin { перевода введенного числа в десятеричную систему}
if a[i]<'A' then Znach:=Ord(a[i])-48
else Znach:=Ord(a[i])-55;
promeg:=promeg+Znach*Stepen(isx,kol-i);
end;
i:=0;
Repeat { определение максимального порядка результата }
i:=i+1;
Chast:=Trunc(Promeg/Stepen(Kon,i));
Until Chast<Kon;
For j:=i downto 0 do begin { перевод в нужную систему исчисления }
Help:=Trunc(Promeg/Stepen(Kon,j));
If Help>9 Then Pom:=Chr(55+Help)
Else Str(Help,Pom);
Otv:=Otv+Pom;
Promeg:=Promeg-Help*Stepen(Kon,j);
end;
WriteLn(' = ',Otv); { вывод результата }
end; { конец обработки результата }
Until Ord(Klav)=27; { если нажата ESC то выход в основное меню }
Zast; { вывод заставки }
end;
Until (Ord(Klav)=13) and (y=7); { если в меню нажали ESC или ВВОД на выходе }
ClrScr { очистить экран }
end.