Реферат Программа для перевода арабского числа в римскую систему счисления и обратно
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение
высшего профессионального образования
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Математический факультет
Кафедра администрирования информационных систем
Проектное задание
по дисциплине «Языки и технологии программирования»
направление - 010300 Математика. Компьютерные науки
1. «Программа для перевода арабского числа в римскую систему счисления и обратно.»
Руководитель
_________Морковина Э.Ф.
«___»_____________2008г.
Исполнитель
Студентка гр. 07-мкн
____________Каирова Р.
«___»_____________2008г.
Оренбург 2008
Содержание:
Задание……………………………………………………………………….3
Цель работы………………………………………………………………….4
Основные теоретические аспекты …………………………………………5
Практические аспекты и алгоритмы решения……………………………..6
Интерфейс тестирующей программы……………………………………...10
Исходный код программного продукта……………………………………14
Вывод по проделанной работе……………………………………………..20
Список используемых источников………………………………………...21
Задание: Написать программу перевода арабского числа в римскую систему счисления и обратно.
Цель проектного задания:
Изучить процесс программирования в среде Delphi. Изучить основные принципы объектно-ориентированного программирования и возможности их реализации в среде Delphi. Разработать приложение для перевода римской системы исчисления в арабскую и обратно.
Основные теоретические аспекты:
Римская система счисления
Числовые обозначения в Древнем Риме напоминали первый способ греческой нумерации. У римлян были специальные обозначения не только для чисел 1, 10, 100 и 1000, но и для чисел 5, 50 и 500. Римские цифры имели такой вид: 1 - I, 5 - V, 10 - X, 50 - L, 100 - C, 500 - D и 1000 - M. Возможно, знак V означал раскрытую руку, а X - две такие руки. Но есть и иное объяснение. Когда счет шел десятками, то, нарисовав 9 палочек, десятой их перечеркивали. А чтобы не писать слишком много палочек, перечеркивали одну палочку и писали десять так: . отсюда и получилась римская цифра X. А цифра 5 получилась просто разрезанием цифры для числа 10 пополам.
Спорят ученые и о происхождении других римских цифр. Возможно, что обозначения C и M связаны с римскими названиями сотни и тысячи. Тысячу римляне называли "милле" (слово "миля" когда-то обозначало путь в тысячу шагов).
Обозначая числа, римляне записывали столько цифр, чтобы их сумма давала нужное число. Например, число 7 они записывали так: VII, а число 362 так: CCCLXII. Как видите, сначала идут большие цифры, а потом поменьше. Но иногда римляне писали меньшую цифру перед большей. Это означало, что нужно не складывать, а вычитать. Например, число 4 обозначалось IV (без одного пять), а число 9 - IX (без одного девять). Запись XC означала число 90 (без одного сто). Так что, если вы увидите на старинном доме сделанную римскими цифрами надпись MDCCCXLIV, то легко определите, что он построен в 1844 году. А если на афише кинотеатра будет написано "Пираты XX века", то вы не прочтете это "Пираты ха-ха века", а поймете, что речь идет о пиратах двадцатого века. Самым большим числом, которое умели обозначать римляне, было 100000. Поэтому обычно в названиях крупных денежных сумм слова "сотен тысяч" опускались. Запись означала 10 сотен тысяч, то есть миллион.
Хотя римская нумерация была не слишком удобной, она распространилась по всей ойкумене - так называли древние греки известный им обитаемый мир. Когда-то римляне завоевали многие страны и присоединили их к своей империи. Со всех этих стран они взимали громадные налоги и, конечно, пользовались при этом своими обозначениями чисел. Так что пришлось жителям этих стран учить римскую нумерацию, посылая все проклятия на головы поработителей. И даже после того, как рухнула Римская империя, в деловых бумагах Западной Европы применялась эта неудобная нумерация.
Практические аспекты и алгоритмы решения:
Описание использованных математических методов, построенных математических моделей, использованных алгоритмов.
Для создания программы, я использовала следующие компоненты: TPanel, TBitBtn, TLabel, TEdit, TStatic Text.
TPanel
-панель:
Компонент TPanel представляет собой контейнер общего назначения. Не имеет заголовка и поэтому менее удобен для функционального группирования элементов. C другой стороны, его свойство Caption отображается в виде текстовой строки и может использоваться для вывода сообщений. Компоненты этого класса часто помещаются на форму для того, чтобы располагать вставленные в них дочерние компоненты вдоль одной из сторон окна независимо от изменения размеров этого окна.
Компонент имеет развитые средства создания различных эффектов объемности за счёт использующихся в нем двух кромок - внешней и внутренней.
TLabel-метка:
Компонент TLabelиспользуется для отображения текста, который играет роль метки и не изменяется пользователем. Текст метки задается свойством Caption. Шрифт надписи определяется свойством Font, цвет фона - свойством Color, а цвет надписи - подсвойством Color свойства Font. Размер меток TLabel определяется свойством AutoSize. Если это свойство установлено в true, то вертикальный и горизонтальный размеры компонента определяются размером надписи. Если же AutoSize равно false, то выравнивание текста внутри компонента определяется свойством Alignment, которое позволяет выравнивать текст по левому краю, правому краю или центру клиентской области метки. Свойство WordWrap определяет допустимость переноса слов длинной надписи, превышающей длину компонента, на новую строчку. Чтобы такой перенос мог осуществляться, надо установить свойство WordWrap в true, свойство AutoSize в false (чтобы размер компонента не определялся размером надписи) и сделать высоту компонента такой, чтобы в нем могло поместиться несколько строк. Если WordWrap не установлено в true при AutoSize равном false, то длинный текст, не помещающийся в рамке метки, просто обрезается.
TEdit-однострочное редактируемое текстовое поле:
В компоненте TEdit вводимый и выводимый текст содержится в свойстве Text. Это свойство можно устанавливать в процессе проектирования или задавать программно. Выравнивание текста невозможно. Перенос строк тоже невозможен. Текст, не помещающийся по длине в окно, просто сдвигается и пользователь может перемещаться по нему с помощью курсора. Свойство AutoSize позволяет автоматически подстраивать высоту (но не ширину) окна под размер текста.
TBitBtn-
кнопка с изображением
:
Графическая кнопка TBitBtn представляет собой популярную разновидность стандартной кнопки TButton. Её отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение на поверхности кнопки. В комплект Delphi входит множество рисунков, разработанных специально для размещения на этих кнопках. Кнопка bkHelp(в данном случае) автоматически вызывает раздел справочной службы, связанный с Heipcontext формы, на которую она помещена. Если у кнопки была изменена пиктограмма Glyph, Delphi автоматически присвоит ей Kind=bkCustom. Это произойдет также в случае, когда кнопка указана как умалчиваемая (Defauit=True), но Kind не содержит bkok или bkYes, а также если ее свойство Cancel содержит True, a Kind нe содержит bkCancel или bkNo.
TStatic Text
-текстовая метка:
Компонент TStatic Text во всем подобен TLabel за исключением двух аспектов. Во-первых, он поражден от класса TWinControl и, таким образом, имеет Windows – окно. Это обстоятельство может быть необходимым условием правильного взаимодействия с внешним для Delphi элементом ActiveX, с которым текстовая метка связана своим свойством FocusControl.
Во-вторых, в его свойстве BorderStyle добавлено значение sbsSunken, которое создает иллюзию рельефности компонента. Все остальные свойства и методы компонента совпадают со свойствами и методами TLabel.
Для создания кода программы я заводила массив. Массив — это пронумерованная последовательность величин одинакового типа(в данном случае числа и символы), обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива).
Массив данных в программе рассматривается как переменная структурированного типа. Массиву присваивается имя(в данном случае R и A), посредством которого можно ссылаться как на массив данных в целом, так и на любую из его компонент.
R: array[1..13] of string[2] =
('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
A: array[1..13] of Integer =
(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
Переменные, представляющие компоненты массивов, называются переменными с индексами в отличие от простых переменных, представляющих в программе элементарные данные. Индекс в обозначении компонент массивов может быть константой, переменной или выражением порядкового типа.
Интерфейс тестирующей программы
.
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Запуск программы.
Запуск программы необходимо производить , находясь в среде Windows : запускаемый файл – AtoR .exe. Программа устанавливается в папку Program Files и создает ярлык на рабочем столе. Запускаем программу.
После запуска на экране появляется окно
Ввод исходных данных осуществляется с клавиатуры.
Вводим арабское число, программа конвертирует данное число в римское и выводит его на экран. На экране мы видим направление перевода.
Вводим римское число, программа конвертирует данное число в арабское и выводит его на экран. На экране мы видим направление перевода.
В левом нижнем углу программы расположен объект «Help». При нажатии на него появится новая форма, которая содержит описание работы тестирующей программы, алгоритм использования.
Исходный код программного продукта:
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
StaticText1: TStaticText;
Label3: TLabel;
StaticText2: TStaticText;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure Edit1Change(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
Mode: integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
const
R: array[1..13] of string[2] =
('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
A: array[1..13] of Integer =
(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
function ArabicToRoman(N: Integer): string; //Арабские в римские
var
i: Integer;
begin
Result := '';
i := 13;
//выполнение цикла пока входное число >0
while N > 0 do
begin
//выбор номера элемента массива, который будет выведен в результирующую строку
перебор элементов начинается с последнего элемента, т.е. с 1000
если входное число меньше текущего элемента, то переход к элементу с меньшим
значением
while A[i] > N do
Dec(i);// уменьшение значения на i
//добавление выбранного элемента к результирующей строке
Result := Result + R[i];
//уменьшение входного числа на величину выбранного элемента
и повтор цикла пока входное число не станет равным нулю
Dec(N, A[i]);
end;
end;
function RomanToArabic(S: string): Integer; //Римские в арабские
var
i, p: Integer;
begin
Result := 0;
i := 13;
p := 1; //позиция, с которой ведётся анализ строки
while p <= Length(S) do //если позиция больше либо равна длине строки
begin
//выделение из входной строки отдельных цифр
длина обозначения цифры может быть = 1 или 2
перебор массива элементов начинается с конца массива
while Copy(S, p, Length(R[i])) <> R[i] do//с p элемента , количество length
begin
Dec(i); // уменьшение значения на i
if i = 0 then
Exit;
end;
//увеличения результата (в арабском представлении) на значение выбранного элемента
Result := Result + A[i];
//сдвиг позиции анализа на длину обозначения римской цифры
p := p + Length(R[i]);
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text='' then
Mode:=0
else
case Edit1.Text[1] of
'0'..'9': Mode:=1;
else
Mode:=2;
end;
case Mode of
0: begin //длина строки =0 - ничего не делаем
StaticText1.Caption:='';
StaticText2.Caption:='';
end;
1: begin //перевод арабских в римские
StaticText1.Caption:='Арабские -> Римские';
StaticText2.Caption:=ArabicToRoman(StrToInt(Edit1.Text));
end;
2: begin //перевод римских в арабские
StaticText1.Caption:='Римские -> Арабские';
StaticText2.Caption:=IntToStr(RomanToArabic(Edit1.Text));
end;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
//Key - нажатый на клавиатуре символ
//переводим символ в верхний регистр
Key:=UpCase(Key);
//фильтр, чтобы программа игнорировала символы не относящиеся
//к обозначению римских и арабских цифр
//#8 - это код когда нажимаешь кнопки Delete или BackSpace
//если символы не входят в разрешённые, то Key обнуляется
if (Mode=0) and (not (Key in ['0'..'9','I','M','D','C','L','X','V',#8])) then
Key:=#0;
if (Mode=1) and (not (Key in ['0'..'9',#8])) then
Key:=#0;
if (Mode=2) and (not (Key in ['I','M','D','C','L','X','V',#8])) then
Key:=#0;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Form2.Show
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Form3.Show
end;
end.
Вывод по проделанной работе:
В результате проделанной работы была разработана программа для перевода арабского числа в римскую систему и обратно.
Список использованных источников:
1) В.В. Фаронов “DELPHI Программирование на языке высокого уровня” Питер
2) Н.Б. Культин Основы прграммирования в Delphi 7. Питер 2006 г.
3) В. Пестриков и А. Маслобоев Delphi на примерах. Питер 2003 г.
4) В. Гофман и А. Хомоненко Delphi быстрый старт. Питер 2005 г.
5) М. Е. Фленов Библия Программиста (Delphi)
6) М. Зелковиц, А. Шоу, Дж. Гэннон Принципы разработки программного обеспечения (пер. с анг.)