WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Pages:     | 1 | 2 || 4 |

«Free Pascal и Lazarus Учебник по программированию Е. Р. Алексеев О. В. Чеснокова Т. В. Кучер Москва Альт Линукс 2010 УДК 004.432 ББК 22.1 А47 Алексеев Е. Р., Чеснокова О. В., Кучер Т. В. А47 Free Pascal и Lazarus: ...»

-- [ Страница 3 ] --

Окно редактора фильтров состоит из двух столбцов: Filter name имя фильтра (например, все файлы программы Паскале); Filter соответствующая имени фильтра маска (фильтру все файлы соответствует маска *.*, фильтру программы на Паскале маска *.pas.

Специальная строка состоит из последовательных имен фильтров и соответствующих им масок, разделённых символом |. Специальная строка, соответствующая фильтру, представленному на рис. 7.2, имеет вид:

OpenDialog1. F i l t e r := ’Программы_на_C|*.c|Программы_на_Паскале|*.pas|Все_файлы|*.*’ ;

Первый фильтр в списке является фильтром по умолчанию, в примере на рис. 7.2 фильтр по умолчанию Программы на C. InitialDialog имя каталога по умолчанию для выбора файлов. DefaultExt расширение, добавляемое к имени файла по умолчанию, если пользователь при ручном вводе имени файла не указал расширение.

Основным методом для компонента OpenDialog является логическая функция Execute, которая приводит к открытию диалогового окна в соответствии со свойствами компонента. Функция Execute возвращает true, если пользователь выбрал файл каким-либо методом. Если пользователь нажал в диалоговом окне Отмена (Cancel), то метод Execute возвращает false. Имя выбранного файла возвращается в свойстве FileName.

Таким образом, вызов диалогового окна можно записать так:

Var s : String ;

begin i f OpenDialog1. Execute then s := OPenDialog1. FileName ;

{Имя файла, выбранного пользователем, хранится в переменной s} end ;

Разобравшись с компонентом для выбора файла, вернемся к задаче 7.2. Можно выделить следующие этапы решения задачи.

1) Выбор файла.

2) Чтение данных из файла в массив вещественных чисел.

3) Удаление в массиве вещественных чисел всех чисел, меньших среднего арифметического, расположенных между максимальным и минимальным элементами.

4) Запись преобразованного массива в файл.

Разработку программы начнём с создания графического приложения (Проект Создать Проект Приложение).

На форме расположим следующие компоненты:

1) Две метки Label1 и Label2 для подписи.

2) Memo1 компонент, в котором будем хранить содержимое исходного файла.

3) Memo2 компонент, в котором будет храниться преобразованный файл.

4) OpenDialog1 компонент для выбора имени обрабатываемого файла.

5) Button1 кнопка для запуска программы.

6) Button2 кнопка для завершения программы.

Установим следующие свойства формы и компонентов (см. табл. 7.1 7.8).

Таблица 7.4. Свойства компонента Таблица 7.5. Свойства компонента Таблица 7.6. Свойства компонента OpenDialog Расположим компоненты на форме подобно тому, как показано на рис. 7.3.

При запуске программы на выполнение все компоненты, кроме кнопки Преобразовать файл, будут невидимыми, свойство Visible установлено в False.

Окно приложения при запуске показано на рис. 7.4.

Рис. 7.3. Форма с расположенными на ней компонентами Проектирование интерфейса приложения завершено. Осталось написать тексты обработчиков событий.

При создании формы установим свойство Filter компонента OpenDialog1.

Поэтому подпрограмма FormCreate будет такой.

procedure TForm_File. FormCreate ( Sender : TObject ) ;

begin OpenDialog1. F i l t e r := ’Файлы_вещественных_чисел|*.dat|Все_файлы|*.*’ ;

end ;

При щелчке по кнопке Преобразовать файл должно происходить следующее:

1) Выбор файла из диалогового окна.

2) Считывание данных из файла в массив вещественных чисел.

3) Установка свойства Visible в true у компонентов label1 и Memo1.

4) Вывод содержимого массива в Memo1.

5) Преобразование массива.

6) Запись преобразованного массива в файл.

7) Установка свойства Visible в true у компонентов label2 и Memo2.

8) Вывод преобразованного массива в Memo2.

9) Установка свойства Visible в True у компонента Button_Close.

Ниже приведён текст обработки события Button_FileClick с подробными комментариями.

procedure TForm_File. B u t t o n _ F i l e C l i c k ( Sender : TObject ) ;

var s : string ;

nmax, nmin, i, j, n : integer ;

sum, max, min : r e a l ;

begin //Открываем диалоговое окно для выбора файла.

//Имя выбранного файла считываем в переменную s.

s := OpenDialog1. FileName ;

//Связываем файловую переменную с файлом на диске.

//Открываем файл для чтения.

//Обнуляем счетчик элементов массива.

//Делаем видимыми первую метку и компонент Memo1.

//Переменная sum служит для нахождения суммы компонентов //файла.

//Пока не встретится конец файла, будем считывать очередной //компонент.

//Индекс массива увеличиваем на 1.

//Считываем очередной элемент из файла в массив.

//Накапливаем сумму элементов массива.

//Выводим очередной элемент в Memo1.

//Закрываем файл.

//Находим среднее арифметическое элементов массива.

sum:=sum/n ;

//Выполняем поиск максимального, минимального элементов //в массиве и их индексов.

max:=a [ 1 ] ; min:=max ; nmin : = 1 ; nmax : = 1 ;

//вычисление и вывод площади readln ;



end.

Элементами записей могут быть как простые, так и структурные типы. Никаких ограничений по уровню вложенности структур не существует.

Теперь для примера создадим запись Student, которая будет состоять из полей: фамилия, имя, группа, оценки по пяти дисциплинам и прописка. В свою очередь прописку тоже сделаем записью, состоящей из полей: город, улица, дом, квартира.

type a d r e s s = record house, apartment : integer ;

end ;

s t u d e n t = record surname, name : string ;

group : string ;

e s t i m a t i o n : array [ 1.. 5 ] of integer ; //оценки residence : adress ;

end ;

При объявлении такой записи обращение к полям осуществляется так:

var begin Ivanov. group := ’ Ф08 ’ ;

...

C использованием ключевого слова With к полям записи можно обращаться без указания префикса каждый раз с названием поля:

with переменная do оператор Например:

with s t u d do begin begin end ;

surname := ’ Иванов ’ ;

name:= ’ Андрей ’ ;

group := ’ Ф07 ’ ;

estimation [1]:=3; estimation [2]:=5; estimation [3]:=4;

estimation [4]:=3; estimation [5]:=5;

end ;

ЗАДАЧА 8.1. Создать базу данных, содержащую сведения о студентах.

В программе предусмотреть расчёт среднего балла студента, сортировку по алфавиту, вывод результатов в диалоговое окно и в текстовый файл.

Создадим новый проект. На форму (рис. 8.4) поместим необходимое количество объектов типа TEdit для ввода исходных данных и объект StringGrid для вывода результатов. Для объекта StringGrid1 зададим свойства ColCount= и RowCount=1. Также создадим три кнопки:

• Запомнить данные после ввода данных они считываются, и поля ввода очищаются для дальнейшего ввода;

• Сортировка по алфавиту после нажатия этой кнопки записи сортируются по алфавиту фамилий;

• Вывести данные результаты выводятся в таблицу ниже и записываются в текстовый файл.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Button2 : TButton ;

Button3 : TButton ;

//Процедура-обработчик кнопки Запомнить данные //Процедура-обработчик кнопки Вывести данные //Процедура-обработчик кнопки Сортировать по алфавиту //Процедура инициализации формы procedure FormCreate ( Sender : TObject ) ;

private { private declarations } public { public declarations } //объявление записи адреса студента house, apartment : integer ;

//объявление записи сведений о студенте residence : adress ;

var Form1 : TForm1 ;

//массив переменных типа студент //переменная для подсчета количества студентов i : integer ;

implementation { TForm1 } //процедура инициализации формы procedure TForm1. FormCreate ( Sender : TObject ) ;

begin i : = 0 ; //количество студентов вначале равно end ;

//процедура работы кнопки Запомнить данные procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

var sum, j : integer ;

begin //чтение данных с формы //расчет среднего балла студента //очищение полей ввода для следующих данных end ;

//процедура работы кнопки Вывести данные procedure TForm1. B u t t o n 2 C l i c k ( Sender : TObject ) ;

var begin //количество строк в таблице StringGrid будет на 1 больше, //чем количество студентов (плюс 1 строка для шапки) //вывод шапки таблицы //вывод сведений о студентах в j-ю строку //вывод результатов в текстовый файл assignfile ( f, ’ g :\ student. txt ’ ) ;

begin closefile ( f );

end ;

//процедура работы кнопки Сортировать по алфавиту procedure TForm1. B u t t o n 3 C l i c k ( Sender : TObject ) ;

var j, k : integer ;

f : t e x t f i l e ; //временная переменная для сортировки begin end ;

initialization {$I unit1.lrs} end.

При запуске программы и вводе сведений окно формы выглядит, как на рис. 8.5.

Когда запись введена, следует щёлкнуть по кнопке Запомнить данные, при этом поля ввода очищаются для ввода следующей записи. После щелчка по кнопке Вывести данные таблица заполняется введёнными сведениями (рис. 8.6).

Рис. 8.5. Окно формы ввода сведений о студенте Рис. 8.6. Окно формы вывода сведений о студентах 8.3. Задачи для самостоятельного решения по теме Строки Рис. 8.7. Окно формы после сортировки записей по алфавиту фамилии После щелчка по кнопке Сортировать по алфавиту нужно повторно щелкнуть по кнопке Вывести данные, чтобы увидеть отсортированный список (рисунок 8.7).

8.3 Задачи для самостоятельного решения по теме Дана строка текста. Слова в тексте друг от друга отделяются одним пробелом.

Выполнить со строкой заданные действия:

1) Посчитать количество запятых в строке.

2) Заменить в строке все цифры на пробел. Вывести количество замен.

3) Посчитать в строке количество цифр.

4) Удалить из строки все запятые.

5) Посчитать в строке количество слов.

6) Удалить из строки все слова, начинающиеся на букву о.

7) После каждого пробела вставить символ *.

8) Найти в строке самое длинное слово.

9) Перед каждым пробелом вставить пробел и символ +.

10) Посчитать сумму всех чисел, которые встречаются в строке.

11) Посчитать в строке количество слов, начинающихся на Ав.

12) Заменить в строке двойные пробелы на одинарный пробел. Вывести количество замен.

13) Вставить после каждого слова запятую.

14) После каждого слова вставить символ ;.

15) Посчитать в строке количество символов : и ;.

16) Удалить из строки все цифры.

17) Посчитать в строке количество слов, заканчивающихся символами ая.

18) Найти в строке самое короткое слово.

19) Вставить после каждого слова, заканчивающегося на букву о слово 20) Удалить из строки все слова, состоящие из пяти букв.

21) Найти в строке количество слов, начинающихся на букву а и заканчивающихся буквой т.

22) Удалить из строки втрое, третье и пятое слова.

23) Перед каждой цифрой вставить символ №.

24) Посчитать в строке количество гласных букв.

25) Удалить из строки все слова, начинающиеся и заканчивающиеся на о.

8.4 Задачи для самостоятельного решения по теме Все таблицы должны содержать не менее десяти записей.

1) Создать структуру с данными по таблице 8.1:

Добавить и вычислить в структуре поле Средний прирост. Определить количество городов с отрицательным приростом в 2003 году. Упорядочить записи по возрастанию среднего прироста.

2) Создать структуру с данными по таблице 8.1. Добавить и вычислить в структуре поле Минимальный прирост. Определить количество городов с приростом в 2003 году более 2 тыс. чел. Упорядочить записи по алфавиту названия городов.

3) Создать структуру с данными по таблице 8.2:

