Смекни!
smekni.com

Изучение методики перевода из одной системы исчисления в другую и разработка программы для этой операц (стр. 3 из 3)

клавишу ВВОД, после чего напротив исходного числа через

знак равно появится эквивалент исходного числа, но уже

в нужной системе исчисления.

Если Вы ошиблись при вводе исходного числа, то можно

нажать клавишу ЗАБОЙ, и последний введенный символ сот-

рется.

Чтобы завершить выполнение программы или осуществить

перевод из другой системы исчисления, нужно нажать кла-

вишу 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.