Основы объектного программирования в системе турбо-паскаль
Объект в ТурбоПаскале - это структура данных, содержащая поля данных различных типов и заголовки методов и обобщающая структуру «Запись» (record). Синтаксис описания объекта: <ИмяПотомка>=оbjесt<ИмяПредка> поле; поле; … метод; … метод; end; В отличие от записи полями объекта могут быть, кроме данных, еще и методы, обрабатывающие эти данные Метод- это процедура или функция, объявленные внутри описания объекта. Синтаксис описания метода: procedure <Заголовок>(<Параметр1>, <Параметр2>:integer), Метод имеет доступ к полям данных объекта, не требуя передачи их ему в виде параметров Объявление метода внутри объявления объектного типа содержит только заголовок. Тело метода определяется вне объявления объекта. Его заголовок должен содержать имя объекта, которому принадлежит метод. Например: procedure <ТипОбъекта.Метод> (<Параметр1>, <Параметр2> : integer); Begin … … еnd;{Метод} Методы подразделяют на статические и виртуальные. Виртуальный метод отличается от статического тем. что реализующий его код подсоединяется к исполняемой программе не в процессе компиляции, а в процессе выполнения, Смысл объектно-ориентированного программирования заключается в работе с полями объекта через его методы. Полиморфизм. Предположим, надо создать объект «кружок». Очевидно, что новый объект должен иметь предком объект Point, обладая всеми его свойствами, кроме того. быть больше по размеру. Однако, ясно, что «высветить» точку и закрашенную окружность не удастся одними и теми же командами. Турбо-Паскаль разрешает сохранить потомку имя родительского метода, «перекрывая» его. Чтобы перекрыть родительский метод, надо просто задать его с тем же именем, но с другим телом (кодом) и, если необходимо, с другим набором параметров. Такой метод делается виртуальным и к его объявлению добавляется слово virtual. Применение виртуальных методов налагает ограничения на процедуры инициализации, которые должны записываться с зарезервированным словом constructor и иметь общее имя Init Каждый отдельный экземпляр объекта должен инициализироваться с помощью отдельного вызова конструктора Для очистки и удаления динамически распределенных объектов существует специальная процедура destructorDone. Деструктор комбинирует шаг освобождения памяти в «куче» с некоторыми другими задачами. Метод деструктора может быть пустыу), поскольку работу выполняет не только код тела, но и код, генерируемый Турбо-Паскалем в ответ на зарезервированное слово destructor. | всесторонней реализации сложных математических моделей, не допускающих аналитического исследования, с другой - возникли принципиально новые направления, и прежде всего - имитационное моделирование.
ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ ДИНАМИКИ ПОПУЛЯЦИЙ
Выше мы обсудили несколько классических математических моделей в экологии. Известно и немало других, которые можно найти в книгах и в статьях научно-популярных журналов.
Использование математических моделей, основанных на дифференциальных уравнениях или их дискретных аналогах, далеко не единственный путь в компьютерном моделировании динамики популяций. Другую интересную группу составляют чисто стохастические модели или динамические модели с элементами стохастичности. Опишем две возможные модели такого класса: одну - без подробностей, которые рекомендуем продумать самостоятельно, другую - во всех деталях, включая реализующую ее программу.
Первая модель. Две популяции находятся в соотношении «хищник - жертва», описанном выше, но модель совершенно иная. На некотором клетчатом поле (которое наглядно - все или по частям - изображается на дисплее) находятся волки (несколько) и зайцы (много). Зайцы совершают беспорядочные перемещения, длины и направления которых - случайные величины, подчиняющиеся некоторому закону распределения вероятностей, а каждый волк в каждое мгновение ориентируется на ближайшего зайца и может совершать ограниченные прыжки. Если волк в течение некоторого, заранее определенного, промежутка времени остается без добычи (т.е. не попадает в клетку, где находится заяц), то он погибает. Зайцы и волки через определенные моменты размножаются, например, каждый второй заяц приносит двух потомков, каждый второй волк приносит одного потомка, причем скорость размножения волков в два раза ниже, чем зайцев. Все это может красочно изображаться на экране, состояние которого меняется через фиксированные моменты времени.
Это - чисто имитационное моделирование, конечной целью которого является, как и в описанных моделях, установление судьбы популяций в зависимости от многих факторов, входящих в модель. Здесь нет дифференциальных уравнений, но зато в полной мере проявляется стохастика, моделирование случайных процессов. Реализация такой модели требует большого программистского искусства, способствует формированию вероятностных представлений.
Возможны и пограничные - динамико-стохастические модели. Например, в уравнениях Лотки - Вольтерры один из параметров - случайная величина с известным законом распределения. Самостоятельные размышления над такими задачами, даже лишь над их постановкой, очень полезны.
Вторая модель, которую опишем во всех деталях, предложена Д.Конвейем -имитационная модель роста, распада и различных изменений в популяции живых организмов, известная под названием «Жизнь».
Для построения алгоритма игры рассмотрим квадратное поле из n+1 столбцов и строк с обычной нумерацией от 0 до n, рис. 7.48. Крайние граничные столбцы и строки для удобства определим как «мертвую зону», они играют лишь вспомогательную роль.
Для любой внутренней клетки поля с координатами (i, j) можто определить 8 соседей. Если клетка «живая», ее закрашиваем, если клетка «мертвая», она пустая.
Зададим правила игры. Если клетка (i, j) «живая» и в окружении более трех «живых» клеток, она погибает (от перенаселения). «Живая» клетка также
специальных макрокоманд и включением последних в язык программирования , доступный программисту. Макрокоманды переводятся в машинные команды двумя путями - расстановкой и генерированием. В постановочной системе содержатся "остовы" - серии команд, реализующих требуемую функцию, обозначенную макрокомандой. Макрокоманды обеспечивают передачу фактических параметров, которые в процессе трансляции вставляются в "остов" программы, превращая её в реальную машинную программу.
В системе с генерацией имеются специальные программы, анализирующие макрокоманду, которые определяют, какую функцию необходимо выполнить и формируют необходимую последовательность команд, реализующих данную функцию.
Обе указанных системы используют трансляторы с ЯСК и набор макрокоманд, которые также являются операторами автокода. Развитые автокоды получили название Ассемблеры. Сервисные программы и пр., как правило, составлены на языках типа Ассемблер.
Макрос. Язык, являющийся средством для замены последовательности символов описывающих выполнение требуемых действий ЭВМ на более сжатую форму - называется Макрос(средство замены). В основном, Макрос предназначен для того, чтобы сократить запись исходной программы. Компонент программного обеспечения, обеспечивающий функционирование макросов, называется макропроцессором. На макропроцессор поступает макроопределяющий и исходный текст. Реакция макропроцессора на вызов-выдача выходного текста. Макрос одинаково может работать, как с программами, так и с данными.
Язык ассе́мблера (англ. assembly language) — машинно-ориентированный язык низкого уровня с командами, обычно соответствующими командам машины, который может обеспечить дополнительные возможности вроде макрокоманд; автокод, расширенный конструкциями языков программирования высокого уровня, такими как выражения, макрокоманды, средства обеспечения модульности программ.
Исторически, если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нём больших программных комплексов привели к появлению языков третьего поколения - языков программирования высокого уровня (таких как Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки программирования высокого уровня и их наследники в основном используются в настоящее время в индустрии информационных технологий. Однако, языки ассемблера сохраняют свою нишу, обусловленную их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.
На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны:
быстродействие (драйверы, игры); объём используемой памяти (загрузочные секторы, встраиваемое (англ. embedded) программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).
С использованием программирования на языке ассемблера производятся:
Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.
Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в
время падает на землю. Напомним элементарное решение этой задачи. Разложим скорость на горизонтальную и вертикальную составляющие:
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
Сначала мы, как и обычно, указываем название нашего массива. Затем, после "array", мы указываем диапазон индексов в массиве, т.е. в данном случае мы создали 101 элементов массива с заданными индексами. И затем естественно указываем тип элементов массива, а именно пишем после "of" тип "integer", т.е. элементы массива целочисленные. Теперь как же обратиться к элементам массива непосредственно из кода, т.е. работать с этими элементами как с обыкновенными переменными? Делается это предельно просто. Обратиться к любому элементу массива можно следующим образом:
В квадратных скобках мы указываем индекс самого элемента массива. Очень важно учитывать, что введенный индекс, по которому мы хотим обратиться к элементу массива, должен быть в указанном при объявлении массива диапазоне, иначе программа во время своей работы выдаст нам ошибку. Также, в качестве индекса может выступать и другая любая переменная типа integer (а также и различные примитивные математические операции), например так:
В Java массивы являются объектами. Это значит, что имя, которое даётся каждому массиву, лишь указывает на адрес какого-то фрагмента данных в памяти. Кроме адреса в этой переменной ничего не хранится. Индекс массива, фактически, указывает на то, насколько надо отступить от начального элемента массива в памяти, чтоб добраться до нужного элемента. Чтобы создать массив надо объявить для него подходящее имя, а затем с этим именем связать нужный фрагмент памяти, где и будут друг за другом храниться значения элементов массива. Возможные следующие варианты объявления массива: тип[] имя; тип имя[];Где тип — это тип элементов массива, а имя — уникальный (незанятый другими переменными или объектами в этой части программы) идентификатор, начинающийся с буквы. Примеры: int[] a; double[] ar1; double ar2[];В примере мы объявили имена для трёх массивов. С первом именем a сможет быть далее связан массив из элементов типа int, а с именами ar1 и ar2 далее смогут быть связаны массивы из вещественных чисел (типа double). Пока мы не создали массивы, а только подготовили имена для них. Теперь создать (или как ещё говорят инициализировать) массивы можно следующим образом: a = new int[10]; // массив из 10 элементов типа intint n = 5; ar1 = new double[n]; // Массив из 5 элементов double ar2 = {3.14, 2.71, 0, -2.5, 99.123}; // Массив из 6 элементов типа double
То есть при создании массива мы можем указать его размер, либо сразу перечислить через запятую все желаемые элементы в фигурных скобках (при этом размер будет вычислен автоматически на основе той последовательности элементов, которая будет указана). Обратите внимание, применения в данном алгоритме, можно свести число парметров к одному (какому?), а не двум.
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|