8.4. Задачи для самостоятельного решения по теме Записи Добавить и вычислить в структуре поле Цена со скидкой, вводя процент скидки с формы. Найти общее количество игрушек с фабрики Игрушка.

Упорядочить записи по убыванию поля Цена.

4) Создать структуру с данными по таблице 8.2. Добавить и вычислить в структуре поле Сумма продажи. Найти количество названий игрушек, у которых цена меньше общей средней цены всех игрушек. Упорядочить записи по названию игрушек.

5) Создать структуру с данными по таблице 8.3:

Добавить и вычислить в структуре поле Возраст, вводя текущую дату с формы. Определить количество школьников с именем Сергей. Упорядочить записи по номеру школы.

6) Создать структуру с данными по таблице 8.3. Добавить и вычислить в структуре поле Год обучения, убрав из названия класса букву. Найти количество учеников девятых классов. Упорядочить записи по алфавиту фамилии.

7) Создать структуру с данными по таблице 8.4:

Добавить и вычислить в структуре поле Выручка. Найти среднюю цену принтеров. Упорядочить записи по возрастанию поля Цена.

8) Создать структуру с данными по таблице 8.4. Добавить и вычислить в структуре поле Среднее количество. Найти среднее количество принтеров в каждом месяце. Упорядочить записи по названию принтера.

9) Создать структуру с данными по таблице 8.4. Добавить и вычислить в структуре поле Общее количество. Найти общее количество проданных принтеров в каждом месяце. Упорядочить записи по возрастанию поля Общее количество.

10) Создать структуру с данными по таблице 8.4. Добавить и вычислить в структуре поле Цена со скидкой, вводя процент скидки с формы. НайГлава 8. Работа со строками и записями ти количество принтеров с ценой более 15 000 рублей. Упорядочить записи по убыванию цены.

11) Создать структуру с данными по таблице 8.5:

Добавить и вычислить в структуре поле Премия, рассчитав её по следующему принципу: 20 % от оклада, если стаж более 10 лет, в противном случае 10 %. Найти количество сотрудников со стажем более 10 лет. Упорядочить записи по должности.

12) Создать структуру с данными по таблице 8.5. Добавить и вычислить в структуре поле Возраст, текущую дату вводить с формы. Найти средний оклад всех сотрудников. Упорядочить записи по ФИО.

13) Создать структуру с данными по таблице 8.5. Добавить и вычислить в структуре поле Возраст, текущую дату вводить с формы. Определить количество молодых специалистов (моложе 25 лет). Упорядочить записи по возрастанию оклада.

14) Создать структуру с данными по таблице 8.6:

Добавить и вычислить в структуре поле Среднее количество. Найти общее количество путёвок в каждом месяце. Упорядочить записи по месту 15) Создать структуру с данными по таблице 8.6. Добавить и вычислить в структуре поле Доход от путёвок. Найти среднюю цену путёвки. Упорядочить записи по возрастанию цены.

16) Создать структуру с данными по таблице 8.7:

Добавить и вычислить в структуре поле Зарплата, рассчитав её по следующему принципу: к окладу прибавить 15 % премии от размера оклада.

Упорядочить записи по ФИО.

17) Создать структуру с данными по таблице 8.7. Добавить и вычислить в структуре поле Возраст, текущую дату вводить с формы. Определить количество мужчин и женщин. Упорядочить записи по должности.

18) Создать структуру с данными по таблице 8.8:

Добавить и вычислить в структуре поле Активность по следующему принципу: если количество статей более 5, то в поле записать пробел, в противном случае фразу Работать лучше. Упорядочить записи по фамилии.

19) Создать структуру с данными по таблице 8.8. Удалить сотрудника с фамилией, которая вводится с формы. Определить количество доцентов. Упорядочить записи по должности.

20) Создать структуру с данными по таблице 8.9:

Добавить и вычислить в структуре поле Стоимость тиража. Найти общий тираж книг 2005 года. Упорядочить записи по автору.

21) Создать структуру с данными по таблице 8.9. Удалить все записи книг тиража 2000 года. Найти среднюю цену книг типографии КП. Упорядочить записи по году издания.

22) Создать структуру с данными по таблице 8.10:

Добавить и вычислить в структуре поле Стоимость звонка. Найти общую стоимость звонков в город, вводимый по запросу. Упорядочить записи по ФИО абонента.

23) Создать структуру с данными по таблице 8.10. Удалить все записи звонков с номерами, начинающимися с цифры 3. Упорядочить записи по названию 24) Создать структуру с данными по таблице 8.11:

Добавить и вычислить в структуре поле Гарантийное обслуживание по следующему принципу: записать фразу 1 год, если гарантийный срок более 3 лет, в противном случае фразу нет обслуживания. Найти общее количество всех приборов. Упорядочить записи по названию прибора.

25) Создать структуру с данными по таблице 8.11. Удалить все записи с гарантийным сроков менее 6 месяцев. Упорядочить записи по дате выпуска.

Глава Объектно-ориентированное программирование Эта глава посвящена изучению объектно-ориентированного программирования (ООП). ООП это методика разработки программ, в основе которой лежит понятие объекта, как некоторой структуры, описывающей объект реального мира, его поведение и взаимодействие с другими объектами.

9.1 Основные понятия Основой объектно-ориентированного программирования является объект.

Объект состоит из трёх основных частей:

1) Имя (например, автомобиль);

2) Состояние, или переменные состояния (например, марка автомобиля, цвет, масса, число мест и т. д.);

3) Методы, или операции, которые выполняют некоторые действия над объектами и определяют, как объект взаимодействует с окружающим миром.

Для работы с объектами во FreePascal введено понятие класса. Класс сложная структура, включающая в себя описание данных, процедуры и функции, которые могут быть выполнены над объектом.

Классом называется составной тип данных, членами (элементами) которого являются функции и переменные (поля). В основу понятия класс положен тот факт, что "над объектами можно совершать различные операции". Свойства объектов описываются с помощью переменных (полей) классов, а действия над объектами описываются с помощью подпрограмм, которые называются методами класса. Объекты называются экземплярами класса.

Объектно-ориентированное программирование (ООП) представляет собой технологию разработки программ с использованием объектов. В объектно-ориентированных языках есть три основных понятия: инкапсуляция, наследование и полиморфизм. Инкапсуляцией называется объединение в классе данных и подГлава 9. Объектно-ориентированное программирование программ для их обработки. Наследование это когда любой класс может быть порождён другим классом. Порождённый класс (наследник) автоматически наследует все поля, методы, свойства и события. Полиморфизм позволяет использовать одинаковые имена для методов, входящих в различные классы Для объявления класса используется конструкция:

type private protected public published end ;

В качестве имени класса можно использовать любой допустимый в FreePascal идентификатор. Имя класса родителя имя класса, наследником которого является данный класс, это необязательный параметр, если он не указывается, то это означает, что данный класс является наследником общего из предопределённого класса TObject.

Структуры отличаются от классов тем, что поля структуры доступны всегда.

При использовании классов могут быть члены, доступные везде публичные (описатель public), и приватные (описатель private), доступ к которым возможен только с помощью публичных методов. Это также относится и к методам класса.

Поля, свойства и методы секции public не имеют ограничений на видимость.

Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него. При обращении к публичным полям вне класса используется оператор. (точка).

Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и в функциях, содержащихся в том же модуле, что и описываемый класс. Это позволяет полностью скрыть детали внутренней реализации класса. Вызов приватных методов осуществляется из публичных.

Публикуемый (published ) это раздел, содержащий свойства, которые пользователь может устанавливать на этапе проектирования и которые доступны для редактирования в инспекторе объектов.

Защищенный (protected ) это раздел, содержащий поля и методы, которые доступны внутри класса, а также любым его классам-потомкам, в том числе и в других модулях.

Поля и методы, описанные до указания имени секции, являются публичными (public).

При программировании с использованием классов, программист должен решить, какие члены и методы должны быть объявлены публичными, а какие приватными. Общим принципом является следующее: Чем меньше публичных данных о классе используется в программе, тем лучше. Уменьшение количества публичных членов и методов позволит минимизировать количество ошибок.

Поля могут быть любого типа, в том числе и классами. Объявление полей осуществляется так же, как и объявление обычных переменных:

поле1 : тип_данных ;

поле2 : тип_данных ;

...

Методы в классе объявляются так же, как и обычные подпрограммы:

function метод1 ( список параметров ) : тип результата ;

procedure метод2 ( список параметров ) ;

Описание процедур и функций, реализующих методы, помещается после слова implementation того модуля, где объявлен класс, и выглядит так:

function имя_класса.метод1 ( список параметров ) : тип результата ;

begin end ;

procedure имя_класса.метод2 ( список параметров ) ;

begin end ;

Объявление переменной типа class называется созданием (инициализацией) объекта (экземпляра класса). Экземпляр класса объявляется в блоке описания переменных:

var имя_переменной : имя_класса ;

После описания переменной в программе можно обращаться к полям и методам класса аналогично обращению к полям структуры, используя оператор..

Например:

имя_переменной.поле1:=выражение ;

имя_переменной.метод1 ( список параметров ) ;

...

Также можно использовать оператор With:

With имя_переменной do begin поле1:=выражение ;

метод1 ( список параметров ) ;

end ;

В Free Pascal имеется большое количество классов, с помощью которых описывается форма приложения и её компоненты (кнопки, поля, флажки и т. п.).

В процессе конструирования формы в текст программы автоматически добавляются программные объекты. Например, при добавлении на форму компонента формируется описание класса для этого компонента, а при создании подпрограмм обработки событий в описание класса добавляется объявление методов.

Рассмотрим это на примере проекта с формой, на которой есть кнопка Button1.

unit Unit1 ;

interface uses Dialogs, StdCtrls ;

type { TForm1 } //объявление класса формы TForm TForm1 = c l a s s (TForm) //объявление компонента кнопки Button Button1 : TButton ;

//объявление метода обработки события щелчка по кнопке Button procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

var //описание переменной класса формы TForm Form1 : TForm1 ;

implementation { TForm1 } //описание метода обработки события - щелчка по кнопке Button procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

begin //Текст процедуры обработки события end ;

initialization {$I unit1.lrs} end.

Во Free Pascal класс (объект) это динамическая структура. В отличие от статической она содержит не сами данные, а ссылку на них. Поэтому программист должен сам позаботиться о выделении памяти для этих данных.

Конструктор это специальный метод, создающий и инициализирующий объект. Объявление конструктора имеет вид:

Описывают конструктор так же, как и другие методы, после ключевого слова implemention того модуля, в котором объявлен класс.

begin поле1:=выражение1 ;

поле2:=выражение2 ;

...

end ;

В результате работы конструктора инициализируются все поля класса, при этом порядковым типам в качестве начальных значений задаётся 0, а строки задаются пустыми.

Деструктор это специальный метод, уничтожающий объект и освобождающий занимаемую им память. Объявляется деструктор следующим образом:

Если в программе какой-либо объект больше не используется, то оператор имя_переменной_типа_класс. f r e e ;

с помощью метода free вызывает деструктор и освобождает память, занимаемую полями объекта имя_переменной_типа_класс.

Рассмотрим всё описанное на примере класса комплексное число 1. Назовём этот класс Tcomplex. В нём будут члены класса: x действительная часть комплексного числа и y мнимая часть комплексного числа. Также в классе будут методы:

• конструктор Create, который будет записывать в действительную и мнимую части значение 0;

• Modul() функция вычисления модуля комплексного числа;

• Argument() функция вычисления аргумента комплексного числа;

• ComplexToStr() функция, представляющая комплексное число в виде строки для вывода.

Создадим новый проект, на форму поместим кнопку Button1, два поля Edit1 и Edit2 для ввода действительной и мнимой частей, для вывода результатов разместим компонент Memo1. При щелчке по кнопке будет создаваться 1 С комплексными числами мы уже сталкивались в предыдущих главах, подробнее о работе с ними можно прочитать на странице http://kvant.mccme.ru./1982/03/komplesnye_chisla.htm.

