1  
   2  IV. Программное обеспечение для объектно-ориентированного программирования и
   3  разработки приложений (Kdevelop, Lazarus, Gambas) ........................................................... 2
   4    1. Введение в ООП.................................................................................................................... 2
   5    2. Разработка ПО с использованием Kdevelop....................................................................... 16
   6       2.1. Основы языка программирования C++....................................................................... 17
   7       2.2. Работа со средой разработки ПО KDevelop................................................................ 30
   8    3. Разработка ПО с использованием Lazarus ......................................................................... 37
   9       3.1. Основы языка программирования Pascal.................................................................... 38
  10       3.2. Работа со средой разработки ПО Lazarus ................................................................... 48
  11    4. Разработка ПО с использованием Gambas ......................................................................... 54
  12       4.1. Основы языка программирования BASIC (ОО диалект) ........................................... 55
  13       4.2. Работа со средой разработки ПО Gambas................................................................... 61
  14  
  15  
  16  
  17  
  18  Академия АйТи                     Установка и администрирование ПСПО. Лекции. Часть 4                             Страница 1 из 67
  19         IV.          Программное                  обеспечение                    для        объектно-
  20  ориентированного программирования и разработки приложений
  21  (Kdevelop, Lazarus, Gambas)
  22         1. Введение в ООП
  23         Объектно-ориентированное               программирование              (ООП)      —       парадигма
  24  программирования (иными словами совокупность идей и понятий, определяющая стиль
  25  написания программ), в которой основными концепциями являются понятия объектов и
  26  классов.  Парадигма программирования определяет то, в каких терминах программист
  27  описывает логику программы. Например, в императивном программировании (самом
  28  прямолинейном подходе, где программа эквивалентна набору инструкций, т.е. это
  29  последовательность команд, которые должен выполнить компьютер) программа описывается
  30  как последовательность действий, а в функциональном программировании представляется в
  31  виде выражения и множества определений функций. В самом же популярном и
  32  рассматриваемом в данном курсе объектно-ориентированном программировании программу
  33  принято рассматривать как набор взаимодействующих объектов. ООП есть, по сути,
  34  императивное программирование, дополненное принципом инкапсуляции данных и методов
  35  в объект и          наследованием     (принципом повторного использования разработанного
  36  функционала). http://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%B8%D0%B3%D0%BC%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F 
  37          Многие современные языки специально созданы для облегчения объектно-
  38  ориентированного программирования. Однако следует отметить, что можно применять
  39  техники ООП и для не объектно-ориентированного языка и наоборот, применение объектно-
  40  ориентированного языка вовсе не означает, что код автоматически становится объектно-
  41  ориентированным.
  42         Современный объектно-ориентированный язык предлагает, как правило, следующий
  43  обязательный набор синтаксических средств:
  44                  ·      Объявление классов с полями (данными) и методами (функциями).
  45                  ·      Механизм расширения класса (наследования) — порождение нового
  46          класса от существующего с автоматическим включением всех особенностей
  47          реализации класса-предка в состав класса-потомка.
  48                  ·      Средства        защиты          внутренней          структуры       классов        от
  49          несанкционированного использования извне. Обычно это модификаторы доступа к
  50  
  51  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4          Страница 2 из 67
  52          полям и методам, типа public, private, обычно также protected, иногда некоторые
  53          другие.
  54                  ·    Полиморфные         переменные         и     параметры   функций    (методов),
  55          позволяющие присваивать одной и той же переменной экземпляры различных
  56          классов.
  57                  ·    Полиморфное поведение экземпляров классов за счёт использования
  58          виртуальных методов. В некоторых ООП-языках все методы классов являются
  59          виртуальными.
  60         Видимо, минимальным традиционным объектно-ориентированным языком можно
  61  считать язык Оберон, который не содержит никаких других объектных средств, кроме
  62  вышеперечисленных. Но большинство языков добавляют к указанному минимальному
  63  набору те или иные дополнительные средства синтаксиса. В их числе:
  64                  ·    конструкторы, деструкторы, финализаторы;
  65                  ·    свойства (аксессоры);
  66                  ·    индексаторы;
  67                  ·    интерфейсы — как альтернатива множественному наследованию;
  68                  ·    переопределение операторов для классов;
  69                  ·    множество других усовершенствований базовых конструкций ООП
  70          парадигмы.
  71         Часть языков (иногда называемых "чисто объектными") целиком построена вокруг
  72  объектных средств — в них любые данные (возможно, за небольшим числом исключений в
  73  виде встроенных скалярных типов данных) являются объектами, любой код — методом
  74  какого-либо класса и невозможно написать программу, в которой не использовались бы
  75  объекты. Примеры подобных языков — Java, C# или Ruby. Программа, на этих языках
  76  состоящая из хотя бы одной строки кода, гарантировано будет содержать хотя бы один класс
  77  и/или объект. Другие языки (иногда используется термин "гибридные") включают ООП-
  78  подсистему в исходно процедурный язык. В них существует возможность программировать
  79  как с привлечением ООП парадигмы, так и не обращаясь к объектным средствам.
  80  Классические примеры таких языков — C++ и Delphi (Object Pascal). http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
  81         Еще раз выделим разницу между объектно-ориентированным программированием
  82  (ООП) и объектно-ориентированным языком программирования (ОО-язык). ООП - это набор
  83  идей, концепций и методик облегчающий (как принято считать, хотя ООП постоянно
  84  
  85  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4        Страница 3 из 67
  86  подвергается довольно аргументированной критике) разработку сложных вычислительных
  87  систем. А ОО-язык берет на вооружение эти идеи и методики и средствами присущего
  88  только ему синтаксиса позволяет разработчику воспользоваться ими. В целом, берясь за
  89  любой новый ОО-язык, программист может быть практически уверен, что он сможет описать
  90  класс (или его аналог в данном языке), создать экземпляр класса, вызвать методы этого
  91  класса и т.д. Единственно существенный вопрос, который может (и должен) его волновать -
  92  КАК? Как все это реализуется, т.е. буквально - с чего начать описание класса, или какой
  93  конструкцией можно вызвать его метод (функцию). Для ответов на эти вопросы и изучают
  94  справочники и спецификации по синтаксису того или иного ОО-языка.
  95         Разумеется, каждый конкретный ОО-язык может реализовывать ОО-идеи несколько
  96  специфичным способом. Более того он может (и чаще всего так и происходит) расширять эти
  97  идеи какими-то собственными, присущими только ему или значительно более узкому кругу
  98  ОО-языков. Тем не менее, есть минимально допустимый набор концепций, который тем или
  99  иным способом реализован в абсолютном большинстве современных ОО-языков. Можно
 100  условно назвать этот набор термином «наименьший ОО-знаменатель». Язык, его не
 101  реализующий, вряд ли может быть помещен в таблицу «Современные ОО-языки».
 102         Итак - что же это за минимальный набор или "наименьший ОО-знаменатель"? Без чего
 103  решительно невозможно представить ОО-язык? Какие концепции являются буквально
 104  несущей конструкцией ООП? Их четыре:
 105         Абстракция данных
 106                  Классы   представляют        собою      упрощенное,        идеализированное    описание
 107         реальных сущностей предметной области. Если соответствующие модели адекватны
 108         решаемой задаче, то работать с ними оказывается намного удобнее, чем с
 109         низкоуровневым описанием всех возможных свойств и реакций класса.http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
 110                  Пример: машина (автомобиль) - реальная сущность реального мира, класс Car -
 111         ее модель в мире программном. Вообще любой автомобиль характеризуется просто
 112         огромной кучей параметров - цвет, марка, модель, габариты, вес, грузоподъемность,
 113         число и диаметр колес и т.д. Обязан ли программист в классе Car полностью
 114         смоделировать машину реальную и указать все ее характеристики? Нет, ему
 115         достаточно создать модель достаточную и адекватную решаемой задаче. Например,
 116         мы можем постановить, что для создаваемой нами программы необходимо и
 117         достаточно знать всего два параметра: дату изготовления автомобиля и тип его кузова.
 118  
 119  Академия АйТи            Установка и администрирование ПСПО. Лекции. Часть 4           Страница 4 из 67
 120         Тогда, очевидно, мы разместим в классе Car 2 поля (поскольку атрибуты объектов
 121         реальных отражаются как раз на поля классов) с условными именами ДатаВыпуска и
 122         КузовТип. Если мы не ошиблись в наших оценках и этих двух полей действительно
 123         достаточно - все отлично, мы можем абстрагироваться от наличия прочих
 124         характеристик автомобиля реального. Однако если выяснится что программе (в лице
 125         других классов-потребителей) требуются вовсе не ДатаВыпуска и КузовТип а как раз
 126         ЦветКузова, МаксимальныйВес и Производитель нам придется имеющийся класс Car
 127         выкинуть и попросту начать с нуля. Дабы избежать подобных накладок и не тратить
 128         попусту труд и время разработчика ООП должно начинаться вовсе не с написания
 129         кода, а с вещи, возможно, даже более важной чем правильный и красивый код - с
 130         объектно-ориентированного проектирования будущей программы. Именно тут
 131         архитектор ПО должен принять стратегические решения - какие из характеристик
 132         объектов реальных необходимы и достаточны для их программного моделирования.
 133         Инкапсуляция
 134                  Это принцип, согласно которому любой класс должен рассматриваться как
 135         «чёрный ящик» — пользователь класса (а им, очевидно, будет какой-то второй класс,
 136         класс-потребитель) должен видеть и использовать только интерфейсную часть класса
 137         (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю
 138         реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы
 139         доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью
 140         методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число
 141         связей между классами и, соответственно, упростить независимую реализацию и
 142         модификацию классов.
 143                  Так же пример: телефон - реальная сущность реального мира, класс Phone - ее
 144         модель в мире программном. В телефоне реальном человек-пользователь (аналог
 145         класса-потребителя в мире программном) снимает трубку - набирает номер - кладет
 146         трубку. Все, это вся информация которую ему необходимо знать. Аналогично, класс
 147         Phone должен "выставлять наружу" примерно следующие 3 метода:
 148                        ·       ТрубкуПоднять()
 149                        ·       НажатьКлавишу(номер_клавиши)
 150                        ·       ТрубкуОпустить()
 151  
 152  
 153  
 154  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4   Страница 5 из 67
 155                  То, что при каждом нажатии клавиши телефона программного (как и реального)
 156         «реле FR45 посылает пиловидный импульс в выходную телефонную линию» не
 157         является необходимым знанием для ежедневной эксплуатации телефона и этот
 158         функционал не должен быть доступен ни реальному человеку, ни классу-потребителю.
 159         Поэтому метод Импульс_В_Линию() был бы объявлен внутри класса Phone как
 160         приватный, т.к. очевидно сам телефон (внутри) должен уметь посылать сигналы в
 161         линию, но вот сделать этот метод доступным извне, прочим классам, было бы грубой
 162         ошибкой и нарушением обсуждаемого принципа «черного ящика». Вызов публичного
 163         метода НажатьКлавишу(номер_клавиши) приводил бы к вызову метода приватного
 164         Импульс_В_Линию() что прекрасно согласуется с моделируемым объектом: нажатие
 165         физической клавиши действительно приводит к активности физического реле. Однако
 166         ситуация, когда никакая клавиша не нажата, а импульс все же сгенерен смотрелась бы
 167         очень странно и никак не укладывается в привычные рамки реального мира. «Черный
 168         ящик» нас от таких ситуаций успешно охраняет.
 169                  Второй пример, освещающий иной аспект того же самого принципа - аспект
 170         контролируемого доступа к состоянию класса. Предположим                 существование
 171         реального объекта - музыкального mp3-плеера. Не программного, а именно в виде
 172         коробочки с наушниками. Так же предположим, что весь его "интерфейс" состоит из
 173         одной физической кнопки A. Короткое нажатие на кнопку A переключает плеер между
 174         состояниями проигрывание/пауза и больше никакого управления не предусмотрено.
 175         Очевидно, что при программном моделировании класса Player мы бы ввели в него
 176         поле ПоложениеКнопкиA, т.к. статус этой кнопки является одной из характеристик, а
 177         они, как уже известно, отражаются на поля. Сначала давайте рассмотрим вариант,
 178         когда мы даем классу-потребителю прямой доступ к этому полю. Какие значения этот
 179         класс-потребитель мог бы в это поле поместить? Очевидно, он мог бы указать
 180         значение НАЖАТО (условный цифровой код 1) и ОТПУЩЕНО (условный цифровой
 181         код 0). Если бы классу- потребитель гарантировано предавал только эти 2 значения, да
 182         еще гарнировано в правильном порядке (что бы за каждым НАЖАТО непременно
 183         следовало ОТПУЩЕНО) - проблем бы не было никаких. Плеер реальный, как и Player-
 184         класс прекрасно понимают что надо делать при переходе из одного состояния в
 185         другое. Однако - как эти плееры должны реагировать при смене состояния НАЖАТО
 186         (1) опять в НАЖАТО (1)? Или - что делать при помещении в поле ПоложениеКнопкиA
 187  
 188  Академия АйТи            Установка и администрирование ПСПО. Лекции. Часть 4   Страница 6 из 67
 189         значения СДВИГ_ВПРАВО (условный цифровой код 2)? Наша кнопка A не умеет
 190         быть нажатой дважды без отпускания и уж тем более не умеет сдвигаться ни вправо,
 191         ни влево! Вот потому-то принцип инкапсуляции и утверждает - никаких
 192         непосредственных изменений внутреннего состояния класса извне, а только через
 193         предусмотренный специально для этих целей интерфейс. В случае класса Player было
 194         бы грамотным шагом введение публичного (доступного любому заинтересованному
 195         классу) метода с именем вроде A_Нажать_И_Отпустить(). Тогда бы мы полностью
 196         и корректно смоделировали поведение нашего реального прототипа. Точно как и на
 197         "живом"      mp3-плеере      потребители         класса      Player    теперь    могут       лишь
 198         нажать_и_отпустить кнопку A. А вот уже внутри метода A_Нажать_И_Отпустить()
 199         автор этого класса сам может изменять значение поля ПоложениеКнопкиA. Но такое
 200         изменение статуса является куда как более контролируемым и подвержено
 201         значительно меньшей вероятности возникновения ошибок. Авторы классов прекрасно
 202         осведомлены о внутреннем состоянии своих "питомцев" и, почти наверняка, автору
 203         класса Player и в голову не придет попытаться двигать кнопку в стороны вместо того,
 204         что бы нажимать на нее. Проблема заключается в том, что бы помешать сделать это
 205         гораздо менее искушенным во внутреннем устройстве класса Player потребителям и
 206         принцип "черного ящика" дает ответ этой проблеме. Коротко этот принцип
 207         формулируется так: классы-потребители в принципе не имеют доступа к приватным
 208         членам потребляемого ими класса, а, следовательно, не могут произвольно менять его
 209         состояние на любое им понравившееся. Любое изменение в статусе производится
 210         только с одобрения самого этого класса.
 211         Наследование
 212                  Наследованием называется возможность порождать один класс от другого с
 213         сохранением всех свойств и методов класса-предка (прародителя, иногда его называют
 214         суперклассом) и добавляя, при необходимости, новые свойства и методы. Набор
 215         классов, связанных отношением наследования, называют иерархией. Наследование
 216         призвано отобразить такое свойство реального мира, как иерархичность.
 217                  Традиционный пример, снова обратимся к машинам (автомобилям). Допустим
 218         нам необходимо реализовать классы ЛегковойАвтомобиль и ГрузовойАвтомобиль.
 219         Очевидно, эти два класса имеют общую функциональность. Так, оба они имеют 4
 220         колеса (для упрощения сделаем в вид, что 6-ти и более колесного транспорта не
 221  
 222  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4            Страница 7 из 67
 223         существует), двигатель, могут перемещаться и т.д. Всеми этими свойствами обладает
 224         любой автомобиль, независимо от того, грузовой он или легковой, 5- или 12-местный.
 225         Разумно вынести эти общие свойства и функциональность в отдельный класс,
 226         например, Автомобиль и наследовать от него два класса - ЛегковойАвтомобиль и
 227         ГрузовойАвтомобиль. Тогда поле МестПосадочных достаточно ввести только в классе
 228         Автомобиль, а два унаследованных класса получат это поле буквально "по
 229         наследству". Останется лишь установить нужное значение этого поля через
 230         публичный интерфейс. Более точно, если мы хотим, что бы потребители наших
 231         классов ЛегковойАвтомобиль и ГрузовойАвтомобиль могли изменять значение этого
 232         поля мы должны предусмотреть для них публичный интерфейс. Почему именно
 233         интерфейс? Потому что так диктует принцип инкапсуляции, он же "черный ящик". А
 234         что если мы попробуем игнорировать этот принцип? В самом деле - ну зачем нам еще
 235         дополнительная прокладка в виде метода УстановитьЧислоМестПосадочных()?
 236         Почему бы не позволить             потребителям быстренько менять           значение поля
 237         МестПосадочных без всяких посредников? Ну то что "быстренько" это, конечно,
 238         хорошо, но вот что делать двум проектируемым классам когда они однажды вдруг
 239         выяснят что могут вместить 7500 человек? Или, что еще "лучше", -5 человек? Вот для
 240         отсечения таких ситуаций обсужденный ранее принцип инкапсуляции соблюдать не
 241         просто         "хорошо            бы",           а          категорически       необходимо.
 242         УстановитьЧислоМестПосадочных() встанет на стражу наших интересов и не
 243         позволит моделировать нам (а более точно - потребителям создаваемых нами классов)
 244         автомобили с пассажирской емкостью в 20 самолетов. Кстати, и сам этот метод можно
 245         объявить в базовом классе, Автомобиль, наряду с полем МестПосадочных. Это еще
 246         больше подчеркнет преимущества обсуждаемого принципа - создается метод лишь
 247         однажды, а доступен потребителям как базового класса (Автомобиль) так и
 248         потребителям любого унаследованного от него класса.
 249         Полиморфизм
 250                  Полиморфизмом называют явление, при котором функции (методу) с одним и
 251         тем же именем соответствует разный программный код (полиморфный код) в
 252         зависимости от того, объект какого класса используется при вызове данного метода.
 253         Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода
 254         класса-предка с обязательным сохранением сигнатуры метода. Иными словами
 255  
 256  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4        Страница 8 из 67
 257         требуется сохранить имя метода, тип и число его параметров, но можно изменить его
 258         тело. Это обеспечивает сохранение неизменным интерфейса класса-предка и
 259         позволяет осуществить связывание имени метода в коде с разными классами — из
 260         объекта какого класса осуществляется вызов, из того класса и берётся метод с данным
 261         именем. Такой механизм называется динамическим (или поздним) связыванием — в
 262         отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.
 263                  В качестве примера этой концепции продолжим работу с базовым классом
 264         Автомобиль и двумя его унаследованными классами из предыдущего раздела. Как вы
 265         помните,              мы         закончили             созданием             публичного         метода
 266         УстановитьЧислоМестПосадочных() причем объявили его именно в базовом классе.
 267         В настоящий момент метод работает совершенно идентично, вызовем ли мы его из
 268         класса Автомобиль, или из класса ЛегковойАвтомобиль, или ГрузовойАвтомобиль.
 269         Напомню, что два последних класса получили этот метод "по наследству" из базового.
 270         Т.к. у нас есть физически один метод не удивительно, что именно он и будет
 271         отрабатывать из какого бы класса мы его не вызывали. Усложним задачу. Введем
 272         новое приватное поля в класс Автомобиль - ЧислоОбращений. Изначально значением
 273         этого поля будет 0, и, точно как и поле МестПосадочных, оно будет унаследовано
 274         обоими производными (иное название класса, унаследованного от какого-то базового
 275         класса) классами. Теперь сформулируем новые требования:
 276                           ·        если метод УстановитьЧислоМестПосадочных() вызывается из
 277                  класса       Автомобиль        -    изменить       (после      проверки)   значение       поля
 278                  МестПосадочных на указанное значение и больше ничего не делать
 279                           ·        если метод УстановитьЧислоМестПосадочных() вызывается из
 280                  класса ЛегковойАвтомобиль - изменить (после проверки) значение поля
 281                  МестПосадочных на указанное значение, а поле ЧислоОбращений увеличить на
 282                  единицу
 283                           ·        если метод УстановитьЧислоМестПосадочных() вызывается из
 284                  класса ГрузовойАвтомобиль - изменить (после проверки) значение поля
 285                  МестПосадочных на указанное значение, а поле ЧислоОбращений уменьшить
 286                  на единицу
 287                  Итак,          теперь          единый           до          этого       момента         метод
 288         УстановитьЧислоМестПосадочных распадается на 3 части:
 289  
 290  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4            Страница 9 из 67
 291                        ·        часть общая для всех классов - проверка переданного ему
 292                  значения и если все хорошо присвоение этого значения полю МестПосадочных
 293                        ·        часть характерная только для класса ЛегковойАвтомобиль, а
 294                  именно +1 к ЧислоОбращений
 295                        ·        часть характерная только для класса ГрузовойАвтомобиль, а
 296                  именно -1 к ЧислоОбращений
 297                  Разумеется практической смысловой нагрузки в таких требованиях не много, но
 298         как иллюстративный пример они подходят как нельзя лучше. Как же полиморфизм
 299         позволит нам изящно подстроиться под изменившиеся условия? А вот как:
 300                        ·        в       классе          Автомобиль               оставим      в        методе
 301                  УстановитьЧислоМестПосадочных() только общую часть и обозначим его как
 302                  "специальный" (с термином "специальный метод" мы разберемся чуть позже).
 303                  Что бы не привязываться к синтаксису конкретного ОО-языка запишем это на
 304                  псевдоязыке:
 305                        класс Автомобиль
 306                        {
 307                                 специальный
 308                  УстановитьЧислоМестПосадочных(места)
 309                                 {
 310                                         Проверить что число места разумно
 311                                         Если проверка прошла -
 312                                         поле МестПосадочных=места
 313                        }
 314                        }
 315                        ·        в унаследованных классах объявим тот же самый метод который
 316                  во-первых, вызовет свою реализацию из вышестоящего класса Автомобиль
 317                  (иногда ее называют базовой реализаций метода), а во-вторых предпримет
 318                  действия уникальные именно для этого класса. Снова псевдокод:
 319                        класс ЛегковойАвтомобиль унаследован_от Автомобиль
 320                        {
 321                                 специальный
 322                  УстановитьЧислоМестПосадочных(места)
 323  
 324  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4             Страница 10 из 67
 325                                {
 326  
 327  
 328                        Базовый.УстановитьЧислоМестПосадочных(места)
 329                                         ЧислоОбращений=ЧислоОбращений+1
 330                        }
 331                        }
 332  
 333  
 334                        класс ГрузовойАвтомобиль унаследован_от Автомобиль
 335                        {
 336                                специальный
 337                  УстановитьЧислоМестПосадочных(места)
 338                                {
 339  
 340  
 341                        Базовый.УстановитьЧислоМестПосадочных(места)
 342                                         ЧислоОбращений=ЧислоОбращений-1
 343                        }
 344                        }
 345                  Что получилось в результате? В результате у нас не 1, а 3 варианта одного и
 346         того же метода. Какой из них будет вызван зависит от того на каком классе будет
 347         вызван                   этот                   метод.                   Т.е.                теперь
 348         ЛегковойАвтомобиль.УстановитьЧислоМестПосадочных(5) совсем не тоже самое,
 349         что Автомобиль.УстановитьЧислоМестПосадочных(5), хотя первый метод и вызовет
 350         второй. Это, кстати, вовсе не обязанность унаследованного метода. Т.е. метод в
 351         ЛегковойАвтомобиль совершенно законно мог бы игнорировать своего коллегу-
 352         предшественника из класса Автомобиль, просто в нашей конкретной задаче оказалось
 353         удобным все же к нему обратиться.
 354                  Почему       же        в       новой        реализации          потребовалось        метод
 355         УстановитьЧислоМестПосадочных() обозначать как специальный и что вообще
 356         означает термин "специальный метод"? Специальным он стал потому, что компилятор
 357         должен обработать его особым образом, а вот методика и синтаксис такого
 358         "специального" обозначения разнится от ОО-языка к ОО-языку.                              Однако в
 359         большинстве ОО-языков "специальные" (в смысле разбираемой темы) методы
 360         называются виртуальными, а их синтаксическое обозначение обыгрывает или
 361  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4           Страница 11 из 67
 362         крутится вокруг слова virtual. Как отмечалось во введении к этому уроку есть ОО-
 363         языки где все методы изначально являются virtual, в них никаких особых обозначений
 364         не требуется. Тем не менее характерный ОО-язык все же проводит явное
 365         синтаксическое        различие      между методами            обычными        (не   виртуальными)         и
 366         виртуальными.
 367                   Ну а в чем же выражается упомянутая "специальная обработка" виртуального
 368         метода компилятором? Выражается она в том, что связь между виртуальным методом
 369         и вызывающими его процедурами и функциями устанавливается не во время
 370         компиляции (это называется ранним связыванием), а во время выполнения программы
 371         (позднее         связывание).      Иными        словами,        в     то      время    когда       метод
 372         УстановитьЧислоМестПосадочных() еще не был переделан нами в виртуальный,
 373         запись       ЛегковойАвтомобиль.УстановитьЧислоМестПосадочных(5)                            однозначно
 374         транслировалась компилятором в Автомобиль.УстановитьЧислоМестПосадочных(5).
 375         Невиртуальный метод всегда однозначно вызывается из того класса, который его
 376         объявил. После переделки того же метода в виртуальный компилятор встретив ту же
 377         строчку кода уже подобной трансляции не производит, а оставляет вопрос "какой же
 378         на       самом    деле    метод     вызвать?"       до    момента          непосредственного      вызова
 379         УстановитьЧислоМестПосадочных() во время выполнения программы. Когда теперь
 380         во время выполнения класс-потребитель заявляет что ему требуется именно метод
 381         класса ЛегковойАвтомобиль - именно так и случается. А если другой потребитель
 382         затребует тот же метод из ГрузовойАвтомобиль - то получит ожидаемое. Отметим, что
 383         невиртуальный метод вызывается чуть-чуть быстрее, т.к. исполняющая программа
 384         изначально         (еще     до     запуска)       точно       знает        адрес    целевого      метода
 385         (УстановитьЧислоМестПосадочных, в нашем примере). Адрес же виртуального
 386         метода рассчитывается непосредственно перед его вызовом (в момент когда
 387         программа уже работает). Однако расчеты эти столь ничтожны, а мощности
 388         современных настольных (не говоря уже о серверных) компьютеров столь
 389         значительны, что указанные потери в производительности программы можно
 390         полностью игнорировать.
 391         Итак - резюмируем четыре постулата ООП:
 392         Абстракция данных - классы моделируют объекты реального мира, однако делают
 393  это лишь до известной степени, не пытаясь достичь соответствия "один-к-одному"
 394  
 395  Академия АйТи               Установка и администрирование ПСПО. Лекции. Часть 4              Страница 12 из 67
 396         Инкапсуляция - классы выставляют для потребителей абсолютно минимально
 397  необходимый публичный интерфейс, все остальное должно быть скрыто
 398         Наследование - взаимоотношения между классами напоминают взаимоотношения
 399  между объектами реального мира и их группами, где Кошка - специализированный вид
 400  (класс) Млекопитающего, а те, в свою очередь, специализированный вид (класс) Животного.
 401  Каждый унаследованный класс точно умеет делать все что делает класс базовый (Кошка
 402  умеет кормить потомство молоком, как все Млекопитающие), но может (хоть и не обязан)
 403  привносить свою собственную функциональность (только Кошка умеет мяукать, ловить
 404  мышей, и шипеть на собак)
 405         Полиморфизм - одни и те же функции (методы) в классе базовом и производном
 406  могут иметь функционал и полностью идентичный, и частично совпадающий (см. наш
 407  последний пример с УстановитьЧислоМестПосадочных), и абсолютно различный.
 408         А кто является главными "действующими лицами" в ООП-мире? С какими
 409  сущностями чаще всего доведется работать ООП-программисту? Их всего две - класс и
 410  объект. И о первом (особенно), и о втором мы уже упоминали неоднократно, однако надо
 411  дать формальное их определение и, что более важно, очертить их взаимосвязь и их отличие
 412  друг от друга.
 413         Итак, класс, как можно уже было предположить из предшествующего рассказа, это
 414  программная сущность - модель реального объекта реального мира (хотя, разумеется, никто
 415  не может помешать вам смоделировать выдуманный объект мира фэнтезийного). Обычно
 416  классы состоят из полей (там хранятся атрибуты объектов типа цвета кузова авто и их
 417  состояния, типа запущен ли двигатель, или остановлен) и функций/методов (действия,
 418  который         класс   "умеет"    выполнять        -   ДвигательСтарт(),        ДвигательЗаглушить(),
 419  ЛеваяПередняяДверьЗакрыть() и т.д.).
 420         Что же до объектов, то в большинстве объектно- ориентированных языков
 421  программирования (таких как Java, C++ или С#), объекты являются экземплярами некоторого
 422  заранее описанного класса. Объекты в таких языках создаются с помощью конструктора
 423  класса, и уничтожаются (когда они становятся ненужными) либо с помощью деструктора
 424  класса (например, в C++), либо автоматически с использованием сборщика мусора (в Java,
 425  C#). Иными словами, класс - это план, по которому будет создан объект. Рассмотрим пример
 426  на псевдокоде:
 427         класс Дом
 428  
 429  Академия АйТи              Установка и администрирование ПСПО. Лекции. Часть 4         Страница 13 из 67
 430         {
 431                  цветКрыши
 432                  количествоОкон
 433  
 434  
 435                  цветКрышиЗадать()
 436                  количествоОконЗадать()
 437                  всеОкнаОткрыть()
 438         }
 439         Примерно так мы бы могли смоделировать реальный дом программно. Из целой кучи
 440  характеристик дома реального мы могли бы остановиться всего на двух (цвете крыши и
 441  количестве окон) и ограничиться двумя методами вспомогательными, помогающими эти
 442  характеристики устанавливать классам потребителям("черный ящик" - помните?) и одним
 443  методом, утверждающим что наш класс будет уметь открывать окна. Самое интересно, что
 444  последняя фраза не совсем корректна. Класс - это проект, а не объект программного мира.
 445  Класс действительно мог бы открыть окна если бы они у него были. Но их нет! Они только
 446  будут у объекта созданного "по кальке" класса.
 447         Тут не совсем удачно пересекаются термины объект (реального мира; из него
 448  архитектор ПО придумывает класс) и одноименный ему объект (мира программного,
 449  получаемый из чертежа-класса). Для прояснения картины запомним схему - кто откуда
 450  "вытекает":
 451         ОБЪЕКТ реальный (автомобиль) à класс Car à ОБЪЕКТ программный (MyGreenCar)
 452         Так же отметим, что ОБЪЕКТ программный иногда называют экземпляром, однако
 453  термин объект все же употребляется чаще даже невзирая на его неоднозначность.
 454         Имея "чертеж" дома (класс Дом) мы можем наштамповать сколько угодно домов-
 455  объектов, например:
 456         МойДом=новый Дом()
 457         МойДом.цветКрышиЗадать("зеленый")
 458         МойДом.количествоОконЗадать(3)
 459         ДомРодителей=новый Дом()
 460         ДомРодителей.цветКрышиЗадать("синий")
 461         ДомРодителей.количествоОконЗадать(4)
 462         ДомПриятеля=новый Дом()
 463  
 464  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 14 из 67
 465         ДомПриятеля.цветКрышиЗадать("красный")
 466         ДомПриятеля.количествоОконЗадать(5)
 467 468         Элемент кода вида новый Дом()присутствует в том или ином синтаксисе в любом
 469  ОО-языке и называется конструктором объекта. Его назначение именно такое какое и
 470  вытекает из названия - сконструировать новый объект по классу-чертежу и позволить нам
 471  получить доступ к его функциям / методам.
 472         Как видите проблема только одна - придумать каждому объекту уникальное имя, и в
 473  общем случае совпадение с именем класса не допускается. И вот только теперь, когда у нас
 474  есть программный объект - копия (пусть и сильно усеченная) объекта реального мы можем
 475  начинать открывать окна:
 476         МойДом.всеОкнаОткрыть()
 477         ДомРодителей.всеОкнаОткрыть()
 478         ДомПриятеля.всеОкнаОткрыть()
 479  
 480  
 481         При этом в общем случае (однако - см. примечание в конце урока) строка
 482         Дом.всеОкнаОткрыть()
 483         вызовет ошибку компиляции. Класс определяет, что будут уметь делать полученные
 484  из него (или, если хотите, "от него") объекты, но не он сам.
 485         Итого, ответ на поставленный ранее вопрос: объект (программный) создается по
 486  "чертежу"-классу и в этом смысле является полностью от него зависящим. Не будет класса -
 487  определенно не будет объекта. В то же время, класс всего лишь планирует характеристики
 488  (атрибуты) и функционал будущих своих объектов, но сам ими не обладает и производить
 489  какую-либо      активность    не    может.      Иными        словами,         что   бы   воспользоваться
 490  функциональностью заложенной в классе (открыть окно в Доме) потребитель обязан создать
 491  его объект; иначе требуемая функциональность будет попросту недоступна.
 492  
 493  
 494  
 495  
 496  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4              Страница 15 из 67
 497         2. Разработка ПО с использованием Kdevelop
 498         KDevelop — свободная среда разработки программного обеспечения для UNIX-
 499  подобных операционных систем. KDevelop не включает в свой состав компилятор; иными
 500  словами сам по себе KDevelop не умеет переводить текст написанный программистом в код
 501  годный для выполнения на компьютере. KDevelop только предоставляет удобную среду для
 502  набора такого текста, его редактирования, отладки и прочих типичных задач разработчика.
 503  Однако для самого важного этапа в разработке ПО - перевод текста программы на языке
 504  высокого уровня (допустим Pascal), в эквивалентную программу на машинном языке (или,
 505  как еще говорят, перевод в двоичный код) - ему требуется помощь внешней программы-
 506  компилятора. Такие программы существуют сами по себе, независимо от KDevelop и в целом
 507  текст набранный в любом редакторе (в KDevelop в т.ч.) можно использовать как входной
 508  файл для компилятора вне зависимости от того установлена у нас среда разработки или ее
 509  нет вообще. Компилятор наличием/отсутствием KDevelop не интересуется; ему нужен
 510  синтаксически корректный файл на входе и более ничего, методика создания этого файла
 511  компилятору безразлична.
 512         Однако KDevelop умеет очень гладко осуществлять передачу набранного в нем текста
 513  разрабатываемой программы компилятору, прием сообщений от компилятора о ходе
 514  компиляции и, по окончании этого процесса, выдачу соответствующих сообщений
 515  программисту. Таким сообщением может быть известие о том, что ошибок компиляции не
 516  обнаружено, а поэтому исполнительный (двоичный) модуль успешно собран и готов к
 517  тестовому запуску. Или, напротив, сообщение о, например, 3-х ошибках компиляции с
 518  указанием строк исходной программы их вызвавших. Ясно, что такой подход сильно
 519  повышает эффективность работы разработчика по сравнению с "прямой" работой с
 520  компилятором и чтением выдаваемых им сообщений в консольном окне, да и редактор
 521  встроенный в эту среду значительно более удобен и продвинут по сравнению со
 522  стандартным.
 523         KDevelop умеет взаимодействовать описанным выше способом не с одним
 524  конкретным компилятором, а с их множеством. Т.е. используя эту среду можно создавать
 525  программы на многих языках программирования. Далеко не полный их перечень включает в
 526  себя такие языки как Ада, Bash, C, C++, Фортран, Java, Pascal, Perl, PHP, Python, Ruby и SQL.
 527  При этом и программист на Фортране и Паскаль-программист работают в одной и той же
 528  графической среде, с одним и тем же редактором и могут пользоваться всеми инструментами
 529  
 530  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 16 из 67
 531  и вспомогательными окнами встроенными в KDevelop. Различие (да и то не столь явно
 532  выраженное визуально) проявится в момент когда каждый из них даст команду на
 533  компиляцию своей программы (или, как еще говорят, на сборку проекта): у первого
 534  отработает Фортран-компилятор, а у второго Паскаль- компилятор. Однако они оба получат
 535  соответствующие уведомления в конце этого процесса.
 536         Разумеется, в рамках нашего курса не возможно рассмотреть создание программ на
 537  всех и каждом языке из списка поддерживаемых KDevelop. Поэтому в качестве нашего
 538  рабочего инструмента выберем C++ как один из (если не самый) популярных ОО-языков. Т.е.
 539  мы готовы попробовать создавать несложные программы на языке C++ в среде KDevelop.
 540  Для этого, очевидно, мы должны быть компетентны в двух не связанных областях
 541  компьютерной науки:
 542                  ·     мы должны знать и уметь писать синтаксически корректные программы
 543          на C++ как таковом, вне зависимости от используемой среды разработки
 544                  ·     мы должны знать KDevelop именно как приложение и уметь
 545          пользоваться предлагаемым им функционалом опять же, вне зависимости от языка на
 546          котором мы будем работать
 547         Соединение этих двух компетенций приведет к созданию именно C++ - программ
 548  именно с помощью среды KDevelop.
 549         Рассмотрим эти вопросы последовательно в следующих двух подразделах.
 550  
 551  2.1. Основы языка программирования C++
 552         C++ —        компилируемый строго типизированный язык программирования общего
 553  назначения. Поддерживает разные парадигмы программирования, но наибольшее внимание
 554  уделено поддержке объектно-ориентированного подхода. C++ справедливо считают трудным
 555  для изучения языком в виду его сложности и избыточности.
 556         В виду ограниченного объема нашего курса и несколько иной его направленности мы
 557  ограничимся лишь самыми базовыми конструкциями языка, да и то не всеми. При желании
 558  обучение может быть продолжено самостоятельно по учебникам и статьям, опубликованным
 559  в печатной и электронной прессе (Интернет). Объем информации находящейся в сети даже в
 560  свободном доступе более чем достаточен для изучения C++ с любой степенью погружения в
 561  его нюансы. Отметим, что базовое знание английского языка (технического) хоть и не
 562  является обязательным условием для успешного освоения C++, способно сильно облегчить и
 563  ускорить учебный процесс.
 564  Академия АйТи            Установка и администрирование ПСПО. Лекции. Часть 4   Страница 17 из 67
 565         Итак, простейшая C++ программа производящая какую-то активность может иметь
 566  вид:
 567         #include <iostream>
 568         using namespace std;
 569         int main()
 570         {
 571             cout << "Учимся программировать на языке С++!";
 572             return 0;
 573         }
 574         Разберем ее строчка за строчкой:
 575         #include <iostream>
 576         При      компиляции    программы        директива      препроцессора   #include   заставляет
 577  компилятор включить содержимое заданного файла в начало вашей программы. В данном
 578  случае компилятор включит содержимое файла iostream. Файлы которые вы включаете в
 579  начало (или заголовок) вашей программы, называются заголовочными файлами. Обычно они
 580  имеют расширение .h, однако данный случай - особый, нам нужен именно файл iostream (без
 581  расширения), а не iostream.h. В данный момент не беспокойтесь о внутреннем содержимом
 582  заголовочных файлов. Просто поймите, что оператор #include позволяет вам использовать эти
 583  файлы. Каждая создаваемая вами программа на C++ начинается с одного или нескольких
 584  операторов #include. Эти операторы указывают компилятору включить содержимое
 585  заданного файла (заголовочного файла) в вашу программу, как если бы программа содержала
 586  операторы, которые находятся во включаемом файле. Замечание: никогда не изменяйте
 587  содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой
 588  создаваемой вами программе. Однако просмотр (без редактирования) этих файлов является
 589  хорошей практикой для постижения внутренней структуры C++ - программ.
 590         using namespace std;
 591         Говорит о том, что в дальнейшем тексте программы необходимо использовать
 592  идентификаторы из указанного именного пространства (namespace - пространство имен).
 593  Пока можно просто принять как данность, что наша первая C++-программа "желает"
 594  работать в пространстве имен с именем std, и отложить рассмотрение самой концепции
 595  namespace до лучших времен.
 596  
 597  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4       Страница 18 из 67
 598         int main()
 599         В    каждой   С++   программе       должна      быть     ровно        одна   функция с     именем
 600  main().Исполнение программы начинается с выполнения первой инструкции функции main(),
 601  в нашем случае – cout. Затем одна за другой исполняются все дальнейшие инструкции
 602  (которых в нашем минимальном примере нет), и, выполнив последнюю инструкцию функции
 603  main(), программа заканчивает работу.
 604         Функция (не только main, а любая) состоит их четырех частей: типа возвращаемого
 605  значения, имени, списка параметров и тела функции. Первые три части составляют прототип
 606  функции.
 607         Список параметров заключается в круглые скобки и следует всегда за именем
 608  функции. В нашем случае пустые круглые скобки означают, что main не ждет никаких
 609  параметров. Слово int на месте типа возвращаемого значения говорит о том метод main
 610  собирается вернуть какое-то значение целого типа (int - целое число).                    Тело функции
 611  содержит последовательность исполняемых инструкций и ограничено фигурными скобками.
 612  Второе назначение таких скобок - группировка операторов. Это такой набор операторов,
 613  которые компьютер должен выполнить определенное число раз (цикл), или другой набор
 614  операторов, которые компьютер должен выполнить, если выполняется определенное условие.
 615  В обоих случаях мы увидим открывающую и закрывающую фигурную скобки внутри тела
 616  той или иной функции. Наш пример слишком прост для циклов и условий и никаких
 617  группировок не использует.
 618         cout << "Учимся программировать на языке С++!";
 619         Третья инструкция является инструкцией вывода. cout – это выходной поток,
 620  направленный на терминал, << – оператор вывода. Полностью эта инструкция выводит в cout
 621  – то есть на терминал – символьную константу, заключенную в двойные кавычки. В
 622  результате выполнения данной инструкции мы получим на терминале сообщение:
 623         Учимся программировать на языке С++
 624         return 0;
 625         Наш метод main обязался вернуть некоторое целое значение. Для этого следует
 626  воспользоваться оператором return после которого и указать это самое значение. Если
 627  оператор return опустить ошибки компиляции не произойдет, однако во время выполнения
 628  наш метод будет возвращать некоторое случайное значение ("мусор").
 629  
 630  
 631  
 632  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4             Страница 19 из 67
 633         Точка с запятой в конце инструкции собственно, обозначает именно этот факт - конец
 634  иструкции. Программист обязан ставить этот символ (;) в конце каждой инструкции.
 635         Типичная программа с функциональностью хотя бы чуть-чуть сложнее только что
 636  показанной определенно должна хранить какую-то информацию во время своего
 637  выполнения. Например, программе, печатающей файл, нужно знать имя файла и, возможно,
 638  число копий, которые вы хотите напечатать. В процессе выполнения программы хранят
 639  такую информацию в памяти компьютера. Чтобы использовать определенные ячейки памяти,
 640  программы применяют переменные. Проще говоря, переменная представляет собой имя
 641  ячейки памяти, которая может хранить конкретное значение. Когда вы присваиваете значение
 642  переменной, представьте себе переменную в виде ящика, в который можно поместить
 643  значение. Если вам позже потребуется использовать значение переменной, компьютер просто
 644  посмотрит значение, содержащееся в ящике.
 645          Ваши программы используют переменные для хранения информации. В зависимости
 646  от типа хранимого значения, например, целое число, буква алфавита или число с плавающей
 647  точкой, тип вашей переменной будет разным. Тип переменной указывает тип значения,
 648  хранимого в переменной, а также набор операций (таких как сложение, умножение и другие),
 649  которые программа может выполнять над значением переменной. Большинство программ на
 650  C+ + будут использовать типы переменных, перечисленные в табл. 3.1
 651  
 652         Тип              Диапазон хранимых значений
 653  
 654                          Значения в диапазоне от -128 до 127. Обычно используется для
 655         char
 656                    хранения букв алфавита
 657  
 658         int              Значения в диапазоне от -32768 до 32767
 659  
 660         unsigned         Значения в диапазоне от 0 до 65535
 661  
 662         long             Значения в диапазоне от -2147483648 до 2147483647
 663  
 664         float            Значения в диапазоне от -3.4 x 10-38 до 3.4 x 1038
 665  
 666         double           Значения в диапазоне от 1.7х 10-308 до 1.7х 10308
 667  
 668         Таблица .1. Наиболее востребованные типы переменных C++.
 669         Прежде чем вы сможете использовать переменную, ваша программа должна ее
 670  объявить. Другими словами, вам следует представить переменную компилятору C++. Чтобы
 671  объявить переменную в программе, вам следует указать тип переменной и ее имя, по
 672  
 673  
 674  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 20 из 67
 675  которому программа будет обращаться к данной переменной. Указывайте тип и имя
 676  переменной после открывающей фигурной скобки главной программы, как показано ниже:
 677            тип_переменной имя_переменной;
 678            Как правило, тип переменной будет одним из типов, перечисленных в табл. 3.1.
 679  Выбираемое вами имя переменной должно нести смысловую нагрузку, которая описывает
 680  (для всех, кто читает вашу программу) использование переменной. Например, ваша
 681  программа могла бы использовать переменные, такие как employee_name, employee_age и т.
 682  д. Обратите внимание на точку с запятой, которая следует за именем переменной. В C++
 683  объявление переменной считается инструкцией. Поэтому вы должны поставить после
 684  объявления точку с запятой, точно так же как ставите ее в конце инструкции производящей
 685  какую-то активность типа печати строки.
 686            Фрагмент следующей программы объявляет три переменные, используя типы int, float
 687  и long:
 688            #include <iostream>
 689            int main()
 690            {
 691                int test_score;
 692                float salary;
 693                long distance_to_mars;
 694            }
 695            Важно обратить внимание, что данная программа ничего не выполняет, а только
 696  объявляет переменные (тем не менее, формально это полноценная C++ - программа). Как
 697  видите, объявление каждой переменной заканчивается точкой с запятой. Если вы объявляете
 698  несколько переменных одного и того же типа, можно разделять их имена запятой.
 699  Следующий оператор, например, объявляет три переменных с плавающей точкой:
 700            float salary, income_tax, retirement_fund;
 701            После объявления переменной вы используете оператор присваивания C++ (знак
 702  равно), чтобы присвоить значение переменной. Фрагмент следующей программы сначала
 703  объявляет переменные, а затем использует оператор присваивания, чтобы присвоить
 704  переменным значения:
 705            #include <iostream>
 706            int main()
 707  
 708  Академия АйТи                   Установка и администрирование ПСПО. Лекции. Часть 4   Страница 21 из 67
 709           {
 710               int age;
 711               float salary;
 712               long distance_to_the_moon;
 713  
 714  
 715               age = 32;
 716               salary = 25000.75;
 717               distance_to_the_moon = 238857;
 718           }
 719           При объявлении переменной часто удобно присваивать ей начальное значение. Чтобы
 720  упростить такую процедуру, C++ позволяет присваивать значение во время объявления
 721  переменной (т.е. свести объявление и присвоение в одну инструкцию), как показано ниже:
 722           int age = 32;
 723           float salary = 25000.75;
 724           long distance_to_the_moon = 238857;
 725           После присвоения значения переменной ваши программы могут использовать это
 726  значение, просто обращаясь к ее имени. Следующая программа присваивает значения трем
 727  переменным и затем выводит значение каждой переменной, используя cout:
 728           #include <iostream>
 729           using namespace std;
 730           int main()
 731           {
 732               int age = 32;
 733               float salary = 25000.7;
 734               long dis_to_moon = 238857;
 735               cout << "Служащему " << age << " года (лет)" << endl;
 736               cout << "Оклад служащего составляет $" << salary << endl;
 737               cout << "От земли до луны " << dis_to_moon << " миль" << endl;
 738           }
 739  
 740  
 741           Когда вы откомпилируете и запустите эту программу, на экране появится следующий
 742  вывод:
 743  
 744  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4   Страница 22 из 67
 745         Служащему 32 года (лет)
 746         Оклад служащего составляет $25000.7
 747         От земли до луны 238857 миль
 748  переделка под Линукс с http://programmersclub.ru/04/
 749  
 750         Независимо от целевого назначения большинство ваших программ на C++ будут
 751  складывать, вычитать, умножать или делить те или иные значения. Ваши программы могут
 752  выполнять арифметические операции с константами (например, 3*5) или с переменными
 753  (например, payment — total). Таблица 2 перечисляет основные математические операции
 754  C++:
 755         Операция                              Назначение                               Пример
 756         +                                     Сложение                                 total = cost + tax;
 757         -                                     Вычитание                                change = payment -
 758                                                                               total;
 759         *                                     Умножение                                tax = cost * tax_rate;
 760         /                                     Деление                                  average = total / count;
 761         Таблица2. Основные математические операции С++.
 762  
 763  
 764         Следующая программа использует cout для вывода результата нескольких простых
 765  арифметических операций:
 766         #include <iostream>
 767         using namespace std;
 768         int main()
 769         {
 770             cout << "5 + 7 = " << 5 + 7 << endl;
 771             cout << "12 - 7 = " << 12 - 7 << endl;
 772             cout << "1.2345 * 2 = " << 1.2345 * 2 << endl;
 773             cout << "15 / 3 = " << 15 / 3 << endl;
 774         }
 775  
 776  
 777         Посмотрите внимательно на операторы программы. Обратите внимание, что каждое
 778  выражение сначала появляется в кавычках, которые обеспечивают вывод символов
 779  (например, 5 + 7 =) на экран. Затем программа выводит результат операции и символ новой
 780  
 781  Академия АйТи              Установка и администрирование ПСПО. Лекции. Часть 4               Страница 23 из 67
 782  строки. Когда вы откомпилируете и запустите эту программу, на вашем экране появится
 783  следующий вывод:
 784         5 + 7 = 12
 785         12 - 7 = 5
 786         1.2345 * 2 = 2.469
 787         15 / 3 = 5
 788  
 789  
 790         В данном случае программа выполняла арифметические операции, используя только
 791  постоянные значения. Следующая программа выполняет арифметические операции,
 792  используя переменные:
 793         #include <iostream>
 794         using namespace std;
 795         int main()
 796         {
 797             float cost =15.50; // Стоимость покупки
 798             float sales_tax = 0.06; // Налог на продажу 6%
 799             float amount_paid = 20.00; // Деньги покупателя
 800             float tax, change, total; // Налог на продажу, сдача покупателю и общий счет
 801             tax = cost * sales_tax;
 802             total = cost + tax;
 803             change = amount_paid - total;
 804             cout << "Стоимость покупки: $" << cost << "\tHaлor: $" << tax << "\tОбщий счет: $"
 805  << total << endl;
 806             cout << "Сдача покупателю: $" << change << endl;
 807         }
 808  
 809  
 810         В данном случае программа использует только переменные с плавающей точкой. Как
 811  видите, программа присваивает значения переменным при объявлении и комментирует
 812  назначение каждой (о комментариях будет сказано в конце данного раздела). Далее
 813  программа выполняет арифметические операции над переменными для определения налога
 814  на продажу, общего счета и сдачи покупателю. Общая стоимость покупки, Налог и Общий
 815  счет выводятся в одну строку, но отделяются друг от друга знаками табуляции. Об этом
 816  
 817  Академия АйТи               Установка и администрирование ПСПО. Лекции. Часть 4   Страница 24 из 67
 818  говорят специальные символы, составленные из косой черты и буквы t. Сдача выводится
 819  отдельной строкой. Когда вы откомпилируете и запустите эту программу, на вашем экране
 820  появится следующий вывод:
 821         Стоимость покупки: $15.5                  Налог: $0.93 Общий счет: $16.43
 822         Сдача покупателю: $3.57
 823  практически полностью содрано с http://programmersclub.ru/05/ 
 824  
 825         Класс представляет собой главное инструментальное средство C++ для объектно-
 826  ориентированного программирования. Т.е. конструкция определяемая в С++ программе с
 827  привлечением ключевого слова class позволяет реализовывать те идеи и концепции ООП о
 828  которых шла речь в первой части курса. Как вы уже знаете класс группирует элементы,
 829  соответствующие данным о некотором объекте реального мира, и оперирующие этими
 830  данными функции (называемые методами). Группируя данные об объекте и кодируя их в
 831  одной переменной-классе, вы упрощаете процесс программирования и увеличиваете
 832  возможность повторного использования своего кода.
 833         Класс C++ должен иметь уникальное имя, за которым следует открывающая фигурная
 834  скобка, один или несколько элементов (а ими, традиционно, будут поля и методы) и
 835  закрывающая фигурная скобка. Т.е. схема объявления класса такая:
 836         class class_name
 837         {
 838              int data_member; // Элемент данных, поле
 839              void show_member(int); // Функция-элемент, метод
 840         };
 841         После определения класса вы можете объявлять переменные типа этого класса
 842  (называемые объектами, или, для избегания путаницы между объектами реальными и
 843  программными - экземплярами), как показано ниже:
 844         class_name object_one, object_two, object_three;
 845         Следующее определение создает класс employee, который содержит определения трех
 846  полей и одного метода:
 847         class employee
 848         {
 849              public:
 850             char name[64];
 851              long employee_id;
 852  
 853  Академия АйТи               Установка и администрирование ПСПО. Лекции. Часть 4    Страница 25 из 67
 854              float salary;
 855  
 856  
 857              void show_employee(void)
 858              {
 859                  cout << "Имя: " << name << endl;
 860                  cout << "Номер служащего: " << employee_id << endl;
 861                  cout << "Оклад: " << salary << endl;
 862              };
 863         };
 864  
 865  
 866         Обратите внимание на использование метки public внутри определения класса.
 867  Элементы класса могут быть частными (private) или общими (public), от чего зависит, как
 868  ваши программы обращаются к элементам класса. В данном случае все элементы являются
 869  общими (т.к. в теле нашего класса есть секция public и отсутствует секция private), это
 870  означает, что программа (т.е. другие классы отличные от employee, классы-потребители)
 871  может обращаться к любому элементу класса employee, используя оператор точку(.) и мы
 872  вскоре увидим как именно этот оператор применяется. Как мы знаем это прямое нарушение
 873  принципа инкапсуляции ("черный ящик") и не должно быть допустимо в проектах реальных.
 874  Здесь же такой подход применен единственно с целью не переусложнять пример новой
 875  конструкции языка - class.
 876         Так же следует обратить внимание на определение поля name, которое включает число
 877  64 в квадратных скобках. Если это число со скобками убрать name был бы объявлен как
 878  обычный char. Т.е. он мог бы содержать ровно один символ(цифру или букву или знак
 879  пунктуации). Привлечение квадратных скобок сообщает компилятору о том, что name будет
 880  представлен не как единичный символ, а как массив таких символов. Массив – это набор
 881  данных одного типа, например массив целых чисел или массив символов, как в данном
 882  случае. По итогу получается, что каждой переменной типа char[64] будет выделено
 883  достаточно памяти, что бы разместить 64 символа. В совокупности они как раз достаточны,
 884  что бы указать с их помощью имя сотрудника.
 885         Продолжим работу с классом employee. После определения класса внутри вашей
 886  программы (мы сделали это только что) вы можете объявить объекты (экземпляры) типа
 887  этого класса, как показано ниже:
 888  
 889  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4   Страница 26 из 67
 890         employee worker, boss, secretary;
 891  
 892  
 893         Т.е. совершенно аналогично элементарным типам из таблицы 3.1 - сначала идет тип
 894  экземпляра, затем - его уникальное имя или несколько имен через запятую как в данном
 895  случае.
 896         Следующая программа создает два объекта (экземпляр) типа employee. Используя
 897  оператор точку, программа затем присваивает значения полям этих объектов. Затем
 898  программа использует метод show_employee() для вывода информации о служащем:
 899         #include <iostream.h>
 900         #include <string.h>
 901         using namespace std;
 902  
 903  
 904         class employee
 905         {
 906         public:
 907              char name [64];
 908              long employee_id;
 909              float salary;
 910  
 911  
 912              void show_employee(void)
 913              {
 914                   cout << "Имя: " << name << endl;
 915                   cout << "Номер служащего: " << employee_id << endl;
 916                   cout << "Оклад: " << salary << endl;
 917              };
 918         };
 919  
 920  
 921         int main()
 922         {
 923              employee worker, boss;
 924              strcpy(worker.name, "John Doe");
 925              worker.employee_id = 12345;
 926              worker.salary = 25000;
 927  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 27 из 67
 928              strcpy(boss.name, "Happy Jamsa");
 929              boss.employee_id = 101;
 930              boss.salary = 101101.00;
 931              worker.show_employee();
 932              boss.show_employee();
 933         }
 934         Как видите, программа объявляет два объекта типа employee — worker и boss, а затем
 935  использует оператор точку (.) для присваивания значений элементам и вызова функции
 936  show_employee(). Еще раз вернитесь к заключительной части урока первого "Введение в
 937  ООП" и взяв в качестве примера последнюю программу подумайте - хорошо ли вы уяснили
 938  разницу между классом (employee) и объектом (worker,boss) от него порождаемым? Ну а
 939  итогом работы последней программы будет такой вывод на консоль:
 940         Имя: John Doe
 941         Номер служащего: 12345
 942         Оклад: 25000
 943         Имя: Happy Jamsa
 944         Номер служащего: 101
 945         Оклад: 101101
 946  
 947  Почти дословно с http://programmersclub.ru/21/ 
 948         Наконец, скажем пару слов о комментариях. Комментарии помогают человеку читать
 949  текст программы; писать их грамотно считается правилом хорошего тона. Комментарии
 950  могут характеризовать используемый алгоритм, пояснять назначение тех или иных
 951  переменных, разъяснять непонятные места. При компиляции комментарии выкидываются из
 952  текста программы поэтому размер получающегося исполняемого модуля не увеличивается.
 953         В С++ есть два типа комментариев. Один использует символы /* для обозначения
 954  начала и */ для обозначения конца комментария. Между этими парами символов может
 955  находиться любой текст, занимающий одну или несколько строк: вся последовательность
 956  между /* и */ считается комментарием. Например:
 957         /*
 958             * Первое знакомство с определением класса в C++.
 959             * Классы используются как в объектном, так и в
 960             * объектно-ориентированном программировании.
 961             */
 962         class Screen {
 963  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 28 из 67
 964                  /* Это называется телом класса */
 965         public:
 966                  void home();         /* переместить курсор в позицию 0,0 */
 967                  void refresh (); /* перерисовать экран                                 */
 968         private:
 969                  /* Классы поддерживают "сокрытие информации"                    */
 970                  /* Сокрытие информации ограничивает доступ из                   */
 971                  /* программы к внутреннему представлению класса */
 972                  /* (его данным). Для этого используется метка                   */
 973                  /* "private:"                                                   */
 974                  int height, width;
 975         };
 976         Второй тип комментариев – однострочный. Он начинается последовательностью
 977  символов // и ограничен концом строки. Часть строки вправо от двух косых черт
 978  игнорируется компилятором. Вот пример того же класса Screen с использованием двух
 979  строчных комментариев:
 980  /*
 981           * Первое знакомство с определением класса в C++.
 982           * Классы используются как в объектном, так и в
 983           * объектно-ориентированном программировании.
 984           */
 985         class Screen {
 986                  // Это называется телом класса
 987         public:
 988                  void home();           // переместить курсор в позицию 0,0
 989                  void refresh (); // перерисовать экран
 990         private:
 991                  /* Классы поддерживают "сокрытие информации".                   */
 992                  /* Сокрытие информации ограничивает доступ из                   */
 993                  /* программы к внутреннему представлению класса */
 994                  /* (его данным). Для этого используется метка                   */
 995                  /* "private:"                                                   */
 996                  int height, width;
 997  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 29 из 67
 998         };
 999  
1000  
1001         После того как программа на C++ создана (т.е. мы закончили редактировать файл с ее
1002  исходным текстом) следует важный этап - этап компиляции. Как уже было сказано, на этом
1003  этапе программа переводится из C++ языка в машинный (двоичный) код. Непосредственно
1004  сам процесс сильно варьируется от того используем ли мы среду разработки (и какую) или
1005  нет. Но даже если мы ее не используем компиляция будет запускаться и протекать по-
1006  разному в зависимости от платформы и используемого компилятора. Дело в том, что нет
1007  единого и универсального компилятора C++. Под каждую платформу есть свой компилятор,
1008  и не один. Так что в общем случае выбор нужного и подходящего варианта является
1009  прерогативой разработчика. Однако общая последовательность шагов этого процесса
1010  остается неизменной для всех компиляторов:
1011                  ·   запустить компилятор и указать в качестве входного файла наш файл с
1012          исходным текстом
1013                  ·   в случае отсутствия ошибок компиляции "забрать" (т.е. просто найти на
1014          локальном диске в выходной директории) выходной файл представляющий
1015          исполнимый модуль готовый к запуску на данной платформе
1016         Например, если мы сохранили исходный текст в файле FIRST.CPP а в качестве
1017  компилятора выбрали Borland C++ на платформе MS-DOS, то мы бы задали такую команду:
1018         C:\>BCC FIRST.CPP
1019         где BCC - как раз программа-компилятор. После нажатия на Enter мы могли бы
1020  проанализировать сообщения компилятора и в случае отсутствия синтаксических ошибок у
1021  нас на диске C: был бы размещен файл FIRST.EXE - результат работы компилятора. Запуск
1022  этого последнего файла привел к исполнению всей нашей программы.
1023         Однако использование сред разработок освобождает нас от набора консольных команд
1024  и предоставляет отчет о ходе и результате процесса компиляции в гораздо более удобном для
1025  анализа формате чем строчки в консоли. Это одно из многочисленных преимуществ таких
1026  сред вообще и KDevelop как одного из представителей в частности.
1027  
1028  2.2. Работа со средой разработки ПО KDevelop
1029         Итак, если мы чувствуем себя уверено в создании C++ программ и уже попробовали
1030  их писать и компилировать вне среды разработки, самое время обратиться к KDevelop и
1031  выяснить - как он может повысить эффективность работы по созданию ПО и облегчить
1032  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 30 из 67
1033  процесс создания таких программ? Напомню, что приемы работы с рассматриваемым
1034  приложением от конкретного языка программирования не зависят, а C++ был выбран нами
1035  исключительно в силу его популярности. Поэтому все методики и приемы, обсуждаемые в
1036  этом подразделе, будут не менее полезны и применимы при создании Pascal-, Фортран-, Perl-
1037  и прочих программ из списка языков приведенного в начале текущего урока.
1038         Есть несколько способов запустить среду разработки KDevelop, однако если мы
1039  собираемся разрабатывать программу именно на C++ оптимальным будет путь через главное
1040  меню КДЕ-Прочие-Разработка-KDevelop-Среда разработки на C/C++ (Kdevelop: C/C++).
1041  При первом запуске нам будет показан «Совет дня» и мы можем указать - предъявлять ли
1042  его при каждом запуске или нет. Наконец, мы оказываемся в пустом рабочем пространстве
1043  (workspace), Рис. 1.
1044  
1045  
1046  
1047  
1048         Рис. 1. Пустое рабочее пространство среды KDevelop
1049  
1050  
1051  
1052  
1053  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 31 из 67
1054         Именно в таком состоянии мы будем видеть среду не часто. Обычно после запуска
1055  будет автоматически открываться последний проект над которым мы работаем.
1056         Именно в пустом рабочем пространстве у нас альтернатив не много - мы можем либо
1057  открыть один из существующих проектов, либо начать проект новый. И то, и другое делается
1058  через меню Проект. Именно тут мы можем вызвать или пункт «Создать проект…» или
1059  «Открыть проект…». При старте нового проекта мы попадаем в мастер «Новый проект» и
1060  нам предстоит пройти несколько шагов. Самый важный, пожалуй, шаг первый, где мы
1061  выбираем шаблон будущего проекта. Давно было замечено, что средний разработчик начиная
1062  работать над тем, что по итогу станет новым консольным приложением обычно в качестве
1063  отправной точки использует один набор файлов, причем и содержимое этих файлов очень
1064  типично. Разумеется, по мере разработки эти файлы очень видоизменяются и становятся
1065  совсем не похожи на то, с чего все началось, однако начало-то у всех было одинаковым! То
1066  же можно сказать о разработке программ с графическим интерфейсом пользователя (GUI).
1067  Все GUI-программисты начинают примерно одинаково, и только по мере разработки у
1068  одного получается Калькулятор, а у другого Блокнот. Т.о. можно предположить, что всем
1069  разработчикам однотипных (консольных, графических, библиотечных и т.д.) приложений
1070  требуется одна и та же (но отличная от приложений другого типа) точка старта. Шаблон и
1071  есть эта самая точка, т.е. набор файлов предопределенного содержания. И выбор этот
1072  предстоит сделать в первом шаге мастера. Причем выбор является "многоуровневым".
1073  Сначала мы выбираем язык программирования (вспомним, что KDevelop является средой
1074  мультиязычной), затем, возможно, набор близких по назначению шаблонов и уже в нем -
1075  шаблон конкретного типа. При этом в правой части мастера нам покажут внешний вид
1076  целевого приложения и краткое описание шаблона, Рис. 2.
1077  
1078  
1079  
1080  
1081  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 32 из 67
1082         Рис. 2. Шаг первый мастера нового проекта, выбор шаблона.
1083         В нашем курсе мы будем придерживаться шаблона находящегося в папке, разумеется,
1084  C++ и имеющего имя Простая программа Hello world. Этот проект является прекрасной
1085  отправной точкой для создания консольного приложения.
1086         На том же первом шаге мастера мы должны указать вторую важную информацию - где
1087  (в каком каталоге) разместятся файлы нашего проекта. Для этого предназначено поле Имя
1088  приложения. Здесь мы указываем, фактически, корневую папку проекта и по мере работы над
1089  последним она будет наполняться файлами и подкаталогами. Одновременно с этим и все
1090  наше приложение будет называться так же. Т.е. если мы введем сюда MyConsole, то:
1091                  ·   корневая папка проекта будет названа MyConsole
1092                  ·   исполнимый модуль (то, что получается в результате успешной
1093          компиляции проекта) будет иметь то же самое имя, только KDevelop приведет все
1094          буквы в его имени к нижнему регистру - myconsole. Именно этот модуль нужно
1095          запускать для того что бы увидеть нашу программу в работе. При этом найти на его
1096          диске можно будет по пути MyConsole/debug/src.
1097         На вопрос «где на диске искать саму корневую папку MyConsole» отвечает еще одно
1098  поле ввода на том же первом шаге - Расположение. По умолчанию MyConsole станет
1099  подкаталогом домашней папки (/home/admin/, если мы логинились как admin) но мы можем
1100  этот путь изменить. В любом случае в поле «Конечное расположение» мы увидим полный
1101  путь к корневой папке нашего проекта, например /home/admin/MyConsole и можем быть
1102  уверены - все, что имеет хоть какое-то отношение к нашему проекту (файлы исходного кода,
1103  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 33 из 67
1104  заголовочные файлы, финальные исполнимые файлы и т.д.) будет расположено или в этой
1105  папке или в одной из ее подпапок.
1106         Наконец мы можем пробежаться по оставшимся шагам мастера и, для целей нашего
1107  курса, просто принять значения по умолчанию. Правда с одним исключением - шаг второй не
1108  даст нам перейти к шагу, следующему пока в поле Автор, не будет введено хоть какое-то
1109  значение. А вот все остальные шаги можно действительно "пролистать" нажатием кнопки
1110  Вперед.
1111         По окончанию мастера будет открыто окно редактора с текстом главного метода
1112  (Main). Это и есть отправная точка, предложенная нам выбранным шаблоном.
1113         Со всех сторон (кроме верхней) окна редактора располагаются множество ярлычков
1114  (т.н. табов) вспомогательным окон. Их порядка полутора-двух десятков и вопрос назначения
1115  каждого оказывается за рамками нашего курса. Скажем лишь об одном из важнейших -
1116  Сообщения. Его ярлычок первый в нижнем ряду ярлыков. Именно в этом окне появляются
1117  сообщения от компилятора и мы узнаем о допущенных в исходном тексте ошибках. Любое из
1118  вспомогательных окон (Сообщения в т.ч.) открывается/закрывается простым щелчком по
1119  соответствующему ярлычку.
1120         Обычно даже несложная C++ программа состоит из нескольких файлов исходного
1121  кода, причем есть 2 типа таких файлов - т.н. .cpp-файлы и т.н. .h-файлы.. Изначально
1122  выбранный нами шаблон Простая программа Hello world создает проект содержащий всего
1123  один файл по имени <имя_проекта>.cpp (например myconsole.cpp). Его наличие и
1124  необходимость не обсуждается, т.к. он содержит «точку входа» нашей программы - метод
1125  Main. Если же мы хотим добавить новые файлы (а чаще всего мы захотим это сделать) то
1126  следует воспользоваться диалогом вызываемом из меню Проект-Создать класс. Обычно
1127  проекты строятся по схеме 1 класс-1 логический файл, поэтому желание добавить новый
1128  файл почти всегда означает желание добавить новый класс и наоборот. А почему файл
1129  логический? Потому что в C++ класс принято объявлять и реализовывать в разных файлах
1130  (как раз те самые .h/.cpp файлы). Поэтому добавление 1 класса означает добавление двух
1131  физических файлов, хотя решают они совместными усилиями одну задачу, объявить и
1132  предоставить доступ к новому типу (классу) в нашей программе.
1133         Диалог «Новый класс» имеет 3 вкладки и изрядное количество различных опций и
1134  настроек, хотя по минимуму достаточно в поле Имя ввести имя нового класса. Тогда после
1135  нажатия кнопки OK будут созданы два файла - <имя_класса>.cpp и <имя_класса>.h - и оба
1136  
1137  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 34 из 67
1138  они будут открыты для редактирования в своих закладках редактора. Переключаться между
1139  редактируемыми файлами можно щелчком по заголовкам (ярлыкам) этих закладок, причем
1140  «активная» вкладка будет «приподнята» над своими соседями Рис. 3.
1141  
1142  
1143  
1144  
1145         Рис. 3. Можно редактировать несколько файлов исходного кода одновременно. В
1146  настоящий момент редактируется файл myclass.h.
1147         Разумеется, редактор встроенный в среду KDevelop отвечает всем функциональным
1148  возможностям ожидаемым от серьезного продукта - перемещение, выделение, отступы,
1149  настраиваемые поиск/замена и т.д. Однако одна особенность заслуживает особенного
1150  упоминания. Допустим мы задекларировали 2 переменных
1151         int my_var1,my_var2;
1152         и теперь готовы присвоить значение 5 одной из них. Конечно мы можем полностью
1153  набрать
1154         my_var1=5;
1155         но можно и воспользоваться обсуждаемой возможностью редактора, а именно:
1156  набрать часть (2-3 символа, допустим my_) имени переменной и нажать Ctrl+J (или, что
1157  эквивалентно, выбрать в меню Правка-Завершить текст). Результат последовательности
1158  таких действий приведен на Рис. 4.
1159  
1160  
1161  
1162  
1163         Рис. 4. Одна из многочисленных особенностей редактора исходного кода среды
1164  KDevelop - Завершить текст.
1165  
1166  
1167         Остается лишь выбрать имя нужной переменной, и оно будет вставлено в исходный
1168  текст. Причем подсказка дается не только по именам переменных / методов, но и по
1169  ключевым словам C++.
1170  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 35 из 67
1171         Наконец когда мы закончим набор исходных текстов всех файлов составляющих наш
1172  проект мы, разумеется, захотим нашу программу собрать (скомпилировать) и опробовать ее в
1173  работе. Компиляция проекта запускается через меню Сборка-Собрать проект или просто по
1174  нажатию F8. Для сборки проекта в среде KDevelop последней требуется особый файл - т.н.
1175  Makefile. Он нужен для автоматизации процесса компиляции нашего проекта и должен быть
1176  создан лишь однажды, поэтому при самой первой компиляции KDevelop предложит его
1177  создать и лишь после этого перейдет непосредственно к компиляции. Все последующие
1178  компиляции будут пользоваться уже готовым Makefile и поэтому будут проходить
1179  значительно быстрее чем самая первая.
1180         Как уже упоминалось, все ошибки компиляции будут отображены в окне Сообщения.
1181  Когда же мы добьемся их отсутствия то у нас будет 2 пути опробовать нашу программу в
1182  работе. Во-первых, мы можем открыть Konsole, перейти в каталог, в котором был
1183  сгенерирован        выходной   исполнимый         модуль      (в    нашем       разбираемом    примере       -
1184  /home/admin/MyConsole/debug/src) и запустить приложение по его имени:
1185         ./myconsole
1186         Но есть второй способ значительно более удобный, особенно если мы уверены, что
1187  нам нужен «пробный запуск» нашего приложения после которого мы вернемся к его
1188  разработке в среде KDevelop. Способ этот сводится к одному из трех вариантов:
1189                  ·      выбору пункта меню Сборка-Выполнить программу
1190                  ·      нажатию Shift+F9
1191                  ·      нажатие кнопки на панели, Рис. 5
1192  
1193  
1194  
1195  
1196         Рис. 5. Кнопка выполнения программы после ее успешной компиляции.
1197         Результатом любого из этого действия будет открытие консоли «силами» KDevelop и
1198  запуск нашей программы в этой консоли. По окончании работы нашей программы эта
1199  консоль не «схлопывается» немедленно, а предлагает нам нажать для этого Enter. Такая
1200  предусмотрительность позволит нам просмотреть вывод нашей программы, даже если мы
1201  сами не озаботились созданием подобной «паузы перед окончанием».
1202         Завершим разговор о языке C++ и среде разработки программ на этом языке KDevelop
1203  предложением нескольких ссылок на ресурсы посвященным этим двум областям
1204  компьютерной науки:
1205  
1206  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4            Страница 36 из 67
1207         Официальный сайт проекта KDevelop
1208         http://www.kdevelop.org
1209         Учебник по KDevelop
1210         http://www.beginning-kdevelop-programming.co.uk
1211         Учебник по C++ для начинающих
1212         http://programmersclub.ru/main
1213  
1214  
1215         3. Разработка ПО с использованием Lazarus
1216         Lazarus — свободная среда разработки программного обеспечения. Иными словами
1217  тип и предназначение этого программного пакета полностью аналогично разобранному в
1218  предыдущем уроке пакету KDevelop. Но есть и существенное отличие. Если KDevelop
1219  изначально задумывался как мультиязычный (в смысле поддержки массы языков
1220  программирования), то Lazarus поддерживает всего один компилятор и, соответственно, язык
1221  именно этого компилятора. В данном случае речь идет о Free Pascal Compiler (FPC) -
1222  свободно распространяемом компилятора языка Паскаль с открытыми исходными кодами.
1223  Этот вариант языка совместим с широко известными вариантами того же языка Borland
1224  Pascal 7 и Object Pascal – Delphi, но при этом обладает рядом дополнительных возможностей,
1225  например, поддерживает перегрузку операторов. Сам компилятор этого языка (FPC) —
1226  кроссплатформенный инструмент, поддерживающий огромное количество платформ. Среди
1227  них DOS, Linux, MacOS(X) и Win32. Ну а Lazarus просто удобная графическая оболочка для
1228  работы с FPC. Его часто сравнивают с другой популярной интегрированной средой
1229  разработки ПО фирмы Borland - Delphi. Это сравнение совершенно справедливо, т.к. Lazarus
1230  предоставляет разработчику подобное Delphi окружение и, более того, поддерживает
1231  преобразование проектов Delphi.
1232         Как и в случае с Kdevelop, для профессиональной работы в среде Lazarus мы должны
1233  быть компетентны в двух областях:
1234                  ·   мы должны знать и уметь писать синтаксически корректные программы
1235          на языке Паскаль как таковом, причем желательно, что бы это был вариант языка
1236          поддерживаемый именно Free Pascal Compiler (FPC)
1237                  ·   мы должны знать Lazarus именно как приложение и уметь пользоваться
1238          предлагаемым им функционалом
1239         Рассмотрим эти вопросы последовательно в следующих двух подразделах.
1240  
1241  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 37 из 67
1242         3.1. Основы языка программирования Pascal
1243         Снова ограничимся довольно скромной задачей - рассмотреть избранные базовые
1244  конструкции языка Pascal в том его варианте, который поддерживается компилятором FPC.
1245         Минимальной программой производящей какую-то активность будет примерно
1246  следующая:
1247         program Hello;
1248         begin
1249           writeln ('Hello, world.');
1250         end.
1251         Разберем ее построчно.
1252         program Hello;
1253         Любая программа на Паскале начинается ключевым словом program вслед за которым
1254  следует название данной конкретной программы. Целиком эта строчка называется
1255  заголовком.
1256         begin…end.
1257         Ограничивают собой раздел операторов и называются операторными скобками.
1258  Иными словами играют ту же роль что скобки фигурные в C++ программе. Все что находится
1259  между этими двумя зарезервированными словами есть сама программа. В Паскале программа
1260  состоит из операторов, причем есть операторы простые и операторы составные. Составной
1261  оператор состоит из нескольких простых операторов и ограничен как раз операторными
1262  скобками begin и end. Т.о. разбираемая нами минимальная программа состоит из одного
1263  оператора. Операторы как и в C++ разделяются точкой с запятой. За телом всей программы
1264  должна следовать точка — признак того, что здесь находится конечная точка останова
1265  программы. Обратите внимание на "end." с точкой в конце - это именно требование языка.
1266         writeln ('Hello, world.');
1267         Как мы уже выяснили - это единственный оператор нашей программы. Он просто
1268  выводит указанную строку на консоль. Любая программа на Паскале состоит из множества
1269  операторов.
1270         Мы посмотрели описания заголовка и раздела операторов. Без них обычная программа
1271  на Паскале в принципе не возможна. В целом ряд программ могут быть созданы только с их
1272  помощью. Однако есть и другие составные блоки, используемые при написании программ, и
1273  поэтому общую структуру Pascal-программы принято выражать примерно такой схемой:
1274  
1275  Академия АйТи              Установка и администрирование ПСПО. Лекции. Часть 4   Страница 38 из 67
1276         PROGRAM ProgramName;
1277  
1278  
1279         CONST
1280              (* Декларация констант *)
1281  
1282  
1283         TYPE
1284              (* Декларация типов *)
1285  
1286  
1287         VAR
1288              (* Декларация переменных *)
1289  
1290  
1291         (* Определение процедур и функций *)
1292  
1293  
1294         BEGIN
1295              (* Тело программы *)
1296         END.
1297  
1298  
1299         Блоки PROGRAM и BEGIN…END. нам известны. Остальные блоки несут такую
1300  нагрузку:
1301         CONST - представляет раздел описания констант. Константа в программировании —
1302  это способ адресования к данным, изменение которых рассматриваемой программой
1303  запрещено. Использование констант, особенно, именованных — мощный инструмент,
1304  повышающий надёжность и безошибочность программ. Т.е. если в нашей программе
1305  постоянно используется в алгоритмах число 3.14 (приближенное значение широко известной
1306  математической константой "пи") то вместо того, что бы из раза в раз набирать эти три
1307  цифры с риском ошибиться, поставить десятичную точку не там или просто забыть о ней мы
1308  можем писать просто - PI. Или myPI. Или даже primernoPI. Это уж какое символьное имя мы
1309  сами присвоим числу 3.14. А выбор этого имени и непосредственное его связывание с
1310  конкретным значением как раз происходит в обсуждаемом блоке.
1311         В общем виде раздел описания констант выглядит так:
1312         Const
1313         <имя>=<значение>; ... ; <имя>=<значение>;
1314         Конкретный пример этого раздела:
1315  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 39 из 67
1316         Const
1317         Nmin = 0; Nmax = 100; SIMV = 'начало';
1318         Заметим кстати, что если в качестве символьного имени числа «пи» нас устраивает
1319  строчка Pi - то ее объявлять не нужно. Компилятор Паскаля обладает «встроенным знанием»
1320  о том, что все вхождения строчки Pi должны быть заменены числом 3,14159… . Иными
1321  словами это одна из «системных» констант. Но, как было показано, мы можем объявить
1322  любое число своих собственных констант.
1323         TYPE - в этом разделе описывают нестандартные типы данных, образованные
1324  программистом. Что значит "нестандартные"? Таблица 3 приводит описание простейших
1325  типов языка Pascal.
1326  
1327  
1328         Имя типа               Характеристика типа
1329         BYTE                   целое число от 0 до 255, занимает одну ячейку памяти (байт).
1330         BOOLEAN                логическое значение (байт, заполненный единицами, или нулями),
1331                        true, или false.
1332         WORD                   целое число от 0 до 65535, занимает два байта.
1333         INTEGER                целое число от –32768 до 32767, занимает два байта.
1334         LONGINT                целое число от –2147483648 до 2147483647, занимает
1335                        четыре байта.
1336  
1337  
1338         REAL                   число с дробной частью от 2.9*10-39.до 1.7*1038, может
1339                        принимать и отрицательные значения, на экран выводится с точностью
1340                        до 12-го знака после запятой, если результат какой либо операции с
1341                        REAL меньше, чем 2.9*10-39, он трактуется как ноль. Переменная типа
1342                        REAL занимает шесть байт.
1343         DOUBLE                 число с дробной частью от 5.0*10-324.до.1.7*10308, может
1344                        принимать и отрицательные значения, на экран выводится с точностью
1345                        до 16-го знака после запятой ,если результат какой либо операции с
1346                        DOUBLE меньше, чем 5.0*10-324, он трактуется как ноль. Переменная
1347                        типа DOUBLE занимает восемь байт.
1348         CHAR                   символ, буква, при отображении на экран выводится тот символ,
1349                        код которого хранится в выводимой переменной типа CHAR, переменная
1350  
1351  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4   Страница 40 из 67
1352                        занимает один байт.
1353         STRING                 строка символов, на экран выводится как строка символов, коды
1354                        которых хранятся в последовательности байт, занимаемой выводимой
1355                        переменной типа STRING; в памяти занимает от 1 до 256 байт – по
1356                        количеству символов в строке, плюс один байт, в котором хранится
1357                        длина самой строки.
1358  
1359  
1360         Таблица 3. Простейшие типы, определенные в языке Pascal.
1361         Так вот все типы из последней таблицы описывать в обсуждаемом блоке не нужно.
1362  Ими можно просто пользоваться - объявлять переменные такого типа и т.д. Однако в Паскале
1363  разрешено введение новых типов определяемых программистом. Их описание происходит
1364  как раз в обсуждаемом блоке. В общем виде раздел описания типов выглядит так:
1365         Type
1366         <имя>=<тип>;
1367         ...
1368         <имя>=<тип>;
1369         Конкретный пример этого раздела:
1370         Type
1371         LatBukva = 'a'..'z';
1372         Dni = 1..31;
1373         В этом примере описаны два перечислимых типа: тип LatBukva, состоящий из
1374  символов латинского алфавита, и тип Dni, состоящий из целых зчисленных значений в
1375  диапазоне от 1 до 31. В этом же блоке объявляются «строительные кирпичики» ООП -
1376  классы.
1377         VAR - блок описаний переменных. Каждая встречающаяся в программе переменная
1378  должна быть описана. В общем виде раздел описания переменных выглядит так:
1379         Var
1380         <имя >, ... ,<имя >:<тип>;
1381         ...
1382         <имя >, ... ,<имя >:<тип>;
1383         Иными словами после ключевого слова VAR мы через запятую перечисляем
1384  однотипные переменные которые мы планируем использовать в программе, далее через
1385  
1386  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4   Страница 41 из 67
1387  двоеточие указываем тот или иной тип (причем тип может быть взят как из таблицы 3.3 так и
1388  из секции TYPE) и ставим точку с запятой. Повторяем все тоже самое для следующей группы
1389  однотипных переменных.
1390         Конкретный пример этого раздела:
1391         Var
1392         a, b, c, x, nomer: integer;
1393         y, z, result: real;
1394         В разделе описания переменных обычно описывают также массивы. Пример описания
1395  одномерного массива из пятидесяти элементов:
1396         Var a:array[1..50] of real;
1397         Или, что тоже самое, но с привлечением константы:
1398         Const Nmax = 50;
1399         Var a:array[1..Nmax] of real;
1400         Если предположить, что мы ранее описали блок TYPE таким образом:
1401         Type
1402         Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
1403         (т.е. Month есть тип состоящий из 12-ти предопределенных значений), то блок VAR
1404  можно объявить так:
1405         Var
1406         M: Month;
1407         (т.е. в переменную M можно поместить одно из 12-ти предопределенных значений).
1408         После объявления переменной в данном разделе ей можно присвоить какое-то
1409  значение в теле программы (или процедуры, или функции):
1410         variable_name := expression;
1411         Т.е. оператор присваивания в Паскале - двоеточие и знак равно. Примеры
1412  (предполагаем, что переменная some_real уже объявлена):
1413         some_real := 385.385837;
1414         some_real := 37573.5 * 37593 + 385.8 / 367.1;
1415         Как можно видеть к переменным и числовым константам применимы ожидаемые в
1416  любом языке программирования базовые арифметические операторы: +,-,*,/, mod (остаток от
1417  деления).
1418  
1419  
1420  
1421  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4   Страница 42 из 67
1422         Блок, который в схеме выше условно обозначен комментарием (* Определение
1423  процедур и функций *) на самом деле состоит из двух подсекций. Секции маркируемой
1424  ключевым словом PROCEDURE и секции с ключевым словом FUNCTION. Обе эти
1425  подсекции описывают подпрограммы, причем именно подпрограммы определяемые
1426  программистом. Паскаль предлагает изрядное количество стандартных процедур и функций
1427  и их описывать не требуется, ими можно просто пользоваться (вызывать). Примеры
1428  стандартных процедур:
1429                  ·   ClrScr – очистка экрана, курсор перемещается в верхний левый угол.
1430                  ·   Delay(t) – задержка программы на t миллисекунд.
1431                  ·   GotoXY(x,y) – перемещение курсора в точку с координатами (x,y).
1432                  ·   Exit – выход из текущего блока или из программы.
1433         Нестандартные процедуры и функции должны быть описаны. Их структура (т.е.
1434  описание), в принципе, такая же, как и основной программы, однако, прежде всего, следует
1435  уяснить разницу между процедурой и функцией, причем эта разница одинаково применима и
1436  к их стандартным разновидностям, и к определяемым программистом.
1437         Процедура - это обычная подпрограмма в самом широком смысле этого термина. Т.е.
1438  это подпрограмма, которая обрабатывает данные, принимает или выводит информацию,
1439  меняет или нет каким-либо образом глобальные и локальные переменные, вообще "что-то
1440  делает".
1441         Функция, это тоже подпрограмма, которая, как и процедура, что-то делает, но, помимо
1442  этого, она обязательно возвращает значение, тип которого задается при описании заголовка
1443  процедуры. Вызов функции является одним из допустимых операндов выражения, обозначая
1444  в нём то значение, которое вычисляет функция, то есть, если подпрограмма с
1445  идентификатором «Function1» – функция, то можно произвести следующие действия и
1446  записать такие операторы:
1447         X:=Function1(a,d,l,n,…);
1448         X:=2*Function1(a,e,…,m,…) - 1/Function1(c,f,…,k,…);
1449         Если бы Function1 была объявлена как процедура, и ее идентификатор был бы изменен
1450  на «Proc1» ее можно было бы только вызвать, но НЕ использовать в выражении:
1451         Proc1(a,e,…,m,…);
1452  
1453  
1454  
1455  
1456  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 43 из 67
1457         Каждая объявляемая нами процедура/функция является «программой в программе»
1458  (потому их и называют подпрограммами). Вот пример объявления процедуры по имени Print.
1459  а затем ее вызова в теле главной программы:
1460         program Procedures;
1461         procedure Print(s: String; i: Integer);
1462         begin
1463           Writeln(s);
1464           Writeln(i);
1465         end;
1466  
1467  
1468         begin
1469           Print('Hello',3);
1470         end.
1471         А теперь пример объявления и вызова функции Add:
1472         program Functions;
1473  
1474  
1475         var
1476           Answer: Integer;
1477  
1478  
1479         function Add(i, j:Integer): Integer;
1480         begin
1481           Add := i + j;
1482         end;
1483  
1484  
1485         begin
1486           Answer := Add(1,2); {вызов ф-ии Add}
1487           Writeln(Answer);
1488           Writeln(Add(7,11)); {второй вызов ф-ии Add}
1489         end.
1490  
1491  
1492         Итак, мы разобрали основные структурные блоки Паскаль-программы. Отметим, что
1493  любой раздел описания (CONST, TYPE, VAR, PROCEDURE, FUNCTION) может
1494  
1495  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4   Страница 44 из 67
1496  отсутствовать. Т.е. если не планируем объявлять ни одной своей собственной функции, то
1497  просто не используем блок FUNCTION. Разделы описаний следуют в произвольном порядке.
1498  Каждый раздел описаний может использоваться любое число раз. После всех разделов
1499  описания следуют операторные скобки begin…end ограничивающие тело программы.
1500  
1501  
1502         Нам осталось выяснить вопрос приложимости                       ООП-принципов к Паскаль-
1503  программам. Т.е. как мы можем объявить класс (модель реального объекта) и как из класса
1504  получить новый его экземпляр.
1505         Класс в Паскале описывается как новый тип (и поэтому его описание вполне
1506  ожидаемо размещается именно в блоке TYPE) по примерно такой схеме:
1507         type <имя объекта>=object
1508           <список имён полей>: <тип полей>;
1509           ....
1510           <список имён полей>: <тип полей>;
1511           <объявление метода>
1512           ...
1513           <объявление метода>
1514         end;
1515         Вполне ожидаемая структура - тип, инкапсулирующий свои атрибуты (поля) и свой
1516  функционал (методы). Почти, как и в C++. Но есть и существенная разница - тела методов в
1517  объявлении класса не реализуются. Указываются только их (методов) заголовки, а
1518  реализация идет после описания типа:
1519         procedure <имя объекта>.<имя метода>(<параметры>)
1520         <тело процедуры>
1521         Обратите внимание на оператор точка (.). Аналогично можно описать и метод-
1522  функцию.
1523         Приведём    реализацию      объекта     "окно"     (объект     хорошо   всем     знакомый          по
1524  операционной системе Windows). Мы можем считать, что окно на дисплее задаётся
1525  координатами левого верхнего угла и размерами по горизонтали и вертикали, а также оно
1526  должно иметь флаг видимости (true означает, что окно на экран выведено).
1527         Type CWindow=object
1528           x,y:   integer; {координаты окна}
1529  
1530  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4            Страница 45 из 67
1531           lenx,leny: integer; {размеры окна}
1532           visible: boolean; {флаг видимости}
1533           procedure Init (_x,_y,_lenx,_leny: integer);
1534           procedure Show;
1535           function isVisible: boolean;
1536         end;
1537         procedure CWindow.Init (_x,_y,_lenx,_leny: integer);
1538         {Задаёт начальные параметры окна}
1539         begin
1540           Self.x:=_x;
1541           Self.y:=_y;
1542           Self.lenx:=_lenx;
1543           Self.leny:=_leny;
1544           visible:=true;
1545         end;
1546  
1547  
1548         procedure CWindow.show;
1549         {Рисует окно}
1550           var i,j: integer;
1551         begin
1552           visible:=true;
1553           {Остальная часть реализации процедуры опущена}
1554         end;
1555  
1556  
1557         function CWindow.isVisible: boolean;
1558         begin
1559           isVisible:=visible;
1560         end;
1561         Еще раз обратите внимание на вынос тел процедур и функций (методов) за границы
1562  определения класса. Более того, специальные компоновочные юниты (вспомогательные
1563  файлы кода), где и принято объявлять новые типы, требуют еще разнести объявление и
1564  
1565  
1566  
1567  Академия АйТи                Установка и администрирование ПСПО. Лекции. Часть 4   Страница 46 из 67
1568  реализацию методов по разным секциям внутри юнита. Мы поговорим о юнитах и об их двух
1569  главных секциях чуть позже.
1570         Создать объект нового типа и воспользоваться заложенным в нем функционалом
1571  можно способом практически совпадающим с применением типов встроенных. Сначала
1572  объявим переменную (пусть ее имя будет просто Window) целевого типа:
1573         var Window: CWindow;
1574         А затем, в теле программы, обращаемся к ее полям и/или методам с привлечением
1575  оператора точка:
1576         begin
1577           Window.Init (20,5,40,10);
1578           Window.Show;
1579         end.
1580         При написании проектов уровня хотя бы выше элементарного описание классов
1581  принято выносить в отдельный (от файла непосредственно программы) файл. В Паскале
1582  такие «вспомогательные» файлы называются юнитами (units) или, что тоже самое, модулями.
1583  Файл же содержащий текст самой программы так и будет называться - программа, и будет
1584  начинаться ключевым словом program, как это было показано в примерах выше. Файлы-
1585  юниты будут начинаться другим ключевым словом - unit через пробел от которого будет
1586  записано имя этого юнита, а после него обязана находиться точка с запятой. Юниты обязаны
1587  состоять из двух частей:
1588                   ·   части декларативной; она начинается с ключевого слова interface;
1589                   ·   части       реализационной;         она      начинается    с   ключевого       слова
1590          implementation.
1591         Часть декларативная содержит объявления всех глобальных объектов модуля (типов,
1592  констант, переменных и подпрограмм), которые должны стать доступными основной
1593  программе и/или другим модулям. Т.е., например класс со всеми его полями/методами
1594  объявляется именно здесь. Однако тела этих методов, их код, будет и должен располагаться
1595  не здесь, а во второй секции - реализационной. Собственно это и есть ее предназначение -
1596  содержать тела процедур и функций, объявленных в interface части. Все описание юнита
1597  завершается словом end с непременной точкой после него. Т.о. абсолютно минимальный, но
1598  синтаксически корректный юнит по имени, скажем, a имеет вид:
1599         unit a;
1600  
1601  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4         Страница 47 из 67
1602         interface
1603         implementation
1604         end.
1605         Главная программа должна явно выразить свое намерение и желание воспользоваться
1606  теми типами, константами, переменными и т.д. что были объявлены и реализованы в том или
1607  ином модуле. Делает она это через раздел uses в своем заголовке:
1608         program testv;
1609         uses a;
1610         Var
1611         Z : Variant;
1612         I : integer;
1613         // остальные разделы описания
1614         begin
1615         // текст программы
1616         end.
1617         После такого объявления программа testv может использовать все идентификаторы и
1618  сущности объявленные /реализованные в модуле a.
1619         Традиционно завершим краткий обзор языка правилами написания комментария. FPC
1620  поддерживает целых 3 их варианта:
1621         (* Комментарий в старом стиле *)
1622         { Комментарий в стиле Turbo Pascal }
1623         // Комментарий в стиле Delphi. Все символы
1624         // до конца строки пропускаются компилятором.
1625         Первые два ограничиваются парами символов (* или { с одной стороны и *) или } с
1626  другой. Оба варианта позволяют писать многострочные комментарии. Комментарий стиля
1627  «две черты» полностью аналогичен своему «коллеге» из языка C++. Т.е. он начинается
1628  последовательностью символов // и ограничен концом строки.
1629         3.2. Работа со средой разработки ПО Lazarus
1630         Среда Lazarus запускается из главного меню: КДЕ-Прочие-Разработка-Lazarus.
1631  Открывшаяся в результате этого действия среда имеет вид довольно своеобразный и не
1632  типичный для современных оконных приложений. У Lazarus нет рабочего пространства (т.е.
1633  одного главного окна) в понятиях типичных RAD-сред. Его рабочее пространство состоит из
1634  
1635  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 48 из 67
1636  независимых окон выполняющих какую-либо функцию (редактирование кода, вывод
1637  сообщений компилятора, просмотр структуры и состава текущего проекта и т.д.), см. Рис. 6.
1638  Независимость этих окон выражается в том, что каждое из них можно свернуть, закрыть,
1639  переместить, не оказывая никакого влияния на окна прочие. Стандартная системная
1640  комбинация клавиш Alt+Tab (переключение окон) тоже выбирает их и выносит на передний
1641  план по одному. «Условно главным» можно считать узкое окно под номером 1 на Рис. 6. Его
1642  закрытие приведет к окончанию работы всего приложения Lazarus. Все прочие окна, как уже
1643  было сказано, могут открываться/закрываться независимо. «Условно главное» окно содержит
1644  лишь меню среды и несколько панелей управления с привычными кнопками. Реальная работа
1645  программиста протекает в основном в окнах дополнительных, число которых довольно
1646  значительно. Рассмотреть работу и назначение каждого не представляется возможным в силу
1647  ограничения времени нашего курса, однако, несомненно, одним из самых востребованных
1648  дополнительных окон будет окно редактора исходного кода (номер 2 на Рис. 6). Оно имеет
1649  точно такой же «закладочный» дизайн что и редактор предыдущей среды - KDevelop. Ясно,
1650  что мы можем редактировать сразу несколько файлов входящих в наш проект. Редактор
1651  среды Lazarus умеренно-продвинут и обладает базовым набором функционала ожидаемого в
1652  редакторе подобного класса. В частности присутствует аналог функции Завершить текст
1653  среды KDevelop (см. «Работа со средой разработки ПО KDevelop»), только здесь он
1654  называется identifier completion (завершение идентификатора) и вызывается сочетанием
1655  клавиш Ctrl+Space после набора первых 2-3 символов имени переменной.
1656         Так же отметим еще одно вспомогательное окно - Сообщения (номер 3 на Рис. 6).
1657  Именно здесь мы увидим сообщения компилятора в ходе процесса компиляции нашей
1658  программы. В целом трех указанных окон достаточно для написания не сложных консольных
1659  приложений..
1660  
1661  
1662  
1663  
1664  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 49 из 67
1665         Рис. 6. Рабочее пространство среды Lazarus. Выделены окна: 1 – «главное», 2 -
1666  редактор исходного кода, 3 - сообщений компилятора.
1667         Еще одно отличие рабочего пространства Lazarus от такого же в KDevelop - оно «не
1668  умеет» быть пустым. Т.е. Lazarus требует что бы постоянно был открыт какой-то проект.
1669  Если в последнем сеансе мы работали над проектом MyProj_01 и при запуске среды он
1670  найден на диске - MyProj_01 и открывается как рабочий проект. Если последний проект не
1671  найден или это просто первый запуск среды разработки - Lazarus создает проект сам. В
1672  качестве шаблона (о них см.. «Работа со средой разработки ПО KDevelop») выбирается
1673  шаблон приложения с графическим интерфейсом пользователя. Это разумно, т.к.
1674  большинство создаваемых приложений будут именно этого типа. Однако, как мы помним,
1675  это не тот тип проекта, который нужен нам в изучаемом курсе, и мы решили придерживаться
1676  шаблонов приложений консольного типа. Тогда этот созданный средой "на удачу" проект
1677  можно закрыть через меню Проект-Закрыть проект. Никаких следов на диске он не
1678  оставляет если только в открывшемся окне-предупреждении мы укажем пункт «Отбросить
1679  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 50 из 67
1680  изменения». Если этот стартовый проект вообще не менялся, то и закрывается он безо всяких
1681  предупреждений. Появившееся вслед за этим еще одно окно предложит нам выбор из трех
1682  опций (Рис. 7). Назначение каждой очевидно.
1683  
1684  
1685  
1686  
1687         Рис. 7. Окно выбора варианта продолжения работы после закрытия активного проекта.
1688         После выбора в этом последнем окне опции «Создать новый проект» среда
1689  предложит нам окно диалога «Создать новый проект» (Рис. 8). Фактически мы выбираем
1690  шаблон для нашего приложения. Список имеющихся далеко не столь внушителен как у
1691  среды KDevelop, но достаточен для типовой разработки. Минималистическим шаблоном
1692  консольного приложения будет вариант «Программа пользователя» (Custom Program).
1693  Именно этот шаблон мы используем в практической части занятий.
1694  
1695  
1696  
1697  
1698         Рис. 8. Окно создания нового проекта. Выбор шаблона будущего приложения.
1699         После выбора этого варианта в редакторе будет открыт исходный текст единственного
1700  (пока) файла составляющего наш проект - project1. Этот файл содержит код главной
1701  программы (которая по умолчанию имеет тоже самое имя - Project1) к редактированию
1702  которого и можно приступать. Если программист желает добавить к проекту новые файлы (а
1703  в проектах реальных вероятность такого желания близка к 100%) то он может пойти
1704  несколькими путями, в зависимости от типа добавляемого файла. Мы воспользуемся путем
1705  самым прямолинейным – Файл-Создать модуль. Новый модуль (он же юнит, unit)
1706  добавляется к проекту и открывается в своей закладке редактора. По умолчанию он имеет
1707  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 51 из 67
1708  имя Unit1, а в текст главной программы добавляется строка uses Unit1. Имя нового модуля,
1709  конечно, можно изменить прямо в редакторе.
1710         Что касается сохранений, то лучшей стратегией будет сохранение каждого нового
1711  модуля (а так же файла главной программы) непосредственно в момент их добавления к
1712  проекту и лишь затем переход к их редактированию. Для этого достаточно в любой момент
1713  выбрать пункт меню Файл-Сохранить как…. Данная команда воздействует на файл в
1714  активной закладке редактора. Пока это не сделано файл существует лишь в памяти
1715  компьютера и может быть в любой момент утерян. В ответ на выбор указанного пункта меню
1716  откроется диалог сохранения активного файла (Рис. 9).
1717  
1718  
1719  
1720  
1721         Рис. 9. Окно диалога сохранения файла/проекта.
1722  
1723  
1724         Здесь надо иметь в виду, что в отличии от среды KDevelop Lazarus самостоятельно не
1725  создает т.н. корневой папки проекта. А она очень удобна в плане управления файлами,
1726  входящими в наш проект. По счастью, из окна сохранения проекта (Рис. 9) мы такую папку
1727  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 52 из 67
1728  можем создать самостоятельно, для этого предусмотрена кнопка Создать каталог. Новый
1729  каталог станет подпапкой каталога указанного в поле «Looking in». После создания желаемой
1730  корневой папки проекта остается перейти в нее двойным щелчком по ее имени в списке
1731  Каталоги и в поле Выбор: <полный_путь_до_ корневой_папки_проекта> ввести имя
1732  сохраняемого файла. При этом если мы сохраняем файл главной программы, то на диск в
1733  указанную папку запишутся 2 файла:
1734                  ·   с расширением .pas - непосредственно текст программы;
1735                  ·   с расширением .lpi - файл самого проекта
1736         Иными словами имена проекта и главной программы всегда совпадают. При
1737  сохранении же нового модуля (unit) на диск пишется одни файл, с расширением .pas и
1738  (возможно, но не обязательно) вносятся необходимые изменения в текст файла проекта. Т.о.
1739  созданная нами корневая папка проекта будет содержать все файлы необходимые
1740  программисту в работе. После успешной компиляции итоговый исполнимый модуль будет
1741  помещен сюда же.
1742         Желательно указывать имена всех файлов проекта в нижнем регистре дабы избежать
1743  предупреждения о возможных проблемах (Рис. 10). Впрочем, прямо из этого окна можно
1744  позволить среде привести имена к требуемому регистру. KDevelop выполняет подобный же
1745  «маневр» не интересуясь мнением разработчика.
1746  
1747  
1748  
1749  
1750         Рис. 10. Окно предупреждения о регистре имени проекта.
1751         Когда все файлы отредактированы должным образом и сохранены на диск можно
1752  попробовать собрать программу. Процесс компиляции инициируется выбором пункта меню
1753  Запуск-Собрать или просто нажатием Ctrl+F9. Как уже отмечалось ход и результат этого
1754  процесса сообщается в особом окне - Сообщения (номер 3 на Рис. 6). После успешной
1755  компиляции возможен тестовый прогон свежей программы прямо из среды. Однако если
1756  KDevelop готов к подобному прогону «со старта», консоль, открываемую изнутри Lazarus
1757  нужно предварительно настроить. Диалог такой настройки вызывается через меню Запуск-
1758  Параметры запуска…. В открывшемся одноименном окне (Рис. 11) требуется:
1759  
1760  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 53 из 67
1761                  ·       разрешить использовать внешнее приложение (консоль) для запуска
1762           нашей программы. За это отвечает флажок Использовать приложение для запуска;
1763                  ·       указать путь к этому внешнему приложению. По умолчанию таковым
1764           выступает xterm - стандартный эмулятор терминала для среды X Window System в
1765           Unix. остается лишь проверить правильность пути к нему.
1766           После всех этих настроек запуск откомпилированной программы проблем не
1767  составляет: Запуск-Запуск или просто F9. Должно открыться окно консоли в котором мы
1768  можем осуществлять ввод для нашей программы и/или наблюдать выводимую ей
1769  информацию. Точно так же как и в случае с KDevelop эта консоль не "схлопывается"
1770  немедленно по окончанию нашей программы, а любезно предлагает нам нажать для этого
1771  Enter.
1772           Традиционно завершим разговор о языке Pascal и среде разработки программ на этом
1773  языке Lazarus предложением нескольких ссылок на ресурсы посвященным этим двум
1774  областям компьютерной науки:
1775           Официальный сайт проекта Lazarus
1776           http://lazarus.freepascal.org
1777           Русскоязычный сайт с материалами по компилятору Free Pascal и среде Lazarus
1778           http://freepascal.ru
1779           Lazarus wiki - энциклопедия по Free Pascal Compiler/Lazarus
1780           http://wiki.lazarus.freepascal.org
1781           4. Разработка ПО с использованием Gambas
1782           Суть и предназначение третьего из рассматриваемых нами пакетов - Gambas -
1783  полностью аналогично двум предыдущим. Как и с KDevelop, и с Lazarus мы имеем дело с
1784  Rapid Application Development (RAD), т.е. со средой разработки программного обеспечения.
1785  По своим возможностям Gambas значительно ближе к Lazarus, т.к. настроен на поддержку
1786  всего одного языка. В данном случае речь идет о языке Basic с объектным расширением. Т.е.
1787  такой вариант языка начального уровня, который позволяет применять при разработке
1788  программ принципы ООП. Этот диалект языка Basic тоже называется Gambas. Т.о. слово
1789  Gambas одновременно обозначает И пакет облегчающий написание на " Basic-о подобном"
1790  языке, И сам этот язык. Собственно если разобрать слово Gambas то выясняется что это —
1791  рекурсивный акроним от англ. Gambas Almost Means BASic, что в дословном русском
1792  переводе выглядит как «Gambas Почти Означает Basic», а более привычно русскому уху:
1793  
1794  Академия АйТи               Установка и администрирование ПСПО. Лекции. Часть 4   Страница 54 из 67
1795  «Gambas — почти Basic». Само слово Gambas с испанского переводится как "креветка",
1796  которая изображена на логотипе обсуждаемого пакета.
1797         Gambas       задумывался     как    альтернатива       для     Microsoft   Visual     Basic     (MVB)
1798  разработчиков, решивших перейти на GNU/Linux. Действительно, программист на MVB
1799  сможет без труда переключиться на Gambas, но надо иметь в виду, что второй не является
1800  клоном первого и определенно не поддерживает запуск программ созданных в MVB.
1801         И снова, как и в случае двух предыдущих сред разработки, для профессиональной
1802  работы с Gambas мы должны быть компетентны в двух областях:
1803                  ·      мы должны знать и уметь писать синтаксически корректные программы
1804          на языке Basic и лучше, если это будет его вариант с объектным расширением.
1805          Разработчики, знающие Basic классический, получают заметное преимущество в этом
1806          аспекте обучения;
1807                  ·      мы должны знать Gambas именно как приложение и уметь пользоваться
1808          предлагаемым им функционалом.
1809         Рассмотрим эти вопросы последовательно в следующих двух подразделах.
1810         4.1. Основы языка программирования BASIC (ОО диалект)
1811         Традиционно начнем обзор базовых конструкций языка с примера программы близкой
1812  к минимальной:
1813         PUBLIC SUB Main()
1814                  DIM m AS Float
1815                  m=doMultiply()
1816                  PRINT m
1817         END
1818         PRIVATE FUNCTION doMultiply() AS Float
1819                  DIM x AS Float
1820                  DIM y AS Float
1821                  PRINT "Enter x:"
1822                  INPUT x
1823                  PRINT "Enter y:"
1824                  INPUT y
1825                  RETURN x*y
1826         END
1827  
1828  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4              Страница 55 из 67
1829         Что получится в результате запуска этой программы? На консоль будет выведено три
1830  строки - первая пригласит пользователя указать число x, вторая - y и третья просто выведет
1831  результат умножения этих двух чисел.
1832         Перейдем теперь к ее построчному разбору.
1833         PUBLIC SUB Main()
1834         Декларирует главный метод (точку входа) создаваемой программы. Отсюда начнется
1835  ее выполнение. Имя главного метода - Main. Вообще Gambas поддерживает декларацию двух
1836  разновидностей методов: процедур и функций. Разница между этими сущностями полностью
1837  аналогична разнице между ними же в языке Pascal, т.е. функция есть процедура
1838  возвращающая значение заданного типа. Поскольку данная декларация не включает
1839  ключевого слова AS можно сделать вывод, что декларируется именно процедура. Пример
1840  декларации функции будет приведен чуть ниже.
1841         DIM m AS Float
1842  Любая переменная, планируемая к использованию в пределах класса / процедуры / функции,
1843  должна быть предварительно декларирована. Переменные могут быть глобальными по
1844  отношению        к   классу   их    декларирующему           или     локальными          по    отношению          к
1845  процедуре/функции так же их декларирующих. Ключевое слово DIM необходимо именно для
1846  декларации локальных переменных. После этого слова идет имя переменной (или несколько,
1847  через запятую, если они все будут однотипны), за ним еще одно ключевое слово AS и,
1848  наконец, тип переменной. Какие типы можно указывать? Поскольку мы уже определили, что
1849  «Gambas=Basic+объектные расширения» то, разумеется, программист может создавать свои
1850  собственные типы (классы). Но и, конечно, Gambas предлагает встроенные, элементарные
1851  типы, которые описывать не нужно, а можно просто указывать после ключевого слова AS.
1852  
1853  
1854  Таблица 3.4 приводит такие типы, а точнее самые востребованные из них.
1855         Имя                Диапазон значений, комментарий                        Занимаемый          в     памяти
1856  типа                                                                  размер
1857         Boolean            true / false                                          1 байт
1858         Short              -32.768...+32.767                                     2 байта
1859         Integer            -2.147.483.648...+2.147.483.647                       4 байта
1860         Single             -1,7014118+38…+1,7014118E+38                          4 байта
1861         Date               Дата/время (например, 07/19/2005                      8 байт
1862  
1863  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4                 Страница 56 из 67
1864                   02:20:08) сохраненные в виде одного
1865                   целого числа
1866         String            Строчка символов переменной                           4   байта    (указатель         на
1867                   длины                                               строку) + память необходимая
1868                                                                       для       хранения    всех     символов
1869                                                                       строки
1870  
1871  
1872         После декларации локальные переменные могут быть использованы в любом месте
1873  только той процедуры/функции, что их декларировала. Переменная m в нашем примере
1874  доступна и "видна" только процедуре Main.
1875         m=doMultiply()
1876         Вызывается функция doMultiply и результат ее вызова присваивается только что
1877  задекларированной переменной m. Вызов процедур/функций в Gambas происходит по
1878  самому типичному шаблону всех языков: имя вызываемой процедуры/функции - круглые
1879  скобки - в скобках аргументы вызова через запятую. В данном случае функция doMultiply
1880  никаких аргументов не принимает и их список в данной строчке вызова пуст. Конечно, саму
1881  функцию doMultiply надо тоже декларировать и реализовать и мы вскоре увидим, как это
1882  делается.
1883         При декларации аргументов процедур / функций Gambas предлагает вариант их
1884  опционального применения при вызове. Осуществляется такой подход с привлечением
1885  ключевого слова OPTIONAL, например:
1886         PRIVATE SUB DoIt(sCommand AS String, OPTIONAL bSaveIt AS Boolean = TRUE)
188718881889         END
1890         Такая декларация говорит, что процедура DoIt может быть вызвана с одним (как
1891  минимум, т.к. первый аргумент является обязательным, а не опциональным) или с двумя
1892  аргументами. В первом случае (вызов с одним аргументом) DoIt считает, что во втором
1893  аргументе было передано значение TRUE.
1894         PRINT m
1895         Инструкция PRINT просто печатает на консоли выражение указанное после нее, в
1896  данном случае им станет переменная m содержащая результат умножения.
1897  
1898  Академия АйТи            Установка и администрирование ПСПО. Лекции. Часть 4               Страница 57 из 67
1899         END
1900         Закрывает описание (и завершает выполнение) процедуры/функции. Завершение
1901  главной процедуры Main так же означает окончание работы программы.
1902         PRIVATE FUNCTION doMultiply() AS Float
1903         Декларируем функцию doMultiply вызываемую из главной процедуры. То что это
1904  декларация именно функции (а не процедуры) говорит наличие ключевого слова AS.
1905  Функция обязана вернуть какое-то значение и тип указанный после этого ключевого слова
1906  говорит, какого типа это значение будет. В данном случае doMultiply имеет право вернуть
1907  любое число из диапазона значений типа Float (-8.98E+307…+8.98E+307).
1908         DIM x AS Float
1909         DIM y AS Float
1910         Декларируются две локальных (по отношению к функции doMultiply) однотипных
1911  переменных x и y. Могло бы быть для краткости записано и как
1912         DIM x,y AS Float
1913         PRINT "Enter x:"
1914         Печатает (в консоли) приглашение пользователю.
1915         INPUT x
1916         Принимает ввод пользователя и помещает его в указанную переменную.
1917         PRINT "Enter y:"
1918         INPUT y
1919         Аналогично x, но для переменной y
1920         RETURN x*y
1921         Заканчивает выполнение (но не описание!) функции doMultiply путем возврата в
1922  вызывающий код значения заданного типа (умножение одного Float на другой даст в
1923  результате еще один Float, а именно такой тип наша функция и обязана вернуть).
1924         END
1925         Закрывает описание функции.
1926         Как легко видеть из приведенного примера в Gambas (в отличии от тех же C++ /
1927  Pascal) каждая отдельная инструкция не обязана завершаться каким-либо спецсимволом
1928  вроде точки с запятой.
1929         К    числовым      переменным         и    константам       применимы    ожидаемые     базовые
1930  арифметические операторы: +,-,*,/, mod (остаток от деления), ^ (возведение в степень).
1931  
1932  Академия АйТи             Установка и администрирование ПСПО. Лекции. Часть 4       Страница 58 из 67
1933  Присвоение какого-либо значения переменной осуществляется простым знаком равенства,
1934  например:
1935         DIM N AS Integer
1936         DIM R AS Integer
1937         N = 3
1938         R = 6
1939         С помощью ключевого слова CONST поддерживается декларация констант:
1940         PUBLIC CONST MAX_VAL AS Integer = 30
1941         PUBLIC CONST HEADER AS String="# Gambas!!"
1942         После подобной декларации отрывок кода
1943         DIM b,p,t AS Integer
1944         b=1 + 30
1945         p=7 * 30
1946         t=(b+p) / 30
1947         может быть переписан как
1948         DIM b,p,t AS Integer
1949         b=1 + MAX_VAL
1950         p=7 * MAX_VAL
1951         t=(b+p) / MAX_VAL
1952         что гораздо практичнее, если мы предвидим возможное изменение значения
1953  константы MAX_VAL и особенно если такие изменения будут частыми.
1954         Нам осталось выяснить вопрос приложимости ООП-принципов к Gambas-программам.
1955  Т.е. как мы можем объявить класс (модель реального объекта) и как из класса получить
1956  новый его экземпляр. Здесь Gambas предлагает такой подход. Декларация нового класса
1957  начинается с создания нового файла специального назначения (реализуемого как просто
1958  новый файл на HDD содержащий удобную для начала работы с новым классом шаблон-
1959  заготовку). Для этого щелкните правой кнопкой мыши в окне проекта (подробнее об этом
1960  окне см. следующий раздел, «Работа со средой разработки ПО Gambas») и выберите New -
1961  Class (Новый - Класс). Вам будет предложено назвать новый файл и класс (т.е. имя файла и
1962  становится именем класса). Допустим, мы бы могли назвать этот файл Person, имея в виду,
1963  что мы приступаем к моделированию объекта реального мира - человека (персоны).
1964         Все место в новом файле отведено для одной задачи - описания полей (атрибутов) и
1965  процедур / функций (методов) нового класса. Начать мы бы могли с полей:
1966  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 59 из 67
1967         ' Gambas class file
1968         PUBLIC firstname AS String
1969         PUBLIC surname AS String
1970         PUBLIC salary AS Float
1971         Как легко догадаться из декларации все три поля будут доступны и из кода нашего
1972  класса Person, и из кода любого другого класса / процедуры / функции. Это, конечно,
1973  нарушение одного из базовых принципов ООП (инкапсуляции) и мы идем на это только с
1974  целью максимально упростить пример для новой темы.
1975         После определения всех полей мы могли бы перейти к декларации и реализации
1976  методов. В любом создаваемом классе мы можем указать «особую» процедуру по имени
1977  _new. Эта процедура нужна для инициализации всех полей нашего класса и вызывается в
1978  момент создания его экземпляра. Вспомним, что метод, обладающий подобными
1979  характеристиками, называется конструктором, и наша _new-процедура представляет именно
1980  его:
1981         PUBLIC SUB _new(ifirstname AS String, isurname AS String, isalary AS Float)
1982                  firstname = ifirstname
1983                  surname = isurname
1984                  salary = isalary
1985         END
1986         И далее мы бы продолжили разработкой любого потребного функционала. В данном
1987  случае ограничимся единственной функцией рассчитывающей размер налога исходя из
1988  значения поля salary:
1989         PUBLIC FUNCTION tax() AS Float
1990                  DIM tsalary AS Float
1991                  DIM ttax AS Float
1992                  tsalary = salary
1993                  ttax = 0
1994                  ' сам расчет реализован здесь
1995                  RETURN ttax
1996         END
1997         После этого мы могли бы сохранить данный (новый файл) и вернуться в файл с
1998  главной процедурой Main. В ней мы могли бы написать примерно такой код:
1999         ' Gambas module file
2000  Академия АйТи              Установка и администрирование ПСПО. Лекции. Часть 4   Страница 60 из 67
2001         PUBLIC SUB Main()
2002             ' Декларация
2003             DIM p1 AS Person
2004             DIM p2 AS Person
2005             DIM tax1, tax2 AS Float
2006             ' Инициализация
2007             p1 = NEW Person("Jane", "Jones", 35000)
2008             p2 = NEW Person("Fred", "Smith", 23000)
2009             ' Использование
2010             tax1 = p1.tax()
2011             tax2 = p2.tax()
2012             PRINT tax1
2013             PRINT tax2
2014         END
2015         Здесь мы сначала декларируем 4 переменных: p1 и p2 будут переменными нового
2016  типа, а tax1 и tax2 являются переменными элементарного типа Float и нужны нам для
2017  сохранения рассчитанного для каждой персоны налога. Далее мы инициализируем две
2018  переменные типа Person. В завершении главная процедурой Main использует имеющийся в
2019  классе Person функционал расчета налога и запоминает результат в двух своих локальных
2020  переменных, содержимое которых и выводится на консоль двумя финальными инструкциями
2021  PRINT. Для обращения к методам того или иного объекта используется самый популярный
2022  для этой цели оператор - точка (.).
2023         И, по традиции, завершим краткий обзор языка правилами написания комментария.
2024  Тут все крайне не сложно - любая строчка начинающаяся знаком апострофа (') и до конца
2025  считается именно им. Уточним, что речь идет о кавычке-апострофе традиционно делящей на
2026  стандартной клавиатуре одну клавишу с кавычками двойными. Использование вместо него
2027  машинописного обратного апострофа (символ на одной клавише с тильдой, ~) будет
2028  расценено компилятором как ошибка. Многострочные комментарии (аналоги /* */ в C++) в
2029  Gambas отсутствуют.
2030         4.2. Работа со средой разработки ПО Gambas
2031         Как известно все RAD-среды имеют один и тот же базис и основываются на одних и
2032  тех же идеях. Везде будут шаблоны, проекты, файлы исходного кода и т.п. Везде будет
2033  главное меню с панелями ниже его и масса рабочих окон, открываемых/закрываемых по
2034  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 61 из 67
2035  необходимости. Всюду можно скомпилировать исходный код, запустить его, отладить и т.п.
2036  Рассмотрение двух предыдущих сред разработки - KDevelop и Lazarus - лишь подтверждает
2037  этот факт.
2038         Никуда не деться из этой «генеральной колеи» и среде третьей - Gambas. Да, все тот
2039  же набор шаблонов для старта нового проекта, тот же «многозакладочный» редактор с
2040  характерным функционалом (в частности - на месте функция автозавершения имен
2041  идентификаторов, причем вам не нужно для ее вызова нажимать какую-то особую «горячую»
2042  клавишу; просто начните набирать имя переменной - спустя 3-4 символа появится окно со
2043  списком вариантов, Рис. 11), такая же возможность запустить разрабатываемое приложение
2044  (а нас снова будет интересовать их консольная разновидность) прямо из среды и провести
2045  анализ выводимой им информации и т.д.
2046  
2047  
2048  
2049  
2050         Рис. 11. Функция автозавершения имен в Gambas срабатывает автоматически.
2051  
2052  
2053         Поскольку все необходимые концепции и типовой функционал сред разработки нам
2054  теперь известны и понятны, рассмотрим еще одного их представителя - Gambas - в сжато-
2055  конспективном режиме. А именно: применим подход «Как мне…?», который максимально
2056  скупо дает ответ на один конкретный вопрос - как произвести то или иной действие - не
2057  погружаясь в нюансы. Необходимость того или иного действия и порядок их следования
2058  (например тот факт, что сначала надо создать проект и лишь затем переходить к
2059  редактированию кода), считаем, нам понятен из опыта работы с предыдущими двумя RAD-
2060  средами.
2061  
2062  
2063  Академия АйТи         Установка и администрирование ПСПО. Лекции. Часть 4   Страница 62 из 67
2064         Итак, таблица 3.5 приводит набор типичных «Как мне…?» действий требуемых для
2065  создания простого консольного приложения на языке BASIC, его компиляции и тест-прогона
2066  прямо из среды.
2067  
2068  
2069         Как мне….                     Предлагаемое действие
2070         …запустить среду              Выбрать в главном меню: КДЕ-Прочие-Разработка-
2071  Gambas?                      Интегрированная среда разработки Gambas (Gambas IDE)
2072         …начать     новый             Выбрать       пункт «Новый проект» в окне «Добро
2073  проект?                      пожаловать в Gambas II», появляющееся немедленно после
2074                               запуска среды
2075         …выбрать                      После выбора пункта «Новый проект» (см. предыдущий
2076  консольный            тип вопрос) будет предложен список из нескольких типов проектов
2077  проекта?                     (шаблонов). Один из них - Консольное приложение.
2078         …создать                      На шаге «2. Директория проекта» мастера создания
2079  корневую            папку нового проекта мы выбираем родительскую папку для будущей
2080  проекта?                     корневой папки проекта. Далее, на шаге «3. Информация о
2081                               проекте»      мы     указываем       имя        проекта.   В      результате       в
2082                               родительской папке создается одноименная подпапка. Эта
2083                               последняя и будет корневой папкой проекта.
2084         …добавить        к            Щелкнуть правой кнопкой мыши в любом месте окна
2085  проекту новые файлы?         проекта среды (окно 1, Рис. 12). Выбрать из контекстного меню
2086                               Новый-Модуль…. Это добавит файл где можно описывать и
2087                               реализовывать новые функции/подпрограммы, но не новые типы
2088                               (классы). Или, в том же меню выбрать Новый-Класс…. Это
2089                               добавит файл, где можно описывать и реализовывать новые
2090                               типы (классы).
2091         …перейти         к            Если файл с кодом уже открыт в окне редактора (окно 2,
2092  редактированию       того Рис. 12) то достаточно щелкнуть по закладке с именем файла.
2093  или       иного    файла Если требуемый файл пока закрыт, необходим будет двойной
2094  исходного            кода щелчок по его имени в окне проекта среды (окно 1, Рис. 12).
2095  входящего в проект?
2096         …сохранить                    Выбрать в главном меню среды Файл-Сохранить проект
2097  
2098  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4                  Страница 63 из 67
2099  внесенные           в     файлы или просто нажать Ctrl+Alt+S. Сохраняются сразу все файлы
2100  исходного                   кода проекта.
2101  изменения на диск?
2102         …запустить                           Выбрать в главном меню среды Проект-Компилировать
2103  компиляцию проекта?                 Все. «Быстрая клавиша» для этой команды - Alt+F7.
2104         …узнать                об            В отличии от других языков программирования файл
2105  ошибках         в       исходном исходного кода не воспринимается компилятором как единое
2106  коде и исправить их?                целое, а интерпретируется строка-за-строкой, сверху вниз.
2107                                      Первая      же       строка,    выходящая         за       рамки    понимания
2108                                      интерпретатора прерывает весь процесс компиляции и:
2109                                                       ·       закладка с файлом, содержащим ошибочный
2110                                              текст становится активной в окне редактора (окно 2, Рис.
2111                                              12);
2112                                                       ·       выводится дополнительное окно-сообщение
2113                                              с      описанием       ошибки;      для    продолжения             работы
2114                                              потребуется нажать OK в этом информационном окне;
2115                                                       ·       после нажатия на OK курсор редактора
2116                                              спозиционируется          на     строке        с   ошибкой,        можно
2117                                              приступать к ее исправлению и затем к новой попытке
2118                                              компиляции.
2119         …собрать                             Выбрать в главном меню среды Проект-Собрать-
2120  исполнимый модуль?                  Executable….         «Быстрая      клавиша»       для      этой    команды       -
2121                                      Ctrl+Alt+M.
2122         …запустить                           Добиться успешной компиляции проекта а затем выбрать
2123  разрабатываемое                     в главном меню среды Отладка-Старт. Тоже самое делает
2124  приложение          из     среды клавиша F5. Если проект еще не компилировался с момента
2125  разработки?                         последних изменений в файлах исходного кода, то сначала
2126                                      запускается этот процесс, а после его успешного завершения
2127                                      происходит старт приложения.
2128         …провести                            Окно консоли встроено прямо в среду разработки (окно 3,
2129  пробный сеанс работы с Рис. 12). Весь консольный вывод поступает сюда. Отсюда же
2130  разрабатываемым                     может       быть     осуществлен        пользовательский           ввод,     если
2131  
2132  Академия АйТи                 Установка и администрирование ПСПО. Лекции. Часть 4                Страница 64 из 67
2133  консольным приложением разрабатываемое приложение запрограммировано на таковой.
2134  не    выходя    из   среды
2135  разработки?
2136  
2137  
2138         Таблица 3.5. Типичные действия, совершаемые разработчиком в RAD-среде Gambas.
2139  
2140  
2141  
2142  
2143         Рис. 12. Окно среды разработки Gambas с консольным проектом, состоящим из трех
2144  файлов исходного кода.
2145         Из приведенной таблицы легко видеть, что все шаги действительно крайне характерны
2146  для прочих сред разработки и неоднократно выполнялись нами при изучении двух
2147  предыдущих пакетов, KDevelop и Lazarus. Недоумение может вызвать лишь наличие
2148  действия «компиляция» параллельно с действием «собрать исполнимый модуль». Разве одно
2149  не следует из другого? Разве после успешной компиляции исполнимый модуль не создается
2150  автоматически? Ответы на эти вопросы утвердительны для подавляющего числа
2151  компиляторов, но НЕ для компилятора с языка BASIC (и его ближайшего «родственника»
2152  
2153  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4   Страница 65 из 67
2154  языка Gambas). Дело в том, что компиляторы BASIC/Gambas являются интерпретаторами.
2155  Они попросту выполняют исходный код строка-за-строкой, пока не достигнут конца главной
2156  процедуры (Main). Компиляция в данном случае на диск вообще ничего не пишет, а всего
2157  лишь удостоверяет тот факт (в случае успешного окончания процесса компиляции, конечно)
2158  что интерпретатору ясна каждая строка во всех файлах исходного кода входящих в наш
2159  проект. И он готов после запуска все их последовательно исполнить. Действие же «собрать
2160  исполнимый модуль» сначала проводит компиляцию (как мы выяснили это эквивалентно
2161  простой проверки синтаксиса) а затем этот проверенный исходный текст всех файлов проекта
2162  сплавляет в один выходной исполнимый модуль. Среда предлагает образовывать имя этого
2163  модуля по шаблону <имя_проекта>.gambas однако оно может быть любым и у нас будет
2164  возможность это имя указать. Однако, и это требуется понимать очень хорошо, между
2165  исполнимыми модулями произведенными средами KDevelop/Lazarus и обсуждаемым есть
2166  огромная, принципиальная разница:
2167                  ·   исполнимые       модули,      полученные        после    компиляции    в   средах
2168          KDevelop/Lazarus являются файлами содержащими «чистый» машинный код. ОС
2169          Linux остается просто «скармливать» байт за байтом содержимое таких модулей
2170          центральному процессору компьютера. Для исполнения тех же модулей на другом
2171          компьютере, не том где они были скомпилированы, требуется просто идентичная (или
2172          совместимая) ОС Linux
2173                  ·   исполнимые модули, полученные после процесса, названным нами
2174          «собрать исполнимый модуль»,в среде Gambas, машинного кода не содержат вообще.
2175          Они по-прежнему содержат исходный код на языке Gambas. Просто этот код
2176          агрегирован из всех файлов проекта и слегка упакован для экономии места. Так же это
2177          удобно для переноса готового приложения на другой компьютер (перенос одного
2178          пусть и большого файла много проще и гораздо лучше управляем, чем перенос
2179          пятисот мелких файлов). Тем не менее, принципиально это картину не меняет, код
2180          содержащийся в этом итоговом пакете «не понятен» центральному процессору. А
2181          понятен он лишь все тому же интерпретатору языка Gambas. Поэтому выход только
2182          один - запустить интерпретатор и указать ему данный пакет в виде входного файла.
2183          Тогда код на языке Gambas будет «на лету» преобразован интерпретатором в код
2184          машинный и, наконец-то, исполнен.
2185  
2186  
2187  
2188  Академия АйТи          Установка и администрирование ПСПО. Лекции. Часть 4         Страница 66 из 67
2189         В сухом остатке мы имеем следующий факт: исполнимый модуль произведенный
2190  средой Gambas не будет запускаться на другом компьютере даже имеющего идентичную ОС
2191  Linux. Для успешного запуска такого модуля (пакета) целевому компьютеру (помимо
2192  идентичной/совместимой операционной системы) требуется специальное приложение -
2193  интерпретатор языка Gambas. Однако полноценная среда разработки Gambas для запуска
2194  готового пакета не требуется, хотя, конечно, и не помешает такому запуску.
2195         Т.о. собрав выходной пакет с именем, скажем MyProj.gambas мы можем передать его
2196  на другой компьютер, предварительно удостоверившись в наличии интерпретатора языка
2197  Gambas на последнем. Приложение-интерпретатор представляет собой утилиту командной
2198  строки gbx2. Однако интерпретатор, как и положено классическому интерпретатору, умеет
2199  воспринимать строки на не упакованном языке Gambas, так как мы их набираем в редакторе.
2200  Поэтому gbx2 можно использовать для запуска из консоли файлов исходного кода с
2201  расширениями .module и .class. Это, кстати, еще один вариант распространения нашей
2202  программы - просто передать файлы исходного кода. Для их запуска, как легко видеть, среда
2203  разработки не нужна, нужна лишь утилита интерпретатора, gbx2. В .gambas-пакете же строки
2204  упакованы, поэтому требуется специальная разновидность интерпретатора - так же
2205  приложение командной строки gbr2. Так вот убедившись в наличии на целевом компьютере
2206  этой утилиты и набрав в его консоли команду gbr2 MyProj.gambas мы, наконец-то, запустим
2207  нашу готовую Gambas-программу на исполнение.
2208         Традиционно завершим разговор о языке Gambas и одноименной среде разработки
2209  предложением нескольких ссылок на ресурсы посвященным этим двум областям
2210  компьютерной науки:
2211         Официальный сайт проекта Gambas
2212         http://gambasrad.org
2213         Краткий учебник по языку Gambas
2214         http://en.wikibooks.org/wiki/Gambas
2215         Официальная документация по языку Gambas
2216         http://gambasdoc.org/help?en
2217  
2218  
2219  
2220  
2221  Академия АйТи           Установка и администрирование ПСПО. Лекции. Часть 4   Страница 67 из 67
2222  
2223  

ALTLinuxEdu: FrBrGeorge/DraftsAndJunk/PspoItRu/APSPO Programm-лекции ч4 (last edited 2009-11-02 10:13:41 by VladCherny)