
- •Содержание введение
- •1. Системы счисления
- •2. Перевод числа из одной системы в другую
- •3. Машинное представление информации
- •4. Числа с фиксированной точкой
- •4.1 Прямой код
- •4.2 Обратный код, инверсный или дополнительный "до 1"
- •4.3 Дополнительный или дополнительный "до 2" код
- •5. Схема алгоритма
- •6. Программная реализация алгоритма
- •6.1 Общие сведения
- •Описание использованных функций и процедур
- •Функции сложения и вычитания Сложение. Функция BinPlus
- •Вычитание. Функция BinMinus.
5. Схема алгоритма
6. Программная реализация алгоритма
6.1 Общие сведения
Программа написана на языке Delphi 7. Минимальные требования к конфигурации системы: процессор 80386 и выше. Исполняемый файл D:\ООП\8
Файл с исходными данными должен находиться в том же каталоге, что и D:\ООП\8.exe",
Данные должны быть целыми числами(возможно со знаком) в диапазоне от –128..+127, т.к. для реализации задачи была выбрана 8 разрядная двоичная сетка.
Описание использованных функций и процедур
В данной работе для перевода из одной системы в другую используется несколько функций:
DecToBase – выполняет перевод из десятичной в 8 систему счисления;
BaseToInt – обратный перевод из Base-системы счисления в десятичную СС;
DecToBase
Данная функция является программным осуществлеием алгоритма преобразования числа из десятичной системы счисления в восьмеричную, описанного выше.
Удобство функции заключается в том, что она чувствительна к знаку числа и по умолчанию при переводе в десятичную систему счисления использует дополнительный "до 1" код, что избавляет нас от написания дополнительной функции перевода.
BaseToInt
Д
(3)
анная функция реализует алгоритм преобразования числа Base- системы счисления в десятичную по следующей формуле:
x = anPn + an-1Pn-1 + ... + a1P1 + a0P0 + a-1P-1 + ... + a-mP-m
p-основание СС; Х – десятичное представление числа.
Функция определяет знак числа за счет учета инверсии: т.к. используем 8 разрядную двоичную сетку и числа со знаком, то имеет 128 отрицательных и 127 положительных значений и ноль (всего 256), то есть отрицательная величина лежит в диапазоне беззнаковых значений 128..256. А выражение (256-<x>), где <x> - беззнаковая величина после преобразования, есть модуль отрицательного числа.
Функции сложения и вычитания Сложение. Функция BinPlus
Функция бинарного сложения работает по следующему алгоритму.
Вычитание. Функция BinMinus.
Принцип работа данной функции основан на тождестве a-b=a+(-b).
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
Delphi 7.(том 1)/ Фаронов., Питер. Прес.,2000г.
"Введение в информатику. Лабораторные работы." / Авт.-сост. А.П. Шестаков; Перм. ун-т. — Пермь, 1999. (Ч. I — 56 с.)
Основы информатики/ Савельев А.Я. , МГТУ им. Баумана.
Архангельский, Алексей Яковлевич . Delphi 7: справочное пособие / А. Я. Архангельский. - Москва : БИНОМ-ПРЕСС, 2003. – 1024c.
Бобровский, Сергей Игоревич. Delphi 7: учебный курс / С. И. Бобровский. - Санкт-Петербург ; Москва ; Минск : Питер, 2005. - 736 с.
ПРИЛОЖЕНИЕ А
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math, Menus;
type
TForm1 = class(TForm)
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioGroup1: TRadioGroup;
Edit1: TEdit;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label4: TLabel;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure calculations;
procedure RadioGroup1Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
calc_stopper: Boolean=False;
null_stopper: Boolean=false;
minus_stopper: Boolean=false;
negative_counter: Boolean=false;
wrong_numbers: Boolean=False;
implementation
function tentoeight (v:real) : Real;
var
i,j,w:Integer;
a:array[1..1000000] of byte;
negative_sign:Boolean;
begin
negative_sign:=False;
i:=0;
Result:=0;
if v<0 then begin
negative_sign:=True;
v:=v*(-1);
end;
w:=Round(v);
While w>0 do
begin
inc(i);
a[i]:=w mod 8;
w:=w div 8
end;
for j:=i downto 1 do
Result:=Result+(a[j]*Round(power(10,j)/10));
if negative_sign=True then Result:=Result*(-1);
end;
function eighttoten (st:string) : string;
var
i,v,summ:integer;
a:array[1..1000000] of byte;
negative_sign:Boolean;
begin
negative_sign:=False;
summ:=0;
if st[1]='-' then
begin
negative_sign:=True;
st:=FloatToStr(StrToFloat(st)*(-1));
end;
v:=length(st);
for i:=1 to v do
a[v-i+1]:=StrToInt(st[v-i+1]);
for i:=1 to v do
summ:=summ+Round(Power(8,i-1))*a[v-i+1];
if negative_sign=False then Result:=IntToStr(summ)
else begin
result:=FloatToStr(summ*(-1));
end;
end;
{$R *.dfm}
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
calc_stopper:=True;
Edit1.Text:=FloatToStr(tentoeight(StrToFloat(Edit1.Text)));
Edit2.Text:=FloatToStr(tentoeight(StrToFloat(Edit2.Text)));
Edit3.Text:=FloatToStr(tentoeight(StrToFloat(Edit3.Text)));
calc_stopper:=false;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
calc_stopper:=True;
Edit1.Text:=eighttoten(Edit1.Text);
Edit2.Text:=eighttoten(Edit2.Text);
if Label4.Visible=true then
begin wrong_numbers:=False; calc_stopper:=False; calculations; end
else
Edit3.Text:=eighttoten(Edit3.Text);
calc_stopper:=false;
if RadioGroup1.Itemindex=3 then calculations;
end;
procedure TForm1.calculations;
var i:Integer;
begin
Label4.Visible:=False;
if (Edit1.Text='-') or (Edit2.Text='-') or (Edit1.Text='') or (Edit2.Text='') then minus_stopper:=True;
// if (Edit2.Text='0') and (RadioGroup1.Itemindex=3) then null_stopper:=True;
if (RadioButton2.Checked=true) then
begin
for i:=1 to Length(Edit1.Text) do
if (Edit1.Text[i]='8') or (Edit1.Text[i]='9') then
wrong_numbers:=True;
for i:=1 to Length(Edit2.Text) do
if (Edit2.Text[i]='8') or (Edit2.Text[i]='9') then
wrong_numbers:=True;
end;
if (calc_stopper=False) and (null_stopper=False) and (minus_stopper=False) and (wrong_numbers=False) then
begin
if RadioButton1.Checked=true then
case RadioGroup1.Itemindex of
0: Edit3.Text:=FloatToStr((StrToFloat(Edit1.Text)+StrToFloat(Edit2.Text)));
1: Edit3.Text:=FloatToStr((StrToFloat(Edit1.Text)-StrToFloat(Edit2.Text)));
2: Edit3.Text:=FloatToStr((StrToFloat(Edit1.Text)*StrToFloat(Edit2.Text)));
// 3: Edit3.Text:=FloatToStr((StrToFloat(Edit1.Text)/StrToFloat(Edit2.Text)));
end
else
case RadioGroup1.Itemindex of
0: Edit3.Text:=FloatToStr(tentoeight((StrToFloat(eighttoten(Edit1.Text))+StrToFloat(eighttoten(Edit2.Text)))));
1: Edit3.Text:=FloatToStr(tentoeight((StrToFloat(eighttoten(Edit1.Text))-StrToFloat(eighttoten(Edit2.Text)))));
2: Edit3.Text:=FloatToStr(tentoeight((StrToFloat(eighttoten(Edit1.Text))*StrToFloat(eighttoten(Edit2.Text)))));
// 3: Edit3.Text:=FloatToStr(tentoeight((StrToFloat(eighttoten(Edit1.Text))/StrToFloat(eighttoten(Edit2.Text)))));
end;
end;
// if null_stopper=True then begin Label3.Visible:=True; null_stopper:=False; end;
if minus_stopper=True then minus_stopper:=False;
if wrong_numbers=True then begin Label4.Visible:=True; wrong_numbers:=False; end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
calculations;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
calculations;
end;
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: Label1.Caption:='+';
1: Label1.Caption:='-';
2: Label1.Caption:='*';
3: Label1.Caption:='/';
end;
calculations;
end;
procedure TForm1.N3Click(Sender: TObject);
begn
Edit1.Text:='0';
Edit2.Text:='0';
calc_stopper:=false;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
MessageDlg('Восьмеричный калькулятор. Автор Кондратьев Денис.',mtWarning,[mbOK],0);
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Form1.Close;
end;
end.