экземпляр класса Комплексное число, затем будет вычисляться его модуль и аргумент. В компонент Memo1 выведем результаты: число в алгебраической форме, его аргумент и модуль. Ниже приведём текст модуля с комментариями, который демонстрирует работу с этим классом.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Edit1 : TEdit ;

Edit2 : TEdit ;

Label1 : TLabel ;

Label2 : TLabel ;

Label3 : TLabel ;

Memo1 : TMemo;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

type //описание класса - комплексное число TComplex = c l a s s private x : r e a l ; //действительная часть public function Modul ( ) : r e a l ; //метод вычисления модуля function Argument ( ) : r e a l ; //метод вычисления аргумента //метод записи комплексного числа в виде строки function ComplexToStr ( ) : String ;

var Form1 : TForm1 ;

//объявление переменной типа класс комплексное число implementation //описание конструктора begin x :=0; y :=0;

//Вызов родительского конструктора end ;

//Описание метода вычисления //модуля комплексного числа.

function TComplex. Modul ( ) : r e a l ;

begin modul:= sqrt ( xx+yy ) ;

end ;

//Описание метода вычисления //аргумента комплексного числа.

function TComplex. Argument ( ) : r e a l ;

begin argument := arctan ( y/x ) 1 8 0 / p i ;

end ;

//Описание метода записи комплексного //числа в виде строки.

function TComplex. ComplexToStr ( ) : String ;

begin FloatTostrF (y, ffFixed,5,2)+ ’ i ’ FloatTostrF (y, ffFixed,5,2)+ ’ i ’ end ;

