Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Вывод функциональных зависимостей ⇐ ПредыдущаяСтр 6 из 6
Произвольную кривую можно вывести как, используя процедуру вывода отрезков прямых линий 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. Тип графика
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 Популярное:
|
Последнее изменение этой страницы: 2016-06-04; Просмотров: 763; Нарушение авторского права страницы