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

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ И НАУКИ РОССИИ

Федеральное государственное бюджетное образовательное

учреждение  высшего профессионального образования

«Тюменский  государственный нефтегазовый университет»

Институт  кибернетики, информатики и связи

Отделение информационных технологий и вычислительной техники 
 
 
 
 
 
 
 

КУРСОВАЯ  РАБОТА 

ПО ДИСЦИПЛИНЕ 

«ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ  ПРОГРАММИРОВАНИЕ» 

    НА  ТЕМУ «Калькулятор шестнадцатеричных чисел» 
     
     
     
     
     
     
     
     
     

Студента Кацюк М.В.  ________/________ г.

                                 подпись          дата

Группа АСОиУт-09-(11)-2

Специальность 230103.51 «Автоматизированные системы  обработки информации и управления (по отраслям)» 

Оценка ___________________

Руководитель  Пучкова Д.М./________/________г.

                                          подпись            дата 
 
 

Тюмень, 2011

СОДЕРЖАНИЕ

ВВЕДЕНИЕ           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. Изучить теоретический материал по теме «системы счисления», на примере шестнадцатеричной системы счисления.
  2. Разработать полноценный программный пакет в среде визуализированного программирования Delphi, с отдельной разработкой дизайна программы.

     Данная  тема актуальна, дополнительную информацию о системах счисления и способах проведения арифметических действий над ними. 
 
 
 
 
 
 

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

      1.1 Позиционные системы счисления 

     Позиционная система счисления - система счисления, в которой значение каждого числового знака (цифры) в записи числа зависит от его позиции (разряда).

       Под позиционной  системой счисления обычно понимается b-ричная система счисления, которая определяется целым числом b > 1, называемым основанием системы счисления. Целое число x в b-ричной системе счисления представляется в виде конечной линейной комбинации степеней числа b [1]:  

                                                                                                                        

                                                ,          (1) 

где ak - это целые числа, называемые цифрами, удовлетворяющие неравенству : 0 £ ак £ (b -1).

      Каждая  степень bk в такой записи называется весовым коэффициентом разряда. Старшинство разрядов и соответствующих им цифр определяется значением показателя k (номером разряда). Обычно для ненулевого числа x требуют, чтобы старшая цифра an − 1 в b-ричном представлении x была также ненулевой.

      Если  не возникает разночтений, число x записывают в виде последовательности его b-ричных цифр, перечисляемых по убыванию старшинства разрядов слева направо:

x = an-1 an-2 … a0.                    (2) 

      1.2 Шестнадцатеричная система счисления 

      Шестнадцатеричная система счисления - позиционная система счисления по целочисленному основанию 16. Обычно в качестве шестнадцатеричных цифр используются десятичные цифры от 0 до 9 и латинские буквы от A до F для обозначения цифр от 1010 до 1510, то есть (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).

      Широко  используется в низкоуровневом программировании и компьютерной документации, поскольку  в современных компьютерах минимальной  единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами. Такое использование началось с системы IBM/360, где вся документация использовала шестнадцатеричную систему, в то время как в документации других компьютерных систем того времени (даже с 8-битными символами, как, например, PDP-11 или БЭСМ-6) использовали восьмеричную систему.

      В стандарте Юникода номер символа принято записывать в шестнадцатеричном виде, используя не менее 4 цифр (при необходимости - с ведущими нулями).

      Шестнадцатеричный цвет - запись трёх компонент цвета (R, G и B) в шестнадцатеричном виде. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

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

 
 
 
 
 

 

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

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

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

 

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

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

      Интерфейс представляет собой стандартный набор компонентов Delphi. Были использованы компоненты MailForm, Panel, button и Edit. 

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

  • Intel Pentium II/233 МГц и выше
  • Microsoft Windows 95, 98, 2000, Windows XP, Vista, Seven
  • 128 Мб ОЗУ
  • 1 Мб места на жестком диске
  • Накопитель CD-ROM
  • Монитор с разрешением VGA или выше
  • Мышь
 

      3.3 Инструкция по применению 

      Откройте  корневой каталог Курсовой проект, и запустите файл Calc_Hex.exe, на экране появится главное окно программы:

      

Рисунок 1 - Интерфейс программы

      В поле Edit введите числа в шестнадцатеричной системе счисления, не забывая при этом указать арифметическое действие. Далее нажмите кнопку «Рассчитать» и в небольшом окне программа выведет ответ.

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

Пример 1.

     Сложим шестнадцатеричные числа А и 9. Нажимаем кнопку «Расчитать», в появившемся окне получает ответ 13.

     Для того, что бы проверить эти данные нужно осуществить расчет арифметическим способом:

     1. A+9=13, данное число в шестнадцатеричной знаковой системе.

     2. Определим значение A в шестнадцатеричной системе счисления, это 10 в десятичной, следовательно 9 – это 9, сумма в десятичной системе счисления 19, так как действие проводится в шестнадцатеричной системе счисления то исходя из разрядов 13.

     0 1 2 3 4 5 6 7 8 9  A  B  C  D   E  F – шестнадцатеричная система,

     0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 – десятичная система.

      Таким образом, результаты, полученные решением программы и арифметическим способом, совпали.

Пример 2.

     Вычтем шестнадцатеричные числа F и A. Нажимаем кнопку «Расчитать», в появившемся окне получает ответ 5.

     Для того, что бы проверить эти данные нужно осуществить расчет арифметическим способом:

     1. F+A=13, данное число в шестнадцатеричной знаковой системе. 

     2. Определим значение F в шестнадцатеричной системе счисления, это 15 в десятичной, следовательно A – это 10, разность в десятичной системе счисления 5, так как действие проводится в шестнадцатеричной системе счисления то ответ 5.

      Таким образом, результаты, полученные решением программы и арифметическим способом, совпали. 

 

ЗАКЛЮЧЕНИЕ 

      В процессе работы над темой курсового  проекта были достигнуты поставленные цели и задачи, а именно калькулятор шестнадцатеричной системы счисления.

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

      В ходе тестирования этой программы были выявлены ее преимущества:

      1. Низкие системные требования.

      2. Интуитивно-понятный интерфейс программы.

      3. Быстрый и достоверный подсчет данных.

      Недостатком программы является недостаточно широкий диапазон работы с числами. Предложение по улучшению программы состоит в расширении диапазона работы с числами.

      Анализ  результатов показывает, что программы  работают правильно и верно проводят арифметические действия над шестнадцатеричными числами.

 

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

  1. Бобровский, С.И. Delphi7. учеб. Пособие для студ. Среднего проф. образования / С.И. Бобровский. - СПб. 2006. – 736 с.
  2. Кузнецов, В.В. Основы объектно-ориентированного программирования в Delphi: учебное пособие /В.В. Кузнецов, И.В.Абдрашитова. – Томск: ТУСУР, 2008 .- 180с.
  3. Сухарев, М.В. Delphi. Профессиональный подход: учебное пособие для студентов среднего профессионального образования/ М.В.Сухарев. – Наука и техника, 2007. – 600с.
  4. Тимошевская, Н.Е. Основы алгоритмизации и программирования: учебное пособие /Н.Е. Тимошевская, Е.А. Перышкина. – Томск: ТУСУР, 2008 .- 135с.
  5. Угринович, Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. - М. .: Лаборатория Базовых Знаний, 2003. – 438 с.
  6. Фаронов, В.В. Delphi Программирование на языке высокого уровня. учебник для вузов / В.В. Фаронов. – СПб.: Питер, 2003. – 640 с.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Приложение А 

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;

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