{Обработчик кнопки: создание экземпляра класса "Комплексное число } {вычисление его модуля и аргумента, вывод числа в алгебраической форме,} {его аргумента и модуля.} procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

Var S t r 1 : String ;

begin //создание объекта (экземпляра класса) типа комплексное число //ввод действительной и мнимой частей комплексного числа //вывод на форму в поле Memo1 построчно комплексного числа, //его модуля //и аргумента //уничтожение объекта end ;

initialization {$I unit1.lrs} end.

Результат работы программы приведён на рис. 9.1.

Рис. 9.1. Результаты работы программы работы с классом Комплексное число В этом примере был написан конструктор для класса комплексное число без параметров. В FreePascal можно писать конструктор с параметрами, который принимает входные значения и инициализирует поля класса этими значениями.

Перепишем предыдущий пример следующим образом. Действительную и мнимую часть будем считывать из полей ввода формы и передавать в конструктор для инициализации объекта типа комплексное число. Листинг программы приведён ниже.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Edit1 : TEdit ;

Edit2 : TEdit ;

Label1 : TLabel ;

Label2 : TLabel ;

Label3 : TLabel ;

Memo1 : TMemo;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

procedure Memo1Change ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

type TComplex = c l a s s private public //объявление конструктора function ComplexToStr ( ) : String ;

end ;

var Form1 : TForm1 ;

implementation //Конструктор, который получает в качестве //входных параметров два вещественных числа и записывает их //в действительную и мнимую часть комплексного числа begin end ;

function TComplex. Modul ( ) : r e a l ;

begin modul:= sqrt ( xx+yy ) ;

end ;

function TComplex. Argument ( ) : r e a l ;

begin argument := arctan ( y/x ) 1 8 0 / p i ;

end ;

function TComplex. ComplexToStr ( ) : String ;

begin i f y>=0 then FloatTostrF (y, ffFixed,5,2)+ ’ i ’ else FloatTostrF (y, ffFixed,5,2)+ ’ i ’ end ;

procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

Var begin S t r 1 := ’ Kompleksnoe c h i s l o ’+c h i s l o. ComplexToStr ( ) ;

end ;

initialization {$I unit1.lrs} end.

9.2 Инкапсуляция Инкапсуляция один из важнейших механизмов объектно-ориентированного программирования (наряду с наследованием и полиформизмом). Класс представляет собой единство трёх сущностей: полей, свойств и методов, что и представляет собой инкапсуляцию. Инкапсуляция позволяет создавать класс как нечто цеИнкапсуляция лостное, имеющее определённую функциональность. Например, класс TForm содержит в себе (инкапсулирует) всё необходимое, чтобы создать диалоговое окно.

Основная идея инкапсуляции защитить поля от несанкционированного доступа. Поэтому поля целесообразно объявлять в разделе private. Прямой доступ к полям объекта чтение и обновление их содержимого должны производиться посредством вызова соответствующих методов. В FreePascal для этого служат свойства класса.

Свойства это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write. Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Синтаксис объявления свойств следующий:

p r o p e t y имя_свойства : тип read имя_чтения write имя_записи Зарезервированное слово read описывает метод чтения свойств объекта, а слово write описывает метод записи свойств объекта. Имя_чтения и имя_записи соответственно имена методов, обеспечивающих чтение или запись свойства.

Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно часть write или read.

Рассмотрим следующий пример. Создадим класс многоугольник, задав ему имя TPolygon. Полями класса будут:

• K количество сторон многоугольника;

• p массив, в котором будут храниться длины сторон многоугольника Методами класса будут:

• конструктор Create, обнуляющий элементы массива p;

• Perimetr() функция вычисления периметра фигуры;

• Show() функция формирования сведений о фигуре (количество сторон • Set_Input() функция проверки исходных данных.

Расположим на форме кнопку и метку. При щелчке по кнопке появляется окно ввода количества сторон многоугольника. Если количество сторон введено корректно, то инициализируется объект Многоугольник с количеством сторон, равным введённому, в противном случае количество сторон многоугольника по умолчанию принимается равным 50. После этого вычисляется периметр фигуры, и результаты выводятся на форму в метке Label1.

Ниже приведён листинг программы с комментариями, результаты работы программы можно увидеть на рис. 9.2.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses 380 Глава 9. Объектно-ориентированное программирование Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Label1 : TLabel ;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

type //объявление класса многоугольник TPolygon TPolygon = c l a s s //Закрытые поля.

Private K : integer ;

//открытые методы Public function P e r i m e t r ( ) : r e a l ; //метод вычисления периметра function Show ( ) : String ;

//защищенные методы Protected procedure Set_Input (m: integer ) ; //процедура проверки данных Published //Объявление свойства n.

//Свойство n оперирует полем K.

//В описании свойства после слова read //стоит имя поля - K. Это значит, что //функция чтения отсутствует и пользователь //может читать непосредственно значение поля.

//Ссылка на функцию Set_Input после //зарезервированного слова write означает, //что с помощью этой функции в поле K будут //записываться новые значения.

Property n : integer read K write Set_Input ;

end ;

var Form1 : TForm1 ;

//объявление переменной типа класс многоугольник implementation //Описание конструктора.

var i : integer ;

begin K: = 5 0 ; //Присваивание начальных значений полям.

//выделение памяти под массив p SetLength ( p,K) ;

end ;

//Функция вычисления периметра.

function TPolygon. P e r i m e t r ( ) : r e a l ;

var Sum: r e a l ; i : integer ;

begin end ;

//Метод формирования сведений о фигуре.

function TPolygon. Show ( ) : String ;

begin Show:= ’ Многоугольниксколичествомсторон ’+ end ;

//Метод записи данных в поле K.

procedure TPolygon. Set_Input (m: integer ) ;

begin //Если введённое значение положительное число, //то записать его в поле K, //иначе вернуться к начальному значению.

end ;

{TForm1 } //Обработка события.

procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

var i, m: integer ;

begin //ввод количества сторон многоугольника s := InputBox ( ’ Ввод ’, ’ Введитеколичествосторонмногоугольника ’, ’6 ’ );

382 Глава 9. Объектно-ориентированное программирование F i g u r e := TPolygon. C r e a t e ; //инициализация объекта begin //метод проверки исходных данных //формирование массива случайных чисел //обращение к методу вычисления периметра Label1. Caption := s ; //вывод результатов в окно формы end ;

initialization {$I unit1.lrs} end.

Рис. 9.2. Результат работы программы с классом многоугольник 9.3 Наследование и полиморфизм Второй основополагающей составляющей объектно-ориентированного программирования является наследование. Смысл наследования заключается в следующем: если нужно создать новый класс, лишь немного отличающийся от старого, то нет необходимости в переписывании заново уже существующих полей и методов. В этом случае объявляется новый класс, который является наследником уже имеющегося, и к нему добавляются новые поля, методы и свойства.

При создании новый класс является наследником членов ранее определённого базового класса (родителя). Класс-наследник является производным от базового, причём он сам может выступать в качестве базового класса для вновь создаваемых классов.

В Object Pascal все классы являются потомками класса TObject. Поэтому если вы создаёте дочерний класс непосредственно от класса TObject, то в определении его можно не упоминать.

Производный класс наследует от класса-предка поля и методы. Если имеет место совпадение имён методов, то говорят, что они перекрываются. В зависимости от того, какие действия происходят при вызове, методы делятся на следующие группы:

• статические методы;

• виртуальные методы;

• динамические методы.

По умолчанию все методы статические. Эти методы полностью перекрываются в классах-потомках при их переопределении. При этом можно полностью изменить объявление метода. Если обращаться к такому методу у объекта базового класса, то будет работать метод класса-родителя. Если обращаться к методу у производного класса, то будет работать новый метод.

Виртуальные и динамические методы имеют в базовом и производном классе те же имена и типы. В классах-наследниках эти методы перегружены. В зависимости от того, с каким классом работают, соответственно и вызывается метод этого класса.

Основная разница между виртуальными и динамическими методами в способе их вызова. Информация о виртуальных методах хранится в таблице виртуальных методов VMT. В VMT хранятся виртуальные методы данного класса и всех его предков. При создании потомка класса вся VMT предка переносится в потомок и там к ней добавляются новые методы. Поиск нужного метода занимает мало времени, так как класс имеет всю информацию о своих виртуальных методах. Динамические методы не дублируются в таблице динамических методов DMT потомка. DMT класса содержит только методы, объявленные в этом классе. При вызове динамического метода сначала осуществляется поиск в DMT данного класса, и если метод не найден то в DMT предка класса и т. д. Таким образом использование виртуальных методов требует больший расход памяти изза необходимости хранения массивных VMT всех классов, зато они вызываются быстрее.

Изменяя алгоритм того или иного метода в производных классах, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перегрузить его в потомке, т. е. объявить в наследнике одноимённый метод и реализовать в нём нужные действия.

В результате в объекте-родителе и объекте-потомке будут действовать два одноимённых метода, имеющих разную алгоритмическую основу. Это называется полиморфизмом объектов.

Виртуальные и динамические методы объявляются так же, как и статические, только в конце описания метода добавляются служебные слова virtual или dynamic:

type имя_класса_родителя = c l a s s end ;

Чтобы перегрузить в классе-наследнике виртуальный метод, нужно после его объявления написать ключевое слово override:

type имя_класса_наследника=c l a s s ( имя_класса_родителя ) end ;

Рассмотрим наследование в классах на следующем примере. Создадим базовый класс Ttriangle (треугольник ) с полями классакоординаты вершин треугольника. В классе будут следующие методы:

• Proverka() метод проверки существования треугольника (если 3 точки лежат на одной прямой, то треугольник не существует);

• Perimetr() метод вычисления периметра треугольника;

• Square() метод вычисления площади;

• Методы вычисления длин сторон a(), b(), c();

• Set_Tr() метод получения координат;

• Show() метод формирования сведений о треугольнике.

На основе этого класса создадим производный класс R_TTriangle (равносторонний треугольник), который наследует все поля и методы базового класса, но методы проверки и формирования сведений о фигуре перегружаются по другому алгоритму.

На форме поместим метку, кнопку и по 6 компонент типа TEdit для ввода координат вершин для двух треугольников. После щелчка по кнопке создаются два объекта типа треугольник и равносторонний треугольник, вычисляются периметр и площадь каждого треугольника, и результаты выводятся ниже в компоненты Label15 и Label16. Далее приведён листинг программы с комментариями.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ; //кнопка Расчёт //массивы x1, y1 - координаты вершин //первого треугольника (частный случай) //массивы x1, y1 - координаты вершин //второго треугольника (равностороннего) Edit1 : T e d i t ; //для ввода координаты x1[1] Edit10 : TEdit ; //для ввода координаты y2[2] Edit11 : TEdit ; //для ввода координаты x2[3] Edit12 : TEdit ; //для ввода координаты y2[3] Edit2 : TEdit ; //для ввода координаты y1[1] Edit3 : TEdit ; //для ввода координаты x2[2] Edit4 : TEdit ; //для ввода координаты y1[2] Edit5 : TEdit ; //для ввода координаты x1[3] Edit6 : TEdit ; //для ввода координаты y1[3] Edit7 : TEdit ; //для ввода координаты x2[1] Edit8 : TEdit ; //для ввода координаты y2[1] Edit9 : TEdit ; //для ввода координаты x2[2] Label1 : TLabel ;

Label10 : TLabel ;

Label11 : TLabel ;

Label12 : TLabel ;

Label13 : TLabel ;

Label14 : TLabel ;

Label15 : TLabel ;

Label16 : TLabel ;

Label2 : TLabel ;

Label3 : TLabel ;

Label4 : TLabel ;

Label5 : TLabel ;

Label6 : TLabel ;

Label7 : TLabel ;

Label8 : TLabel ;

Label9 : TLabel ;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

//объявление базового класса треугольник type Private 386 Глава 9. Объектно-ориентированное программирование //массивы, в которых хранятся координаты вершин треугольника Public //метод получения исходных данных procedure Set_Tr ( a, b : array of r e a l ) ;

//Методы вычисления сторон треугольника.

function a ( ) : r e a l ;

function b ( ) : r e a l ;

function c ( ) : r e a l ;

//Виртуальный метод проверки существования //треугольника, который будет перегружен //в производном классе.

function P e r i m e t r ( ) : r e a l ; //метод вычисления периметра function Square ( ) : r e a l ; //метод вычисления площади //виртуальный метод формирования сведений о треугольнике end ;

//объявление производного класса равносторонний треугольник type R_TTriangle=c l a s s ( T T r i a n g l e ) public //перегружаемые методы проверки, что треугольник является //равносторонним, //и формирования сведений о треугольнике function Proverka ( ) : boolean ; o v e r r i d e ;

end ;

var Form1 : TForm1 ;

//объявление переменной типа класс треугольник //объявление переменной типа класс равносторонний треугольник implementation //Конструктор, который обнуляет //массивы координат.

c o n s t r u c t o r TTriangle. Create ;

var i : integer ;

begin begin end ;

//Метод получения координат вершин.

procedure T T r i a n g l e. Set_Tr ( a, b : array of r e a l ) ;

var i : integer ;

begin begin end ;

//Методы вычисления сторон треугольника a, b, c begin end ;

begin end ;

begin end ;

//Метод вычисления периметра треугольника.

begin end ;

//Функции вычисления площади треугольника.

begin end ;

//Метод проверки существования треугольника:

//если в уравнение прямой, проходящей через //две точки подставить координаты третьей точки //и при этом получится равенство, значит три //точки лежат на одной прямой и построение //треугольника невозможно.

function T T r i a n g l e. Proverka ( ) : boolean ;

begin end ;

//метод формирования строки - сведений о треугольнике function T T r i a n g l e. Show ( ) : string ;

begin //если треугольник существует, //то формируем строку сведений о треугольнике i f Proverka ( ) then chr (13)+ ’ b= ’+FloatToStrF ( b ( ), f f F i x e d, 5, 2 ) + chr (13)+ end ;

//Метод проверки существования //равностороннего треугольника.

function R_TTriangle. Proverka ( ) : boolean ;

begin Proverka := true end ;

//Метод формирования сведений //о равностороннем треугольнике.

function R_TTriangle. Show ( ) : string ;

begin //если треугольник равносторонний, //то формируем строку сведений i f Proverka ()= true then end ;

{ TForm1 } //массивы x1, y1 - координаты треугольника //массивы x2, y2 - координаты равностороннего треугольника s : string ;

begin //чтение координат треугольников из полей ввода диалогового окна //инициализация объекта класса треугольник //инициализация объекта класса равносторонний треугольник //вызов методов формирования сведений и вывод строки на форму Label15. Caption := S ;

Label16. Caption := S ;

//уничтожение объектов end ;

initialization {$I unit1.lrs} end.

Результаты работы программы представлены на рис. 9.3.

Абстрактный метод это виртуальный или динамический метод, реализация которого не определена в том классе, где он объявлен. Предполагается, что этот метод будет перегружен в классе-наследнике. Вызывают метод только в тех классах, где он перезагружен. Абстрактный метод объявляется при помощи служебного слова

Abstract

после слов virtual или dynamic, например:

метод1 ; virtual ; abstract ;

Рис. 9.3. Окно формы работы программы расчёта параметров треугольников Рассмотрим следующий пример. Создадим базовый класс TFigure (фигура).

На основании этого класса можно построить производные классы для реальных фигур (окружность, четырёхугольник и т. д.). В нашем примере рассмотрим два класса-наследника TCircle (окружность) и TRectangle (прямоугольник).

На форму поместим кнопку. При щелчке по кнопке инициализируются 2 объекта типа окружность и прямоугольник, рассчитываются параметры фигур:

периметр (длина окружности) и площадь. Результаты выводятся в компоненты Label1 и label2. Ниже приведён листинг программы.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Label1 : TLabel ;

Label2 : TLabel ;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

//объявление базового класса фигура type TFigure=c l a s s private n : integer ; //количество сторон фигуры p : array of r e a l ; //массив длин сторон фигуры public //абстрактный конструктор //в каждом производном классе будет перегружаться

c o n s t r u c t o r Create ; virtual ; abstract ;

function P e r i m e t r ( ) : r e a l ; //метод вычисления периметра //абстрактный метод вычисления площади, в каждом //производном классе будет перегружаться реальным методом

function Square ( ) : r e a l ; virtual ; abstract ;

//абстрактный метод формирования сведений о фигуре //в каждом производном классе будет перегружаться

function Show ( ) : string ; virtual ; abstract ;

end ;

//объявление производного класса окружность type public end ;

//объявление производного класса прямоугольник type TRectangle=c l a s s ( TFigure ) public end ;

var Form1 : TForm1 ;

F i g u r a 1 : T c i r c l e ; //объект типа класса окружность F i g u r a 2 : TRectangle ; //объект типа класса прямоугольник implementation //Описание метода вычисления 392 Глава 9. Объектно-ориентированное программирование //периметра для базового класса.

function TFigure. P e r i m e t r ( ) : r e a l ;

var begin end ;

//описание конструктора в классе окружность //перезагрузка абстрактного родительского конструктора c o n s t r u c t o r TCircle. Create ;

begin //количество сторон для окружности n:=1;

//выделяем память под 1 элемент массива p [ 0 ] : = 5 ; //сторона - радиус окружности end ;

//Перезагрузка метода вычисления периметра.

begin P e r i m e t r :=2 Pi p [ 0 ] ; //вычисление длины окружности end ;

//Перезагрузка метода вычисления площади function T C i r c l e. Square ( ) : r e a l ;

begin end ;

//Описание метода формирования //строки сведений об окружности.

//Перезагрузка родительского //абстрактного метода.

function T C i r c l e. Show ( ) : string ;

begin Show:= ’ C i r c l e ’+chr (13)+ ’ r= ’+ end ;

//Описание конструктора в классе прямоугольник.

//перезагрузка абстрактного //родительского конструктора.

begin n : = 2 ; //количество сторон - две SetLength ( p, n ) ; //выделение памяти под два элемента end ;

//перезагрузка абстрактного родительского метода //вычисления площади фигуры function TRectangle. Square ( ) : r e a l ;

begin end ;

//Описание метода формирования //сведений о прямоугольнике.

//перезагрузка родительского //абстрактного метода.

function TRectangle. Show ( ) : string ;

begin FloatToStr (p [1])+ end ;

{ TForm1 } procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

var s : string ;

begin //инициализация объекта типа окружность //инициализация объекта типа прямоугольник //формирование сведений о фигурах и вывод результатов на форму end ;

initialization {$I unit1.lrs} end.

9.4 Перегрузка операций В FreePascal можно перегрузить не только функции, но и операции. Например, можно запрограммировать, чтобы операция * при работе с матрицами осуществляла умножение матриц, а при работе с комплексными числами умножение комплексных чисел.

Для этого в программе нужно написать специальную функцию метод. Объявление метода перегрузки записывается после объявления класса и выглядит так:

operator symbols ( параметры: тип) имя_переменной_результата: тип ;

где • operator служебное слово;

• symbols символ перегружаемой операции;

• параметры имена переменных, участвующих в перегрузке оператора.

Описывают метод перегрузки так же, как и другие методы, после ключевого слова implemention того модуля, в котором объявлен класс.

Рассмотрим несколько примеров.

ЗАДАЧА 9.1. Создать класс работы с комплексными числами, в котором перегрузить операции сложения и вычитания.

На форме разместим четыре компонента типа TEdit для ввода действительной и мнимой частей двух комплексных чисел. Также создадим компонент типа TMemo для вывода результатов и кнопку. При щелчке по кнопке создаются четыре объекта типа комплексное число. Первое и второе числа инициализируются введенными данными. Третье формируется как результат сложения первых двух, а четвёртое как разность этих же чисел. Текст программы с комментариями приведён ниже, на рис. 9.4 показано окно работы программы.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

//для ввода действительной части первого числа Edit1 : TEdit ;

//для ввода мнимой части первого числа Edit2 : TEdit ;

//для ввода действительной части второго числа Edit3 : TEdit ;

//для ввода мнимой части второго числа Edit4 : TEdit ;

Label1 : TLabel ;

Label2 : TLabel ;

Label3 : TLabel ;

Label4 : TLabel ;

Label5 : TLabel ;

Label6 : TLabel ;

Memo1 : TMemo; //поле для вывода результатов procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

//объявление класса комплексное число type TComplex = c l a s s private x : r e a l ; //действительная часть public function Modul ( ) : r e a l ;

function Argument ( ) : r e a l ;

function ComplexToStr ( ) : String ;

end ;

//объявление метода перегрузки //оператора + с комплексными числами operator +(const a, b : TComplex ) r : TComplex ;

//объявление метода перегрузки //оператора с комплексными числами operator (const a, b : TComplex ) r : TComplex ;

var Form1 : TForm1 ;

//объявление переменных типа комплексное число implementation 396 Глава 9. Объектно-ориентированное программирование //Описание конструктора.

begin end ;

function TComplex. Modul ( ) : r e a l ;

begin end ;

function TComplex. Argument ( ) : r e a l ;

begin end ;

//Метода перегрузки оператора +.

//переменные a и b - комплексные числа, //которые складываются, //r - результирующее комплексное число operator +(const a, b : TComplex ) r : TComplex ;

begin r :=TComplex. C r e a t e ; //инициализация объекта //Действительная часть нового комплексного //числа формируется как результат сложения //действительных частей первого и второго //операндов. Мнимая часть нового комплексного //числа формируется как результат сложения //мнимых частей первого и второго операндов.

//Операнды - переменные типа комплексное //число, передаваемые в метод.

end ;

//метод перегрузки оператора operator (const a, b : TComplex ) r : TComplex ;

begin end ;

function TComplex. ComplexToStr ( ) : String ;

//Действительная часть нового комплексного //числа формируется как разность действительных //частей первого и второго операндов. Мнимая //часть нового комплексного числа формируется //как разность мнимых частей первого и второго //комплексное число, передаваемые в метод.

begin ComplexToStr := FloatToStrF ( x, f f F i x e d, 5, 2 ) + ’+ ’ + FloatTostrF (y, ffFixed,5,2)+ ’ i ’ FloatTostrF (y, ffFixed,5,2)+ ’ i ’ end ;

procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

Var S t r 1 : String ;

begin //инициализация объектов //чтение действительной и мнимой частей двух исходных //комплексных чисел с формы //для сложения двух комплексных чисел можно использовать //операцию +, так как она перегружена для этого класса //для вычитания двух комплексных чисел можно использовать //операцию, так как она перегружена для этого класса end ;

initialization {$I unit1.lrs} end.

ЗАДАЧА 9.2. Создать класс работы с квадратными матрицами, в котором перегрузить операции сложения и умножения. В классе создать метод проверки, что матрица является единичной.

В классе созданы по два метода перегрузки операций сложения и умножения. В первом случае складываются и перемножаются две матрицы. Во втором случае к матрице прибавляется вещественное число, и матрица умножается на вещественное число. На форму поместим кнопку и 8 компонент типа TLabel для вывода результатов. При щелчке по кнопке создаются 6 объектов типа матрица, все они заполняются случайными числами. Третья матрица затем рассчитывается как сумма первых двух. Четвёртая матрица результат умножения первой матрицы на вторую. Пятая матрица получается из первой путем добавления к ней числа 10, а шестая умножением первой матрицы на число 5. Первая и вторая матрицы также проверяются, не являются ли они единичными. Текст программы с комментариями приведён ниже, на рис. 9.5 показано окно работы программы.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

Label2 : TLabel ;

Label3 : TLabel ;

Label4 : TLabel ;

Label5 : TLabel ;

Label6 : TLabel ;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

procedure Memo1Change ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

//объявление класса матрица type private public //метод формирования строки, выводящей элементы матрицы function MatrixToStr ( ) : String ;

//функции проверки, является ли матрица единичной function Pr_Edin ( ) : boolean ;

end ;

//объявление метода перегрузки операции + с //классом матрица //в данном случае складываются две матрицы operator +(const a, b : TMatrix ) r : Tmatrix ;

//объявление метода перегрузки операции + с //классом матрица //в данном случае к матрице добавляется вещественное число operator +(const a : TMatrix ; b : r e a l ) r : TMatrix ;

//объявление метода перегрузки операции * //с классом матрица operator ( const a, b : TMatrix ) r : Tmatrix ;

//объявление метода перегрузки операции * с //классом матрица //в данном случае матрица умножается на вещественное число operator ( const a : TMatrix ; b : r e a l ) r : TMatrix ;

var Form1 : TForm1 ;

matr1 : TMatrix ;

matr2 : TMatrix ;

matr3 : TMatrix ;

matr4 : TMatrix ;

matr5 : TMatrix ;

matr6 : TMatrix ;

implementation //конструктор в классе матрица, который //заполняет матрицу случайными числами var i, j : integer ;

begin end ;

//Функции, проверяющая, //является ли матрица единичной.

function TMatrix. Pr_Edin ( ) : boolean ;

var i, j : integer ;

begin //предварительно решаем, что матрица единичная //если на главной диагонали элемент не //или вне главной диагонали элемент не 0, begin //то в этом случае матрица не является единичной end ;

//метод перегрузки оператора + сложение двух матриц operator +(const a, b : TMatrix ) r : TMatrix ;

var i, j : integer ;

begin //метод перегрузки оператора * перемножение двух матриц operator ( const a, b : TMatrix ) r : TMatrix ;

var i, j, k : integer ;

begin end ;

//метод перегрузки оператора + сложение матрицы и вещественного числа operator +(const a : TMatrix ; b : r e a l ) r : TMatrix ;

var i, j : integer ;

begin end ;

//метод перегрузки оператора * умножение матрицы на вещественное число operator ( const a : TMatrix ; b : r e a l ) r : TMatrix ;

var i, j : integer ;

begin end ;

//Метод формирования строки //с элементами матрицы.

function TMatrix. MatrixToStr ( ) : String ;

var begin s := ’ ’ ; //вначале строка пустая //добавление к s строки, которая представляет собой //элемент матрицы и пробел //формирование новой строки матрицы MatrixToStr := s ;

end ;

//Обработка кнопки Пуск:

//создание экземпляров класса Матрица, //вычисление результирующих матриц путём //сложения, умножения исходных матриц, //умножение матрица на число procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

Var S t r 1 : String ;

begin //Инициализация объектов:

//matr1, matr2 - исходные матрицы, //заполняемые случайными числами;

//matr3 - матрица, получаемая //сложением двух исходных матриц;

//matr4 - матрица, получаемая умножением //двух исходных матриц;

//matr5 - матрица, получаемая добавлением //к первой матрице числа 10;

//matr6 - матрица, получаемая умножением //первой матрицы на число 5.

matr1 := TMatrix. C r e a t e ;

matr2 := TMatrix. C r e a t e ;

matr3 := TMatrix. C r e a t e ;

matr4 := TMatrix. C r e a t e ;

matr5 := TMatrix. C r e a t e ;

matr6 := TMatrix. C r e a t e ;

//Вычисление матриц matr3, matr4, matr5, matr //с помощью перегрузки операторов.

matr3 := matr1+matr2 ;

matr4 := matr1 matr2 ;

matr5 := matr1 +10;

matr6 := matr1 5 ;

//Формирование строки вывода и её вывод //в метку Label1 матрицы matr1.

S t r 1 := ’ Matrix1 ’+chr (13)+ matr1. MatrixToStr ( ) ;

Label1. Caption := S t r 1 ;

//Проверка, является ли матрица matr1 единичной //и вывод соответствующего сообщения.

i f matr1. Pr_Edin()= true then Label5. Caption := S t r 1 ;

//Проверка, является ли матрица matr2 единичной //и вывод соответствующего сообщения.

i f matr2. Pr_Edin()= true then Label6. Caption := S t r 1 ;

S t r 1 := ’ Matrix2 ’+chr (13)+ matr2. MatrixToStr ( ) ;

Label2. Caption := S t r 1 ;

//вывод элементов матрицы matr3=matr1+matr S t r 1 := ’ Matrix1+Matrix2 ’+chr (13)+ matr3. MatrixToStr ( ) ;

Label3. Caption := S t r 1 ;

//вывод элементов матрицы matr4=matr1*matr S t r 1 := ’ Matrix1 Matrix2 ’+chr (13)+ matr4. MatrixToStr ( ) ;

Label4. Caption := S t r 1 ;

//вывод элементов матрицы matr5=matr1+ S t r 1 := ’ Matrix1+10 ’+chr (13)+ matr5. MatrixToStr ( ) ;

Label7. Caption := S t r 1 ;

//вывод элементов матрицы matr5=matr1* S t r 1 := ’ Matrix1 5 ’+chr (13)+ matr6. MatrixToStr ( ) ;

Label8. Caption := S t r 1 ;

end ;

initialization {$I unit1.lrs} end.

Рис. 9.5. Результаты работы программы задачи 9. ЗАДАЧА 9.3. Создать класс обыкновенная дробь, в котором перегрузить операции < и >.

На форму поместим четыре компонента TEdit для ввода числителей и знаменателей двух обыкновенных дробей и компонент Memo1 для вывода результатов.

Также разместим кнопку, при щелчке по которой инициализируются два объекта типа обыкновенная дробь, затем они сравниваются и результаты выводятся в Memo1. Ниже приведён листинг программы с комментариями, на рис. 9.6 показаны результаты работы программы.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : Tbutton ;

//поле для ввода числителя первой дроби //поле для ввода знаменателя первой дроби //поле для ввода числителя второй дроби //поле для ввода знаменателя второй дроби Label1 : TLabel ;

Label2 : TLabel ;

Label3 : TLabel ;

Label4 : TLabel ;

Memo1 : Tmemo ; //поле для вывода результатов procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

//объявление класса обыкновенная дробь type private public //метод формирования строки для вывода дроби function DrobToStr ( ) : String ;

end ;

//Метод перегрузки оператора < operator operator >(const a, b : TOb_Drob) r : boolean ;

var Form1 : Tform1 ;

//объявление переменных типа класса обыкновенная дробь d1, d2 : TOb_Drob ;

implementation //конструктор begin Ch:=a ; Zn:=b ;

end ;

//описание метода перегрузки оператора < сравнения //обыкновенных дробей operator (const a, b : TOb_Drob) r : boolean ;

begin end ;

//описание метода формирования строки //для вывода дроби на форму function TOb_Drob. DrobToStr ( ) : String ;

begin i f Zn0 then else end ;

procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

Var begin //чтение данных из полей ввода формы a:= S t r T o I n t ( Edit1. Text ) ; //числитель b:= S t r T o I n t ( Edit2. Text ) ; //значенатель //инициализация первой дроби //чтение данных из полей ввода формы //инициализация второй дроби //Формирование строки вывода и //добавление ее в поле Memo1.

//Вывод исходной дроби d1.

S t r 1 := ’ Drob1 ’+d1. DrobToStr ( ) ;

//Вывод исходной дроби d2.

S t r 1 := ’ Drob2 ’+d2. DrobToStr ( ) ;

//сравнение дробей с помощью перегрузки //операторов < и > и вывод сообщения.

i f d1Drob2 ’ end ;

initialization {$I unit1.lrs} end.

Рис. 9.6. Результаты работы программы задачи 9. 9.5 Задачи для самостоятельного решения 1) Создать класс комплексное число в алгебраической форме z = x + yi, поля класса действительная (x) и мнимая (y) части числа. Методы класса: вычисление корня комплексного числа, вывод комплексного числа. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение комплексных чисел.

408 Глава 9. Объектно-ориентированное программирование 2) Создать класс квадратная матрица, поля класса размерность и элементы матрицы. Методы класса: вывод матрицы. В классе предусмотреть методы перегрузки операций: сложение, вычитание, умножение матриц, проверку, является ли одна матрица обратной другой (A · A1 = E).

