Автор работы: Пользователь скрыл имя, 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
Приложение
А
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','
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(
begin
Text.Text:=Text.Text + 'D';
LastAdd:='D';
end;
procedure TMainForm.Button11Click(
begin
LastAdd:='7';
Text.Text:=Text.Text + '7';
end;
procedure TMainForm.Button12Click(
begin
LastAdd:='6';
Text.Text:=Text.Text + '6';
end;
procedure TMainForm.Button13Click(
begin
LastAdd:='5';
Text.Text:=Text.Text + '5';
end;
procedure TMainForm.Button14Click(
begin
LastAdd:='4';
Text.Text:=Text.Text + '4';
end;
procedure TMainForm.Button15Click(
begin
LastAdd:='9';
Text.Text:=Text.Text + '9';
end;
procedure TMainForm.Button16Click(
begin
LastAdd:='8';
Text.Text:=Text.Text + '8';
end;
procedure TMainForm.Button17Click(
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(
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(
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;