Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 05:05, курсовая работа
Тема курсовой работы звучит так: разработка программы перевода чисел между системами счисления.
Целью курсовой работы является разработка программы, которая переводила бы числа одной системы счисления в любую другую, заданную пользователем программы и могла сохранять или открывать полученные результаты. Кроме того, она должна содержать в себе справочный материал для пользователя программы.
Введение 3
1 Теоретические основы разработки 4
1.1 Системные требования 4
1.2 Техническое задание 4
1.3 Жизненный цикл 5
1.3.1 Схемы модели ЖЦ ПО 5
1.3.2 Другие типы моделей ЖЦ ПО 10
1.3.3 Процессы жизненного цикла ПО 12
1.4 Проектирование программного обеспечения 15
2 Практические основы разработки 16
2.1 Реализация программного продукта 16
2.1.1 Описание программного кода 21
2.2 Тестирование и отладка программного продукта 28
2.3 Достоинства и недостатки программного продукта 29
2.4 Руководство пользователя 29
Заключение 31
Список использованных источников 32
Приложение А - UML - диаграмма программы 33
Приложение Б - Программный код 35
Приложение В - Презентация 43
10: Result := 'A';
11: Result := 'B';
12: Result := 'C';
13: Result := 'D';
14: Result := 'E';
15: Result := 'F';
else
raise Exception.Create(SelfName +
' Числу не сопоставлена цифра!');
end;
end;
Функцию которая определяет, какое число соответствует цифре:
function DigitToInt(aDigit: AnsiChar; aBase: Byte): Byte;
const
SelfName: string = 'DigitToInt.';
begin
if aBase < 2 then
raise Exception.Create(SelfName +
' Основание системы счисления должно быть >= 2!')
;
case aDigit of
'0'..'9': Result := StrToInt(aDigit);
'A', 'a': Result := 10;
'B', 'b': Result := 11;
'C', 'c': Result := 12;
'D', 'd': Result := 13;
'E', 'e': Result := 14;
'F', 'f': Result := 15;
else
raise Exception.Create(SelfName +
' Неизвестный символ в представлении числа!');
end;
if Result > aBase - 1 then
raise Exception.Create(SelfName +
' В данной системе счисления нет такой цифры!')
;
end;
Функция которая по записи числа в системе счисления с основанием aBase, определяет само это число:
function XcimalStrToNumber(aStrXcimal: string; aBase: Byte): Extended;
const
SelfName: string = 'XcimalStrToNumber.';
var
StrXcimal: string; { Строковое представление исходного числа без знака.}
i: Integer; {Счётчик для циклов.}
Weight: Integer; {Вес разряда.}
StrInt: string; { Строковое представление целой части числа }
StrFrac: string;
{ Строковое представление
Pos1: Integer; { Позиция в строке }
Sign: Integer; { Знак числа = 1 или -1.}
IntPart: Extended; { Целая часть числа }
FracPart: Extended; { Дробная часть числа }
begin
if Length(aStrXcimal) = 0 then
raise Exception.Create(SelfName + ' Не задано число!');
Определяем знак и формируем строковое представление исходного числа без знака:
Sign := 1;
if aStrXcimal[1] in ['+', '-'] then
begin
if aStrXcimal[1] = '-' then
Sign := -1;
StrXcimal := Copy(aStrXcimal, 2, Length(aStrXcimal) - 1);
end
else
begin
StrXcimal := aStrXcimal;
end;
Ищем десятичную точку. Она у нас может обозначается знаками: '.' или ',':
Pos1 := Pos('.', StrXcimal);
if Pos1 = 0 then
Pos1 := Pos(',', StrXcimal);
Определяем подстроку с записью целой части числа и подстроку с записью дробной части:
if Pos1 = 0 then
begin
StrInt := StrXcimal; { Значит число состоит только из целой части }
StrFrac := '';
end
else
begin
StrInt := Copy(StrXcimal, 1, Pos1 - 1); { Число имеет целую и дробную части }
StrFrac := Copy(StrXcimal, Pos1 + 1, Length(StrXcimal) - Pos1);
end;
Определяем значение целой части числа:
IntPart := 0;
Weight := 1; { Вес младшего разряда }
for i := Length(StrInt) downto 1 do
begin
IntPart := IntPart + DigitToInt(StrInt[i], aBase) * Weight;
Weight := Weight * aBase; { Вес следующего по старшинству разряда}
end;
Определяем значение дробной части числа:
FracPart := 0;
Weight := 1;
for i := 1 to Length(StrFrac) do
begin
Weight := Weight * aBase; { Вес знаменателья текущего разряда. Т.е. для разрядов дробной части вес = 1/Weight}
FracPart := FracPart + DigitToInt(StrFrac[i], aBase) / Weight;
end;
Получаем число, которое соответствует записи aStrXcimal в системе счисления с основанием aBase:
Result := Sign * (IntPart + FracPart);
end;
Преобразует запись числа в системе счисления с основанием aSrcBase в запись этого же числа в системе счисления с онованием aTrgBase:
unction XcimalStrToYcimalStr(
aSrcBase: Byte;
aSrcNumStr: string;
aTrgBase: Byte;
aTrgPrecision: Byte
): string;
var
SrcNum: Extended; {Число соответствующее записи aSrcNumStr в системе счисления с основанием aSrcBase }
StrSign: string; { Знак числа. Sign = '' или '-'}
IntPart: Int64; { Целая часть, выделенная из числа SrcNum }
FracPart: Extended; { Дробная часть, выделенная из числа SrcNum }
StrInt: string; { Представление целой части числа SrcNum в системе счисления с основанием aTrgBase }
StrFrac: string; { Представление дробной части числа SrcNum в системе счисления с основанием aTrgBase}
i: Integer; { Счетчик}
TempNum: Extended; { Для промежуточных вычислений}
begin
SrcNum := XcimalStrToNumber(aSrcNumStr, aSrcBase); { Исходное число}
StrSign := ''; { Определяем знак}
if SrcNum < 0 then
begin
SrcNum := -SrcNum; { Записываем в SrcNum число без знака}
StrSign := '-';
end;
IntPart := Trunc(SrcNum); { Получаем целую и дробную части числа }
FracPart := Frac(SrcNum);
StrInt := ''; { Переводим целую часть }
repeat
StrInt := IntToDigit(IntPart mod aTrgBase) + StrInt;
IntPart := IntPart div aTrgBase;
until IntPart = 0;
if FracPart = 0 then { Если дробная часть = 0, то перевод закончен }
begin
Result := StrSign + StrInt;
exit;
end;
StrFrac := ''; { Переводим дробную часть. Точность - до aTrgPrecision цифр после запятой }
for i := 1 to aTrgPrecision do
begin
TempNum := FracPart * aTrgBase;
StrFrac := StrFrac + IntToDigit(Trunc(TempNum));
FracPart := Frac(TempNum);
if FracPart = 0 then { Если дробная часть = 0, то перевод закончен }
Break;
end;
Result := StrSign + StrInt + DecimalSeparator + StrFrac; { Переменная DecimalSeparator определена в модуле SysUtils и содержит знак разделитель целой и дробной части. Инициализируется автоматически во время запуска программы согласно региональным настройкам операционной ситемы }
end;
procedure TfrmMain.BitBtn1Click(Sender: TObject);
var
TrgPrecision, i, s: Integer;
begin
Try { По умолчанию точноть преобразования дробной части = 10 цифр после запятой }
Memo1.Text := XcimalStrToYcimalStr(
StrToInt(EdSrcBase.Text),
EdSrcNum.Text,
StrToInt(EdTrgBase.Text),
TrgPrecision
);
For i:= 0 to Memo1.Lines.Count-1 do
Begin
S:= memo1.Lines [i];
SrcNum:=copy (s, pos(' ',s)+1, bength (s);
delete (s, pos(' ',s), bength (s);
xd:= char to xy (s[1]);
yd:= char to xy (s[3]);
s:= XcimalStrToYcimalStr(xd, SrcNum, yd, TrgPrecision);
s:= SrcNum + 'C' + xy to Char (xd) + 'i'= '+s';
s:= s + 'C' + xy to Char (yd) + 'i';
Memo2.LineStart: add (s);
memo1.Lines.Count
except
Label9.Caption := 'Неверное число';
EdSrcNum.SetFocus;
end;
end;
procedure TfrmMain.N3Click(Sender: TObject); {Открывает сохраненный документ}
begin
if opendialog1.execute then
memo1.Lines.loadFromFile(
end;
procedure TfrmMain.N4Click(Sender: TObject); {Сохраняет полученный результат}
begin
if savedialog1.Execute then
memo1.Lines.SaveToFile(
end;
procedure TfrmMain.N5Click(Sender: TObject); {Закрывает всю программу}
begin
close;
end;
end.
2.2 Тестирование и отладка программного продукта
При компиляции программного продукта возникла проблема при запуске справочного модуля. Программа указывала на ошибку в программном коде. Для решения этой проблемы была изменена процедура:
procedure TfrmMain.N6Click(Sender: TObject);
begin
shellexecute(0, nil, PChar('Help.chm'), nil, nil, sw_normal);
end;.
Проблема не работоспособности программы заключалась в том, что название процедуры было заданно с грамматической ошибкой и название файла справочного модуля было указанно не правильно.
После решения этой проблемы ошибка возникала при работе программного продукта, программа при неправильном задании исходного числа переставала работать. Чтоб решить эту проблему было добавлено ещё одно поле Label. В программном коде была добавлена строчка к процедуре кнопке и в конечном итоге процедура получила вид:
procedure TfrmMain.BitBtn1Click(Sender: TObject);
var
TrgPrecision, i, s: Integer;
begin
try
Memo1.Text := XcimalStrToYcimalStr(
StrToInt(EdSrcBase.Text),
EdSrcNum.Text,
StrToInt(EdTrgBase.Text),
TrgPrecision);
except
Label9.Caption := 'Неверное число';