3) Создать класс вектор на плоскости, поля класса координаты вектора.

Методы класса: вычисление направляющих косинусов вектора, вывод всех характеристик вектора. В классе предусмотреть методы перегрузки операций: сложение, скалярное и векторное произведение векторов.

4) Создать класс обыкновенная дробь, поля класса числитель и знаменатель.

Методы класса: сокращение дроби, вывод дроби. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение 5) Создать класс квадрат, член класса длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре: периметр, площадь, диагональ. Создать производный класс куб, добавить в класс метод определения объёма фигуры, перегрузить методы расчёта площади и вывода сведений о фигуре.

6) Создать класс квадратная матрица, поля класса размерность и элементы матрицы. Методы класса: вычисление суммы всех элементов матрицы, вывод матрицы. В классе предусмотреть методы перегрузки операций: сложение, вычитание, умножение матриц, умножение матрицы на число.

7) Создать класс прямая, поля класса координаты двух точек (x1, y1) и (x2, y2). Методы класса: вывод уравнения прямой вида y = ax + b.

В классе предусмотреть методы перегрузки операций: проверка параллельности двух прямых, определение угла между двумя прямыми.

8) Создать класс комплексное число в тригонометрической форме a = = (cos + i sin ), поля класса модуль () и аргумент () числа. Методы класса: возведение числа в степень, вывод комплексного числа в алгебраической и тригонометрической формах. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение комплексных чисел.

9) Создать класс вектор на плоскости, поля класса координаты вектора.

Методы класса: вычисление длины вектора, вывод характеристик вектора.

В классе предусмотреть методы перегрузки операций: сложение, скалярное и векторное произведение векторов.

10) Создать класс обыкновенная дробь, поля класса числитель и знаменатель. Методы класса: определение обратной дроби, вывод дроби. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение дробей.

11) Создать класс квадратная матрица, поля класса размерность и элементы матрицы. Методы класса: проверки, является ли матрица верхнетреугольной или нижнетреугольной, вывод матрицы. В классе предусмотреть методы перегрузки операций: сложение, вычитание, умножение матриц, умножение матрицы на число.

