Смекни!
smekni.com

Перевод чисел из различных систем счисления (стр. 2 из 3)

Результат: сообщение «неверный завершающий символ»

· Входные данные:

строка: «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».

4.3 Входные и выходные данные

Для программы входными данными являются число и переключатели.

Выходным данным будет число, переведенное в систему счисления.

4.4 Сообщения оператору

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