Результат: сообщение «неверный завершающий символ»
· Входные данные:
строка: «ffffffffh»
переключатель: десятичная
Результат: сообщение «превышение допустимого диапазона»
· Входные данные:
строка: «123nv23»
переключатель: десятичная
· Результат: сообщение «строка введена не корректно»
· Входные данные:
строка: «012345»
переключатель: десятичная
· Результат: сообщение «строка начинается с нуля»
· Входные данные:
строка: «12345»
переключатель: десятичная
· Результат: 12345
· Входные данные:
строка: «12345»
переключатель: двоичная
· Результат: 11000000111001b
· Входные данные:
строка: «12345»
переключатель: восьмеричная
· Результат: 30071o
· Входные данные:
строка: «12345»
переключатель: шестнадцатеричная
· Результат: 3039h
· Входные данные:
строка: «12345h»
переключатель: десятичная
· Результат: 74565
· Входные данные:
строка: «12345h»
переключатель: двоичная
· Результат: 10010001101000101b
· Входные данные:
строка: «12345h»
переключатель: восьмеричная
· Результат: 221505o
· Входные данные:
строка: «12345h»
переключатель: шестнадцатеричная
· Результат: 12345h
· Входные данные:
строка: «12345o»
переключатель: десятичная
· Результат: 5349
· Входные данные:
строка: «12345o»
переключатель: двоичная
· Результат: 1010011100101b
· Входные данные:
строка: «12345o»
переключатель: восьмеричная
· Результат: 12345o
· Входные данные:
строка: «12345h»
переключатель: шестнадцатеричная
· Результат: 14E5h
· Входные данные:
строка: «1011001010b»
переключатель: десятичная
· Результат: 714
· Входные данные:
строка: «1011001010b»
переключатель: двоичная
· Результат: 1011001010b
· Входные данные:
строка: «1011001010b»
переключатель: восьмеричная
· Результат: 1312o
· Входные данные:
строка: «1011001010b»
переключатель: шестнадцатеричная
· Результат: 2CAh
4. Руководство оператора (пользователя)
4.1 Назначение и условия применения программ
Программа служит для перевода чисел из систем счисления с основанием 2, 8, 10, 16. Для того чтобы программа работала и выполняла соответствующие функции, компьютер должен иметь определенные технические средства, а именно:
1) Windows 9x/2000/Me/Xp
2) Процессор не ниже PENTIUM 2 400
3) ОП 64 мб
4.2 Обращение к программам для запуска
Для запуска программы необходимо запустить приложение «perevod.exe».
Для программы входными данными являются число и переключатели.
Выходным данным будет число, переведенное в систему счисления.
1) если поле ввода пусто, то выводится сообщение:
2) если завершающий символ введен неверно, то выводится сообщение:
3) если превышен диапазон значений, то выводится сообщение:
4) если число введено не корректно, то выводится сообщение:
5) если первый символ ноль, то выводится сообщение:
Приложение
Текст основного модуля среды Delphi
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Button2: TButton;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{$l modul.obj}
{$R *.dfm}
procedure perevod (var s:shortstring; i:integer); external;
procedure TForm1. Button1Click (Sender: TObject);
var
s:string[32];
i:integer;
begin
label1. Caption:='';
if radiobutton1. Checked then
i:=10
else if radiobutton2. Checked then
i:=2
else if radiobutton3. Checked then
i:=8
else if radiobutton4. Checked then
i:=16;
s:=edit1. Text;
perevod (s, i);
if s[1]=#1 then
showmessage ('строка пустая')
else if s[1]=#2 then
showmessage ('последний символ должен быть:'+#13+#10+'цифра, если десятичная система, '+#13+#10+'b, если двоичная система, '+#13+#10+'o, если восьмеричная система, '+#13+#10+'h, если шестнадцатиричная система')
else if s[1]=#3 then
showmessage ('число введено неправильно')
elseifs[1]=#4 then
showmessage ('ноль не может быть первым символом числа')
elseifs[1]=#5 then
showmessage ('число должно быть в диапазоне'+#13+#10+'0..2147483647, если десятичная система, '+#13+#10+'1111111111111111111111111111111, если двоичная система, '+#13+#10+'17777777777, если восьмеричная система, '+#13+#10+'7FFFFFFF, если шестнадцатиричная система')
else label1. Caption:=s;
end;
procedure TForm1. Button2Click (Sender: TObject);
begin
close;
end;
end.
Текстмодулянаязыкеассемблера
; #########################################################################
586
model use32 small;, pascal
data
str db 32 dup (0)
flag DD 0
iss DD 0
oss DD 0
code
;##########################################################################
; in ebx указатель на строку, edi длина строки
; out iss выходная разрядность, flag код ошибки
inputss proc; процедура для определения входной системы счисления
public inputss
cmp BYTE PTR [ebx+edi], 30h; если последний элемент массива меньше 30h
jb. ErrInSS; то переход к. ErrInSS
cmp BYTE PTR [ebx+edi], 39h; если последний элемент массива больше 39h
ja.bin; то переход к.bin
mov iss, 10; иначе копируем 10 в iss
jmp.exitinputss; переход к.exitinputss
bin:
cmp BYTE PTR [ebx+edi], 62h; если последний элемент массива не равен 62h
jne.oct; то переход к.oct
mov iss, 2; иначе иначе копируем 2 в iss
jmp.mod; переходк.mod
oct:
cmp BYTE PTR [ebx+edi], 6fh; если последний элемент массива не равен 6fh
jne.hex; то переход к.hex
mov iss, 8; иначе иначе копируем 8 в iss
jmp.mod; переход к.mod
hex:
cmp BYTE PTR [ebx+edi], 68h; если последний элемент массива не равен 68h
jne. ErrInSS; то переход к. ErrInSS
mov iss, 16; иначе иначе копируем 16 в iss
jmp.mod; переход к.mod
mod:; если система счисления 2, 8 или 16
dec BYTE PTR [ebx]; то декремент системы счисления в паияти
dec edi; и в регистре edi
jmp.exitinputss; переход к.exitinputss
ErrInSS:
mov flag, 2; присваеваем flag код ошибки 2
exitinputss:
ret
inputss endp
; #########################################################################
; in iss входная разрядность, ebx указатель на строку, edi длина строки
; out flag флаг ошибки
verinput proc; процедура проверки правельности ввода
public verinput
push edi
push eax
je.null; то переход к.null
mov eax, iss; копируем основание системы счисления в eax
cmp eax, 16; если основание системы счисления равно 16
je.hexver; то переход к.hexver
ver:
sub BYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h
jb.errinput; если результат меньше 0, то переход к.errinput
cmp BYTE ptr [ebx+edi], al; если результат больше или равен основанию системы счисления
jae.errinput; то переход к.errinput
dec edi; декремент edi
cmp edi, 0; если edi не равен нулю
jmp.exitverinput; переход.exitverinput
hexver:
sub BYTE ptr [ebx+edi], 30h; вычитаем из элемента массива 30h
jb.errinput; если результат меньше 0, то переход к.errinput
cmp BYTE ptr [ebx+edi], 10; если результат меньше 10
jb.p2; то переход к.p2 (если символ в диапазоне 0..9)
sub BYTE ptr [ebx+edi], 7h; вычитаем из элемента массива 7h
cmp BYTE ptr [ebx+edi], 10; если результат меньше 10
jb.errinput; если результат меньше 10, то переход к.errinput
cmp BYTE ptr [ebx+edi], 10h; если результат меньше 10
sub BYTE ptr [ebx+edi], 20h; вычитаем из элемента массива 20h
jb.errinput; если результат меньше 0, то переход к.errinput
jb.p2; то переход к.p2 (если символ в диапазоне a..f)
jmp.errinput; иначе переход к.errinput
errinput:
mov flag, 3; присваеваем flag код ошибки 3
jmp.exitverinput; переход к.exitverinput
p2:
dec edi; декремент edi
cmp edi, 0; если edi не равен нулю
jne.hexver; то переход к.hexver
jmp.exitverinput; иначе переход к.exitverinput
null:
mov flag, 4; присваеваем flag код ошибки 4
exitverinput:
pop eax
pop edi
ret
verinput endp
;#########################################################################
; in iss входная разрядность, ebx указатель на строку, edi длина строки, oss выходная; разрядность
; out
perepolnenie proc; проверка превышения максимальных значений и окончание перевода
public perevod
push edi ; сохраняемedi встеке
xor ecx, ecx ; очищаемрегистры
xor edx, edx;
xor esi, esi;
xor eax, eax;
point1:
mov cl, BYTE ptr [ebx+esi+1]; пересылаембайтподномером esi в cl
add eax, ecx ; прибавляем его к eax
inc esi ; инкрементируем esi
cmp edi, esi; если esi равен edi,
je.point2 ; то переходим к.point2
mul iss ; умножаем eax на основание входной системы
jmp.point1; переходк.point1
point2:
cmp edx, 0 ; если старшее слово произведения не равно нулю,
переход к.errmax
cmp eax, 7fffffffh; если eax больше 7fffffffh,
ja.errmax ; то переход к.errmax
mov ecx, oss; посылаем в ecx основание выходной системы
xor esi, esi; очищаем esi
point3:
xor edx, edx ; очищаем edx (остаток от деления)
div ecx ; делим eax на ecx
mov BYTE ptr str[esi], dl; пересылаем остаток от деления в массив str
inc esi ; инкрементируем esi
cmp eax, 0; если частное не равно нулю,
jne.point3; то переходим к.point3
mov edx, esi ; сохраняем esi (количество элементов нового массива в edx)
xor esi, esi ; очищаем esi
mov BYTE ptr [ebx], dl; сохраняем в память длинну массива
point4:
mov al, BYTE ptr str [edx-1]; сохраняем символ из str в al (начиная с конца)
mov BYTE ptr [ebx+esi+1], al ; сохраняем его в исходном массиве
dec edx ; уменьшаем edx на 1
inc esi ; увеличиваем esi на 1
cmp edx, 0 ; если edx не равен нулю
jne.point4 ; то переходим к.point4
mov dl, BYTE ptr [ebx]; копируем в dl длинну массива
mov edi, edx; копируем в edi длину массива
point5:
cmp BYTE ptr [ebx+edi], 9; если элемент массива больше 9
ja.point6; то переходим к.point6
add BYTE ptr [ebx+edi], 30h; иначе прибавляем 30h
jmp.point7; переходк.point7
point6:
add BYTE ptr [ebx+edi], 57h; прибавляем к элементу массива 57h
point7:
dec edi; декремент edi
cmp edi, 0; если edi не равен нулю
jne.point5; то переход к.point5
cmp ecx, 2 ; если выходная система не равна 2
jne.oct1 ; то переходим к.oct1
'b' сохраняем
mov BYTE ptr [ebx+esi+1], al ; в последний байт массива
add BYTE ptr [ebx], 1; и увеличиваем длину массива на 1
jmp.exitperepolnenie ; переход на выход
oct1:
cmp ecx, 8 ; если выходная система не равна 8