Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ооп.rtf
Скачиваний:
5
Добавлен:
22.07.2019
Размер:
639.76 Кб
Скачать

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).

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

  1. Delphi 7.(том 1)/ Фаронов., Питер. Прес.,2000г.

  2. "Введение в информатику. Лабораторные работы." / Авт.-сост. А.П. Шестаков; Перм. ун-т. — Пермь, 1999. (Ч. I — 56 с.)

  3. Основы информатики/ Савельев А.Я. , МГТУ им. Баумана.

  4. Архангельский, Алексей Яковлевич . Delphi 7: справочное пособие / А. Я. Архангельский. - Москва : БИНОМ-ПРЕСС, 2003. – 1024c.

  5. Бобровский, Сергей Игоревич. 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]