Калькулятор шестнадцатеричных чисел

Автор работы: Пользователь скрыл имя, 10 Января 2012 в 17:27, курсовая работа

Описание работы

Цель индивидуального задания, состоит в разработке программы «Калькулятор шестнадцатеричных чисел».

Задачи:
Изучить теоретический материал по теме «системы счисления», на примере шестнадцатеричной системы счисления.
Разработать полноценный программный пакет в среде визуализированного программирования Delphi, с отдельной разработкой дизайна программы.

Содержание работы

ВВЕДЕНИЕ 3

1. Теоретический обзор 4

1.1 Позиционные системы счисления 4 1.2 Шестнадцатеричная система счисления 5

2. Алгоритм задачи 6

2.1. Блок-схема программы 6

2.2 Описание процедур 7

3. Руководство по эксплуатации 8

3.1. Разработка пользовательского интерфейса 8

3.2 Минимальный требования к конфигурации ПК 8 3.3 Инструкция по применению 8

3.4. Тестирование программы 9

ЗАКЛЮЧЕНИЕ 10

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

ПРИЛОЖЕНИЕ А 12

Файлы: 1 файл

Курсовая работа.doc

— 406.50 Кб (Скачать файл)
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Приложение А 

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

type

  TMainForm = class(TForm)

    Panel1: TPanel;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    Button5: TButton;

    Button6: TButton;

    Button7: TButton;

    Button8: TButton;

    Button9: TButton;

    Button10: TButton;

    Button11: TButton;

    Button12: TButton;

    Button13: TButton;

    Button14: TButton;

    Button15: TButton;

    Button16: TButton;

    Button17: TButton;

    Button18: TButton;

    Button19: TButton;

    Text: TEdit;

    Button20: TButton;

    Button21: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button10Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

    procedure Button9Click(Sender: TObject);

    procedure Button17Click(Sender: TObject);

    procedure Button18Click(Sender: TObject);

    procedure Button8Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button14Click(Sender: TObject);

    procedure Button13Click(Sender: TObject);

    procedure Button12Click(Sender: TObject);

    procedure Button11Click(Sender: TObject);

    procedure Button16Click(Sender: TObject);

    procedure Button15Click(Sender: TObject);

    procedure Button19Click(Sender: TObject);

    procedure Button20Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button21Click(Sender: TObject);

    procedure TextChange(Sender: TObject);

    procedure Panel1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

  Const HexTab : array[0..15] of char = ('0','1','2','3','4','5','6','7',

                                        '8','9','A','B','C','D','E','F');

var

  MainForm: TMainForm;

  LastAdd:string;

  PosR:integer;

Res : Array[1..17] of integer;

     I : Integer;

     S : String;

     F : Text;

     flag:boolean;

     PosR1 : Integer;

implementation

{$R *.dfm}

Procedure Sum(V : String);  { Процедура, которая прибавляет к результату новое значение }

Var A : Byte;

       PosR : Integer;

Begin

     For I := 1 to Length(V) do  { Переводим все буквы в верхний регистр и ищем ошибки }

     Begin

       If V[i] in['a'..'f'] then Dec(V[i],32); { Если этот симвл - маленькая буква, то уменьшаем ее значение на 32 (переводим в верхний регистр) }

       If not(V[i] in['0'..'9','A'..'F']) then  { Если это не шестнадцатиричное значение, то ошибка }

       Begin

         WriteLn(V,' is not hex!');

         Exit;

       End;

     End;

     For I := Length(V) downto 1 do

     Begin

       If V[i]>'9' then

         A := Ord(V[i])-48-7

       else

         A := Ord(V[i])-48;

       PosR := 16-Length(V)+I;  { Выщитываем текущую позицию в массиве Res }

       Res[PosR] := Res[PosR] + A;  { Прибавляем значение к текущей позиции }  //uhuihiu

       If Res[PosR]>15 then    { ГДе то в этой части кода находится баг }

       Begin

         Res[PosR-1] := Res[PosR-1] + 1; { Увеличиваем на 1 старшую позицию }

         Res[PosR] := Res[PosR] - 16;  { А в этой оставляем только остаток }

       End;

     End;

     For I := 16 downto 2 do

     Begin

      If Res[I]>15 then

      Begin

        Res[I-1] := Res[I-1] + 1;

        Res[I] := Res[I] - 16;

      End;

    End;

End;

Procedure UnSum(V : String);  { Процедура, которая вычитает из результата новое значение }

Var    A,j : integer;