12) Создать класс треугольник, члены класса длины трёх сторон. Предусмотреть в классе методы проверки существования треугольника, вычисления и вывода сведений о фигуре: длины сторон, углы, периметр, площадь.

Создать производный класс равнобедренный треугольник, предусмотреть в классе проверку, является ли треугольник равнобедренным.

13) Создать класс комплексное число в показательной форме a = ei, поля класса модуль () и аргумент () числа. Методы класса: вывод комплексного числа в алгебраической, тригонометрической и показательной формах. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение комплексных чисел.

14) Создать класс прямая, поля класса коэффициенты уравнения y = ax + b.

Методы класса: вывод уравнения прямой, определение точек пересечения с осями. В классе предусмотреть методы перегрузки операций: проверка перпендикулярности двух прямых, определение угла между двумя прямыми.

15) Создать класс квадратная матрица, поля класса размерность и элементы матрицы. Методы класса: проверки, является ли матрица диагональной или нулевой, вывод матрицы. В классе предусмотреть методы перегрузки операций: сложение, вычитание, умножение матриц, добавление к матрице 16) Создать класс треугольник, члены класса координаты трёх точек.

Предусмотреть в классе методы проверки существования треугольника, вычисления и вывода сведений о фигуре: длины сторон, углы, периметр, площадь. Создать производный класс прямоугольный треугольник, предусмотреть в классе проверку, является ли треугольник прямоугольным.

17) Создать класс комплексное число в тригонометрической форме a = = (cos + i sin ), поля класса модуль () и аргумент () числа. Методы класса: извлечение корня из числа, вывод комплексного числа в алгебраической и тригонометрической формах. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение комплексных чисел.

18) Создать класс обыкновенная дробь, поля класса числитель и знаменатель. Методы класса: возведение дроби в степень, вывод дроби. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение дробей.

19) Создать класс треугольник, члены класса длины трёх сторон. Предусмотреть в классе методы проверки существования треугольника, вычисления и вывода сведений о фигуре: длины сторон, углы, периметр, площадь. Создать производный класс равносторонний треугольник, предусмотреть в классе перегрузку метода проверки, является ли треугольник равносторонним.

20) Создать класс комплексное число в алгебраической форме z = x + yi, поля класса действительная (x) и мнимая (y) часть числа. Методы класса:

410 Глава 9. Объектно-ориентированное программирование вычисление модуля и аргумента комплексного числа, вывод комплексного числа. В классе предусмотреть методы перегрузки операций: сложение, вычитание комплексных чисел, проверка сопряжённости двух комплексных Создать класс окружность, член класса радиус R. Предусмотреть в классе методы вычисления и вывода сведений о фигуре: площади, длины окружности. Создать производный класс круглый прямой цилиндр с высотой h, добавить в класс метод определения объёма фигуры, перегрузить методы расчёта площади и вывода сведений о фигуре.

Создать класс вектор на плоскости, поля класса координаты вектора.

Методы класса: вычисление длины вектора, вывод характеристик вектора.

В классе предусмотреть методы перегрузки операций: сложение, скалярное и векторное произведение векторов, вычисления угла между векторами.

Создать класс квадратная матрица, поля класса размерность и элементы матрицы. Методы класса: проверка, является ли матрица симметричной (A = AT ), вывод матрицы. В классе предусмотреть методы перегрузки операций: сложение, вычитание, умножение матриц, добавление к матрице Создать класс обыкновенная дробь, поля класса числитель и знаменатель.

Методы класса: вывод дроби. В классе предусмотреть методы перегрузки операций: сложение, вычитание, деление и умножение дробей, сравнение Создать класс квадрат, член класса длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре: диагональ, периметр, площадь. Создать производный класс правильная квадратная призма с высотой H, добавить в класс метод определения объёма фигуры, перегрузить методы расчёта площади и вывода сведений о фигуре.

Глава Графика в Lazarus Данная глава посвящена графическим средствам языка. Рассмотрены основные процедуры и функции работы с графикой. Приведён пример построения графика функции.

10.1 Средства рисования в Lazarus При разработке проекта, в котором можно рисовать, в распоряжении программиста находится полотно (холст) свойство Canvas, карандаш свойство Pen, и кисть свойство Brush.

Свойством Canvas обладают следующие компоненты:

• форма (класс Tform);

• таблица (класс TSringGrid);

• растровая картинка (класс Timage);

• принтер (класс TPrinter).

При рисовании компонента, обладающего свойством Canvas, сам компонент рассматривается как прямоугольная сетка, состоящая из отдельных точек, называемых пикселями. Положение пикселя характеризуется его вертикальной (X) и горизонтальной (Y) координатами. Левый верхний пиксель имеет координаты (0,0). Вертикальная координата возрастает сверху вниз, горизонтальная слева направо. Общее количество пикселей по вертикали определяется свойством Height, а по горизонтали свойством Weight. Каждый пиксель может иметь свой цвет. Для доступа к любой точке полотна используется свойство Pixels[X,Y]:TColor. Это свойство определяет цвет пикселя с координатами X(integer), Y(integer).

Изменить цвета любого пикселя полотна можно с помощью следующего оператора присваивания:

Компонент. Canvas. P i x e l s [ X,Y] : = C o l o r ;

где Color переменная или константа типа Tcolor.

Определены следующие константы цветов (табл. 10.1).

Цвет любого пикселя можно получить с помощью следующего оператора присваивания:

C o l o r :=Компонент. Canvas. P i x e l s [ X,Y ] ;

где Color переменная типа Tcolor.

Класс цвета точки Tcolor определяется как длинное целое longint. Переменные этого типа занимают в памяти четыре байта. Четыре байта переменных этого типа содержат информацию о долях синего (B), зелёного (G) и красного (R) цветов и устроены следующим образом: $00BBGGRR.

Для рисования используются методы класса TСanvas, позволяющие изобразить фигуру (линию, прямоугольник и т. д.) или вывести текст в графическом режиме, и три класса, определяющие инструменты вывода фигур и текстов:

• TFont (шрифты);

• TPen (карандаш, перо);

• TBrush (кисть).

Класс TFONT. Можно выделить следующие свойства соответствующего объекта Canvas.TFont:

• Name (тип string) имя используемого шрифта.

• Size (тип integer) размер шрифта в пунктах (points). Пункт это единица измерения шрифта, равная 0,353 мм или 1/72 дюйма.

• Style стиль начертания символов, который может быть обычным, полужирным (fsBold), курсивным (fsItalic), подчёркнутым (fsUnderline) и перечёркнутым (fsStrikeOut). В программе можно комбинировать необходимые стили, например, чтобы установить стиль полужирный курсив необходимо написать следующий оператор:

• Color (тип Tcolor) цвет символов.

• Charset (тип 0..255) набор символов шрифта. Каждый вид шрифта, определяемый его именем, поддерживает один или более наборов символов. В табл. 10.2 приведены некоторые значения Charset.

ANSI_CHARSET

SYMBOL_CHARSET

MAC_CHARSET

GREEK_CHARSET

RUSSIAN_CHARSET

EASTEUROPE_CHARSET

Класс TPEN. Карандаш (перо) используется как инструмент для рисования точек, линий, контуров геометрических фигур. Основные свойства объекта Canvas.TPen:

• Color (тип Tcolor) определяет тип линии;

• Width (тип Integer) задаёт толщину линии в пикселях;

• Style даёт возможность выбрать вид линии. Это свойство может принимать значение, указанное в таблице 10.3.

• Mode определяет, каким образом взаимодействуют цвета пера и полотна.

Выбор значения этого свойства позволяет получать различные эффекты.

Возможные значения Mode приведены в табл. 10.4. По умолчанию вся линия вычерчивается цветом, определяемым значением Pen.Color, но можно определять инверсный цвет линии по отношению к цвету фона. В этом случае независимо от цвета фона, даже если цвет линии и фона одинаков, линия будет видна.

Таблица 10.4. Возможные значения свойства Mode Класс TBRUSH. Кисть (Canvas.Brush) используется методами, обеспечивающими вычерчивание замкнутых фигур для заливки. Кисть обладает двумя основными свойствами:

• Color (тип Tcolor) цвет закрашивания замкнутой области;

• Style (тип TBrushStyle) определяет стиль заполнения области (bsSolid сплошное заполнение, bsClear прозрачное, bsHorizontal горизонтальные линии, bsVertical вертикальные линии, bsFDiagonal, bsBDiagonal диагональные линии, bsCross решётка, bsDiagCross диагональная решетка).

Класс TCANVAS. Этот класс является основным инструментом для рисования графики. Рассмотрим его наиболее часто используемые методы.

Procedure MoveTo (X, Y : Integer ) ;

Метод MoveTo изменяет текущую позицию пера на позицию, заданную точкой (X,Y). Текущая позиция хранится в переменной PenPos типа Tpoint. Определение типа TPoint следующее:

type TPoint =record X : Longint ;

Y: Longint ;

end ;

Текущую позицию пера можно считывать с помощью свойства PenPos следующим образом:

X:=PenPos.X;

Y:=PenPos.Y;

Procedure LineTo (X, Y : Integer ) ;

Метод LineTo соединяет прямой линией текущую позицию пера и точку с координатами (X,Y). При этом текущая позиция пера перемещается в точку с координатами (X,Y).

Рассмотрим работу процедуры на примере. Расположим на форме кнопку и рассмотрим процедуру обработки события TForm1.Button1Click, которая рисует прямые линии:

Procedure TfForm1. B u t t o n 1 C l i c k ( Sender : TObject ) begin Form1. Canvas. LineTo ( 3 0, 5 0 ) ;

end ;

В результате щелчка по кнопке на форме будет нарисована прямая линия, соединяющая точку с координатами (0,0) и точку с координатами (30,50).

При повторном щелчке по кнопке процедура продолжит рисовать эту же линию.

Теперь перепишем процедуру обработки события следующим образом:

Procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) begin Form1. Canvas. LineTo ( Canvas. PenPos. x+30, Canvas. PenPos. y +50);

end ;

При первом щелчке по кнопке на экране прорисуется аналогичная линия.

Но при повторном щелчке процедура рисует линию, которая соединяет текущую точку с точкой, получившейся из текущей добавлением к координате X числа 30, а к координате Y числа 50. Т. е. при повторном щелчке по кнопке процедура соединяет прямой линией точки (30,50) и (60,100). При третьем щелчке по кнопке будут соединяться прямой линией точки (60,100) и (90,150) и т. д.

Procedure P o l y L i n e ( const P o i n t s array of TPoint ) ;

Метод PolyLine рисует ломаную линию, координаты вершин которой определяются массивом Points.

Рассмотрим работу процедуры на примере. Расположим на форме кнопки Рисовать и Выход и запишем следующие операторы процедур обработки события:

procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

var temp : array [ 1.. 2 5 ] of TPoint ;

j : integer ;

begin j :=1;

begin //вычисление координат вершин ломаной линии end ;

procedure TForm1. B u t t o n 2 C l i c k ( Sender : TObject ) ;

begin Form1. Close ;

end ;

После запуска программы и щелчка по кнопке Рисовать окно формы будет выглядеть, как на рисунке 10.1.

Procedure E l l i p s e (X1, Y1, X2, Y2 : Integer ) ;

Метод Ellipse вычерчивает на холсте эллипс или окружность. X1, Y1, X2, Y2 это координаты прямоугольника, внутри которого вычерчивается эллипс.

Если прямоугольник является квадратом, то вычерчивается окружность.

Procedure Arc (X1, Y1, X2, Y2, X3, Y3, X4, Y4 : Integer ) ;

Метод Arc вычерчивает дугу эллипса. X1, Y1, X2, Y2 это координаты, определяющие эллипс, частью которого является дуга; X3, Y3 координаты, определяющие начальную точку дуги; X4, Y4 координаты, определяющие конечную точку дуги. Дуга рисуется против часовой стрелки.

