Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Вывод функциональных зависимостей



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

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

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

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

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

В-четвёртых, надо определить количество выводимых точек графика.

Пример. Программа вывода синусоидальной функции с использованием процедуры вывода отрезков прямых линий Line.

Program sinus1;

uses Crt, Graph;

const

N = 500; (* Количествоточекграфика *)

var

d, m, e, Xmax, Ymax, Xfirst, Xend, Y0, Ym: integer;

X, Y: array [0.. N] of word;

k: word;

Xfront, Xback, hx, hfi, Nt, Em, Dy, SY, mY: real;

begin (* Тело программы – раздел операторов *)

clrScr;

Em: = 3; Nt: = 2; (* Выбор амплитуды и числа периодов синусоиды *)

Xfront: = 0.15; Xback: = 0.2; (* Выбор отступов графика по оси Х *)

Dy: = 0.35; (* Выбор высоты графика в относительных единицах *)

Xmax: = GetMaxX; Ymax: = GetMaxY; (* Нахождение максимального количества пикселей по осям экрана *)

Xfirst: = trunc (Xfront * Xmax); Xend: = Xmax – trunc (Xback * Xmax);

(* Определение начальных b конечных координат графика *)

Y0: = Ymax div 2; (* Местоположение оси Y на экране*)

SY: =Dy* Ymax / 2; (* Определение длины оси Y вверх и вниз относительно начальной координаты Y0 *)

Ym: = trunc (SY); (* Перевод SY в графические координаты *)

mY: = 0.1*Em/Dy; (* Выбор масштаба амплитуды синуса *)

hx: = (Xend – Xfirst) / N; hfi: = 2 * pi *Nt / N; (* Вычисление шагов изменения координаты Х и фазы синуса *)

d: = detect; m: = VGAMed;

InitGraph (d, m, ' '); (* Инициализация графического режима *)

(* Блокпроведенияосей *)

SetBkColor (blue); SetLineStyle (0, 0, 1); SetColor (white);

Line (Xfirst, Y0, Xend, Y0); (* Проведение оси Х *)

Line (Xfirst, Y0 – Ym, Xfirst, Y0 + Ym); (* Проведение оси Y *)

(* Блок вычисления и рисования синусоидальной функции.

Вычисление и запоминание координат точек в массивах X и Y,

вывод функции отрезками прямых линий *)

SetLineStyle (0, 0, 3); SetColor (red);

X [0]: = Xfirst; Y [0]: = Y0;

for k: = 1 to N do

Begin

X [k]: = Xfirst + trunc (k*hх);

