Разработка программы перевода чисел

Автор работы: Пользователь скрыл имя, 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

Содержимое работы - 1 файл

Курсовая.docx

— 4.23 Мб (Скачать файл)

    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(opendialog1.FileName);

end;  

procedure TfrmMain.N4Click(Sender: TObject); {Сохраняет полученный результат}

begin

  if savedialog1.Execute then

    memo1.Lines.SaveToFile(SAVEdialog1.FileName);

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 := 'Неверное число';

Информация о работе Разработка программы перевода чисел