Procedure R e c t a n g l e (X1, Y1, X2, Y2 : Integer ) ;

Метод Rectangle рисует прямоугольник. X1, Y1, X2, Y2 координаты верхнего левого и нижнего правого углов прямоугольника.

Рис. 10.1. Пример использования процедуры PolyLine Procedure RoundRect (X1, Y1, X2, Y2, X3, Y3 : Integer ) ;

Это метод вычерчивания прямоугольника со скруглёнными углами. X1, Y1, X2, Y2 координаты верхнего левого и нижнего правого углов прямоугольника, а X3, Y3 размер эллипса, одна четверть которого используется для вычерчивания скругленного угла.

Procedure PolyGon ( const P o i n t s array of TPoint ) ;

Метод PolyGon рисует замкнутую фигуру (многоугольник) по множеству угловых точек, заданному массивом Points. При этом первая точка соединяется прямой линией с последней. Этим метод PolyGon отличается от метода Poliline, который не замыкает конечные точки. Рисование осуществляется текущим пером Pen, а внутренняя область фигуры закрашивается текущей кистью Brush.

Procedure Pie (X1, Y1, X2, Y2, X3, Y3, X4, Y4 : Integer ) ;

Метод Pie рисует замкнутую фигуру сектор окружности или эллипса с помощью текущих параметров пера Pen, внутренняя область закрашивается текущей кистью Brush. Точки (X1,Y1) и (X2,Y2) задают прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его его центр и точку (X3,Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4,Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (X3,Y3) и (X4,Y4).

Рис. 10.2. Пример использования методов рисования фигур Создадим форму, установим ей размеры Heigth 500, Weight 500. Внизу разместим кнопку, зададим ей свойство Caption Рисовать. При запуске программы и щелчке по этой кнопке на форме прорисуются различные фигуры (см. рис. 10.2). Ниже приведён листинг программы, демонстрирующий работу перечисленных методов. Результат работы программы приведен на рис. 10.2.

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, StdCtrls ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

procedure B u t t o n 1 C l i c k ( Sender : TObject ) ;

private { private declarations } public { public declarations } end ;

var Form1 : TForm1 ;

implementation { TForm1 } procedure TForm1. B u t t o n 1 C l i c k ( Sender : TObject ) ;

var t : array [ 1.. 5 ] of TPoint ;

begin //рисование линии //изменяем цвет и толщину линии Form1. Canvas. Pen. C o l o r := clMaroon ;

Form1. Canvas. Pen. Width:= 5 ;

//рисование прямоугольника //рисование эллипса //рисование прямоугольника со скруглёнными углами //рисование сектора окружности //формирование массива координат вершин пятиугольника Form1. Canvas. Polygon ( t ) ;

Form1. Canvas. TextOut ( 1 0, 1 0, ’ этовывелитекст ’ ) ;

end ;

initialization {$I unit1.lrs} end.

Procedure TextOut (X, Y : Integer ; const Text : String ) ;

Эта функция пишет строку текста Text, начиная с позиции с координатами (X,Y). Текущая позиция PenPos пера Pen перемещается в конец выведенного текста. Надпись выводится в соответствии с текущими установками шрифта Font, фон надписи определяется установками текущей кисти. Для выравнивания позиции текста на канве можно использовать методы, позволяющие определить высоту и длину текста в пикселях TextExtent, TextHeight и TextWidth. Рассмотрим эти функции.

Function TextExtent ( const Text : String ) : T s i z e ;

Эта функция возвращает структуру типа Tsize, содержащую длину и высоту в пикселях текста Text, который предполагается написать на канве текущим шрифтом.

type T s i z e = record cx : Longint ;

cx : Longint ;

end ;

Function TextHeight ( const Text : String ) : Integer ;

Функция возвращает высоту в пикселях текста Text, который предполагается написать на канве текущим шрифтом.

Function TextWidth ( const Text : String ) : Integer ;

Функция возвращает длину в пикселях текста Text, который предполагается написать на канве текущим шрифтом. Это позволяет перед выводом текста на канву определить размер надписи и расположить её и другие элементы изображения наилучшим образом.

Если цвет кисти в момент вывода текста отличается от того, которым закрашена канва, то текст будет выведен в цветной прямоугольной рамке, но её размеры будут точно равны размерам надписи.

Мы рассмотрели основные функции рисования. Теперь можно перейти непосредственно к рисованию. Но перед этим следует заметить, что если вы свернёте окно с графикой, а затем его восстановите, то картинка на форме исчезнет. Изменение размеров окна также может испортить графическое изображение в нём. Для решения этой проблемы существуют процедуры обработки событий Объект.FormPaint и Объект.FormResize. Процедура Объект.FormPaint выполняется после появления формы на экране, а процедура Объект.FormResize после изменения размера формы. Следовательно, все операторы рисования нужно помещать внутрь Объект.FormPaint и дублировать в процедуре Объект.FormResize.

10.2 Построение графиков Алгоритм построения графика непрерывной функции y = f (x) на отрезке [a; b] состоит в следующем: необходимо построить точки (xi, f (xi )) в декартовой системе координат и соединить их прямыми линиями. Координаты точек определяются по следующим формулам:

где N количество отрезков на отрезке [a; b].

Чем больше точек будет изображено, тем более плавным будет построенный график.

При переносе этого алгоритма на форму или другой компонент Lazarus учитывает размеры и особенности компонента (ось ОX направлена слева направо, её координаты лежат в пределах от 0 до Width; ось OY направлена вниз, её координаты находятся в пределах от 0 до Height). Значения координат X и Y должны быть целыми.

Необходимо пересчитать все точки из бумажной системы координат (X изменяется в пределах от a до b, Y изменяется от минимального до максимального значения функции) в компонентную1 (в этой системе координат ось абсцисс обозначим буквой U, 0 U W idth, а ось ординат буквой V, 0 V Height).

Для преобразования координаты X в координату U построим линейную функцию cX + d, которая переведёт точки из интервала (a; b) в точки интервала (X0, W idth Xk )2. Поскольку точка a бумажной системы координат перейдет в точку X0 экранной, а точка b в точку W idth Xk, то система линейных уравнений для нахождения коэффициентов c и d имеет вид:

Решив её, найдём коэффициенты c, d:

Для преобразования координаты Y в координату V построим линейную функцию V = gY + h. Точка min бумажной системы координат перейдет в точку Height Yk компонентной, а точка max в точку Y0. Для нахождения коэффициентов g и h решим систему линейных алгебраических уравнений:

1 Система координат, связанная с конкретным компонентом класса Tform, Timage, Tprinter и т. д.

2X, X, Y, Y отступы от левой, правой, нижней и верхней границы компонента Её решение позволит найти нам коэффициенты g и h.

Перед описанием алгоритма построения графика давайте уточним формулы для расчёта коэффициентов c, d, g и h. Дело в том, что Width это ширина компонента с учётом рамок слева и справа, а Height полная высота компонента с учётом рамки, а если в качестве компонента будет использоваться форма, то необходимо учесть заголовок окна. Однако для изображения графика нам нужны вертикальные и горизонтальные размеры компонент без учёта рамок и заголовка. Эти размеры хранятся в свойствах ClientWidth (ширина клиентской области компонента без учёта ширины рамки) и ClientHeight (высота клиентской области компонента, без учёта ширины рамки и ширины заголовка) компонента. Поэтому для расчёта коэффициентов c, d, g и h логичнее использовать следующие формулы:

Алгоритм построения графика на экране монитора можно разделить на следующие этапы:

1) Определить число отрезков N, шаг изменения переменной X.

2) Сформировать массивы X, Y, вычислить максимальное (max) и минимальное (min) значения Y.

3) Найти коэффициенты c, d, g и h по формулам (10.1), (10.2).

4) Создать массивы Ui = cXi + d, Vi = gYi + h.

5) Последовательно соединить соседние точки прямыми линиями с помощью функции LineTo.

6) Изобразить систему координат, линий сетки и подписи.

При построении графиков нескольких непрерывных функций вместо массивов Y и V рационально использовать матрицы размером kn, где k количество функций. Элементы каждой строки матриц являются координатами соответствующего графика в бумажной (Y ) и компонентной (V ) системах координат.

Блок-схема алгоритма изображения графика представлена на рис. 10.3, блоксхема построения графиков k непрерывных функций на рис. 10.4.

Рассмотрим поэтапно каждую схему.

Для рис. 10.3 первый этап алгоритма представлен в блоках 2 и 3. Второй этап реализуется в блоках 4 13. Коэффициенты третьего этапа рассчитываются в блоке 14. В блоках 15 16 формируются массивы значений U и V компонентной системы координат (этап 4). Блоки 17 19 это вывод графиков на экран, и блок 20 предназначен для шестого этапа.

Рис. 10.3. Блок-схема алгоритма построения графика функции Для второй схемы (рис. 10.4) реализация второго этапа представлена в блоках 4 15. В блоке 16 рассчитываются коэффициенты c, d, g и h. В блоках 20 формируются массивы четвёртого этапа. Блоки 21 24 предназначены для вывода графиков, а блок 25 для построения осей.

ЗАДАЧА 10.1. Построить график функции f (x) на интервале [a, b].

Функция задана следующим образом:

Создадим новый проект, изменим высоту и ширину формы до размеров, достаточных для отображения на ней графика. Например, можно установить следующие свойства: Width 800, Height 700. Разместим на форме кнопку и комГлава 10. Графика в Lazarus Рис. 10.4. Блок-схема алгоритма построения графиков нескольких функций понент класса TImage. Объект TImage1 это растровая картинка, которая будет использоваться для отображения графика после щелчка по кнопке Button1. Размеры растровой картинки сделаем чуть меньше размеров формы.

Установим в качестве свойства формы Caption сроку График функции.

Чтобы избавиться от проблемы перерисовки будущего графика при изменении размера формы, запретим изменение формы и уберём кнопки минимизации и максимизации окна. Свойство формы BorderStyle определяет внешний вид и поведение рамки вокруг окна формы. Для запрета изменения формы установим значение свойства BorderStyle в bsSingle это значение определяет стандартную рамку вокруг формы и запрещает изменение размера формы. Чтобы убрать кнопки минимизации и максимизации формы, установим её свойства BolderIcons.BiMaximize и BolderIcons.BiMinimize в False.

Для кнопки установим свойство Caption фразу Построить график.

После установки всех описанных свойств окно формы должно стать подобным представленному на рис. 10.5.

Ввод интервала a и b выполним с помощью запроса в момент создания формы (в методе инициализации формы FormCreate). Ниже приведён листинг модуля проекта рисования графика с комментариями:

unit Unit1 ;

{$mode objfpc}{$H+} interface uses Dialogs, ExtCtrls, StdCtrls ;

//объявление функции, которая задаётся //математически для построения //объявление функции, которая изображает //график функции на компоненте procedure Graphika ( a, b : r e a l ) ;

type { TForm1 } TForm1 = c l a s s (TForm) Button1 : TButton ;

procedure FormCreate ( Sender : TObject ) ;

private { private declarations } public { public declarations } var Form1 : TForm1 ;

//объявление переменных //x0, xk, y0, yk - отступы от границ компонента слева //справа, сверху и снизу //x, y - массивы, определяющие координаты точек графика //в бумажной системе координат //u, v массивы, определяющие координаты точек графика //в компонентной системе координат //N - количество точек N : integer ;

implementation //функция, которая будет изображена на компоненте Image begin i f xmax then max:=y [ i ] ;

Построить графики функций f1 (x), f2 (x), f3 (x) в одной системе координат на интервале [a; b]. Функции заданы следующими зависимостями:

Вместо заключения Перевёрнута последняя страница книги. Что теперь? Авторы надеются, что знакомство с языком Free Pascal будет только первым этапом в изучении программирования. Желание читателя что-то исправить в книге: переписать приведённые в ней программы, предложить более простые и быстро работающие алгоритмы, написать свои программы и модули, будет лучшей благодарностью авторам. Если у Вас, читатель, появилось подобное желание, то мы выполнили свою задачу научили Вас основам программирования.