Y [k]: = Y0 – trunc (mY*SY*sin (k*hfi);

Line (X [k-1], Y [k-1], X [k], Y [k] );

Delay (100);

end;

readln;

CloseGraph (* Процедура закрытия графического режима *)

End.

Принятые обозначения:

Xfront, Xback – отступы в относительных единицах от левой (передней) и правой (задней) границ экрана соответственно,

Dy – относительный размер графика по оси ординат,

Y0 – координата положения оси Y на экране,

hx – шаг по оси абсцисс,

hfi – шаг по аргументу (по углу, радиан),

Nt – количество периодов синусоиды,

Em – амплитуда синусоиды.

Процедура DrawPoly ( N: word; var Points) модуля Graph рисует текущим цветом и типом линии произвольную ломаную линию, заданную N вершинами (точками излома) с графическими координатами Points. Координаты точек излома задают парой значений типа word, первое из которых определяет горизонтальную, второе – вертикальную координаты. Points – переменная типа record. Если крайние точки совпадают, то будет вычерчен многоугольник. Поэтому полный синтаксис процедуры DrawPoly будет иметь вид, например,

type

Points = record

X, Y: word

end;

var

A: array [1..50] of Points;

N: word;

.......

С помощью процедуры DrawPoly удобно выводить на экран не только многоугольники или ломаные линии, но и графики функций, заданных формулами. Рассмотрим, например, вывод на экран графика синусоидальной функции.

Пример. Программа вывода синусоидальной функции с использованием процедуры вывода многоугольников DrawPoly.

Program sinus2;

uses Crt, Graph;

const

N = 500; (* Количествоточекграфика *)

type

Points = record

X, Y: word

end;

var

d, m, er, Xmax, Ymax, Xf, Xe, Y0, Ym: integer;

k: word;

Xfr, Xb, hx, hfi, Nt, Em, Dy, SY, mY: real;

coords: array [0..N] of Points;

begin

ClrScr;

Em: = 3; Nt: = 2; (* Выбор амплитуды и числа периодов синусоиды *)

Xfr: = 0.15; Xb: = 0.2; (* Выбор отступов графика по оси Х *)

Dy: = 0.35; (* Выбор высоты графика в относительных единицах*)

d: = detect; m: = VGAMed;

InitGraph (d, m, ' ');

(* Получение номера ошибки, если инициализация режима не произошла *)

er: = GraphResult;

if er< > grOk then

Begin

writeln ( GraphErrorMsg (er));

Halt

end;

Xmax: = GetMaxX; Ymax: = GetMaxY;

Xf: = trunc (Xfr * Xmax); Xe: = Xmax – trunc (Xb * Xmax);

Y0: = Ymax div 2; SY: = Dy* Ymax / 2; Ym: = trunc (SY); mY: = 0.1*Em/Dy;

hx: = (Xe – Xf) / N; hfi: = 2 * pi *Nt / N;

SetBkColor (blue); SetLineStyle (0, 0, 1); SetColor (white);

Line (Xf, Y0, Xe, Y0); Line (Xf, Y0 + Ym, Xf, Y0 – Ym);

(* Блок вычисления и рисования синусоиды *)

SetLineStyle (0, 0, 3); SetColor (red);

for k: = 0 to N do with coords [k] do

Begin

X: = Xf + trunc (k*hх);

Y: = Y0 – trunc (mY*SY*sin (k*hfi);

(* Рисование синусоиды с помощью процедуры DrawPoly )

DrawPoly (N, coords);

end;

readln;

CloseGraph

End.

Функция GraphResult: integer; модуля Graph возвращает код ошибки, если инициализация гра­фического режима не произошла.

Функция GraphErrorMsg (ErrorCode: integer): string; модуля Graph, возвращает строку сообщения об ошибке, указывая её код ErrorCode.

Для построения сложных фигур, образованных прямыми и дугами окружностей, весьма важной является процедура GetArcCoords ( var Coords: ArcCoordType) модуля Graph, определяющая координаты центра и точек начала и конца дуги. Здесь переменная Coords имеет тип " запись".

Полный синтаксис процедуры должен иметь вид:

type

ArcCoordType = record

X, Y, (* Координаты центра дуги окружности *)

Xs, Ys, (* Координаты точки начала дуги *)

Xe, Ye: integer (* Координаты точки конца дуги *)

end;

var

coords: ArcCoordType;

begin

.........

GetArcCoords;

 

Порядок выполнения работы

1. Разработайте алгоритм решения задачи в соответствии со своим вариантом.

2. Откройте текстовый редактор TurboPascal.

3. Напишите программу решения задачи по разработанному ранее алгоритму. В программе предусмотреть вывод справочной информации (информация об авторе, наименование и назначение программы), возможность многократных вычислений.

4. Отладьте программу.

5. Сохраните результаты работы программы.

Содержание отчета

Отчет оформляется индивидуально и содержит:

- титульный лист;

- наименование, цель и содержание работы;

- алгоритм и текст программы

- изображения экранов монитора с результатами работы программы;

- выводы по результатам работы.

 

Варианты заданий

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

 

Таблица 1. Варианты заданий

№ вар. Функция № вар. Функция

 

Таблица 2. Тип графика

№ цифры Система координат Ось Y Ось X
Декартовая Линейная Линейная
Полярная Линейная Линейная
Декартовая Логарифмическая Линейная
Полярная Линейная Линейная
Декартовая Линейная Логарифмическая
Полярная Линейная Линейная
Декартовая Логарифмическая Логарифмическая
Полярная Логарифмическая Линейная
Декартовая Логарифмическая Логарифмическая
Полярная Логарифмическая Линейная

 

6 Контрольные вопросы

1. Укажите типы шрифтов по способу начертания.

2. Перечислите особенности векторных шрифтов.

3. Перечислите особенности растровых шрифтов.

4. Укажите, какое действие выполняет процедура OutTextXY и в чем её отличие от процедуры OutText.

5. Какое действие выполняет процедура SetTextStyle?

6. Какое количество шрифтов доступно в Pascal 5.5?

7. Какое количество шрифтов доступно в Pascal 7.0?

8. Какое действие выполняет процедура SetTextJustify?

9. Перечислите основные шаги по выводу функциональных (графических) зависимостей в среде TurboPascal.

10. Перечислите основные варианты вывода графических зависимостей в среде TurboPascal.

11. Какую процедуру (функцию) можно использовать для вывода зависимостей заданных формулой.

Рекомендуемая литература

1. Степанов А.Н. Информатика. Базовый курс. Учебник для ВУЗов. - Издательство " Питер", 2007. – 768с.

2. Острейковский, В.А. Информатика: учебник для вузов / В.А.Острейковский.— 3-е изд., стер. — М.: Высш.шк., 2005.— 511с.: ил. — Библиогр.в конце кн. — ISBN 5-06-003533-6 /в пер./: 128.74.

 


ЛАБОРАТОРНАЯ РАБОТА 19

Программирование с использованием записей(2 часа)

Цель работы

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

2 Краткая теоретическая справка

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

< имя типа> = RECORD

< имя поля> : < тип поля>;

< имя поля> : < тип поля>;

< имя поля> : < тип поля>;

END;

Для обращения к какому-либо полю записи сначала следует указать имя записи, а затем после точки–имя поля. Ниже приведена программа, организующая заполнение информацией массива z, состоящего из 10 записей, содержащих сведения о поставщиках товаров (наименование поставщика, его адрес, телефон, наименование банка и номер расчетного счета):

program zapisi;

type

post=record

naim: string[30];

adres: string[50]; (*)

tel: integer;

bank: string[30];

num: integer;

end;

var

z: array [1..10] of post;

x: post;

i: integer;

begin

for i: =1 to 10 do

begin

writeln (‘введите сведения о ‘, i, ‘-ом поставщике’);

write (‘наименование’); read (x.naim);

write (‘адрес’); read (x.adres);

write (‘телефон’); read(x.tel);

write (‘наименование банка’); read (x.bank);

write (‘номер расчетного счета’); read (x.num);

z[i]: = x;

end;

end.

 

При необходимости постоянно обращаться к полям одной и той же записи можно использовать оператор WITH, который имеет вид:

WITH < имя записи> DO < оператор>.

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

with x do

begin

write (‘наименование’); read (naim);

write (‘адрес’); read (adres);

write (‘телефон’); read(tel);

write (‘наименование банка’); read (bank);

write (‘номер расчетного счета’); read (num);

end;

Порядок выполнения работы

Изучить необходимые сведения, указанные выше.

Пункты 1 и 2 задания можно объединить (по согласованию с преподавателем).

Войти в режим редактирования и набрать текст программы

Проверить работоспособность программы на других исходных данных.

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

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

 

Содержание отчета

Отчет оформляется индивидуально и содержит:

- титульный лист;

- наименование, цель и содержание работы;

- алгоритм и текст программы

- изображения экранов монитора с результатами работы программы;

- выводы по результатам работы.

 

Варианты заданий

 

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

 

1. Структура записи:

4 автор;

4 название книги;

4 год издания;

4 количество экземпляров.

Вывести количество книг заданного автора определенного диапазона годов изданий.

 

2. Структура записи:

4 номер избирательного участка;

4 район расположения;

4 общее количество избирателей;

4 количество избирателей, принявших участие в голосовании.

Определить участок с наибольшим процентом проголосовавших в заданном районе.

3. Структура записи:

4 кафедра;

4 количество сотрудников;

4 объем бюджетных работ;

4 объем хоздоговорных работ.

Определить лучшую кафедру по критерию максимального удельного объема работ.

4. Структура записи:

4 название дисциплины;

4 фамилия преподавателя;

4 количество часов в неделю лекций;

4 количество часов в неделю практических и лабораторных работ.

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

 

5. Структура записи:

4 фамилия студента;

4 название дисциплины;

4 количество выполненных работ;

4 количество защищенных отчетов.

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

6. Структура записи:

4 шифр детали;

4 вес детали;

4 стоимость детали;

4 количество деталей.

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

7. Структура записи:

4 фамилия преподавателя;

4 должность;

4 количество публикаций;

4 количество докладов на конференциях.

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

8. Структура записи:

4 фамилия;

4 должность;

4 оклад;

4 премия.

Вывести фамилии инженеров с зарплатой более заданного числа.

9. Структура записи:

4 тема работы;

4 календарный месяц;

4 исполнитель;

4 затраченное время.

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

10. Структура записи:

4 шифр изделия;

4 название изделия;

4 цена;

4 количество.

Вывести шифр и название изделия с максимальной общей стоимостью.

11. Структура записи:

4 номер компьютера;

4 количество файлов на диске;

4 последняя дата обновления файлов;

4 метка диска.

Определить диск на заданном компьютере с наиболее " старой" информацией.

12. Структура записи:

4 идентификатор программы;

4 пользователь;

4 объем памяти;

4 время выполнения.

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

13. Структура записи:

4 отделение банка;

4 фамилия вкладчика;

4 номер счета;

4 сумма вклада.

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

14. Структура записи:

4 номер производства;

4 название цеха;

4 плановое задание;

4 фактическое выполнение плана.

Определить все цеха заданного производства, не выполнившие план.

15. Структура записи:

4 конфигурация компьютера;

4 объем оперативной памяти;

4 суммарный коэффициент быстродействия;

4 стоимость.

Определить наиболее экономичную ЭВМ с заданным объемом памяти.

16. Структура записи:

4 тип блюда;

4 название блюда;

4 калорийность;

4 цена.

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

17. Структура записи:

4 номер школы;

4 номер района расположения;

4 количество классов;

4 общее число учеников.

Определить номер школы в заданном районе с максимальным средним количеством учеников в одном классе.

18. Структура записи:

4 номер телефона;

4 дата разговора;

4 тип разговора (городской, междугородний);

4 длительность разговора.

Определить общую стоимость переговоров в заданном месяце для заданного телефона.

19. Структура записи:

4 название;

4 объем оперативной памяти;

4 быстродействие;

4 стоимость.

Выбрать ЭВМ у которой быстродействие выше заданного числа и объемпамяти больше заданного числа.

20. Структура записи:

4 фамилия студента;

4 номер группы;

4 зачеты;

4 оценки за сессию.

Определить количество отличников в заданной группе.

 

21. Структура записи:

4 фамилия студента;

4 название дисциплины;

4 количество выполненных работ;

4 количество защищенных отчетов.

Определить общее количество выполненных, но не сданных работ, для заданной дисциплины.

22. Структура записи:

4 шифр детали;

4 вес детали;

4 стоимость детали;

4 количество деталей.

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

23. Структура записи:

4 фамилия преподавателя;

4 должность;

4 количество публикаций;

4 количество докладов на конференциях.

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

24. Структура записи:

4 фамилия;

4 должность;

4 оклад;

4 премия.

Вывести фамилии инженеров с окладом большим чем премия.

25. Структура записи:

4 тема работы;

4 календарный месяц;

4 исполнитель;

4 затраченное время.

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

26. Структура записи:

4 шифр изделия;

4 название изделия;

4 цена;

4 количество.

Вывести шифр и название изделия с минимальной общей стоимостью.

27. Структура записи:

4 номер компьютера;

4 количество файлов на диске;

4 последняя дата обновления файлов;

4 метка диска.

Определить диск на заданном компьютереу которого больше всех файлов.

28. Структура записи:

4 идентификатор программы;

4 пользователь;

4 объем памяти;

4 время выполнения.

Определить объём памяти всех программ заданного пользователя.

29. Структура записи:

4 отделение банка;

4 фамилия вкладчика;

4 номер счета;

4 сумма вклада.

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

30. Структура записи:

4 номер производства;

4 название цеха;

4 плановое задание;

4 фактическое выполнение плана.

Определить все цеха заданного производства, выполнившие план.

 

6 Контрольные вопросы

1. Как описываются переменные типа запись?

2. В каких случаях целесообразно использование переменных типа запись?

3. Каково назначение оператора WITH?

4. В чем отличие записей от массивов?

 

Тестовые задания

Дана ведомость абитуриентов, сдавших вступительные экзамены в институт (приведено начало ведомости)

Ф.И.О. Оценки Местожительство

Иванов А.Г. 9 6 5 Минск

Петров Л.Л 9 9 9 Барановичи

Раковский Д.Г. 4 4 5 Брест

1. Определить количество абитуриентов со средним баллом не менее 6.

2. Определить количество абитуриентов со средним баллом не менее 6, фамилии которых начинаются с буквы А.

3. Определить количество абитуриентов, фамилии которых начинаются с буквы «И».

4. Определить количество абитуриентов, со средним баллом не менее 6, проживающих в городе Минске.

5. Определить количество абитуриентов, проживающих в городах, название которых начинается с буквы «Б».

6. Определить количество абитуриентов, средний балл которых выше среднего балла по институту.

7. Определить количество абитуриентов, фамилии которых начинаются с буквы «Р» и получивших хотя бы одну оценку «5».

8. Определить количество абитуриентов, получивших хотя бы одну оценку «7».

9. Определить количество абитуриентов, средний балл которых выше среднего балла по институту. Напечатать список поступающих, причем первыми в списке идут абитуриенты, сдавшие все экзамены на 10(9).

10. Определить количество абитуриентов, проживающих в городе Минске и фамилии которых начинаются с буквы «П».

 

 

ЛАБОРАТОРНАЯ РАБОТА 20

Объекты в Pascal(2 часа)

Цель работы

Получение практических навыков объектно-ориентированного программирования.

2 Краткая теоретическая справка

 

Один из подходов в программировании носит название: " Объектно-ориентированное программирование" или, сокращенно, ООП. Идея этого подхода заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое - ОБЪЕКТ.

В Турбо Паскале ООП реализовано начиная с версии 5.5.

 

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

 

Инкапсуляция.

Объединение в единое целое данных и алгоритмов обработки ЭТИХ данных. В результате инкапсуляции и получается новый тип данных - объект.

Наследование.

Возможность использования уже определенных объектов для построения иерархии объектов-потомков. Объект-потомок наследует от родителя ВСЕ поля и методы, и может дополнять объекты новыми полями или заменять их.

Полиморфизм.

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

 

Определение объекта

 

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

Перефразируя Вирта, можно сказать что: " Алгоритмы+Структуры Данных=Объекты".

 

Выглядит описание объекта так:

 

type

T = object

{ переменные, или ПОЛЯ объекта }

...

{ заголовки процедур и функций, или МЕТОДЫ }

end;

 

 

Переменные, описанные в объекте называются полями, а процедуры их обработки - методами.

 

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

 

procedure ObjectType.ProcedureName(...);

 

 

Т.е< имя_объекта>.< имя_процедуры>

Параметры описываются как обычно, за исключением того, что внутри метода всегда доступны поля объекта непосредственно по их именам. Например:

 

type

TA = object

a: Integer;

procedure give(x: integer);

end;

{... }

procedure TA.give(x: integer);

begin

a: = a + x;

end;

 

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

 

procedure TA.give;

begin

a: = a + x;

end;

 

Переменные типа " объект" можно создавать как обычно, объявлением в списке переменных (при таком способе для использования экземпляров объектов - переменных объектного типа - в программе, их вызывают так: < имя_объекта>.< имя_метода> ):

 

type TA = object... end;

 

var a: TA;

begin

a.give(5);

end.

 

но большее распространение получил метод их размещения в динамической памяти. Для этого нужно создать дополнительный тип - указатель на объект (в таком случае для обращения к полям или методам объекта указатель надо разыменовать):

 

type

PTA = ^TA;

TA = object... end;

 

var p_a: PTA;

begin

new(p_a);

p_a^.give(5);

end.

 

Наследование

 

При описании объекта-наследника (также называемого производным типом), имя его родителя указывается в скобках. Например:

 

TA =

object

{ поля и методы объекта TA }

end;

TA1 =

object(TA) { потомок TA }

{... }

end;

 

 

Поля и методы родителя могут появляться в реализации методов наследника, как если бы они были описаны явно в самом наследнике. Процесс наследования является транзитивным: если TB наследуется от TA, а TC в свою очередь - наследник TB, то тип TC также считается наследником TA.

 

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

 

Из " умения" объектов " наследовать" вытекает правило присваивания для переменных типа " Объект": переменным такого типа можно присваивать не только значения этого же типа, но и значения любого производного типа. Например, при таком определении:

 

type

TA = object

x: integer;

{...}

end;

TB = object(TA)

y: integer;

{...}

end;

var a: TA; b: TB;

 

 

для копирования значения X записанного в переменной b в переменную a достаточно выполнить присваивание:

 

a: = b;

 

Внимание:

Операция присваивания возможна только таким путем:

" Родитель< -- Наследник"

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

 

Операцией присваивания копируются только поля. Методы таким образом не присваиваются...

 

Использование объектов

 

Посмотрим теперь на практике, как работать с объектами.

 

usescrt;

 

{ Глобальная константа }

constNN = 10;

type

{ это наш массив, на основе которого будем делать объекты }

atype = array[1.. nn] of integer;

 

T1 = object

a: atype;

n: integer;

procedureVec; { процедуравводамассива }

procedurePrint; { процедура вывода массива }

end;

T2 = object(T1)

s: integer; { сумма }

procedurePrint; { перекроем новым методом, посмотрим результат }

procedureSumm; { посчитаем сумму эл-тов }

end;

 

{ ---------- теперь опишем методы ------- }

procedureT1.Vec;

var c, i: Integer;

begin

repeat

write('Введите длинну массива n = '); readln(n)

until (N > 0) and (n < = NN);

for i: = 1 to n do begin

write('a[', i, '] = '); readln(a[i])

end

end;

{ ----- }

procedure T1.Print;

var i: Integer;

begin

WriteLn;

for i: = 1 to n do write(a[i]: 6);

WriteLn

end;

{ ----- }

procedure T2.Print;

var F: text; fn: string; i: integer;

begin

Writeln('Введите имя файла для записи туда массива');

ReadLn(fn); Assign(f, fn); ReWrite(f);

for i: = 1 to n do WriteLn(f, a[i]);

Close(f)

end;

{ ----- }

procedure T2.Summ;

var i: integer;

begin

s: = 0;

for i: = 1 to n do s: = s + a[i];

end;

{ ----- }

 

var

b: T1; c: T2;

 

begin

{

Теперь проверим работу объектов. При вызове Т2, должны быть доступны

ВСЕ методы объекта родителя, т.е. Т1, но метод PRINT перекрывается

}

с.Vec;

b.Print;

c.Print;

c.Summ;

end.

 

 

Итак, рассмотрим эту программу. Это первая наша программа с объектами.

 

В ней есть 2 объекта - родитель Т1 и потомок Т2.

Я специально сделал так, чтобы в них были методы (процедуры) с одинаковыми именами. Обратите внимание, что мы не описывали в Т2 процедуру Vec, однако, при вызове:

c.Vec

 

метод заработал. Это произошло, потому что объект T2 является потомком Т1, и он знает все методы и данные своего родителя Т1. И наоборот Т1 не знает, что есть процедура Summ.

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

То есть при вызове C.Print пошла запись в файл, а не на экран монитора, как есть в методе родителя. Таким образом, при наследовании объект-потомок наследует все методы родителя и перекрывает одноименные.

 

Итак, мы научились создавать простейшие объекты, и объекты потомки, теперь посмотрим для чего нужны директивы Public и Private.

 

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

 

Название книги

Том (если есть)

Автор

Инициалы автора

краткая информация про книгу

Место нахождения книги.

 

Такую базу данных хорошо использовать дома, т.к. нет лишней информации (год издания, где напечатано и т. д.) и в тоже время есть информация о нахождении книги. Например:

 

TurboPascal

Фаронов

ВВ

программирование на паскале

У меня на полке

 

Не будем делать базу данных, которая для быстрой работы с базой помещает в память всю информацию из файла. Будем напрямую обращаться к файлу.

(Кодировка текста программы - Cyrillic Win, так что для использования программы Вам придется перекодировать текст в ДОС.Я специально сделал кодировку WIN, чтобы все объяснения делать прямо в программе используя коментарии):

Исходныйкод

Unit DateBase;

Interface

Uses CRT;

Type

BOOK = record

NAME: string[30];

TOM: string[2];

autor: string[30];

IO: string[2]; { инициалы }

INFO: string[30]; { доп.информ. }

GEO: string[30] { расположение }

end;

BD= object

Private

BDF: file of BOOK;

BDFileName: string;

Function UpStr(s: string): string;

Procedure Add;

Procedure PrintCRT;

Procedure Search;

Public

Procedure Run;

Procedure Init;

Procedure Done;

end;

 

Implementation

 

{------- теперьопишемметоды------}

ProcedureBD.Init; { подготовка к работе }

begin

If paramcount=0 then BDFileName: ='C: \BOOKH.BD'

else BDFileName: =paramstr(1);

TextColor(Black); TextBackGround(7); ClrScr;

Assign(BDF, BDFileName); {$I-} Reset(BDF); {$I+}

If IOresult=0 then begin Seek(BDF, 0); Exit end

else rewrite(BDF)

end;

{-----------------------------------------------}

ProcedureBD.Done; { завершение работы }

begin

CLOSE(BDF); NormVideo; TextBackGround(0); ClrScr; HALT(1)

end;

{-----------------------------------------------}

 

{Эта функция взята из программы PWLHack,

старой прогрммы для взлома PWL, она хороша тем,

что максимально оптимизирована }

FunctionBD.UpStr(S: String): String; {перевод строки в верхний регистр}

Var I: Byte;

Begin

For I: =1 To ORD(S[0]) Do Begin

Case S[I] Of

'a'..'z': S[I]: =Chr(Ord(S[I])-$20);

'а'..'п': S[I]: =Chr(Ord(S[I])-$20);

'р'..'я': S[I]: =Chr(Ord(S[I])-$50)

End

End;

UpStr: =S

End;

{-----------------------------------------------}

ProcedureBD.Add; { Добавление элементов }

Var POLE: book;

Begin

ClrScr;

GOTOXY(30, 10); Write('Введите название книги: ');

repeat

GOTOXY(25, 11);

Readln(POLE.NAME)

until pole.name< > '';

GOTOXY(30, 12); Write('Введитеномертома: ');

GOTOXY(25, 13); Readln(POLE.TOM);

GOTOXY(30, 14); Write('Введитефамилиюавтора: ');

repeat

GOTOXY(25, 15); Readln(POLE.autor)

until pole.autor< > '';

GOTOXY(30, 16); Writeln('Введитеинициалыавтора: ');

GOTOXY(25, 17); Readln(POLE.IO);

GOTOXY(30, 18); Writeln('Дополнительная информация о книге: ');

GOTOXY(25, 19); Readln(POLE.INFO);

GOTOXY(30, 20); Writeln('Где находится эта книга');

repeat

GOTOXY(25, 21); READln(POLE.GEO)

until pole.geo< > '';

GOTOXY(35, 24); Writeln('ЗАПИСЫВАЮ...');

{------------------------}

Seek(BDF, FileSize(BDF));

Write(BDF, POLE);

GOTOXY(35, 25); Writeln('ЗАПИСАЛ.')

end;

{-----------------------------------------------}

ProcedureBD.PrintCRT; { печать на экран содержимого файла }

var

i: longint;

POLE: BOOK;

begin

ClrScr;

For i: =0 to FileSize(BDF)-1 do begin

Seek(BDF, i);

read(BDF, POLE);

writeln('---------------------------');

writeln('Название: ', POLE. NAME);

If POLE.TOM< > '' then writeln('том: ', POLE.TOM);

writeln('Автор: ', POLE.autor);

If POLE.IO< > '' then writeln('Инициалы: ', POLE.IO);

If POLE.INFO< > '' then writeln('Доп.Информ: ', POLE.INFO);

writeln('Расположение: ', POLE.GEO);

writeln('---------------------------');

If (i+1) mod 3 = 0 then begin

GOTOXY(20, 25); Write('Нажмите клавишу ENTER для продолжения');

readkey; clrscr

end

End;

Write('Нажмите клавишу ENTER для продолжения');

readkey

end;

{-------------------------------------------------------}

Procedure BD.Search; {Поискзаписи }

var

i: longint;

POLE: BOOK;

param1, param2, param3,

param4, param5, param6: string;

begin

ClrScr;

GOTOXY(30, 10); Write('Введите название книги: ');

GOTOXY(25, 11); Readln(param1);

GOTOXY(30, 12); Write('Введитеномертома: ');

GOTOXY(25, 13); Readln(param2);

GOTOXY(30, 14); Write('Введитефамилиюавтора: ');

GOTOXY(25, 15); Readln(param3);

GOTOXY(30, 16); Writeln('Введитеинициалыавтора: ');

GOTOXY(25, 17); Readln(param4);

GOTOXY(30, 18); Writeln('Дополнительная информация о книге: ');

GOTOXY(25, 19); Readln(param5);

GOTOXY(30, 20); Writeln('Где находится эта книга');

GOTOXY(25, 21); Readln(param6);

ClrScr;

For i: =0 to (FILESIZE(bdf)-1) do begin

seek(bdf, i);

read(bdf, pole);

If (UPSTR(pole.name)=UPSTR(param1)) or

(UPSTR(pole.TOM)=UPSTR(param2)) or

(UPSTR(pole.autor)=UPSTR(param3))or

(UPSTR(pole.io) = UPSTR(param4)) or


Поделиться:



Популярное:

  1. A.16.15.5. Экран состояния модулей удаленного ввода-вывода (RIOM)
  2. IV Обсуждение результатов и некоторые выводы
  3. Автор специального исследования по этому вопросу Середонин пришел к выводу, что в конце XVI в. было не более 23–25 тыс. детей боярских и дворян, числившихся в разрядных списках.
  4. В выводе должно прозвучать, что была определена «нужда» потребителя в данной услуге.
  5. В результате противоречивости этих двух структур в Сутевом строении образуется ряд концептуальных зависимостей, сила и мощь которых – на стороне преимущественного лидерства победившей оппозиции.
  6. Ввод и вывод данных. Форматы вывода.
  7. Ввод – вывод и файловая система
  8. Великие события, описанные в Священном Писании, никогда не происходили. Об этом сообщается в газете La Repubblica. К такому выводу пришли израильские археологи на основании многолетних раскопок
  9. Взаимодействие трех основных функциональных блоков мозга
  10. Влияние индуктивности рассеяния трансформатора на форму выпрямленного напряжения в 3-х фазной схеме выпрямителя с нулевым выводом
  11. Вместимость функциональных емкостей
  12. ВОССТАНОВЛЕНИЕ ФУНКЦИОНАЛЬНЫХ НАРУШЕНИЙ ГОЛОСА


Последнее изменение этой страницы: 2016-06-04; Просмотров: 724; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.493 с.)
Главная | Случайная страница | Обратная связь