Begin

     For I := 1 to Length(V) do  { Переводим все буквы в верхний регистр и ищем ошибки }

     Begin

       If V[i] in['a'..'f'] then Dec(V[i],32); { Если этот симвл - маленькая буква, то уменьшаем ее значение на 32 (переводим в верхний регистр) }

       If not(V[i] in['0'..'9','A'..'F']) then  { Если это не шестнадцатиричное значение, то ошибка }

       Begin

         WriteLn(V,' is not hex!');

         Exit;

       End;

     End;

     For I := Length(V) downto 1 do

     Begin

       If V[i]>'9' then

         A := Ord(V[i])-48-7

       else

         A := Ord(V[i])-48;

          if(Res[PosR] >= A) then

          begin

              Res[PosR] := Res[PosR] - A;

          end

          else begin

            Res[PosR] :=Res[PosR] + 16;

            Res[PosR] := Res[PosR] - A;

            for j := PosR-1 downto 1 do

            begin

              if(Res[j]>0)then

              begin

                 Res[j]:=Res[j]-1;

                 break;

              end

              else begin

                 Res[j]:=15;

              end;

            end;

          end;

        PosR:=PosR - 1;

     End;

   End;

procedure TMainForm.Button10Click(Sender: TObject);

begin

  Text.Text:=Text.Text + 'D';

  LastAdd:='D';

end;

procedure TMainForm.Button11Click(Sender: TObject);

begin

  LastAdd:='7';

  Text.Text:=Text.Text + '7';

end;

procedure TMainForm.Button12Click(Sender: TObject);

begin

  LastAdd:='6';

  Text.Text:=Text.Text + '6';

end;

procedure TMainForm.Button13Click(Sender: TObject);

begin

  LastAdd:='5';

  Text.Text:=Text.Text + '5';

end;

procedure TMainForm.Button14Click(Sender: TObject);

begin

  LastAdd:='4';

  Text.Text:=Text.Text + '4';

end;

procedure TMainForm.Button15Click(Sender: TObject);

begin

  LastAdd:='9';

  Text.Text:=Text.Text + '9';

end;

procedure TMainForm.Button16Click(Sender: TObject);

begin

  LastAdd:='8';

  Text.Text:=Text.Text + '8';

end;

procedure TMainForm.Button17Click(Sender: TObject);

var DelOp:string;

begin

  if((LastAdd = '+') or (LastAdd = '-')) then

  begin

    DelOp:=Text.Text;

    delete(DelOp, length(DelOp), 1);

    Text.Text := DelOp;

  end;

  Text.Text:=Text.Text + '+';

  LastAdd:='+';

end;

procedure TMainForm.Button18Click(Sender: TObject);

var DelOp:string;

begin

if((LastAdd = '+') or (LastAdd = '-')) then

  begin

    DelOp:=Text.Text;

    delete(DelOp, length(DelOp), 1);

    Text.Text := DelOp;

  end;

  Text.Text:=Text.Text + '-';

  LastAdd:='-';

end;

procedure TMainForm.Button19Click(Sender: TObject);

var i,k,j,znak:integer;

    F,Digit:string;

    flag_sim:boolean;

begin

   if(Text.Text = '')then

   begin

      ShowMessage('Введите пример для рассчета!');

   end

   else if(Text.Text='0') then

   begin

      Text.Text:='0';

   end

   else begin

   znak:=0;

   PosR:=16;

   For i := 1 to 17 do Res[i] := 0;  { Обнуляем результат  }

   F:=Text.Text;

   k:=1;

  if(F[1] = '+')then znak:=1;

  if(F[1] = '-')then znak:=2;

  if(znak<>0) then inc(k);

  While k<=Length(F) do

  Begin

     if(F[k]='+') then begin break; end;

     if(F[k]='-') then begin break; end;

     Digit:=Digit+F[k];

     inc(k);

  End;

  if(znak <> 2) then Sum(Digit);

  if(znak = 2) then UnSum(Digit);

  j:=0;

  While k<=Length(F) do

  Begin

     PosR:=16;

     Digit:='';

     while(true) do

     begin

       if(k>Length(F)) then begin break;end;

       if((F[k]='+') ) then begin j:=1;inc(k);break; end;

       if((F[k]='-') ) then begin j:=2;inc(k);break; end;

       inc(k);

     end;

     while(true) do

     begin

       if(k>Length(F)) then begin break;end;

       if((F[k]='+') ) then begin break; end;

       if((F[k]='-') ) then begin break; end;

       Digit:=Digit+F[k];

       inc(k);

     end;

     if(j=1)then begin Sum(Digit);end;

     if(j=2)then begin UnSum(Digit);end;

  End;

   S := '';

   For I := 1 to 16 do

   Begin

     S := S + HexTab[Res[i]];  { Перевести из вида целого числа 0..15 в строковый вид '0'..'F' }

   End;

   While (S<>'') and (S[1]='0') do Delete(S,1,1);  { Убираем все  нули из начала }

   Text.Text:='';

   ShowMessage('Ответ: ' + S);

end;

Информация о работе Калькулятор шестнадцатеричных чисел