Следующим этапом в освоении программирования будет разработка своих алгоритмов и написание реально работающих программ для различных операционных систем.



Pages:     | 1 | 2 || 4 |


Похожие работы:

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Ярославский государственный университет им. П.Г. Демидова Физический факультет УТВЕРЖДАЮ Проректор по развитию образования _Е.В.Сапир _2012 г. Рабочая программа дисциплины послевузовского профессионального образования (аспирантура) История и философия науки по специальности научных работников 01.04.10 Физика полупроводников Ярославль 2012 2 Цели освоения дисциплины История и философия науки 1. Целью освоения дисциплины История и философия...»

«Комитет образования и науки администрации г. Новокузнецка муниципальное бюджетное общеобразовательное учреждение Средняя общеобразовательная школа № 92 Рекомендовано Рассмотрено Утверждаю ШМО учителей начальных классов педагогическим советом Директор МОУ СОШ № 92 МОУ СОШ № 92 /Т.А.Кольцова/. Руководитель ШМО учителей начальных классов Приказ № 17 Протокол №1 от 03 сентября 2011г. / Е.Н.Иванова/ от 05сентября 2011 г Протокол №1 от 30 августа 2011г Основная образовательная программа начального...»

«Негосударственное образовательное учреждение дополнительного профессионального образования Ассоциация иностранных языков Рассмотрено на заседании Утверждено приказом учебно-методическогосовета. №15_ от 3_ октября 2013 г. Протокол №2_ от 1_ октября_ 2013 г. РАБОЧАЯ ПРОГРАММА полного академического курса испанского языка (2 года, 4 семестра, 510 академических часов) _ Ф.И.О. учителя на 20 - 20 учебный год Санкт-Петербург 2013 год РАБОЧАЯ ПРОГРАММА ПОЛНОГО АКАДЕМИЧЕСКОГО КУРСА ИСПАНСКОГО ЯЗЫКА...»

«INFOWATCH IT SECURITY ROADSHOW - МИНСК Компания InfoWatch приглашает Вас принять участие в ежегодном бизнес-семинаре Решения InfoWatch: защита информации, репутации, организации. Взгляд в будущее, который состоится 28 ноября 2013 года. Мероприятие пройдет в рамках мирового турне InfoWatch IT Security Roadshow и будет посвящено вопросам защиты информации от внутренних угроз. В фокусе IT Security RoadShow – практические аспекты обеспечения информационной безопасности в организациях любого...»

«Министерство здравоохранения Российской Федерации Российская ассоциация эндокринологов ФГБУ Эндокринологический научный центр АЛГОРИТМЫ СПЕЦИАЛИЗИРОВАННОЙ МЕДИЦИНСКОЙ ПОМОЩИ БОЛЬНЫМ САХАРНЫМ ДИАБЕТОМ Под редакцией И.И. Дедова, М.В. Шестаковой 6-й выпуск Москва 2013 Министерство здравоохранения Российской Федерации Российская ассоциация эндокринологов ФГБУ Эндокринологический научный центр УТВЕРЖДАЮ Главный эндокринолог Министерства здравоохранения Российской Федерации Президент Российской...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ УЛЬЯНОВСКАЯ ГОСУДАРСТВЕННАЯ СЕЛЬСКОХОЗЯЙСТВЕННАЯ АКАДЕМИЯ ЭКОНОМИЧЕСКИЙ ФАКУЛЬТЕТ КАФЕДРА ЭКОНОМИЧЕСКОЙ ТЕОРИИ РАБОЧАЯ ПРОГРАММА ПО ДИСЦИПЛИНЕ ТЕОРИЯ РАЗВИТИЯ для студентов экономического факультета специальности: 080502.65 Экономика и управление на предприятиях АПК Ульяновск – 2009г. РАЗДЕЛ I ЦЕЛИ И ЗАДАЧИ КУРСА Целью курса является изучение теории развития, которая представляет не только теоретический, но и практический интерес. Развитие –...»

«Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования РОССИЙСКАЯ АКАДЕМИЯ НАРОДНОГО ХОЗЯЙСТВА И ГОСУДАРСТВЕННОЙ СЛУЖБЫ ПРИ ПРЕЗИДЕНТЕ РОССИЙСКОЙ ФЕДЕРАЦИИ Воронежский филиал г. Воронеж Кафедра политологии и политического управления РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ История русской культуры Шифр и наименование специальности: 030501.65 Юриспруденция Квалификация (степень) выпускника: специалист Форма обучения: заочная 2 Воронеж Рабочая...»

«БАЛТИЙСКИЙ МОРСКОЙ ФЕСТИВАЛЬ 2 – 5 июня, 2011 Контакт: тел./факс (812) 321 2860, +7 921 369 3436 [email protected] http://boatshow.lenexpo.ru/ Уважаемые дамы и господа! Приглашаем вас принять участие в Международной Специализированной выставке яхт, катеров, оборудования и снаряжения для водных видов спорта, рыбалки, туризма и отдыха БАЛТИЙСКИЙ МОРСКОЙ ФЕСТИВАЛЬ 2 – 5 ИЮНЯ, 2011 Выставочный комплекс ЛЕНЭКСПО УСЛОВИЯ УЧАСТИЯ 1. ТЕМАТИЧЕСКИЕ РАЗДЕЛЫ ВЫСТАВКИ: Маломерные суда (продажа,...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Уральский государственный экономический университет ХИМИЯ ПРИРОДНЫХ СОЕДИНЕНИЙ Рабочая программа изучения курса для студентов специальности 23.05.06. Социально культурный сервис и туризм, специализация Ресторанный сервис факультета Техники и технологии пищевых производств Екатеринбург 2004 Составитель Калугина И.Ю. Рецензент Николаева Л.И. 2 1. ЦЕЛИ И ЗАДАЧИ КУРСА Цель дисциплины: подготовка специалистов, владеющих основами химии природных...»

«АННОТАЦИИ РАБОЧИХ ПРОГРАММ ДИСЦИПЛИН по направлению подготовки магистров 260800.68 Технология продукции и организация общественного питания (магистерская программа Производство продукции различного назначения для предприятий питания) М1 ОБЩЕНАУЧНЫЙ ЦИКЛ БАЗОВАЯ ЧАСТЬ М1.Б.1 Философские проблемы науки и техники Место дисциплины в структуре ООП магистратуры Дисциплина Философские проблемы науки и техники в учебном плане находится в базовой части общенаучного цикла М.1 для магистра по направлению...»

«Международный институт экономики и финансов (МИЭФ) Российско-британская бакалаврская программа двух дипломов При академической поддержке Лондонской школы экономики (ЛШЭ) МИЭФ сегодня 2 Бакалаврская 2 диплома: программа Лондонского университета (ведущий колледж – (с 1997 г.) Лондонская школа экономики ) • Экономика • Банковское дело и финансы • Экономика и менеджмент • Экономика и финансы • Бухгалтерский учет и финансы • Математика и экономика Национального исследовательского университета...»

«1 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Кузбасский государственный технический университет имени Т. Ф. Горбачёва УТВЕРЖДАЮ Начальник управления реализации ООП В. М. Юрченко _2011 г. РАБОЧАЯ ПРОГРАММА дисциплины Геология Специальность Физические процессы горного или нефтегазового производства Специализация: Физические процессы горного производства, Трудоемкость дисциплины 8 3Е...»

«1. ИНФОРМАЦИЯ ИЗ ФГОС, ОТНОСЯЩАЯСЯ К ДИСЦИПЛИНЕ 1.1. Виды деятельности выпускника, относящиеся к дисциплине: проектно-конструкторская; производственно-технологическая; организационно-управленческая; научно-исследовательская; монтажно-наладочная. 1.2. Задачи профессиональной деятельности выпускника проектно-конструкторская деятельность: сбор и анализ данных для проектирования; расчет и проектирование технических объектов в соответствии с техническим заданием с использованием стандартных средств...»

«Московский государственный университет имени М. В. Ломоносова МОСКОВСКАЯ ШКОЛА ЭКОНОМИКИ РАБОЧАЯ ПРОГРАММА ДИСЦИПЛИНЫ Микроэкономика - I Направление 080100 Экономика для подготовки студентов – бакалавров очного отделения Авторы – составители программы: Левина Евгения Александровна; Покатович Елена Викторовна, кандидат экономических наук. Рабочая программа утверждена решением Ученого совета МШЭ МГУ Протокол № от _ 2011 г. Москва 2011 СОДЕРЖАНИЕ I. ОРГАНИЗАЦИОННО-МЕТОДИЧЕСКИЙ РАЗДЕЛ 1.1. Задачи...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Утвержден приказом Министерства образования и науки Российской Федерации от 200 г. № Регистрационный номер _ ФЕДЕРАЛЬНЫЙ ГОСУДАРСТВЕННЫЙ ОБРАЗОВАТЕЛЬНЫЙ СТАНДАРТ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ по направлению подготовки 84 б - ЭНЕРГЕТИЧЕСКОЕ МАШИНОСТРОЕНИЕ Квалификация (степень) Бакалавр ОБЩИЕ ПОЛОЖЕНИЯ Направление подготовки Энергетическое машиностроение утверждено приказом Министерства образования и науки Российской Федерации от №_...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ У Ч Е Б Н О -М Е Т О Д И Ч Е С К И Й КОМПЛЕКС по дисциплине Б.3.В.ОД.10 Рыбоводство (индекс и наименование дисциплины) Код и направление 111100.62 – зоотехния подготовки Технология производства продуктов Профиль животноводства подготовки Квалификация Бакалавр (степень) выпускника Факультет...»

«CBD Distr. GENERAL UNEP/CBD/COP/9/6 31 January 2008 RUSSIAN ORIGINAL: ENGLISH КОНФЕРЕНЦИЯ СТОРОН КОНВЕНЦИИ О БИОЛОГИЧЕСКОМ РАЗНООБРАЗИИ Девятое совещание Бонн, 19-30 мая 2008 года Пункт 4.1 предварительной повестки дня* ДОКЛАД О РАБОТЕ ШЕСТОГО СОВЕЩАНИЯ СПЕЦИАЛЬНОЙ РАБОЧЕЙ ГРУППЫ ОТКРЫТОГО СОСТАВА ПО ДОСТУПУ К ГЕНЕТИЧЕСКИМ РЕСУРСАМ И СОВМЕСТНОМУ ИСПОЛЬЗОВАНИЮ ВЫГОД ВВЕДЕНИЕ Шестое совещание Специальной рабочей группы открытого состава по доступу к 1. генетическим ресурсам и совместному...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ КРАСНОЯРСКОГО КРАЯ КРАЕВОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ НАЧАЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ ПРОФЕССИОНАЛЬНОЕ УЧИЛИЩЕ №79 УТВЕРЖДАЮ: Зам. директора по УПР _ Копнина И.Ф. _ _20 г. РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ ОП.07 МАТЕРИАЛОВЕДЕНИЕ Профессия 270835.02 Бригадир-путеец Нормативный срок обучения – 2 года и 5 мес. на базе основного общего образования Рабочая программа учебной дисциплины разработана на основе Федерального...»

«1 Пояснительная записка Курс География России в 8 классе создает у учащихся образ страны во всем ее многообразии и целостности. Его содержание связано с ключевыми проблемами, решаемыми Россией. Данный курс служит одной из основ формирования духовности, воспитания патриотизма, интернационализма будущих граждан России, их уважения к культуре и истории своей Родины и населяющих ее народов, экономического и эстетического образования школьников. География России призвана главным образом формировать...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ УТВЕРЖДАЮ Декан факультета энергетики и электрификации, доцент _А.В. Винников 2013 РАБОЧАЯ ПРОГРАММА дисциплины Электромеханические переходные процессы в электроэнергетических системах для бакалавров 140400 Электроэнергетика и электротехника направления подготовки Факультет, на котором...»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.