МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН ЮЖНО-КАЗАХСТАНСКИЙ ЭКОНОМИКО-ТЕХНОЛОГИЧЕСКИЙ КОЛЛЕДЖ "МИРАС" Утверждаю: Директор колледжа "Мирас" ______________ Калжанова А.К. Согласовано: Зам. директора УР _______________ Калиниченко В.И. Зам. директора ЗДО _______________ Дуржинская Л.Н.. УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС (для студентов) по дисциплине "Основы алгоритмизации и программирования" Специальность: 3706002 – "Программное обеспечение вычислительной техники и автоматизированных систем". Форма обучения: очная, заочно-дистанционная. Курсы II - III, семестры 3,4,5 Всего часов – 246 час. (IIIс.– 90ч., IVс. –72 ч.,. Vс.– 84 ч.) Лекции – 132 час. Лабораторные – 114 час. Экзамен – 2 ОКР – 2 Курсовой проект - 1 Шымкент 2012 г. УДК ……………………. (номер УДК) ББК ……………………. (номер ББК) Составитель: Попова Т.Д. Шымкент: ЮКЭТ колледж Мирас; 2011 Учебно-методический комплекс (УМК) составлен в соответствии с требованиями учебного плана и программой дисциплины «Основы алгоритмизации и программирования» и включает все необходимые сведения по выполнению тем лекционных занятий курса. Учебно-методический комплекс (УМК) для студентов специальности 3706002 «Программное обеспечение вычислительной техники и автоматизированных систем». Краткая аннотация. Учебно-методический комплекс (УМК) для учебной дисциплины «Основы алгоритмизации и программирования» содержит следующие материалы. - Проектирование учебного процесса по учебной дисциплине (назначение и трудоемкость дисциплины) - Технология процесса обучения по учебной дисциплине - Рабочая программа учебной дисциплины (место, цели и задачи учебной дисциплины - представленная и в виде учебных разделов-семестров (каждый раздел содержит комплексную цель; краткое изложение программного материала; задания, позволяющие обеспечить достижение студентами комплексной цели; список рекомендуемой литературы). - Тематический план дисциплины. - Контрольный конспект лекций преподавателя, отражающий содержание и уровень лекционного материала, материала практических (семинарских) занятий, варианты индивидуальных заданий, контрольные вопросы по отдельным разделам и в целом по всей учебной дисциплине. Рецензент: «Мирас» Абдуллина А.М. - преподаватель высшей категории ЮКЭТ колледжа Рассмотрено и рекомендовано к печати заседанием ПЦК математических дисциплин Учебно-методический комплекс обсужден на заседании ПЦК общепрофессиональных дисциплин, протокол № _9___ , от «_13.04.11__» «____________» Председатель ПЦК Гаврикова Т.П. Рассмотрено: на заседании методического совета. Протокол № ______, от "______" "_____________" 20____ г. Зам. директора по МР _________________ Куттыбаева Ж.Ф. © ЮКЭТ колледж «Мирас»2012 естественно- СОДЕРЖАНИЕ КРАТКОЕ ОПИСАНИЕ КУРСА……………………………….………… III СЕМЕСТР СЕМИНАР 1 Основы алгоритмизации…………….…………………………………… Свойства и графический способ представления алгоритмов…………. Разновидности структур алгоритмов…………………………………… СЕМИНАР 2 Концепция данных.……………………………………………………… Структура программы в ТР …………………………………………….. Разделы программы……………………………………………………… СЕМИНАР 3 Бит. Байт………………………………………………………………….. Простые типы данных и их обработка…………………………………. СЕМИНАР 4 Классификация операторов……………………………………………… Оператор присваивания………………………………………………….. Операторы ввода-вывода………………………………………………… СЕМИНАР 5 Арифметические операции в ТР………………………………………… Операции DIV и MOD…………………………………………………… Стандартные функции в языке ТР……………………………………… СЕМИНАР 6 Применение логических выражений…………………………………… Условный оператор IF ………………………………………………….. Оператор выбора: Case………………………………………………….. СЕМИНАР 7 Циклические алгоритмы …………………………………………..……. Оператор цикла с предусловием While………………………………… Оператор цикла с постусловием Repeat………………………….…….. Цикл с параметром. Оператор FOR…………………………………….. Вложенные циклы………………………………………………………... СЕМИНАР 8 Одномерные и двумерные массивы…………………………………….. Действия над массивами………………………………………………… Действия с одномерными массивами…………………………………… Организация доступа к элементам двумерного массива………………. Сортировка массивов…………………………………………………….. СЕМИНАР 9 Обработка данных символьного типа…………………………………... Строки. Обработка строковых данных…………………………………. Числа и строки……………………………………………………………. IV СЕМЕСТР СЕМИНАР 10 Множественный тип данных…………………………………................. 3 …4 …6 …7 …8 ..11 ..12 ..14 ..17 ..17 ..20 ..20 ..21 ..23 ..23 ..24 ..25 ..26 ..28 ..30 ..31 ..32 ..32 ..34 ..35 ..38 ..39 ..40 ..42 ..46 ..46 ..49 ..51 СЕМИНАР 11 Комбинированные типы - записи…………………………………......... СЕМИНАР 12 Методы структурного программирования.………………...................... Процедуры пользователя………………………………………………… Виды параметров. Механизм передачи параметров…………………… Глобальные и локальные переменные………………………………….. СЕМИНАР 13 Функции пользователя. Структура функций…………………………… Нетрадиционное использование пользовательских подпрограмм. Рекурсия…………………………………………………………………… СЕМИНАР 14 Ввод – вывод данных. Файлы……………………………………………. Описание файлового типа………………………………………………... Средства обработки файлов……………………………………………... СЕМИНАР 15 Текстовые файлы… ……………………………………………………… СЕМИНАР 16 Типизированные файлы………………………………………………….. Нетипизированные файлы……………………………………………….. СЕМИНАР 17 Динамические переменные. Ссылочные типы…………………………. Создание и удаление динамических переменных……………………… СЕМИНАР 18 Динамические объекты – линейные списки……………………………. Структура односвязного списка…………………………………………. Действия со связанными списками……………………………………… V СЕМЕСТР СЕМИНАР 19 Динамические объекты сложной структуры. Деревья…………………. СЕМИНАР 20 Текстовый и графический режимы. Модуль CRT. Процедуры и функции управления экраном…………………………………………… Процедуры и функции для управления выводом в активное окно…… СЕМИНАР 21 Графический режим. Модуль GRAPH………………………………….. Обработка текстовой информации в графическом режиме…………… СЕМИНАР 22 Модули в программировании. Процесс преобразования исходного кода программы в исполнимый код…………………………………….. Понятие модуля. Структура модуля…………………………………….. Компиляция модулей…………………………………………………….. ЛИТЕРАТУРА……………………………………………………………… КОНТРОЛЬНЫЕ ТЕСТЫ. ПРАКТИЧЕСКИЕ ЗАДАНИЯ……………… 4 ..54 ..56 ..56 ..59 ..61 ..63 ..67 ..68 ..70 ..70 ..72 ..74 ..76 ..78 ..80 ..83 ..84 ..84 ..87 ..88 ..90 ..91 ..94 ..95 ..96 ..97 ..98 ..99 Программа обучения студентов дисциплине "Основы алгоритмизации и программирования" Дисциплина "Основы алгоритмизации и программирования" для студентов специальности 3706002 "Программное обеспечение ВТ и АС" является одной из основных профессиональных образовательных дисциплин. Краткое описание курса. Цель курса. Цель изучения этого курса определяется ее ролью в процессе развития в целом и формированием личности отдельного человека. Целью преподавания дисциплины является: - Изучение основ алгоритмизации и программирования; - Привитие студентам базовых понятий программирования; - Привитие навыков формализации интуитивных понятий различных областей знаний и построения математических моделей при создании алгоритмов; - Привитие умений преобразования алгоритма в рабочую программу на языке программирования Turbo Pascal. Задача курса. - Задачами изучения дисциплины являются: Этапы подготовки и решения задач на ПК. Способы представления алгоритмов. Данные и операторы языка программирования. Сложные типы данных. Процедуры и функции как средства структурного программирования. Ввод – вывод данных. Динамические переменные. Графика. Модули в программировании. Содержание курса. Объектом изучения является информация, которую можно представить в виде алгоритма решения поставленной задачи. Предметом изучения являются способы и методы представления алгоритмов на языке программирования Turbo Pascal. В качестве метода познания используется персональный компьютер и ИС Turbo Pascal. Обучение строится на использовании активных методов обучения, т.е индивидуальной работы на персональном компьютере при решении конкретных задач и упражнений, выполнении индивидуальных заданий (проектов), игровых методов и.т.д. 5 Студенты должны знать: Концепцию данных Простые типы данных Операторы языка программирования Концепцию сложных типов данных Массивы и стринги Возможности использования множеств Правила использования комбинированных типов Основы методов структурного программирования Структуру процедур и функций Понятие формальных и фактических параметров Способы получения и передачи информации вспомогательным алгоритмом Классификацию файлов Процедуры и функции для обработки типизированных файлов. Распределение оперативной памяти при выполнении программ Отличия статических и динамических переменных Ссылочные типы – указатели Виды линейных списков Различия текстового и графического режимов Инициализацию графического режима Процедуры и функции для построения различных фигур Порядок создания собственного модуля Студенты должны уметь: Разрабатывать и оформлять линейные, разветвляющиеся и циклические алгоритмы Составлять различные выражения с учетом совместимости типов данных Составлять программы по разработанным алгоритмам с использованием условного оператора Составлять программы по разработанным алгоритмам с использованием операторов цикла Использовать при составлении программ сложные типы данных Применять вспомогательные алгоритмы при составлении программ Организовывать ввод данных из файла Организовывать вывод данных в файл Разрабатывать структуру записи файла Использовать динамическую память Использовать динамические типы данных Использовать правила преобразования координат при построении фигур Использовать вывод текста в графическом режиме Оформлять структуру модуля Компилировать модуль и подключать его к программе. 6 III семестр. Семинар №1. Основы алгоритмизации 1. 2. 3. 4. 5. 6. Общая характеристика предмета: цели, задачи его изучения. Понятие данных и обработки данных. Подготовка задачи к решению на ПК. Основные свойства алгоритмов. Графическое оформление алгоритма. Разновидности структур алгоритмов. Целью программирования является описание процессов обработки данных. Данные это представление фактов и идей в формализованном виде, пригодном для передачи и переработке в некоем процессе, а информация это смысл, который придается данным при их представлении. Обработка данных это выполнение систематической последовательности действий с данными. Данные представляются и хранятся на т.н. носителях данных. Совокупность носителей данных, используемых при какой-либо обработке данных, будем называть информационной средой. Набор данных, содержащихся в какой-либо момент в информационной среде, будем называть состоянием этой информационной среды. Процесс можно определить как последовательность сменяющих друг друга состояний некоторой информационной среды. Подготовка любой задачи к решению с использованием ПК делится на следующие этапы: 1. Постановка задачи. 2. Формализация задачи. 3. Построение алгоритма. 4. Составление программы на языке программирования. 5. Отладка и тестирование программы. 6. Проведение расчётов и анализ полученных результатов. Часто эту последовательность называют технологической цепочкой решения задачи на ЭВМ. Непосредственно к программированию относятся пункты 3, 4, 5. На этапе постановки необходимо чётко сформулировать, что дано и что требуется найти. Здесь очень важно определить полный набор исходных данных, необходимых для получения результата. Второй этап – формализация задачи. Здесь чаще всего задача переводится на язык математических формул, уравнений, отношений и т.д. Третий этап – построение алгоритма. Под алгоритмом понимается «точное предписание, определяющее вычислительный процесс, ведущий от варьируемых начальных данных к искомому результату» (ГОСТ 19.781-74). Алгоритм включает систему правил, 7 определяющих содержание и конечную последовательность действий (шагов и операций), выполняемых над некоторыми объектами с целью переработки исходных и промежуточных данных в искомый результат. Четвёртый этап – составление программы на языке программирования. Можно написать программу на любом языке программирования (на том, каким вы владеете). Существует множество языков программирования: C/C++, Pascal, Basic, Delphi и т.д. Программист может пользоваться тем языком программирования, который больше всего соответствует его симпатиям. Пятый этап – отладка и тестирование программы. На этом этапе выявляются и устраняются все программные ошибки и недочёты. Для тестирования программы программистом обычно составляется контрольный пример, включающий в себя все возможные варианты вычислительных процессов и изменений исходного материала. И, наконец, шестой этап – завершение. Программа прогоняется с использованием фактических исходных данных. Проводится анализ полученных результатов. Свойства и графический способ представления алгоритмов При разработке алгоритмов следует учитывать ряд требований, совокупность которых формирует его свойства. Из основных свойств алгоритма выделим: - Определённость - алгоритм, должны быть чёткими и однозначными, не допускать произвольного или двоякого толка: - Дискретность - возможность поэтапной детализации алгоритма путём разложения любой сложной структуры на ряд простых действий: - Конечность и Результативность – вычислительный процесс после выполнения заданной алгоритмом конечной последовательности действий должен заканчиваться выдачей результатов - Рациональность - алгоритм должен привести к результату за наименьшее время при минимальном использовании ресурсов ПК - Массовость – алгоритм должен использоваться для решения множества однотипных задач с различными исходными данными. Графический способ представления алгоритмов подчиняется двум ГОСТам: 1. ГОСТ 19.002-80, соответствует международному стандарту ИСО 263673. Регламентирует правила составления блок-схем. 2. ГОСТ 19.003-80, соответствует международному стандарту ИСО 102873. Регламентирует использование графических примитивов. 8 Название 1. Блок вычислений 2. Логический блок 3. Блоки ввода/вывода 4. Начало/конец (вход/выход) 5. Предопределенный процесс 6. Блок модификации 7. Соединитель 8. Межстраничный соединитель Символ (рисунок) Выполняемая функция (пояснение) Выполняет вычислительное действие или группу действий Выбор направления выполнения алгоритма в зависимости от условия Ввод или вывод данных вне зависимости от физического носителя Вывод данных на печатающее устройство Начало или конец программы, вход или выход в подпрограмму Вычисления по стандартной или пользовательской подпрограмме Выполнение действий, изменяющих пункты алгоритма Указание связи между прерванными линиями в пределах одной страницы Указание связи между частями схемы, расположенной на разных страницах Правила построения блок-схем: 1. Блок-схема выстраивается в одном направлении либо сверху вниз, либо слева направо 2. Все повороты соединительных линий выполняются под углом 90 градусов Разновидности структур алгоритмов По структуре алгоритмы разделяют на линейные, разветвляющиеся и циклические. Линейными называют алгоритмы, в которых операции выполняются последовательно одна за другой, в естественном и единственном порядке следования. Рис.1. Схема линейного алгоритма. Пример 1. Найти значение функции при значении аргумента x=1,5 и заданных а, b, с. Алгоритмы, в которых в зависимости от выполнения некоторого логического условия происходит разветвление вычислений по одному из 9 нескольких возможных направлений, называют разветвляющимися. Подобные алгоритмы предусматривают выбор одного из альтернативных путей продолжения вычислений. Каждое возможное направление вычислений называется ветвью. Пример 2. Даны два числа а и b. Найти Очевидно, что для определения ветви , по которому необходимо производить процесс вычисления значения х, достаточно проверить выполнение одного из условий, например а>b. Если условие а>b не выполняется, то очевидно и без дополнительной проверки, что будет выполнено условие а < b. Следовательно, вариант схемы алгоритма будет выглядеть следующим образом Рис.2. Схема разветвляющегося алгоритма. Алгоритм циклической структуры предусматривает многократное повторение действий в одной и той же последовательности по одним и тем же математическим зависимостям, но при разных значениях некоторой специально изменяемой величины. Циклические алгоритмы позволяют существенно сократить объем программы за счет многократного выполнения группы повторяющихся вычислений, так называемого тела цикла. Специально изменяемый по заданному закону параметр, входящий в тело цикла, называется переменной цикла. Переменная цикла используется для подготовки очередного повторения цикла и отслеживания условий его окончания. Во время выполнения тела цикла параметры переменной цикла изменяются в интервале от начального до конечного значения с заданным шагом. Следовательно, при организации циклических вычислений необходимо предусмотреть задание начального значения переменной цикла, закон ее изменения перед каждым новым повторением и ее конечное значение, при достижении которого произойдет завершение цикла. Циклы, в теле которых нет разветвлений и других встроенных в них циклов, называют простыми. В противном случае их относят к сложным. Циклические алгоритмы разделяют на детерминированные и итерационные. Циклы, в которых число повторений заранее известно из исходных данных или определено в ходе решения задачи, называют детерминированными. Для организации детерминированных циклов наиболее целесообразно использовать блок модификации, внутри которого указывается переменная цикла, ее начальное и конечное значения, а также шаг ее изменения . Организовать 10 подобный цикл возможно и при использовании блока проверки условия вместо блока модификации. Циклы, в которых число повторений неизвестно из исходных данных и не определено по ходу решения задачи, называют итерационными. В итерационных циклах для организации выхода из тела цикла предусматривается проверка некоторого заранее заданного условия, для чего используют блок проверки условия. В итерационных циклах невозможно использовать блоки модификации, так как при организации таких циклов заранее неизвестно количество изменений переменной цикла и ее конечное значение. В зависимости от местонахождения блока проверки условия итерационные циклы могут быть организованы как циклы с предусловием (блок проверки условия размещен перед телом цикла) или с постусловием (блок проверки условия размещен после тела цикла). Если в цикле с предусловием входящие в тело цикла команды могут не выполняться ни разу (если начальное значение параметра цикла удовлетворяет условию выхода из цикла), то в цикле с постусловием - выполняются как минимум один раз (даже если начальное значение параметра цикла удовлетворяет условию выхода из него). Пример 3. Дано натуральное число N. Найти сумму первых N членов натурального ряда. Варианты схемы алгоритма циклической структуры решения поставленной задачи приведены на рис.3.1. и рис.3.2. При этом в схеме на рис. 3.1. цикл организован с использованием блока модификации, а на рис. 3.2. блока проверки условия. В обоих алгоритмах операция нахождения суммы, при предварительном обнулении значения переменной S (блок 3), повторяется N раз. Рис.3.1. Циклический алгоритм, использующий блок модификации. Рис.3.2. Циклический алгоритм, использующий блок проверки условия 11 Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №2. Концепция данных 1. 2. 3. 4. 5. Алгоритмическая обработка информации с применением данных. Классификация данных по типам. Простые и сложные типы данных. Переменные и константы. Структура программы в языке ТР. Совокупность величин, с которыми работает ПК, принято называть данными. По отношению к программе данные делятся на исходные, результаты и промежуточные, которые получаются в процессе вычислений. исходные Программа (Промежуточ. Данные) результат ы Для успешного освоения программирования необходимо усвоить следующее правило: всякая величина занимает своё определённое место в памяти ПК. У всякой величины имеются три основных свойства: имя, значение и тип. Величины делятся на константы и переменные. Константы – это величины, значения которых в процессе выполнения программы не изменяются. В языке ТР используются константы следующих видов: числовые, логические (булевские), символьные и строковые. Константы могут быть именованными, типизированными и зарезервированными. Переменные - это величины в ходе выполнения программы могут изменять свои значения. В программировании переменную можно трактовать как одну или несколько ячеек ОП компьютера, которым присвоено определенное имя – идентификатор. Идентификатор служит посредником для удобного использования адреса ячейки с ее содержимым. Содержимое этой ячейки может меняться, но имя переменной остается неизменным. Каждое новое значение, записанное в эту ячейку памяти, "затирает" предыдущее значение, поэтому в любой момент времени переменная имеет только одно текущее значение. 12 Все типы данных в ТР можно разделить на две большие группы: простые (скалярные) и сложные (структурированные). К простым типам данных относятся: целочисленный, вещественный, логический, символьный). К структурированным типам данных относятся: строки, массивы, множества, записи и файлы. Структура программы в ТР В общем случае программа, написанная в ТР имеет вид: {описательная часть} begin {исполнительная часть} end. В более подробном рассмотрении программа на ТР состоит из следующих разделов: {заголовок} {описательная часть} - раздел подключаемых модулей; - раздел объявления меток; - раздел объявления констант; - раздел объявления типов; - раздел объявления переменных; - раздел объявления процедур и функций; {исполнительная часть} - раздел инструкций (операторов) программы, заключаемый в слова BEGIN и END; - в конце программы ставится признак останова - . (точка). Заголовок программы состоит из зарезервированного слова program и имени программы, присваемое самим программистом для удобства работы с ней и отличия от других программ.. Например: Program kvadr; Более удобным способом отличия программ друг от друга является комментарий, помещенный в начало программы и содержащий краткую характеристику программы, например: {Программа вычисления квадратного уравнения} и тогда заголовок программы может отсутствовать. Комментарий (пояснительный текст) можно записать в любом месте программы, где разрешен пробел. Он не обрабатывается компилятором и не включается в исполняемый exe-файл. Текст комментария ограничивается фигурными скобками {} или символами (* *). 13 Описательная часть не выполняет никаких действий и служит для правильного выделения памяти под данные, используемые в программе, их характеристики – имена, тип, возможные значения. В исполнительной части (разделе операторов) записывается последовательность исполняемых операторов. Каждый оператор выражает действие, которое необходимо выполнить. Исполняемые операторы отделяются друг от друга символом ";". Иногда описательная часть может отсутствовать. Без исполнительной части программа бессмысленна. Идентификаторы пользователя применяются для обозначения меток, констант, переменных, процедур и функций, определенных самим программистом. Тип идентификатора должен быть указан в описательной части программы, до его использования. Общие правила написания идентификаторов: - Состоят из букв, цифр и знаков подчеркивания. - Специальные символы, а также пробелы не допускаются. - Буквы русского алфавита не допускаются. - Начинаются с буквы или знака подчеркивания. Только для меток допускается использование цифр. - Максимальная длина идентификатора – 127 символов. - Нельзя использовать зарезервированные слова языка ТР. - При написании идентификаторов можно использовать как строчные, так и прописные буквы. Компилятор не делает различия между ними (MAS или mas – одно и тоже) В самом общем виде структура программы имеет вид: program ИмяПрограммы; uses ИмяМодуля1, ИмяМодуля2, …; label ИмяМетки1, ИмяМетки2, …; const ИмяКонстанты1 = ЗначениеКонстанты1; ИмяКонстанты2 = ЗначениеКонстанты2; type ИмяТипа1 = ЗначенияТипа1; ИмяТипа2 = ЗначенияТипа2; var ИмяПеременной1: ИмяТипа1; ИмяПеременной2: ИмяТипа2; ИмяПеременной3, ИмяПеременной4: Тип1; ИмяПеременной5, ИмяПеременной6: Тип2; {объявления процедур и функций программиста} begin {инструкции основной программы} end. 14 Разделы описания могут встречаться в программе любое количество раз и следовать в произвольном порядке, кроме раздела uses, который всегда расположен сразу после заголовка программы. Любой раздел, кроме раздела инструкций, может отсутствовать. Разделы программы 1. Содержание разделов программы. 2. Перечень операторов. 3. Простые и сложные операторы. Раздел uses. Позволяет подключить стандартные и пользовательские библиотечные модули, например модуль CRT. Он начинается с зарезервированного слова uses и имеет следующий вид: uses ИмяМодуля1, ИмяМодуля2, …; Например: uses CRT, GRAPH; Раздел описания меток. Перед любым оператором в программе можно поставить метку, что позволяет выполнить прямой переход на этот оператор из любого места программы. Метка состоит из имени и следующего за ним ":", после которого и располагается помеченной меткой оператор. Все метки, используемые в программе, должны быть описаны в этом разделе. Он начинается с зарезервированного слова label и имеет следующий вид: label ИмяМетки1, ИмяМетки2, …; Например: label MET, 1, 2; Раздел описания констант. Хранение констант (постоянных величин) не требует памяти, компилятор их значения помещает прямо в текст исполняемой программы. Каждая константа принадлежит к определенному типу данных, но при определении константы его обычно не указывают. Он начинается с зарезервированного слова const и имеет следующий вид: const ИмяКонстанты1 = ЗначениеКонстанты1; ИмяКонстанты2 = ЗначениеКонстанты2; Например: const max = 1000; str = 'Основы алгоритмизации и программирования'; Раздел описания типов данных. В языке ТР предусмотрено несколько стандартных типов и существует механизм создания новых типов данных. Каждое новое определение типа задает множество значений и связывает с этим множеством некоторое имя. Раздел описания типов данных – это раздел типов, определяемых пользователем, поэтому в простых программах он часто 15 отсутствует. Он начинается с зарезервированного слова type и имеет следующий вид: type ИмяТипа1 = ЗначенияТипа1; ИмяТипа2 = ЗначенияТипа2; Пример описания: type matrica = array [1..row, 1..col] of real; var mas: matrica; Задан тип matrica – матрица с row строк и col столбцов. Далее в разделе описания переменных var необходимо указать переменную, относящуюся к этому типу. Раздел описания переменных. Все переменные, используемые в программе, должны быть описаны в этом разделе. После того, как переменная описана, она может быть опознана компьютером, а в тексте программы к ней можно обратиться по имени. Пример: var mas: matrica; x1, x2: real; i,j: integer; stroka: string; Раздел описания процедур и функций. Данный раздел используется в программах, которые с целью удобства программирования были разбиты на более мелкие части – подпрограммы. Подпрограммой называется программная единица (часть программы), имеющая имя, по которому она может быть вызвана из других частей программы. Подпрограммы делятся на процедуры и функции, которые могут быть стандартными и определенными пользователем. Стандартные процедуры и функции являются частью языка и вызываются без предварительного описания. В общем случае подпрограмма имеет ту же структуру, что и программа. Объявление процедуры: procedure ИмяПроцедуры (ФормальныеПараметры); (описательная часть процедуры) begin (исполнительная часть процедуры) end; Объявление функции: function ИмяФункции (ФормальныеПараметры): ТипРезультата; (описательная часть функции) begin (исполнительная часть функции) 16 ИмяФункции:= Результат; end; Раздел операторов. Этот раздел является основным, т.к. именно в нем выполняются действия, позволяющие получить результат, ради которого и создавалась программа. вegin Оператор1; …….. ОператорN; end. В одной строке можно размещать несколько операторов, отделяя их друг от друга точкой с запятой. Допускается перенос операторов с одной строки на другую. Если между операторами не поставлена точка с запятой, возникает ошибка, т.к. компилятор воспринимает конец оператора именно по этому знаку. Например: X:= 1 Y:= 2; компилятором будет воспринято как X:= 1Y:= 2;. В итоге получается оператор, в котором используется два знака присваивания и неправильный идентификатор 1Y. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №3. Простые типы данных и их обработка 1. 2. 3. 4. 5. Бит, байт. Описание простых типов данных. Константы соответствующих типов. Понятие порядковых данных. Типы – диапазоны. Бит. Байт Вся информация хранится в памяти компьютера в двоичной форме в виде последовательности битов. Каждый бит может принимать значение 0 или 17 1. Восемь битов составляют один байт. Максимальное число, которое можно записать при помощи восьми двоичных цифр – это 11111111, что соответствует десятичному 255, минимальное – 0. поэтому значением байта может быть любое целое число от 0 до 255 (всего их 256). Так как переменные разных типов могут принимать различные значения, то для их хранения нужен соответствующий им объем памяти. Память под переменные выделяется в байтах. Простые типы данных Тип определяет множество значений, которые могут принимать объекты программы (константы, переменные), а также совокупность операций, допустимых над этими значениями. Например, 1 и 3 относятся к целочисленному типу и над ними можно выполнить любые арифметические операции. Целочисленный тип. В ТР это интервал целых положительных или отрицательных чисел. Операции над целыми числами определены лишь тогда, когда исходные данные и результат лежит в этом интервале. Иначе возникает ситуация, называемая переполнением. Название целого типа Byte (байтовый) Shortint (короткий целый) Integer (целый) Word (слово) Longint (длинный целый) Диапазон возможных значений 0 - 255 -128 - 127 -32 768 - 32767 0 – 65 535 -2 147 483 648 – 2 147 483 647 Память, байт 1 1 2 2 4 Byte и Word – беззнаковые типы. Вещественный тип. Любые (целые и дробные) числа в некотором диапазоне. Вещественный тип Диапазон возможных значений Память, байт Single (с одинарн.точн.) 1,5е-45 – 3,4е38 4 Real (вещественный) 2,9е-39 – 1,7е38 6 Double (с двойной точн.) 5,0е-324 – 1,7е308 8 Extended (с повыш.точн.) 3,7е-4932 – 1,1е4932 10 Вещественные числа могут записываться двумя способами – в общепринятой и в экспоненциальной форме. При общепринятой форме записи целая часть отделяется от дробной точкой. Если точка отсутствует – число считается целым, например 12.25, -0.148. В экспоненциальной форме записи используется степень числа 10. При этом число изображается так: пишется мантисса, знак умножения опускается, вместо основания 10 пишется буква е, а следом указывается порядок (показатель степени), например: 5,18е+02 (518), 10е-03 (0,01). 18 Логический тип - boolean. Переменные этого типа могут принимать значения True (истина), False (ложь). Память, выделяемая переменным этого типа, равна 1 байту. Символьный тип - char. Любые символы компьютерного алфавита, например: 'a', '5', '+', '$'. Значение переменной символьного типа обязательно нужно заключать в апострофы, причем сами апострофы не входят в состав символа. Тип данных очень важен при выделении памяти под переменные, т.к. каждому типу соответствует строго определенный размер ячейки памяти. Этот размер ограничен, а это значит, что все типы данных имеют ограниченный диапазон значений. С этим фактом программистам следует считаться. Константы могут быть именованными, типизированными и зарезервированными. Пример объявления именованных констант: сonst g = 9.8; - вещественная константа nmax = 100; - целая константа s = 'abcd'; - строковая константа kod = $123; - шестнадцатеричная константа Пример объявления типизированных констант: сonst ocenka: byte = 5; predmet : string = 'Информатика'; Без предварительного описания в программе можно использовать значения зарезервированных (предопределенных) констант. Идентификатор Тип Значение Описание true boolean true Истина false boolean false Ложь maxint integer 32 767 Максим. целое maxlongint integer 2 147 483 647 Макс. длинное целое Особенностью языка ТР является предоставляемая им возможность создания новых, пользовательских типов данных: перечисляемого и интервального. Описание перечисляемого типа данных имеет следующий вид, например: type days = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); var day: days; Интервальный тип задает две константы, определяющие границы диапазона для данной переменной - отрезок типа. Например: const min = 1; 19 max = 31; type days = min..max; var day1, day2: days; Перечисляемый и интервальный типы данных совместно с целыми, логическим и символьным относятся к порядковым типам. Порядковые типы обладают четырьмя характеристиками: Все возможные значения данного порядкового типа представляют собой упорядоченное множество и каждое возможное значение связано с порядковым номером, который является целым числом. Значения любого порядкового типа, за исключением целочисленного начинается с порядкового номера ноль (следующий порядковый номер 1, 2, 3…) Порядковым номером значения целочисленного типа является само значение. В любом порядковом типе каждому значению кроме первого есть предыдущее и каждому значению кроме последнего есть последующее. Для работы с данными порядковых типов в ТР используются функции: - Ord(s) – возвращает порядковый номер значения s в множестве, определенным типом s. - Pred(s) – возвращает элемент, предшествующий s в списке значений типа. - Succ(s) – возвращает значение, следующее за s в списке значений типа. Например: var d: (pen, note, book, pencil); переменная перечисляемого типа ……………… Ord (pen) вернет значение 0; Pred (3) вернет значение 2; Succ (2) вернет значение 3. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 20 Семинар №4. Классификация операторов 1. 2. 3. 4. 5. Классификация операторов в ТР. Оператор присваивания. Совместимость и преобразование типов данных. Операторы ввода-вывода данных. Форматы вывода данных. Алгоритм решения любой задачи состоит из отдельных шагов. В программе для каждого шага алгоритма записывается отдельная инструкция (команда). Отдельные инструкции записываются также для организации ветвлений и циклов. Эти инструкции в программировании называются операторами. Операторы языка ТР можно разделить на простые и сложные. Простые не содержат внутри себя других операторов. Сложные – представляют собой конструкции, содержащие простые операторы. К простым операторам относятся: присваивания, перехода, операторы вводавывода. К сложным операторам относятся: составной оператор, оператор условного перехода, оператор выбора, оператор присоединения в записях. Операторы могут объединятся в более крупные конструкции – составные операторы, процедуры и функции. Такие конструкции состоят из нескольких элементарных операторов. Оператор присваивания Для изменения значения переменной используется оператор присваивания. Оператор содержит операцию присваивания, которая обозначается двумя символами :=. Слева от операции присваивания указывается имя переменной, которой нужно присвоить новое значение, справа – значение, которое следует присвоить указанной переменной. Один оператор от другого отделяется точкой с запятой. Оператор присваивания имеет вид: ИмяПеременной:= выражение; Знак ‘:=’ читается, как "присвоить значение". Например: Sort:= 1; cena:= 12.34; x:= x+1; y:= x; name:= 'модель 1'; Оператор присваивания можно считать основным языком языка ТР, т.к. именно в нем выполняются практически все действия по обработке данных. Следует знать: - Оператор присваивания используется для изменения значений переменных. Он предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, стоящей в левой части; 21 - Имеется три вида выражений: арифметические, логические, символьные; - Тип результата, полученного при вычислении выражения, должен быть совместим по типу с переменной, которой он присваивается. Необходимо следить за тем, чтобы тип переменной совпадал с типом выражения. Если переменная REAL, а выражение INTEGER, то оператор выполнится успешно, в противном случае компилятор выдаст сообщение об ошибке. Например: Var X: integer; Y: real; Begin X:= 5; Y:= 0.5; Y:= Y + X; ------ так можно! X:= Y;------------ так нельзя! Нельзя с помощью оператора присваивания присвоить нескольким переменным одно и то же значение. Например: I:= J:= K:= M:= 0; ------------ так нельзя! I:= 0; J:= 0; K:= 0; M:= 0; ------- нужно так! Операторы ввода-вывода Ввод данных. Ввод данных – это передача исходных данных в ОП ПК. Для ввода данных в Паскале применяют операторы READ или READLN, которые имею одинаковый формат записи: READ(список ввода); В операторе после ключевого слова READ следует заключенный в круглые скобки список переменных, в котором переменные друг от друга отделяются запятыми. Оператор завершается точкой с запятой. Например: VAR A, B, C: REAL; READ(A,B,C); При выполнении оператора READ программа приостанавливает свои действия в ожидании ввода значений, которые по очереди в соответствии с приведенным в операторе списком будут присвоены переменным. Значения переменных могут вводиться с клавиатуры во время исполнения программы или читаться из файла. Тип вводимых значений должен соответствовать типу переменных. Оператор READLN по своим действиям аналогичен оператору READ, за исключением того, что по окончании чтения значения последней 22 переменной из списка ввода он дает указание на переход к началу новой строки. Оператор READLN может быть применен и без списка, тогда будет произведен переход на новую строку. Вывод данных. Вывод данных – это передача данных после обработки из ОП на внешние устройства. Вывод данных организуется операторами WRITE и WRITELN. Формат записи имеет вид: WRITE(список вывода); В списке вывода приводят разделенные запятыми переменные и выражения типа INTEGER, REAL, BOOLEAN, CHAR, заключенные в кавычки строки символов: WRITE(DAY[3], SIN(X), LETTERS, 'Результат ='); Формат вывода. Формат выводимых данных может быть изменен явным указанием числа отводимых позиций. Для этого после идентификаторов переменных в списке вывода указывается отведенная ширина поля для выводимой информации и точность представления числа (только для вещественных чисел). Эти две величины должны быть целыми и положительными, отделяться от имен и друг от друга двоеточием. Они соответственно указывают количество позиций в строке, отводимых под значение переменной, и количество мест под цифры дробной части. Например: WRITE('I =', I:3, 'K =', K:5:2); На экране появится I =-12 K =3.25 В отличие от WRITE, оператор WRITELN автоматически организует перевод курсора на новую строку. При его использовании последующий оператор WRITE, если он присутствует в программе, начинает вывод информации с новой строки. Оператор WRITELN без списка выводит пустую строку. Например, после выполнения операторов: WRITELN('ЗАДАЧА'); WRITELN('I=', I:3, '; К=’, K:5:2); WRITELN('Z=', Y); на экране появиться следующая информация: ЗАДАЧА I=-12; K=3.25 Y=3.7800E+02 Семинар №5. Выражения и стандартные функции языка ТР. Арифметические операции в ТР 1. Выражения. Их классификация и правила вычисления их значений. 2. Операции DIV и MOD. 23 3. Стандартные функции языка ТР. Действия, которые должен выполнить компьютер, указываются в выражениях. Выражение задает порядок выполнения действий над данными и состоит из операндов, круглых скобок и знаков операций. Операнды – это константы, переменные и функции языка ТР. Операции – это действия, выполняемые над операндами. Круглые скобки используются для изменения последовательности выполнения операций в выражении. Унарные операции, такие как смена знака (-а), относятся к одному операнду, бинарные – связывают два (а+в). В арифметических выражениях используются бинарные арифметические операции, представленные в следующей таблице: Операция Действие Тип операндов Тип результата + Сложение Целый, действительный Целый, действительный Вычитание -"-"* Умножение -"-"/ Деление -"-"Div Целочисленное Целый Целый деление Mod Остаток от деления -"-"Операции DIV и MOD Целочисленное деление DIV отличается от обычной операции деления тем, что возвращает целую часть частного, а дробная часть отбрасывается, например: 13 div 3 = 4. Результат div всегда равен нулю, если делимое меньше делителя. Например: 11 div 5 = 2 17 div –5 = -3 Взятие остатка от деления mod вычисляет остаток, полученный при выполнении целочисленного деления. Например: 10 mod 5 = 0 11 mod 5 = 1 Результат выполнения выражения заносится в переменную с помощью оператора присваивания. Вызов стандартной функции осуществляется путем указания в нужном месте программы имени функции и ее аргумента, заключенного в круглые скобки. После вычисления значения функции ее вызов заменяется результатом. Стандартные функции в языке ТР В арифметических выражениях часто используются следующие стандартные функции: 24 Стандартная функция Выполняемое действие Тип аргумента результата real real abs(x) |x| integer integer real real sqr(x) x2 integer integer real real sqrt(x) x integer real real real exp(x) ex integer real real real ln(x) ln(x) integer real pi число пи real real real sin(x) sin(x) integer real real real cos(x) cos(x) integer real real real arctan(x) arctg(x) integer real Есть еще несколько процедур и функций, которые также используются в программах: random(диапазон) – возвращает случайное число х, лежащее между 0<=x< диапазон. Если диапазон не указан, то функция возвращает число х в диапазоне 0<=x<1. Перед первым обращением к этой функции надо инициировать генератор случайных чисел с помощью процедуры randomize. В противном случае всегда будут выдаваться одни и те же числа. dec(x,n) – процедура, которая уменьшает значение целочисленной переменной на n. Например: x:= 10; dec(x,2); - результат = 8. Если функцию применить без обязательного параметра n, то значение x уменьшится на 1. inc(x,n) - процедура, которая увеличивает значение целочисленной переменной на n. Например: x:= 10; inc(x,3); - результат = 13. Если функцию применить без обязательного параметра n, то значение x увеличится на 1. frac(x) – функция, которая вычисляет дробную часть x. Например: write(frac(0.25*11):4:2); - результат = 0.75; int(x) – функция, которая вычисляет целую часть числа x. Например: write(int (422.117):4:2); - результат = 422.00; оdd(x) – функция определяющая четность или нечетность числа x. Результат возвращает true, если число нечетное и false – если число четное. Список рекомендуемой литературы: 25 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №6. Условный оператор. Применение логических выражений 1. 2. 3. 4. 5. 6. Условный оператор. Операции отношения. Вложенный условный оператор. Составной оператор. Оператор безусловного перехода. Оператор выбора CASE. Условные операторы обеспечивают выполнение или невыполнение некоторого оператора в зависимости от справедливости проверяемого условия. Эти операторы прерывают естественную линейную последовательность алгоритма, после чего алгоритм может пойти по одной из двух или более возможных ветвей в соответствии с заданным условием. Такая алгоритмическая конструкция называется ветвлением. Проверяемое условие обычно записывается в виде логического выражения, состоящего из одного или нескольких отношений. Основные операции отношения Операция = <> > < >= <= in Выражен ие Равно A=B Не равно A <> B Больше A >B Меньше A<B Больше или равно A >= B Меньше или равно A <= B Принадлежность A in B Название Результат true, если А равно В true, если А не равно В true, если А больше В true, если А меньше В true, если А больше или равно В true, если А меньше или равно В true, если А находится в списке В Операции отношения выполняют сравнение двух операндов и определяют, истинно значение отношения или ложно. Результат проверки любого условия, каким бы сложным оно не было, всегда имеет тип – Boolean. Следует знать: 26 - В ТР нельзя записать двустороннее неравенство вида 1 < x < 2. Нужно использовать логическое выражение (x > 1) and (x < 2); and – логическое И (умножение). - Нельзя писать x=y=z. Нужно записывать так (x = y) and (x = z); Логические выражения можно использовать в операторах присваивания и вывода. Например: Const a = 1; b = 2; var fl: Boolean; begin fl:= a > b; writeln('a = ', a,'; b = ', b); writeln('a > b – ', fl,'; a < b –', a < b); end. В ТР имеются две реализации ветвления. Это условный оператор IF и оператор выбора CASE. Условный оператор IF Условный оператор IF записывается двумя способами: 1-ый способ: if <условие> then begin <оператор1>; <оператор2>; ... end else begin <оператор5>; <оператор6>; ... end; 2-ой способ: if <условие> then begin <оператор1>; <оператор2>; ... end; Выполнение оператора начинается с вычисления условия и, если оно истинно, то выполняются операторы, стоящие после служебного слова then, а если ложно, то выполняются операторы, стоящие за служебным словом else. Часть оператора, стоящая после служебного слова else, может отсутствовать. 27 В этом случае выполнение передается операторам, стоящим после ';'. Один оператор if может входить в другой оператор if. В этом случае говорят о вложенности операторов. Графическое представление оператора IF представлено на следующих рисунках. да условие оператор1 условие нет да оператор2 нет оператор Вариант 1. if <условие1> then if <условие2> then <оператор1> else <оператор2> else <оператор3>; Вариант 2. if <условие1> then <оператор1> else if <условие2> then <оператор2> else <оператор3>; Вариант 3. if <условие1> then if <условие2> then <оператор1> else <оператор2>; Следует знать, что: - при вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует; - конструкций со степенью вложенности более 2 – 3 следует избегать изза сложности их анализа; 28 - в условных операторах часто используется составной оператор begin… end; - в условных операторах не ставится ';' после then и перед else. Оператор безусловного перехода GOTO имеет общий вид: GOTO <метка>; где метка – любое целое число без знака в диапазоне от 0 до 9999 или буквенное выражение. Метка ставится перед оператором, которому передается управление и отделяется от него двоеточием. Метка должна быть описана в разделе LABEL. Оператор выбора Case При реализации алгоритма, имеющего более двух ветвей, иногда вместо нескольких вложенных друг в друга операторов IF удобно использовать оператор выбора CASE. Общий вид оператора: CASE <выражение-селектор> OF <список1 значений селектора> : begin < инструкции 1;> end; <список2 значений селектора> : begin < инструкции 2;> end; … <списокN значений селектора> : begin < инструкции N;> end ELSE begin < инструкции;> end; END; Ветвь ELSE может отсутствовать. Выполнение оператора CASE начинается с вычисления выраженияселектора. Инструкции между begin и end выполняются в том случае, если значение выражения после слова CASE совпадает со значением селектора из соответствующего списка. Если это не так, то выполняются инструкции, идущие после ELSE. Если же ELSE отсутствует, то управление передается оператору, стоящему за оператором CASE. Селектор может иметь только следующий тип данных: интервальный, перечисляемый, логический, символьный и целый типы. Запрещены: вещественный и строковый типы. Список значений селектора может состоять из произвольного количества значений констант и интервалов, отделенных друг от друга 29 запятыми. Все значения селектора должны быть уникальными, а диапазоны не должны пересекаться. Тип значений должен быть совместим с типом селектора, например: VAR S: CHAR; BEGIN READLN(S); CASE S OF '0'..'9' : WRITE('Цифра'); 'A'..'Z' : WRITE('Прописная буква'); 'a'..'z' : WRITE('Строчная буква') ELSE WRITE('Другие символы'); END; Следует знать, что: 1. Инструкция CASE является обобщением IF и используется для выбора одного из нескольких направлений дальнейшего хода программы; 2. Выражение-селектор должно иметь порядковый тип: чаще всего integer, реже – char и boolean. 3. Список выбора может состоять из произвольного количества значений или диапазонов, отделенных друг от друга запятыми. Границы диапазона записываются двумя константами через разграничитель "..". Тип констант должен совпадать с типом селектора. 4. Точка с запятой не ставится после последнего элемента списка выбора. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар № 7. Циклические алгоритмы. Операторы итерационных и детерминированных циклов 1. 2. 3. 4. 5. Циклы. Разновидности циклических алгоритмов. Циклы с предусловием. Циклы с постусловием; Циклы с параметром. Вложенные циклы. 30 В программах, связанных с обработкой данных, часто приходится выполнять циклически повторяющиеся действия. Например, присвоение начального значения нескольким сотням переменных. Циклы позволяют записать такие действия в компактной форме. Поэтому, они являются одной из важнейших алгоритмических структур. Цикл представляет собой последовательность операторов, которая повторяется неоднократно. В алгоритмическом языке ТР имеются три вида операторов цикла, которые используются для реализации алгоритмов циклической структуры: 1. оператор FOR – оператор цикла с параметром; 2. оператор WHILE – оператор цикла с предварительным условием; 3. оператор REPEAT – оператор цикла с последующим условием. Оператор цикла с предусловием Оператор цикла с предусловием - WHILE используется для программирования итерационных циклов, т.е. если необходимо произвести некоторые повторяющиеся вычисления, но число повторов неизвестно, а также для программирования детерминированных циклов, если шаг изменения параметра цикла отличен от 1 и –1. Общий вид оператора WHILE: WHILE <логическое выражение> DO <оператор цикла>; Или WHILE <логическое выражение> DO BEGIN <блок операторов цикла>; END; Схема, реализующая оператор WHILE имеет следующий вид: условие нет да Операторы цикла Оператор WHILE действует следующим образом: сначала проверяется условие, и пока оно "истинно", выполняются все операторы цикла, записанные после DO. Как только логическое выражение принимает значение "ложь", происходит выход из цикла. 31 Следует знать, что: Число повторений цикла определяется в ходе работы программы и заранее неизвестно; Условие – это выражение логического типа, которое может принимать одно из двух значений: true или false; В теле цикла обязательно должен присутствовать оператор, оказывающий влияние на условие выполнения инструкций цикла; Цикл WHILE – это цикл с предварительным условием, это значит, что если проверяемое условие ложно, то операторы цикла вообще могут быть не выполнены. Цикл WHILE считается самым универсальным видом цикла; В операторе WHILE никогда не ставится ";" после слова DO. - - Оператор цикла с постусловием Оператор цикла с постусловием - REPEAT используется для программирования итерационных циклов. Схема, реализующая оператор цикла REPEAT, является схемой итерационного цикла с последующим условием. Оператор REPEAT действует следующим образом: выполняются все операторы циклической части, записанные между операторами REPEAT и UNTIL. Затем проверяется логическое выражение и если оно ложно, то вновь выполняются все операторы цикла до тех пор, пока логическое выражение не примет значение "истина". Общий вид оператора REPEAT: REPEAT <блок операторов цикла>; Операторы UNTIL <логическое выражение>; цикла Если логическое выражение истинно с самого начала, то операторы циклической части выполняются один раз. условие да нет Цикл с параметром. Оператор FOR Оператор цикла FOR используют для программирования детерминированных циклов, т.е. в том случае, когда заранее известно число повторений цикла. Этот вид оператора цикла называют циклом со счетчиком или циклом с параметром. В нем важную роль играет переменная-параметр, который автоматически изменяет свое значение либо на 1, либо на –1. Общий вид оператора FOR: FOR I:= N1 TO N2 DO <оператор цикла>; Или 32 FOR I:= N1 TO N2 DO BEGIN <блок операторов цикла> END; где I – параметр цикла; N1 – начальное значение параметра цикла; N2 – конечное значение параметра цикла. Схема, реализующая действие оператора FOR имеет вид: I=N1,N2 Оператор или блок операторов цикла Параметры I, N1, N2 должны быть одного и того же скалярного типа, но не REAL. Параметр цикла I принимает последовательные значения от N1 до N2, увеличиваясь на 1. Например, при реализации следующего оператора: FOR K:= 1 TO 50 DO WRITELN(K:3); на печать будут выданы натуральные числа от 1 до 50. Если параметр цикла изменяется от большей величины к меньшей, уменьшаясь на –1, то оператор будет иметь вид: FOR I:= N2 DOWNTO N1 DO <оператор цикла>; Например, при выполнении оператора FOR I:= 100 DOWNTO 50 DO WRITELN(K:3); на печать будут выданы натуральные числа от 100 до 50. Следует отметить, что внутри цикла нельзя изменять значения параметров I, N1, N2. После завершения цикла FOR значение параметра цикла I становится неопределенным. Нельзя передавать внутри цикла управление извне, минуя оператор FOR. Следует знать, что: 1. Оператор цикла FOR используется для организации циклов с фиксированным числом повторений; 2. Количество повторений цикла определяется начальным и конечным значениями переменной-счетчика. Оператор FOR обеспечивает выполнение до тех пор, пока не будут перебраны все значения параметра цикла. 33 3. Переменная-счетчик должна быть порядкового типа, чаще всего integer. Использование вещественного типа недопустимо. 4. Параметр цикла может изменяться (увеличиваться или уменьшаться) каждый раз при выполнении цикла только на единицу. 5. Для досрочного выхода из цикла можно использовать оператор GOTO. Вложенные циклы В теле любого оператора цикла могут находиться другие операторы цикла. При этом, цикл, содержащий в себе другой, называется внешним, а цикл, находящийся в теле первого – вложенным или внутренним. Правила организации внешнего и внутреннего циклов такие же, как и для простого цикла. При программировании вложенных циклов необходимо соблюдать следующее условие: все операторы внутреннего цикла должны располагаться полностью в теле внешнего цикла. Представленный ниже пример фрагмента программы вывода на экран таблицы умножения демонстрирует применение вложенных циклов. var i, j: byte; begin for i:= 1 to 10 do for j:= 1 to 10 do writeln(i, '*', j, ' = ', i*j); end. На блок-схеме наглядно показано, что при вложении циклов внутренний цикл выполняется полностью от начального до конечного значения параметра, при неизменном значении параметра внешнего цикла. Затем значение параметра внешнего цикла изменяется на единицу, и опять от начала и до конца выполняется вложенный цикл. И так повторяется до тех пор, пока значение параметра внешнего цикла не станет больше конечного значения, определенного в операторе FOR внешнего цикла. I=N1,N2 I=N1,N2 Оператор или блок операторов цикла Пример программы вычисления суммы степеней для натурального числа N 34 ( 1 )n ( 1 )n ... ( 1 ) n , в которой используется вложенный цикл: 1 2 n var n, i, j: integer; a, s, p: real; begin write ('введите показатель степени: '); readln (n); s:= 0; {обнуление начального значения суммы} for i:= 1 to n do {начало внешнего цикла} begin a:= 1/i; p:= a; for j:= 2 to n do p:= p*a; {вычисление слагаемого} s:= s+p; {накопление суммы} end; writeln ('сумма степеней: ', s); end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар № 8 Структурированные типы данных. Одномерные и двумерные массивы 1. 2. 3. 4. 5. 6. Массивы как агрегаты данных. Одномерные и многомерные массивы. Расположение массивов в ОП. Организация доступа к элементам массива. Действия над массивами. Сортировка массивов. Если работа программы связана с хранением и обработкой большого количества элементов одного типа, то для их представления в программе можно использовать массивы. Массив (индексированные переменные) – подмножество однотипных переменных, объединенных по какому-либо признаку и имеющих общее имя. Отдельные величины, составляющие массив, называются его элементами. 35 Элементы массива пронумерованы, и обратиться к каждому из них можно по номеру. Номера элементов массива иначе называются индексами, а сами элементы массива – индексированными переменными. Характеристика массива: Тип – общий тип для всех элементов массива; Размерность – количество индексов массива; Диапазон изменения индекса (индексов) – определяет количество элементов массива. Массивы чаще всего на практике бывают одномерными и двумерными. Вектор или одномерный массив – это массив, в котором элементы нумеруются одним индексом. Если в массиве хранится таблица значений (матрица), то такой массив называется двумерным, его элементы нумеруются двумя индексами – номером строки и номером столбца. Массивы большей размерности встречаются на практике редко. В памяти компьютера все элементы массива обязательно занимают одну непрерывную область – массив, отсюда и произошло название. Двумерные массивы располагаются в памяти по строкам: сначала все элементы первой строки, затем второй и т.д. В качестве индекса элемента массива используется выражение порядкового типа, чаще всего индекс – это переменная типа integer. При обращение к элементу массива индекс указывается в квадратных скобках после имени массива, например: A[5], B[1,2]. Массивы объявляются в разделе описания переменных var. Тип массив обозначается зарезервированным словом ARRAY, после которого указывается диапазон изменения номеров элементов и, после зарезервированного слова OF, тип элементов массива. Объявление массива задаётся следующим образом: <имя массива>: ARRAY [границы индексов] OF <тип>. Например: var a: array[1..100] of integer; ----- 100 элементов – целые числа; b: array[0..50] of char; ---------- 51 элемент – символы; c: array[-1..20] of real; ----------- 22 элемента – вещественные числа. Для двумерных массивов: var y: array[1..3,1..4] of integer; ----- массив из 12 целых чисел (3 х 4); x: array[1..5,1..4] of real; ----------- массив из 20 вещественных числа. Например, пусть в памяти компьютера расположена таблица чисел: 1 2 3 4 5 6 7 8 9 10 11 12 36 Для адресации элементов таблицы требуется два индекса – номер строки и номер столбца. Индекс 1 в данном примере принимает значение от 1 до 3 (3 строки), а индекс 2 может меняться от 1 до 4. Нижняя граница индекса отделяется от верхней двумя точками. Нижняя граница не должна превосходить верхнюю. При описании массива широко используется предварительное описание типа в разделе описания типов данных. Например: type ИмяТипа = array[НижГранИнд1..ВерхнГранИнд1, НижГранИнд2..ВерхнГранИнд2] of ТипЭлементов; var ИмяМассива: ИмяТипа; Например: const row = 10; col = 15; type matr = array[1..row, 1..col] of integer; var mas: matr; Для ввода и вывода элементов массива используется цикл for, в котором параметром цикла будет индекс (порядковый номер) элемента массива. Для двумерных массивов применяются вложенные циклы. Пример 1. В заданном массиве A1, A2, …, A30 найти и вывести на печать сумму и произведение всех элементов массива. program mas1; var i, s, p: integer; mas1: array [1..20] of integer; begin for i:= 1 to 20 do readln(mas1[i]); s:= 0; p:= 1; for i:= 1 to 20 do begin s:= s + mas1[i]; p:= p * mas; end; writeln(s, p); end. 37 Организация доступа к элементам массива. Действия над массивами Массивы, объявленные в разделе описания переменных, следует заполнять данными, прежде чем выполнить над ними какие-то действия. Значения элементов массива можно задать следующими способами: Ввести данные с клавиатуры; Присвоить элементам заданные значения; Считать значения из файла. В любом случае для заполнения массива используется цикл FOR. Для двумерных массивов используются вложенные циклы. Пример заполнения одномерного массива из 5 элементов при помощи ввода значений с клавиатуры: for i:= 1 to 5 do readln(a[i]); Пример заполнения матрицы 3х4 (всего 12 чисел) с клавиатуры: for i:= 1 to 3 do for j:= 1 to 4 do readln(a[i,j]); Иногда необходимо заполнить массив нулями, т.е. обнулить. for i:= 1 to 5 do a[i]:= 0; или for i:= 1 to 3 do for j:= 1 to 4 do a[i,j]:= 0; Вывод значений элементов массива также выполняется с помощью цикла FOR с использованием операторов write и writeln. Например, вывод вектора из пяти элементов выглядит так: for i:= 1 to 5 do writeln (a[i]); - в столбец; for i:= 1 to 5 do write (a[i], ' '); - в строку через пробел-разделитель; for i:= 1 to 5 do write (a[i]:4); - с заданным форматом. Вывод матриц по строкам и столбцам выполняется при помощи оператора writeln; (без параметра). Он используется после вывода текущей строки матрицы для перевода курсора в начало следующей строки: for i:= 1 to 3 do begin for j:= 1 to 4 do write(a[i,j]:4); writeln; end; 38 Действия с одномерными массивами При обработке массивов часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значение и номер максимального и минимального элементов, а также изменить значения элементов массива. Условимся, что в векторе a содержится n элементов. {Вычислим сумму элементов:} s:= 0; for i:= 1 to n do s:= s + a[i]; {Вычислим произведение элементов:} р:= 1; for i:= 1 to n do р:= р*a[i]; {Подсчитаем количество четных элементов:} k:= 0; for i:= 1 to n do if a[i] mod 2 = 0 then k:= k + 1; {Найдем номер первого из элементов массива, имеющего нулевое значение. Если такого элемента нет, то выведем соответствующее сообщение:} i:= 0; repeat i:= i+ 1; until (a[i] = 0) or (i = n); if a[i] = 0 then writeln('Номер нулевого элемента = ', i) else writeln('Таких элементов нет'); {Если требуется найти номера всех нулевых элементов, то лучше применить оператор FOR:} for i:= 1 to n do if a[i] = 0 then write(i, ' '); {Поиск максимального элемента и его номера. Переменная max хранит максимальное значение элемента, а k – его номер.} max:= a[i]; k:= 1; for i:= 2 to n do if a[i] > max then begin max:= a[i]; k:= i; end; 39 Многомерные массивы (матрицы). Организация доступа к элементам двумерного массива Для описания многомерных массивов в Pascal существует целый ряд способов. Следующие группы операторов задают описание одного и того же двумерного массива А, представляющего собой таблицу размером 23 (2 строки, 3 столбца) Первый способ: Type Stroka = array [1..3] of real; Matr = array [1..2] of stroka; Var V: stroka; A: matr ; Второй способ: Type Matr= array [1..2] of array [1..3] of real; Var A: matr; Третий способ: Type Matr = array [1..2,1..3] of real; Var A: matr; Четвёртый способ: Var A: array [1..2,1..3] of real; В первом способе описания переменная V объявлена как одномерный массив из трёх элементов вещественного типа. Переменная А имеет смысл двумерного массива из двух строк, в каждую из которых включено по три элемента. Второй, третий и четвертый способы описания массива получаются из первого путем его последовательного упрощения. Так второй способ описания получен из первого путём исключения определения типа stroka в определении типа matr. Задание значений элементам массива может выполняться при помощи операторов присваивания: A [1, 2] := 2.3 + P1 Другим способом задания значений элементам массива является поэлементный ввод. Также поэлементно может осуществляться и вывод. 40 Действия с двумерными массивами Для обработки двумерных массивов применяются вложенные циклы FOR. Рассмотрим примеры обработки двумерных массивов. Пример 1. Поиск минимального (максимального) элемента матрицы и индексов его строки и столбца. uses crt; var min,i,j,k,m: integer; a: array [1..5,1..5] of integer; begin clrscr; randomize; for i:= 1 to 5 do begin for j:= 1 to 5 do begin a[i,j]:= random(100); write(a[i,j]:4); end; writeln; end; min:= a[1,1]; for i:= 1 to 5 do for j:= 1 to 5 do if min > a[i,j] then begin min:= a[i,j]; k:= i; m:= j; end; writeln; writeln('min = ', a[k,m], ' str = ',k:2,' stolb = ',m:2); readln end. Пример 2. Программа заполнения двумерного массива при n=6 и m=8: 41 1 8 9 16 2 7 10 15 3 6 11 14 4 5 12 13 змейкой. Решение Для того чтобы заполнить массив указанным образом, надо вывести правило заполнения. В данном случае правило будет таким: если ряд нечетный (то есть когда номер строки − нечетное число), то А[i,j] = (i-1)*m+j, иначе (т.е. когда строка четная) A[i,j] = i*m-j+1. uses crt; const n = 6; m = 8; var a: array[1..n,1..m] of integer; i,j,k: integer; begin for i:= 1 to n do begin for j:= 1 to m do begin if i mod 2 = 0 then a[i,j]:= i*m - j + 1 else a[i,j]:= (i-1)*m + j; write(a[i,j]:3); end; writeln; end; readln end. Сортировка массивов 1. Виды сортировок массивов. 2. Линейная сортировка. 3. Сортировка обменом. Сортировка - это процесс упорядочивания набора данных одного типа по возрастанию или убыванию значения какого-либо признака. При сортировке элементы массива меняются местами таким образом, что их значения оказываются упорядоченными или по возрастанию или по убыванию. В большинстве случаев речь идет о сортировке одномерных массивов. Сортировка массивов – одно из наиболее важных действий над массивами в системах сбора и поиска информации, т.к. в отсортированных массивах гораздо легче можно найти нужную информацию. Существуют множества способов сортировки массивов. Один из способов сортировки массивов: 42 Линейная сортировка (сортировка отбором) Идея линейной сортировки массива заключается в том, чтобы последовательно просматривать все элементы массива, отыскать наименьший (или наибольший) элемент и поменять его местами с первым из рассматриваемых элементов. Затем, просматриваются элементы массива, начиная со второго, снова находить наименьший (или наибольший), который меняется местами со вторым элементом и т.д. Повторяя указные операции с изменением точки отсчета начала поиска минимального (или максимального) из оставшихся элементов, получим отсортированный по возрастанию (или по убыванию) массив. Пример программы линейной сортировки: const n = 10; var a: array[1..n] of integer; i,j,m: integer; begin for i:= 1 to n do begin write('a[',i,']= '); readln(a[i]); end; for i:= 1 to n - 1 do for j:= i + 1 to n do begin if a[i] > a[j] then begin m:= a[i]; a[i]:= a[j]; a[j]:= m; end; end; for i:= 1 to n do writeln(a[i]); readln; end. Сортировка обменами (метод "пузырька") При сортировке обменами организуется последовательный перебор массива A1, A2, A3, …, AN и сравнение значений двух соседних элементов на выполнение условия Ai< Ai+1. При выполнении условия элементы меняются местами, и просмотр возобновляется с очередного элемента - Ai+1. По завершении цикла сравнений наибольший элемент массива придвигается на последнее место, а просмотр массива возобновляется с первого элемента при уменьшении на единицу количества просматриваемых элементов (до N-1 43 элемента), т.к. наибольший из оставшихся элементов после каждого просмотра будет оказываться в конце. Массив будет упорядочен до конца после просмотра, в котором участвуют только первый и второй элементы, следовательно, количество просмотров ограничено значением N-1. program massor2; var j,i,m,n: integer; a: array[1..10] of integer; begin readln(n); for i:= 1 to n do readln(a[i]); for i:= 1 to n-1 do begin for j:= 1 to n-1 do if a[j] > a[j+1] then begin m:= a[j]; a[j]:= a[j+1]; a[j+1]:= m; end; end; for i:= 1 to n do writeln('***** ',a[i]:3); readln; end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №9. Символьный и строковый типы данных 1. 2. 3. 4. 5. Символьный тип данных. Стандартные функции обработки символьного типа. Строковый тип данных. Расположение строк в ОП. Операции над строками. Процедуры и функции обработки строковых данных. 44 Обработка данных символьного типа Для работы с текстом в ТР имеется два типа данных: char – литерный или символьный тип; string – строковый или стринговый тип. Значением переменных символьного типа является один символ. Каждому символу соответствует код символа – целое число в диапазоне от 0 до 255. Из этого следует, что символьный тип – это порядковый тип, т.е. каждому символу соответствует целое число, лежащее в диапазоне от 0 до 255. Это первый момент, который нужно уяснить – все действия по обработке символов сводятся к действиям над целыми числами, расположенными строго по порядку. Над данными символьного типа определены операции отношения: =, <>, <, >, <=, >=, вырабатывающие результат логического типа. При выполнении всех операций сравнения коды символов сравниваются как обычные целые числа. При этом получается, что любая заглавная буква всегда меньше соответствующей ей строчной, т.к. в кодовой странице сначала расположены заглавные буквы, а затем строчные. Точно также, любая буква латинского алфавита меньше любой буквы русского алфавита, даже если их изображения на экране практически неразличимы (например, A латинская, А русская). Для данных символьного типа определены следующие стандартные функции: Chr(x) – возвращает значение символа по его коду; Chr(129) 'Б'. Ord(ch) – возвращает код заданного символа; Ord('A') 65. Pred(ch) – возвращает предыдущий символ; Pred('Б') 'А'. Succ(ch) – возвращает следующий символ; Succ('Г') 'Д'. Upcase(ch) – преобразует строчную букву в прописную. Upcase('n') 'N'. Обрабатывает буквы только латиницы. Строки. Обработка строковых данных К структурированным типам данных относятся также строки. Строка – это последовательность символов. Максимальное количество символов в строке (длина строки) может изменяться от 1 до 255. переменную строкового типа можно определить в разделе определения типов или в разделе объявления переменных. Type ИмяТипа = string [максимальная длина строки]; Var Идентификатор1, Идентификатор2, …: ИмяТипа; 45 Или строковые переменные указываются только в разделе объявлений после слова VAR, например: VAR FIO: STRING[15]; STROK: STRING; Если строковая константа используется в программе несколько раз, то ее целесообразно объявить в разделе констант, например: CONST STR = 'STROKA'; Если максимальная длина строки не указывается, то она равна 255 байт. Строка в языке ТР трактуется, как массив символов. Для строки из n символов в памяти ПК отводится n+1 байт, n байтов для хранения символов строки, а один дополнительный байт – для значения текущей длины строки. Этот дополнительный байт имеет номер 0, соответственно первый символ строки имеет номер 1, второй – 2 и т.д. Например, переменная strok типа string[15] хранится в памяти таким образом: Strok:= 'колледж Мирас'; Номер байта Его значение 0 13 1 к 2 о 3 л 4 л 5 е 6 д 7 ж 8 9 10 11 12 13 14 15 М и р а с Вся строка занимает 16 байтов, из них 2 байта остались незанятыми, т.к. реальная длина строки составляет 13 символов, это значение и хранится в нулевом байте строки. Незанятые байты составляют "хвост" строки, в котором может находиться любой "мусор", однако программа не будет обращаться к "хвосту", т.к. реальный размер строки ей известен. Из этого примера становиться понятным, почему максимальная длина строки может быть равна 255 символам, т.к. для хранения длины строки отведен всего лишь один байт, а число 255 в двоичном представлении выглядит как восемь единиц, т.е. 1111 1111. К отдельным символам строки можно обратиться как к элементу одномерного массива, т.е. с помощью индексов в квадратных скобках, например FIO[5]; STROK[24]; При вводе строки количество символов в ней определяется автоматически, при этом автоматически заполняется нулевой байт. В отличие от массивов переменные строкового типа могут целиком участвовать в операторах ввода/вывода. Например: Readln(st1); writeln(st2); Строковые данные используются в строковых выражениях. Операндами строковых выражений могут быть строковые константы, переменные, встроенные функции для обработки строк. Над строковыми данными могут выполняться операции присваивания, сцепления, отношения. 46 Операция присваивания. При записи операции присваивания строка символов заключается с двух сторон в апострофы, например: FIO:= 'Иванов И.И.'; Если длина строкового выражения превышает максимальную длину строковой переменной, то все лишние символы справа отбрасываются. Ввод с клавиатуры значений строковых переменных осуществляется оператором READLN, причем строка символов, предназначенная для ввода, набирается на клавиатуре без апострофов, начиная с первой позиции. Например, для ввода в переменную STROK с клавиатуры строки символов STROKA необходимо записать: READLN(STROK); На клавиатуре набрать STROKA и нажать клавишу Enter. Для исключения ошибок надо использовать для ввода оператор READLN, а не READ. Операция сцепления. Операция сцепления применяется для объединения нескольких строк в одну результирующую строку. Для обозначения операции сцепления применяется знак '+'. Пример: STR1:= 'Колледж'; STR2:= 'Мирас'; STR:= STR1 + ' ' +STR2; В результате получится 'Колледж Мирас'. Операции отношения. Операции отношения осуществляют сравнение двух строковых операндов и имеют более низкий приоритет, чем операции сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается большей, в которой первый несовпадающий символ имеет больший номер в кодовой таблице ПК. Результат выполнения операций отношения над строковыми операндами всегда имеет логический тип и принимает значение TRUE или FALSE. Строки считаются равными, если они полностью совпадают по текущей, а не по объявленной длине и содержат одни и те же символы. Например, в результате выполнения программы: program primer; var str1: string[6]; str2: string[8]; begin str1:= 'stroka'; str2:= str1; if str1 = str2 then writeln('str1 равна str2') else writeln('str1 не равна str2'); end. будет выведено Str1 равна Str2. 47 Необходимо учитывать, что одинаковые строчные (маленькие) и прописные (большие) буквы имеют разные номера в кодовой таблице ПК, поэтому они определяют разные значения строковых переменных. Так, если ST1:= 'abc', а ST2:= 'ABC', то строки ST1 и ST2 не равны. Для обработки строковых переменных применяются процедуры и функции, которые специально предназначены для работы со строками. Для упрощения описания примем, что STR, STR1 и STR2 переменные типа STRING, а I, K – переменные типа INTEGER. 1. LENGTH(STR) – функция, которая вычисляет фактическое количество символов в строке. 2. COPY(STR,I,K) - функция, которая выделяет из строки STR подстроку длиной K, начиная с позиции I. Если I > LENGTH(STR), то результат будет пробел. 3. DELETE(STR,I,K) – процедура, которая удаляет из строки STR подстроку, начиная с позиции I, длиной K символов. 4. INSERT(STR1,STR2,I) – процедура, которая вставляет строку STR1 в строку STR2, начиная с позиции I. 5. POS(STR1,STR2) – функция, которая определяет наименьший номер (позицию) символа в строке STR2, начиная с которого строка STR1 входит в строку STR2. 6. STR(I,STR) – процедура, которая преобразует численное значение I в строку STR. Пример программы, использующей строковый тип данных: Ввести с клавиатуры n строк, каждая из которых содержит фамилию, имя и отчество уч-ся. Ввод каждой строки завершается нажатием клавиши Enter. Вывести список уч-ся в алфавитном порядке. program fio; var i,n,j: integer; st: string; fios: array[1..30] of string; begin readln(n); for i:= 1 to n do readln(fios[i]); for i:= 1 to n-1 do for j:= 1 to n-1 do begin if fios[j] > fios[j+1] then begin st:= fios[j]; fios[j]:= fios[j+1]; fios[j+1]:= st; end; end; 48 for i:= 1 to n do writeln(fios[i]); end. Числа и строки Часто возникает необходимость получить строковое представление числа и наоборот (например, получить строку '13' из числа 13). Для работы с числами и строками применяются две процедуры. 1. Str(N, St) − переводит числовое значение N в строковое и присваивает результат строке St, причем можно переводить как целые числа, так и вещественные. Примеры - Str(1234, St) − после выполнения St='1234'; - Str (452.567, St) − переводим вещественное число с фиксированной запятой, результат St='452.567'; - Str(4.52567е+2, St) − переводим вещественное число в экспоненциальной форме, результат St='4.52567e+2'. 2. Val(Str, N, К) − переводит строковое значение в числовое. Если данная строка действительно является записью числа (целого или вещественного), то значение К=0, а N − это искомое число, иначе К будет равно номеру первого символа, с которым процедура Val "не справилась". Примеры - Val('1234', n, k) - n=1234, k=0; Val('234.56', n, k) - n=234.56, k=0; Val('2.3456e+2', n, k) - n=2.3456e+2, k=0; Val('12-45', n, k) k=3, так как знак "−" в записи чисел может быть только на первом месте; - Val('2,567m', n, k) k=2, так как разделительным знаком между целой и дробной частями является точка, а не запятая; - Val ('5.87с-5') k=5, так как символ 'с' не должен встречаться в записи вещественного или целого числа. Пример программы на закрепление темы: Составить программу, определяющую курс обучения в колледже «Мирас» студентов. Применить процедуру преобразования числа в строку для вывода результата на экран. uses crt; var c: string; 49 d,k,m: integer; begin writeln('Введите год поступления в колледж'); readln(d); writeln('Введите текущий год'); readln(k); writeln('Введите текущий месяц'); readln(m); case m of 9..12: str((k-d)+1,c); 1..8: str((k-d),c); end; writeln('Вы учитесь на '+ c +' курсе колледжа «Мирас»'); end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 50 IV семестр. Семинар №10 Множественный тип данных 1. Определение множественного типа данных. 2. Описание множественного типа данных. 3. Операции над множествами, использование множеств. Множества - это наборы однотипных логически связанных друг с другом данных. Количество элементов, входящих в множество, может меняться в пределах от 0 до 255. Именно непостоянством количества своих элементов множества отличаются от массивов. Элементы множества не пронумерованы, поэтому, нельзя обратиться к отдельному элементу множества по его индексу. Тип элементов множества называется базовым типом множества. Область значений типа множества – это набор всевозможных подмножеств, составленных из элементов базового типа. В ТР имеются ограничения на базовый тип. Это может быть только порядковый тип, количество значений которого не превышает 256, из простых типов к таким относятся Char, Byte, Boolean. Разрешается использовать перечисляемый тип и диапазон. Для ряда задач применение множеств может обеспечить серьезные преимущества по сравнению с использованием других структур данных – массивов или строк. При задании значений элементов множества используются квадратные скобки. Например: [1,2,3,4], [‘a’..’z’], [‘a’,’b’,’c’]. Множество, не содержащее элементов, называется пустым. Пустое множество может быть включено в любое другое множество. Описание типа множества имеет вид: <имя типа> set of <базовый тип> Здесь <имя типа> - правильный идентификатор, set of зарезервированные слова (множество из), <базовый тип> - базовый тип элемента множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, LongInt. Два множества называются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое. Пример объявления и определения множества: Type MnogChar = set of '0'..'9'; MnogCifr = set of 0..9; 51 Var S1, S2, S3: MnogChar; S4, S5, S6: MnogCifr; Begin …… S1:= ['1', '2', '3']; S2:= ['3', '2', '1']; S3:= ['2', '3']; S4:= [0..3, 6]; S5:= [4, 5]; S6:= [3..9]; …… End; В этом примере множества S1 и S2 эквивалентны, а множество S3 включено в S2, но не эквивалентно ему. Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделяемых друг от друга запятыми; список обрамляется квадратными скобками. Спецификации могут быть константы или выражения базового типа, а также тип-дапазон того же базового типа. Над множествами определены следующие операции: * - пересечение множеств; результат содержит элементы, общие для обоих множеств; например, S4*S6 содержит [3], S4*S5 – пустое множество. + - объединение множеств; результат содержит элементы первого множества, дополненные недостающими элементами из второго множества: o S4 + S5 содержит [0,1,2,3,4,5,6]; o S5 + S6 содержит [3,4,5,6,7,8,9]; - - разность множеств; результат содержит элементы из первого множества, которые не принадлежат второму: o S6 – S5 содержит [3,6,7,8,9]; o S4 – S5 содержит [0,1,2,3,6]; = - проверка эквивалентности; возвращает True, если оба множества эквивалентны. <> - проверка неэквивалентности; возвращает True, если оба множества неэквивалентны. <= - проверка вхождения; возвращает True, если первое множество включено во второе. >= - проверка вхождения; возвращает True, если второе множество включено в первое. In - проверка принадлежности; в этой операции первый элемент – выражение, а второй – множество одного и того же типа; возвращает True, если выражение имеет значение, принадлежащее множеству; 52 o 3 in S6 возвращает True; o 2*2 in S1 возвращает False. Дополнительно к этим операциям можно использовать две процедуры. Include - включает новый элемент во множество. Обращение к процедуре: o Include (S, I), Здесь S – множество, состоящее из элементов базового типа, I – новый элемент, который необходимо включить во множество. Exclude – исключает элемент из множества, например: o Exclude(S, I). Исходя из особенностей внутреннего представления множеств, можно сделать следующие выводы: в множестве не может быть двух одинаковых элементов; все операции над множествами выполняются значительно эффективней, чем над другими структурами данных. Пример. Даны два множества M1 и M2 натуральных чисел (множества задаются произвольно). Нужно получить третье множество M3, состоящее из объединенных двух первых множеств, M4 - разность множеств М1 и М2, включить в М4 элемент, равный 22, если такого элемента нет в М4, исключить из М3 элемент, равный 15, если такой элемент есть в М3. uses crt; type mnog = set of 1..100; var i,k: integer; m1,m2,m3,m4: mnog; begin clrscr; m1:= [1..9]; m2:= [1..7,15,18]; m3:= m1+m2; m4:= m1-m2; if 22 in m4 then writeln('число 22 уже есть в M4') else include (m4,22); if 15 in m3 then exclude (m3,15); writeln; for i:= 1 to 100 do if i in m4 then 53 write(' M4 - ',i:3); writeln; for i:= 1 to 100 do if i in m3 then write(' M3 - ',i:3); readln; end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №11 Комбинированные типы - записи 1. Иерархические записи. 2. Оператор присоединения. При работе с массивами основное ограничение заключается в том, что все элементы массива должны быть одного типа. Иногда для решения задач необходимо хранить и обрабатывать данные различного типа. Для таких данных применяется комбинированный тип данных – записи. Запись – это структура данных, состоящая из фиксированного количества компонентов, называемых полями записи. В отличие от массива, компоненты (поля) могут быть разного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются. Записи объявляются следующим способом: 1. Сначала объявляется тип записи: Type ИмяТипа = record ИмяПоля1: ТипПоля1; ИмяПоля2: ТипПоля2; ... end; 2. Затем объявляются переменные соответствующего типа: Var ИмяПеременной: ИмяТипа; 54 Например: Type Avto = record Number: integer; Marka: string[20]; Fio: string[40]; Address: string[60]; End; Var m,v: avto; {номер автомобиля} {марка автомобиля} {фамилия владельца} {адрес владельца} Type Birthday = record Day, Month: byte; {день и месяц рождения} Year: word; {год рождения} End; Var a,b: BirthDay; Обращение к значению поля осуществляется с помощью имени переменной и имени поля, разделенных точкой. Такая комбинация называется составным именем. Например, чтобы получить доступ к полям записи avto, надо записать: m.number, m.marka, m.fio, m.address Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания. Например: m.number:= 1234; m.marka:= 'Audi – 200'; m.fio:= 'Иванов В.В.'; m.address:= 'ул. Гагарина, 25, кв. 47'; a.day:= 25; b.year:= 2012; Составные имена можно использовать в операторах ввода/вывода: readln(m.number, m.marka, m.fio, m.address); write(m.number:4, m.marka:10, m.fio:13, m.address:23); Нельзя использовать в операторах ввода/вывода запись целиком. Как и в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например: 55 a:= b; v:= m; После выполнения этого оператора значения полей записей v и a станут равными значениям соответствующих полей записей m и b. В ряде задач удобно пользоваться массивами из записей. Их можно описать следующим образом: Type Person = record Fio: string[20]; Age: 1..99; Prof: string[30]; End; Var Mas: array [1..50] of Person; Чтобы упростить доступ к полям записи, используется оператор присоединения with: With <переменная> do <оператор>; Здесь With, do - зарезервированные слова, <переменная> – имя переменной типа запись, за которым следует список вложенных полей, <оператор> – любой оператор ТР. Один раз указав переменную типа запись в операторе with, можно работать с именами полей как с обычными переменными. Например: With m do Begin number:= 1234; marka:= 'Audi – 200'; fio:= 'Иванов В.В.'; address:= 'ул. Гагарина, 25, кв. 47'; end; Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 56 Семинар № 12 Методы структурного программирования. Процедуры и функции как средства структурного программирования 1. 2. 3. 4. 5. 6. 7. Структура процедур. Область действия переменных. Глобальные и локальные переменные. Процедуры с параметрами. Формальные и фактические параметры. Вызов процедур. Передача параметров. Процедуры пользователя Если в программе возникает необходимость частого обращения к группе операторов, выполняющих определенные вычисления или действия, то рационально сгруппировать эти операторы в блок, к которому можно обратиться по имени. Такие разработанные программистом самостоятельные блоки называются подпрограммами пользователя. Они являются основой модульного программирования. Использование подпрограмм позволяет сосредоточить в них подробное описание некоторых операций. В основной же программе указываются только имена этих подпрограмм, чтобы выполнить эти операции. Такие вызовы подпрограммы возможны неоднократно из разных участков основной программы. Достоинства подпрограмм: - Программы, в которых используются подпрограммы, легче отлаживать и тестировать; - Независимость подпрограмм позволяет содержать отдельный алгоритм, поэтому, при изменении его меняется только подпрограмма; - Составление подпрограмм можно поручать другим программистам. Так осуществляется разделение работы по программированию; - Использование подпрограмм позволят экономить память, т.к. память для хранения переменных, используемых в подпрограмме, выделяется только на время ее работы и высвобождается, как только ее выполнение заканчивается. В ТР подпрограммы реализованы посредством процедур и функций. Все процедуры и функции подразделяются на встроенные и определенные пользователем. Встроенные процедуры и функции являются частью языка ТР. Процедуры и функции пользователя пишутся программистом. Процедура – это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени из основной программы для выполнения определенных действий. 57 Процедуры объявляются в описательной части программы сразу же за областью описания типа данных. При объявлении указывается ключевое слово PROCEDURE, имя процедуры и список формальных параметров. PROCEDURE имя [(список формальных параметров)]. Здесь имя – имя процедуры, которое должно быть уникально; список формальных параметров – разделенный запятыми перечень параметров, указывающих имена и типы переменных (процедур и функций) с исходными данными и результатами работы процедуры. Допускается объявление процедуры и без списка формальных параметров. Формальные параметры – это переменные, формально присутствующие в процедуре и определяющие тип и место подстановки фактических параметров. Тело процедуры по своей структуре аналогично обычной программе: Procedure proc1[(список формальных параметров)]; {описательная часть} begin {исполнительная часть} end; Для обращения к процедуре используется оператор вызова процедуры, который состоит из имени процедуры и списка фактических параметров, отделенных друг от друга запятыми и заключенных в круглые скобки. При вызове формальные параметры, указанные в заголовке процедуры, строго в порядке следования, заменяются фактическими, т.е. следующий первым в списке формальных параметров принимает значение первого из списка фактических параметров, второй – второго и т.д. Количество и тип фактических и формальных параметров должны однозначно соответствовать друг другу. Процедуры с параметрами Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимооднозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равен количеству и типу фактических параметров. Соответствующие друг другу параметры не обязательно должны одинаково обозначаться. При вызове процедуры работа главной программы приостанавливается и начинает выполняться вызванная процедура. Когда процедура выполнит свою работу, программа продолжится с оператора, следующего за оператором вызова процедуры. Описания меток, констант, типов действительны только в пределах данной пользовательской процедуры. 58 Для принудительного выхода из процедуры используется оператор exit, который обеспечивает выход во внешний блок, т.е. в основную программу. Пример программы вывода горизонтальной линии, в которой используется процедура без формальных параметров: uses crt; procedure hor; var i: integer; begin for i:= 1 to 30 do write('-'); end; begin clrscr; hor; end. При вызове процедуры работа главной программы приостанавливается и начинает выполняться вызванная процедура. Когда процедура выполнит свою работу, программа продолжится с оператора, следующего за оператором вызова процедуры. Приведем еще один пример программы вычисления значения степени числа, использующей для этой цели процедуру с формальными параметрами: PROCEDURE Stepen (n: integer; x: real; var y: real); var i: integer; begin y:= 1; for i:= 1 to n do y:= y*x; end; {основная программа} Var j: integer; a,b: real; begin readln(a,j); if j = 1 then b:= 1 else if j > 0 then STEPEN (j, a, b) else STEPEN (-j, 1/a, b); writeln(a:9:2, ' в степени ', j:2 ,' равно ', b); end. 59 В процедуре формальные параметры N и X определяют исходные данные (N – степень, X – число), а Y - результаты выполнения, т.е. значение искомой степени числа. При вызове процедуры stepen происходит замена формальных параметров (N, X, Y) фактическими (J, A, B) и выполняются операторы тела процедуры. При замене формальный параметр N принимает конкретное значение переменной J или –J, а X – переменной A или арифметического выражения 1/A. Затем в процедуре вычисляется значение Y и его значение передается в точку вызова в виде результата B. возврат в программу после выполнения процедуры stepen осуществляется к оператору, следующему за оператором вызова процедуры, в рассмотренном примере к оператору writeln. Виды параметров. Механизм передачи параметров По способу передачи данных параметры можно разделить на несколько категорий. Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной, либо параметром-константой. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово VAR, например: Procedure tide (var a : real); Здесь параметр А - параметр-переменная. Заголовок процедуры может быть устроен так, что некоторые группы формальных параметров не содержат слова VAR. Например: Procedure qwerty(a,b,c:real; var s:real); Формальные параметры, которые входят в группы, не содержащие слова VAR, называются формальными параметрамизначениями. Определение формального параметра тем или иным способом существенно только для вызывающей программы: - если формальный параметр объявлен как параметрпеременная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной определенного типа; - если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение. Контроль за неукоснительным соблюдением этого правила осуществляет компилятором Pascal. Для того чтобы понять, в каких случаях использовать параметры значения, а в каких - параметры-переменные, рассмотрим, как 60 осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме. Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Таким образом, назначение параметра-значения – передача данных из программы в подпрограмму. Если же параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия. *** Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра, в то время как изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе. *** Параметр-константа схож с параметром-переменной: в подпрограмму передается сама константа, но изменение её невозможно. Назначение такого параметра совпадает с назначением параметра-значения. Формальные параметры- константы указываются в заголовке программы после служебного слова const. Его действие распространяется до ближайшей точки с запятой. Поясним изложенное. var с, b: integer; procedure squar(с: integer; var b: integer); begin с:=sqr(c); b:=sqr(b); writeln(‘в квадрате они выглядят так: ’,с,’, ’,b); end; begin с:=4; b:=6; writeln(‘внимательно посмотрите на эти числа: ’, с,’, ’, b); squar(c,b); writeln(‘а так – “с” не в квадрате: ’,с, ’, ’,b); end. Результаты выглядят так: внимательно посмотрите на эти числа: 4, 6 в квадрате они выглядят так: 16, 36 а так – “с” не в квадрате: 4, 36 Этот пример может служить еще и иллюстрацией механизма «закрывания» глобальной переменной а одноименной локальной: хотя переменная объявлена как глобальная (она описана в вызывающей 61 программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная а, объявленная как параметрзначение. Итак, параметры-переменные используются как средство связи алгоритма, реализованного в подпрограмме, с «внешним миром»: с помощью этих параметров подпрограмма может передавать результаты своей работы вызывающей программе. Глобальные и локальные переменные При создании программ, использующих процедуры, надо учитывать, что все метки, константы, переменные, которые описываются после заголовка процедуры, называются локальными объектами и доступны они только в пределах этой процедуры. Память под них выделяется при обращении к процедуре в специальной части, которая называется программным стеком. По окончании работы процедуры эта память освобождается и может быть занята под локальные переменные другой процедуры, поэтому все локальные объекты создаются при входе в процедуру и уничтожаются при выходе из нее. Все объекты, описанные в вызывающей программе, называются глобальными. Память под глобальные переменные выделяется при компиляции программы. Эта часть памяти называется сегментом данных. Глобальные переменные находятся в сегменте данных от начала и до конца выполнения программы, поэтому ими можно пользоваться и в программе, и во всех процедурах, к которым обращается программа. Следует знать: - Обмен данными между программой и вызываемой ею процедурой может производиться и через глобальные переменные; - Если же одно и то же имя определено и в программе, и в вызываемой ею процедуре, то в программе ему соответствует глобальный объект, но внутри процедуры глобальный объект недоступен. Он маскируется локальным объектом с таким же именем, над которым и выполняются необходимые действия. Например, рассмотрим программу: var a, b, c, d: integer; procedure p(x: integer; var y: integer); var c: integer; begin c:= 1; d:= 1; x:= 1; y:= 1; writeln(x:3, y:3, c:3, d:3); end; begin a:= 0; b:= 0; c:= 0; d:= 0; p(a,b); 62 writeln(a:3, b:3, c:3, d:3); end. При выполнении программа напечатает: 1 1 1 1 0 1 0 1 х – формальный параметр-значение, которому соответствует фактический параметр а = 0. В процедуре его значение изменится на 1, после чего результат будет напечатан. На переменной а это никак не отразится, и после выполнения процедуры а по-прежнему будет равно 0. у – параметрпеременная, поэтому при выполнении процедуры вместо у действия будут проводиться с переменной b, которая получит значение 1. это значение сохранится и после выхода из процедуры. с – локальная для данной процедуры переменная, которая маскирует глобальную переменную с основной программы. d – глобальная переменная, имеющая одинаковый смысл, как в основной программе, так и в процедуре. В ТР допускается любой уровень вложенности процедур и функций. Процедура, описанная в основной программе, может иметь описания внутренних процедур и функций. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар № 13 1. 2. 3. 4. Структура функций. Вызов функций. Отличия процедур и функций. Рекурсии. Функции пользователя. Структура функций Если результатом подпрограммы является только одно значение, то такую подпрограмму можно оформить в виде функции. Функция пользователя аналогична процедуре с той лишь разницей, что: - Функция передает в программу результат своей работы – единственное значение, носителем которого является имя самой функции; - Имя функции может входить в выражение как операнд. Функция возвращает результат в точку своего вызова. Функция, определенная пользователем, имеет заголовок и тело. Заголовок содержит зарезервированное слово function, имя функции, 63 заключенный в круглые скобки необязательный список формальных параметров и – в отличие от процедуры, тип возвращаемого функцией значения: Function ИмяФункции[(ФормальныеПараметры)]: ТипРезультата; Например: Function func1(n: integer): integer; Function func2(a,b: real): real; Function func3: integer; Имя функции уникально в пределах одной программы. Тело функции аналогично по своей структуре обычной программе. В разделе операторов функции должен находиться хотя бы один оператор, который присваивает ее имени значение, возвращаемое как результат работы функции. Если таких присваиваний несколько, то результатом выполнения функции будет значение последнего оператора присваивания. Если же такого оператора нет, то значение, возвращаемое функцией, не определено. В отличие от процедуры, вызов функции не оформляется в виде отдельного оператора. Обращение к функции осуществляется путем использования указателя функции в качестве операнда в некотором выражении. Указатель функции – это ее имя со списком аргументов, т.е. фактических параметров. Например: writeln(func1(i)); c:= func2(2,5); writeln(func3); Таким образом, общий вид описания функции следующий: Function Имя[(Список формальных параметров)]: Тип результата; {Описательная часть} Begin Тело функции, в котором обязательно долен быть оператор присваивания Имя функции:= значение; End; Пример 1 Составить программу, подсчитывающую число сочетаний без повторения из n элементов по k. Число сочетаний без повторения вычисляется по формуле: С nk n! k!(n k )! Решение Обозначим через n и k переменные для хранения введенных чисел; c − переменную для хранения результата. Чтобы подсчитать количество сочетаний без повторения, необходимо вычислить n!, (n-k)!, k! 64 Опишем функцию для вычисления факториала числа n(n!= 1•2•...•n). {заголовок функции} Function factorial(n:Integer):Longint; {описательная часть} Var i: Integer; rez: Longint; {тело функции} Begin rez:=1; For i:=1 To n Do rez:=rez*i; factorial:=rez; {присваивание значения имени функции} End; Первая строчка в описании функции − это ее заголовок. Служебное слово Function (функция) указывает на то, что именем factorial названа функция. В скобках записан список формальных параметров функции, состоящий из одной переменной целого типа. Далее в заголовке указан тип значения функции. В данном примере результат функции factorial − длинное целое число. За заголовком функции следует описательная часть функции, которая, как и у программы, может состоять из разделов описания переменных, констант, типов. В данном примере имеется только раздел описания переменных. В нем описаны переменные i (счетчик цикла) и rez (для накопления значения факториала). Далее идет раздел операторов (тело функции). Результат присваивается имени функции, таким образом функция получает свое значение. В тексте программы описания функций всегда следуют за разделом описания переменных и до начала основной части, как и описания процедур. После того как функция описана, ее можно использовать в программе. Листинг основной программы. Var n, k: Integer; a1, a2, a3, c: Longint; Function factorial (n:Integer): Longint; Var i: Integer; rez: Longint; Begin rez:=1; For i:=1 To n Do rez:=rez*i; factorial:=rez; End; Begin Writeln('Ввод n и k:'); Readln(n,k) ; 65 a1:= factorial(n); {вычисление n!} a2:= factorial(k); {вычисление k!} a3:= factorial(n-k);{вычисление(n-k)!} c:= a1 div (a2*a3) ; {результат} Writeln(c); Readln; End. Пусть n=5, k=3. Когда в программе встречается оператор a1:= factorial(n), выполняются следующие действия: - выделяется память для переменных, описанных в функции factorial; - формальному параметру присваивается значение фактического: n:=n (n=5); - выполняется функция, вычисляется факториал числа 5; - значение функции передается в место обращения к этой функции, то есть присваивается переменной а1. В операторах a2:= factorial(k) и a3:= factorial(n-k) еще дважды вызывается функция factorial с параметрами k=3 и n-k=2. Всего в программе имеется 3 обращения к функции factorial, столько же раз выполняются и описанные выше действия. Еще раз подчеркнем, что функция − это самостоятельная часть программы, имеющая собственные переменные, которым отводится отдельное место в памяти ЭВМ. Этим объясняется тот факт, что переменные с одинаковыми именами, используемые в функции и в основной программе, являются разными (в рассмотренном примере переменная n основной программы и параметр n функции). При выполнении программы машина "не путает" имена этих переменных, так как области их действия не совпадают. Это особенно важно при написании больших программ. Пример 2 Написать функцию, подсчитывающую количество цифр натурального числа. Используя ее, определить, в каком из двух данных чисел больше цифр. Решение Надо выделять последнюю цифру числа до тех пор, пока число не станет равным нулю. При этом каждый раз счетчик увеличивается на 1 (начальное значение счетчика − 0). Function Quantity(x: Longint): Byte; Var k: Byte; Begin k:=0; While x <> 0 Do Begin Inc(k) ; 66 x:=x div 10; End; Quantity:= k; End; В заголовке функции указано ее имя − Quantity. Функции передается только один параметр − целое число, количество цифр которого надо найти. Результат − тоже целое число. В разделе переменных описана переменная k − счетчик цифр. В теле функции с помощью цикла While выполняются указанные выше действия (увеличивается значение счетчика и удаляется последняя цифра). Еще раз заметим, что память для переменной k, которая является локальной, выделяется только тогда, когда начинает свою работу функция. После завершения работы функции эта часть памяти освобождается и значение k будет не определено. Листинг основной программы. Var n1, n2: Longint; k1, k2: Byte; Function Quantity(x: Longint): Byte; Var k: Byte; Begin k:=0; While x <> 0 Do Begin Inc(k) ; x:= x div 10; End; Quantity:= k; End; Begin Writeln('Введите два числа'); Readln(n1, n2); k1:= Quantity(n1); {количество цифр первого числа} k2:= Quantity(n2); {количество цифр второго числа} If k1 = k2 Then Writeln('Одинаковое количество цифр') Else If k1 > k2 Then Writeln('В первом числе цифр больше') Else Writeln('Во втором числе цифр больше'); Readln; 67 End. Нетрадиционное использование пользовательских подпрограмм. Рекурсия В ряде алгоритмов решения задач требуется вызов подпрограммы из раздела операторов той же самой подпрограммы. Рекурсия – это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе. При использовании рекурсии следует обращать особое внимание на выход из подпрограммы в нужный момент. Рекурсия полезна, когда задачу нужно разделить на подзадачи. При использовании рекурсивной процедуры и функции в начале нужно поместить строку if keypressed then halt; - для прерывания зависания, если таковое произойдет. Keypressed – это функция, возвращающая результат true, если на клавиатуре была нажата клавиша, и false – в противном случае. Пример 1. Рассмотрим программу вычисления элементов ряда Фибоначчи с использованием рекурсивной процедуры. program rekurs; procedure fibon(n,fn1,fn:integer);{рекурсивная процедура} begin if n > 0 then begin writeln(fn1+fn); fibon(n-1,fn,fn1+fn); end; end; var n,a,b: integer; begin write('введите число элементов ряда Фибоначчи: '); readln(n); write('...следующими за двумя данными числами: '); readln(a,b); fibon(n,a,b); end. Пример 2. Программа, которая выводит на экран цифры целого положительного числа в обратном порядке. program rekurs2; uses crt; procedure revers(n:integer); {рекурсивная процедура} begin if keypressed then halt; 68 write(n mod 10); if (n div 10) <> 0 then revers (n div 10); end; var n: integer; begin clrscr; writeln('vvedi chislo <= : ', maxint); readln(n); revers(n); writeln; readln; end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №14 Ввод – вывод данных. Файлы 1. 2. 3. 4. 5. 6. Основные понятия. Классификация файлов. Понятие логического и физического файла. Разделение файлов по типам и методам доступа. Описание файлов. Процедуры и функции для обработки файлов. Файл – это набор данных, хранящихся во внешней памяти компьютера под заданным именем. Любой файл имеет три характерные особенности: 1. У файла есть имя, что дает возможность программе работать одновременно с несколькими файлами. 2. Файл содержит компоненты одного типа. Типом компонентов файла может любой тип. 3. Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. Для того, чтобы программа нашла нужный файл, необходимо знать путь или маршрут к файлу. 69 Путь – это перечень имен подкаталогов, которые отделены друг от друга с помощью обратной косой черты, за которым следует собственно имя файла. Например: c:\catalog1\catalog2\file1.txt. Каждое имя каталога соответствует входу в подкаталог с таким именем. Знак ".." соответствует входу в надкаталог. Максимально допустимая длина пути – 79 символов. В программе на ТР имя файла задается в виде текстовой константы, заключенной в апострофы, которая может быть значением строковой переменной: '\turbo\pas\table.txt'. Устройства. Использование файлов в ТР было вызвано необходимостью обмена данными с окружением компьютера, его аппаратными средствами: дисплеем, клавиатурой, принтером, каналами ввода-вывода. Все они рассматриваются в ТР как файлы, с которыми можно работать так же, как с обычными файлами. Файлы на внешних устройствах часто называют физическими или внешними файлами. Обращение к устройствам выполняется с помощью специальных имен, которые запрещено использовать для обычных файлов – так называемых имен логических устройств компьютера. - CON – консоль. При помощи консоли выводимая информация пересылается на экран дисплея, а вводимая информация воспринимается с клавиатуры; - PRN – это наименование принтера. Если к компьютеру подключено несколько принтеров, то обращение к ним осуществляется с помощью логических имен: LPT1, LPT2, LPT3. - COM1, COM2, COM3 – это устройства подключения к последовательным портам. Используются для связи с другими компьютерами и для подключения мыши. - NUL – нулевое или пустое устройство. Часто используется программистами для отладки программы. Позволяет не создавать отдельный файл. При использовании его для вывода информации – информация никуда не выводится, но сообщается, что вывод произошел успешно. Доступ к файлам. В любой момент времени программе доступен только один элемент файла, на который ссылается указатель текущей позиции файла. Он определяет место в файле, откуда или куда происходит чтение или запись данных. При открытии или создании файла указатель помещается в его начало. Указатель ведет себя подобно курсору, который, смещаясь при редактировании текста, все время показывает текущую позицию. При чтении данных из файла указатель рано или поздно достигнет его конца. По способу доступа к элементам различают файлы последовательного или прямого доступа. 70 Файлом последовательного доступа называется файл, к элементам которого доступ выполняется в той последовательности, в какой они записывались. Для поиска нужного элемента в этом случае необходимо перемещать указатель до тех пор, пока он не будет помещен на искомый элемент. Для таких файлов запрещено одновременно читать и записывать данные в файл. Файл прямого доступа – это файл, доступ, к элементам которого осуществляется по их адресу. При поиске нужного элемента в таких файлах достаточно указать номер его позиции. Для файлов прямого доступа разрешается одновременная запись и считывание данных. Описание файлового типа. Виды файлов. Файловая переменная Файловый тип можно создать одним из трех способов: <Имя> = File of <тип>; <Имя> = Text; <Имя> = File; Здесь имя - имя файлового типа; File of, Text, File – зарезервированные слова; тип – любой тип языка ТР. В зависимости от способа объявления можно выделить три вида файлов: Типизированные файлы (задаются предложением File of ..); Текстовые файлы (определяются типом Text); Нетипизированные файлы (определяются типом File). Средства обработки файлов Файлы становятся доступными программе только после особой процедуры открытия файла. Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтения из файла или запись в него. Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре ASSIGN: ASSIGN (<ф.п.>, <имя файла>); Здесь ф.п. – файловая переменная, имя файла – текстовое выражение, содержащее имя файла и, если это необходимо, маршрут доступа к нему. Инициализировать файл означает указать для этого файла направление передачи данных. Для чтения файл инициализируется с помощью стандартной процедуры RESET: RESET (<ф.п.>); 71 При выполнении этой процедуры файл подготавливается для чтения. В результате специальная переменная-указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0. Следующая стандартная процедура инициирует запись информации в файл, связанный с файловой переменной: REWRITE (<ф.п.>); Процедурой REWRITE нельзя инициировать запись информации в ранее существующий дисковый файл. При выполнении этой процедуры старый файл уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель принимает значение 0. Следующая стандартная процедура инициирует запись в существующий текстовый файл, при чем указатель файла устанавливается в конец файла: APPEND (<ф.п.>); Процедура APPEND (<ф.п.>) применима только в текстовых файлах. Если текстовый файл был открыт с помощью процедуры RESET или REWRITE, то использование процедуры APPEND приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей. Функция IORESULT(<ф.п.>) проверяет существование файла на диске. С помощью этой функции можно избежать исключительной ситуации, возникшей при обращении к несуществующему файлу. Процедура CLOSE(<ф.п.>) используется для закрытия файла по завершении обработки данных. Процедура RENAME(<ф.п.>) переименовывает неоткрытый внешний файл любого типа. Логическая функция EOF(<ф.п.>) выполняет проверку, не достигнут ли конец файла. Пример программы, создающей текстовый файл, содержащий одну строку, которая записывается в виде текстовой константы. var f: text; str: string; begin assign(f, 'file01.txt'); rewrite(f); writeln(f, 'Этот простой текстовый файл содержит строку текста'); close(f); reset(f); readln(f, str); close(f); writeln('проверка ввода-вывода в файл'); writeln(str); end. 72 Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар № 15 Текстовые файлы. Процедуры и функции для обработки текстовых файлов Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся исходные тексты программ. Текстовый файл – это последовательность строк различной длины, отделенных друг от друга специальными символами-разделителями. Доступ к каждой строке возможен только последовательно, начиная с первой. При создании текстового файла в конце каждой строки ставится специальный признак EOLN (End Of Line), а в конце всего файла – признак EOF (End Of File). Эти признаки можно протестировать одноименными логическими функциями - EOLN и EOF. EOLN (<ф.п.>): Boolean; EOF(<ф.п.>): Boolean; Для чтения из текстового файла используется процедуры чтения: 1. READ(<ф.п.>, х1, х2, . . . , хN); 2. READLN (<ф.п.>); 3. READLN (<ф.п.>, х1, х2, . . . , хN); где х1, х2, . . . , хN – список ввода, содержащий имена переменных разных типов (integer, real, char, string), значения которых процедура считывает из текстового файла, начиная с элемента, на котором установлен текущий указатель. Файловая переменная имеет тип text. Процедура READLN выполняет те же действия, что и READ и дополнительно переход к новой строке. Вызов READLN без параметров приводит к перемещению текущей позиции файла на начало следующей строки. Так можно пропускать строки. Для записи в текстовый файл используются процедуры: 1. WRITE(<ф.п.>, х1, х2, . . . , хN); 2. WRITELN(<ф.п.>); 3. WRITELN(<ф.п.>, х1, х2, . . . , хN); где х1, х2, . . . , хN – список вывода, содержащий имена переменных разных типов (integer, real, char, string), значения которых процедура 73 записывает в текстовый файл, начиная с элемента, на котором установлен текущий указатель. Файловая переменная имеет тип text. Процедура WRITELN выполняет те же действия, что и WRITE и дополнительно вставляет признак конца строки. Особенность использования текстовых файлов состоит в том, что процедуры чтения и записи разрешают работать со значениями различных типов. Последовательность символов, прочитанная из файла, автоматически преобразуется к значению того типа переменной, которая используется в списке ввода. Например, при выполнении фрагмента программы var f1: text; a,b,c: real; … readln(f1,a,b,c); процедура readln выполнит чтение из очередной строки файла, связанного с ф.п. f1, последовательности цифр, интерпретируемой как три вещественных числа, значения которых будут присвоены переменным a,b,c. Следующая стандартная процедура инициирует запись в существующий текстовый файл, при чем указатель файла устанавливается в конец файла: APPEND (<ф.п.>); Процедура APPEND (<ф.п.>) применима только в текстовых файлах. Если текстовый файл был открыт с помощью процедуры RESET или REWRITE, то использование процедуры APPEND приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей. При завершении работы с файлом используется процедура CLOSE(<ф.п.>). Функция проверки конца строки SEEKEOLN(<ф.п.>) аналогична EOLN(<ф.п.>), но пропускает пробелы и позиции табуляции перед проверкой конца строки. Функция проверки конца файла SEEKEOF(<ф.п.>) аналогична EOF (<ф.п.>), но пропускает пробелы и позиции табуляции перед проверкой конца файла. Пример: Программа, создающая текстовый файл, содержащий одну строку, которая записывается в виде текстовой константы. var f: text; str: string; begin assign(f, 'file01.txt'); - назначение файловой переменной f файла 'file01.txt' rewrite(f); - создание файла writeln(f,'Этот текстовый файл содержит 1 строку'); - запись в файл close(f); - закрытие файла append(f); - открытие файла и установка указателя в конец 74 str:= 'В это файл добавим еще строку текста !!!!!'; writeln(f,str); - запись в файл 'file01.txt' close(f); - закрытие файла 'file01.txt' reset(f); - открытие файла 'file01.txt' while not eof(f) do begin readln(f,str); чтение из файла 'file01.txt' и вывод на экран writeln(str); end; close(f); - закрытие файла 'file01.txt' writeln('================='); readln; end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар № 16 Типизированные файлы. Процедуры и функции для обработки типизированных файлов. Типизированные переменные нужны, если файл состоит из последовательности компонент одного и того же типа и длины. Их число и размер файла не ограничивается при его задании. Каждый элемент файла имеет номер. Первый элемент считается нулевым. Длина любого компонента типизированного файла строго постоянна. Это дает возможность организовать прямой доступ к каждому из них по порядковому номеру. Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель автоматически сдвигается к следующему элементу файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом. Т.к. все элементы файла имеют одинаковую длину, позиции каждого элемента легко вычисляются, таким образом, здесь имеет место говорить о прямом доступе к элементам файла. 75 В отличие от текстового файла типизированный файл не делится на строки. Данные в нем записаны во внутреннем двоичном представлении ПК. Вообще все файлы, кроме текстовых, рассматриваются, как двоичные. Для описания типизированных файловых переменных применяются зарезервированные слова file of, например: F1: File of string [50]; F2: File of integer; F3: File of real; 1. Перед использованием типизированной файловой переменной, ее необходимо связать с дисковым файлом с помощью процедуры ASSIGN. При вызове процедуры ASSIGN в качестве параметров указывается название переменной и полное имя файла. Например: Assign(F1,'d:\home\stud17\miras\name.pas’); 2. Процедура Reset – открывает файл уже существующий на диске. Текущая позиция устанавливается в начало файла. Описание: Reset (F); 3. Процедура Rewrite – создает и открывает файл. Если файл уже существует, то он уничтожается и создается заново. Описание: Rewrite (F); 4. Процедура Read – прочитать значения указанных переменных из файла. Описание: Read (F, X1[,X2[,X3[..XN]]]); F – типизированная файловая переменная X1..XN – переменные того же типа, что и компоненты файла. 5. Процедура Write – записать значения указанных переменных в файл. Описание: Write (F, X1[,X2[,X3[..XN]]]); F – типизированная файловая переменная X1..XN – переменные того же типа, что и компоненты файла. Следует помнить, что для чтения и записи типизированного файла применяются только операторы Read и Write. 6. Функция FilePos – возвращает порядковый номер текущего компонента файла. Файл должен быть открыт. Если текущей позицией является начало файла, то функция возвращает значение 0. При переходе от элемента к элементу его значение увеличивается на 1. Эту функцию нельзя использовать в текстовых файлах. Описание: FilePos(F): LongInt; (-2 147 483 648 – 2 147 483 647). 7. Функция FileSize - возвращает количество компонентов файла. Если файл пуст, то возвращается значение 0. Описание: FileSize(F): LongInt; 8. Процедура Seek – позиционирует указатель файла на заданный компонент файла. Описание: Seek (F, L: LongInt); F – файловая переменная, L – номер компонента, на который будет позиционирован указатель. 9. Процедура Truncate(F) усекает размер файла до его текущей позиции. Файл должен быть открыт. Все элементы после текущей позиции 76 удаляются, после чего текущая позиция становится концом файла. Функция не используется для текстовых файлов. Описание: Truncate(F); Пример: Программа, которая формирует типизированный файл из целых чисел, вводимых с клавиатуры. Их количество заранее неизвестно. Признаком конца является число 0. Программа находит: сумму и произведение чисел из файла, разность между вторым и предпоследним числами, а также наибольшее из чисел. type filtyp = file of integer; var f: filtyp; sum, mult, r, k1, k2, max: integer; begin writeln('введите элементы файла по одному в строке, в конце - 0'); assign(f,'data.dat'); rewrite(f); // записываем в файл числа, вводимые с клавиатуры до 0 repeat readln(r); if r <> 0 then write (f,r); until r = 0; // позиционируем указатель на 0-ой элемент, т.е на начало файла seek(f,0); sum:= 0; mult:= 1; // считываем из файла 1-ый элемент, указатель сдвигается вправо на одну позицию read(f,r); // заносим его значение в max для нахождения наибольшего значения max:= r; // сдвигаем указатель влево на 1 позицию seek(f,filepos(f)-1); // считываем элементы, суммируем, перемножаем и отыскиваем max while not eof(f) do begin read(f,r); sum:= sum+r; mult:= mult*r; if max < r then max:= r; end; // позиционируем указатель на 2-ой элемент, запоминаем его значение, затем позиционируем указатель на предпоследний элемент и 77 запоминаем его seek(f,1); read(f,k1); seek(f,filesize(f)-2); read(f,k2); close(f); writeln('Сумма = ',sum,#10#13'Произведение = ',mult); writeln('Разность = ',k2-k1,#10#13'Максимум = ',max); readln; end. Нетипизированные файлы. Процедуры и функции обработки нетипизированных файлов Нетипизированные файлы удобно использовать, когда файл рассматривается как сплошной поток данных. Для описания нетипизированной файловой переменной используется зарезервированное слово file. Например: Data: file; File1, File2: file; Перед использованием нетипизированной файловой переменной, ее необходимо связать с дисковым файлом с помощью процедуры ASSIGN. При вызове процедуры ASSIGN в качестве параметров указывается название переменной и полное имя файла. Например: Assign(Data,'C:\TP7\fil.dat'); Для работы с файлом в конечном итоге требуется выполнять следующие фундаментальные операции: Считать блок данных из заданного места файла в ОП; Записать блок данных из ОП в заданное место файла. Чтение и запись информации происходит порциями одинакового размера. Эти порции называются записями. При открытии нетипизированного файла с помощью RESET и REWRITE можно указать размер записи. Если размер записи не указан, то он принимается равным 128 байт. Процедура BLOCKREAD – прочитать заданное количество записей из файла в указанное место ОП. BLOCKREAD(var F: file; var V,N: Word); F – файловая переменная V – адрес в памяти, начиная с которого будет помещена считанная информация N – количество записей, которые должны быть считаны. Длина записи определяется при открытии файла. Процедура BlockWrite – записать заданное количество записей из указанного места ОП в файл. Описание: BlockWrite(var F: file; var V,N: Word); F – файловая переменная, V – адрес в ОП, 78 N – количество записей, которые должны быть записаны в файл. Длина записи определяется при открытии файла. Функция FilePos – возвращает текущую позицию файла в записях. Описание: FilePos(var F: file): LongInt; Функция FileSize - возвращает размер файла в записях. Описание: FileSize(var F: file): LongInt; Процедура Reset – открывает файл уже существующий на диске. Текущая позиция устанавливается в начало файла. Описание: Reset(var F: file[; Size: Word]); Процедура Rewrite – создает и открывает файл. Если файл уже существует, то он уничтожается и создается заново. Описание: Rewrite(var F: file[; Size: Word]); Процедура Seek – позиционирует указатель на заданную запись в файле. Описание: Seek(var F, L: LongInt); F – файловая переменная, L – номер записи, на которую будет позиционирован указатель. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 5. Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 Семинар №17 Динамические переменные. Ссылочные типы 1. 2. 3. 4. 5. 6. 7. Ссылочные типы. Основные понятия. Распределение оперативной памяти при выполнении программ. Статические и динамические переменные. Ссылочные типы – указатели. Обращение к динамической переменной с помощью указателей. Операции над данными ссылочного типа. Выделение и освобождение динамической памяти. Перед выполнением программ выполняются этапы компиляции и компоновки. При компоновке программы в памяти формируются несколько специальных областей, предназначенных для хранения всех используемых в данной программе переменных. Для хранения глобальных переменных и 79 типизированных констант формируется область, которая называется сегментом данных. Каждая переменная в зависимости от типа получает определенное количество байтов в сегменте данных. Суммарный размер сегмента данных определяется суммой затрат памяти на хранение всех переменных. Размер сегмента данных не изменяется от начала до конца выполнения программы. Во многих системах программирования его размер ограничен, например в ТР он не может превышать 64 Кбайт. Для хранения локальных переменных и параметров процедур и функций используется другая область памяти, которая называется стек. При каждом вызове подпрограммы ее локальные переменные и параметры помещаются в стек, а по окончании работы подпрограммы – автоматически из него удаляются. Однако память под стек отводится еще до начала выполнения подпрограммы, и размер этой памяти не может быть изменен по ходу ее выполнения. Суммарный размер памяти, отведенный под стек в ТР по умолчанию составляет – 16 КБайт и его можно увеличить, но существует ограничение, которое составляет 64 Кбайт. Для того, чтобы преодолеть существующие ограничения на размеры памяти под переменные программы и в целях рационального использования памяти, ТР предоставляет возможность создавать и уничтожать переменные по ходу выполнения программы. Такие переменные не объявляются в разделе объявлений и не имеют своего собственного имени, а память под них выделяется в соответствии с инструкциями программы. Эти переменные называются динамическими. Они создаются не в сегменте данных и не в стеке, для них имеется еще одна дополнительная область памяти, которая называется динамически распределяемой областью или кучей. Динамическая память – это оперативная память ПК, предоставляемая программе при ее работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от динамического размещения данных, при статическом размещении выделение памяти осуществляется компилятором ТР во время компиляции программы. При динамическом размещении заранее неизвестны ни тип, ни количество размещаемых данных. Работать с переменными в куче можно с помощью гибкого средства управления динамической памятью – так называемыми указателями. Их основное назначение состоит в том, чтобы обеспечить механизм использования в программе динамических переменных, т.е. переменных, которые создаются в памяти и удаляются из нее по ходу выполнения программы. Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой тип данных. Некоторые типы данных (byte, shortint, char, boolean) занимают во внутреннем представлении ПК всего один байт, остальные – по несколько смежных, поэтому указатель адресует лишь первый байт данных. Указатели бывают двух видов: типизированный и нетипизированный. 80 Типизированный указатель связывается с некоторым типом данных. Для объявления типизированного указателя применяется значок ^, который помещается перед соответствующим типом, например: var p1: ^integer; p2: ^real; Указатели можно объявлять, не связывая их с каким-либо конкретным типом данных. Указатели такого рода называются нетипизированными. Для объявления непизированных указателей служит стандартный тип – Pointer, например: var p: Pointer; С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе программы. В ТР можно передавать значения одного указателя другому, связанным с одним и тем же типом данных, например: var p1, p2: ^integer; p3: ^real; p: Pointer; то присваивание p1:= p2; p1:= p; p3:= p; p:= p1; вполне допустимо, когда, как p2:= p3; p3:= p1; запрещено, т.к. p1, p2 и p3 указывают на разные типы данных. Эти ограничения не распространяются на нетипизированные указатели, т.к. они совместимы со всеми типами указателей. Каждый указатель размещается в сегменте или в стеке (в зависимости от его объявления) и занимает там 4 байта. Например, для хранения в динамической памяти массивов больших размеров лишние четыре байта на указатель несущественны. Объявить указатель на массив можно так: type massiv = array[1..1000] of real; var pmassiv: ^massiv; При таком объявлении память будет выделена только под указатель. Под массив выделится память при его создании в программе. Создание и удаление динамических переменных В соответствии с двумя типами указателей существуют и две разные процедуры создания динамических переменных. 81 Память под любую динамически размещаемую переменную выделяется процедурой NEW. Параметром обращения к этой процедуре является типизированный указатель. В результате обращения указатель приобретает значение, соответствующее адресу, начиная с которого можно разместить данные, например: var p1, p2: ^integer; p3: ^real; begin New(p1); New(p2); … end; После того, как указатель приобретает некоторое значение, т.е. указывает на конкретный физический байт памяти, по этому адресу можно разместить любое значение соответствующего типа. Для этого сразу за указателем без пробелов ставится значок ^, например: p1^:= 2; {в область параметра p1 помещено значение 2} p2^:= 2*pi; {в область параметра p2 помещено значение 6.28} Если за указателем нет значка ^, то имеется в виду адрес, по которому размещены данные. Динамически размещаемые данные можно использовать в любом месте программы, где это допустимо для констант и переменных соответствующего типа, например: p3^:= sqr(p3^) + 17; --------------- так можно p3:= sqr(p3^) + 17; --------------- так нельзя. Для выделения динамической памяти переменным, параметром которых является нетипизированный указатель, используется процедура GETMEM(P,Size). Параметр Size задает размер памяти, которую необходимо выделить, в байтах. Размер Size не должен превышать 64 Кбайт. Динамические переменные не имеют собственного имени, в процедурах выделения памяти задаются имена указателей соответствующего типа. Динамическую память можно не только забирать из кучи, но и возвращать в нее. Для типизированных указателей используется процедура DISPOSE, например операторы Dispose(p1); Dispose(p3); вернут в кучу память, которая была закреплена за указателями p1 и p3. Для нетипизированных указателей используется процедура FREEMEM(P,Size), которая освобождает Size байтов, начиная с адреса P. 82 Пример программы с применением динамической переменной: var ps: ^string; begin new(ps); ps^:= 'Введена строка для примера с указателем '; writeln(ps^); dispose(ps); end. При работе с динамическими переменными следует знать: 1. Прежде всего, программа должна разместить в памяти динамическую переменную (процедуры New(P), getmem(P,Size)); 2. Каждый вызов процедуры getmem(P,Size) должен сопровождаться вызовом процедуры freemem(P,Size); 3. Процедуру Dispose(P) (освобождение памяти) следует вызывать сразу после того, как только отпадет необходимость в динамической переменной; 4. После применения к указателю процедуры Dispose(P), обязательно следует присвоить указателю значение Nil, т.к. После освобождения памяти указатели автоматически не обнуляются и, фактически указывают на несуществующую переменную. Эта встроенная константа представляет собой значение "нулевого" указателя, который ни на что не указывает; 5. При обращении к значению динамической переменной применяется символ ^ (p^:= 25;), а к адресу динамической переменной этот символ опускается; 6. Динамические переменные используются в основном в двух ситуациях: для работы с массивами больших размеров и для работы с особыми структурами переменных размеров (динамические структуры данных); Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Немнюгин C. "Turbo Pascal 7.0. Практикум", 2007 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 Семинар № 18 Динамические объекты – линейные списки 1. Описание списков. 2. Формирование списков. 3. Операции над списками. 83 Фундаментальной структурой в ОП следует считать массивы, но они имеют недостаток – память под массив выделяется в полном объеме от начала и до конца выполнения программы, размеры памяти, как известно, ограничены. Файлы предоставляют уникальные возможности обработки больших объемов информации, но работа с файлом выполняется медленно. В поисках решения этих проблем были предложены динамические структуры данных. Они характеризуются следующими особенностями: Для отдельных элементов структуры память выделяется в тот момент, когда в них появляется необходимость (а не всем элементам сразу); Число элементов динамической структуры заранее не объявляется и может изменяться от нуля до некоторого значения, определяемого объемом памяти или спецификой задачи; Память, занимаемая структурой, не представляет непрерывную область, т.е. элементы структуры могут быть разбросаны в памяти хаотически; Логическая последовательность элементов задается в явном виде с помощью указателей, хранящихся в самих элементах. Каждый элемент, кроме своего значения, хранит указатель на следующий элемент или на два соседних элемента. Рассмотрим наиболее распространенную динамическую структуру – связанный список. Связанный список – это такая структура данных, элементами которой служат записи одного и того же формата, связанные друг с другом с помощью указателей, расположенных в самих элементах. Элементы списка называют узлами. Каждый элемент списка состоит из двух различных по назначению частей: содержательной (информационной) и указующей. В содержательной части хранятся данные. Если указующая часть хранит адрес одного соседнего элемента, то такой список называется односвязным, или однонаправленным. Поле указателя последнего элемента содержит специальный признак NIL (признак конца списка). Для каждого элемента (кроме последнего) имеется единственный следующий элемент, поэтому связанные списки иногда называют линейными. В случае, когда в указующей части хранятся адреса и предыдущего, и следующего элементов, список называется двусвязным или двунаправленным. Сегмент данных Динамически распределяемая память . Указате ль на первый элемент инфор- указующмацион- ая часть ная часть 84 ... nil Структура односвязного списка С линейными списками можно выполнять те же действия, что и с одномерными массивами. Типовые действия со списками: 1. добавить новый узел перед заданным узлом; 2. удалить заданный узел; 3. объединить два или более линейных списка в один список; 4. разбить линейный список на два или более списка; 5. сделать копию списка; 6. выполнить сортировку узлов списка в возрастающем порядке по некоторым полям в узлах; 7. найти в списке узел с заданным значением в некотором поле; очень часто встречаются линейные списки, в которых добавление и удаление производится только в первом и последнем узлах. Это следующие списки: 1. стек – линейный список, в котором все добавления и удаления делаются в одном конце списка; 2. очередь – линейный список, в котором все добавления производятся на одном конце списка, а все удаления делаются на его другом конце; 3. дек – линейный список, в котором все добавления и все удаления делаются на обоих концах списка. Действия со связанными списками Прежде, чем рассматривать действия над связанными списками, введем обозначения переменных, которыми будем пользоваться при описании соответствующих алгоритмов и структур данных. item, pitem – тип для одного элемента списка и указатель на него; data – поле данных (информационная часть списка); next, prev – указатели следующего, предыдущего элементов (указующая часть); head, top – указатели на первый и последний элемент списка; p1, p2 – рабочие указатели. Опишем тип одного элемента односвязного линейного списка и указателя на этот элемент: type pitem = ^item; item = record data: . . . {простой или определяемый пользователем тип} next: pitem; {или prev: pitem} end; Наиболее просто реализуются действия со стеком. Все действия со стеком реализуются на одном конце, который называется вершиной стека. Стеки как структуры данных имеют широкое применение в системном программировании, например, при разработке компиляторов. Область памяти, 85 в которую помещаются локальные переменные и параметры подпрограмм, имеет структуру стека. Благодаря устройству стека возможны такие приемы программирования, как вложенные подпрограммы и рекурсия. Начало списка Добавление элемента Удаление элемента Схема списка – стека. Стек представляет собой частный случай списка, доступ к которому возможен только в корневой точке. Добавление или удаление элемента производится вначале списка. Стек иногда обозначают аббревиатурой LIFO – Last In First Out – "последний вошел – первый вышел". Это сокращение правильно передает механизм работы стека. Очередь, как и стек, является частным случаем списка. Доступ возможен только к первому и к последнему элементам очереди. Данные могут быть добавлены в конец очереди и удалены из ее начала. Элемент, который был добавлен в очередь первым, первым достигнет ее начала. Английское обозначение такой структуры данных – FIFO, т.е. First In First Out – "первым вошел – первым вышел". Начало списка Добавление Удаление элемента элемента Схема списка – очереди. Как и для стека, для очереди определены операции добавления элемента в список и удаление из очереди. type pitem = ^item; item = record data: integer; prev: pitem; 86 end; var top, p: pitem; n, k: integer; procedure add(x:integer); {процедура добавления элемента на вершину стека} begin new(p); {выделение памяти; создаем произвольный элемент p} p^.data:= x; {присвоение полям записи значений, т.е. в адрес полей записи} p^.prev:= top; { засылаются значения.} top:= p; {устанавливаем р вершиной стека} end; procedure deltop; {процедура удаления узла с вершины стека} begin if top <> nil then {если стек не пустой} begin p:= top^.prev; {запоминаем предшествующей вершине элемент} dispose(top); top:= p; {устанавливаем р вершиной стека} end; end; procedure writestack; {процедура вывода содержимого стека на экран} begin writeln('содержимое стека, начиная с вершины: '); p:= top; while p <> nil do begin write(p^.data,' '); p:= p^.prev; end; writeln; end; begin {начало программы} top:= nil; for k:= 1 to 10 do add(k); {заполняем стек числами от 1 до 10} writestack; writeln('введите значение элемента для добавления в стек'); readln(n); add(n); writestack; writeln('сколько элементов стека нужно удалить?'); readln(n); for k:= 1 to n do deltop; writestack; readln; end. 87 V семестр. Семинар № 19 Динамические объекты сложной структуры. Деревья: основные понятия. Дерево представляет собой совокупность элементов с иерархической структурой. Дерево состоит из узлов, причем один начальный узел играет особую роль. Он называется корнем или корневым узлом. Узлы дерева связаны между собой отношениями. У каждого узла есть узел-предок и некоторое число узлов-потомков. Корень представляет собой особый случай. Такие структуры данных встречаются в повседневной жизни (например, генеалогическое дерево). Используются деревья и в компьютерной науке. Например, при компиляции программы строится дерево синтаксического анализа. Существуют разные способы реализации деревьев. Часто при реализации деревьев каждый узел имеет несколько указателей на несколько узлов. Если указателей два (правый и левый), то такое дерево называется бинарным. Один из указателей может быть равен NIL. У корневого узла нет входящих в него ветвей, а есть только исходящие. Вершина, на которую имеется указатель из другой вершины, называется потомком этой вершины, а значит вершина, имеющая указатель на вершину-потомка, называется вершиной предком. Если вершина не имеет потомков, она называется терминальной вершиной. nil nil nil nil Схема бинарного дерева. В бинарном дереве целочисленных значений обычно во всех левых вершинах должны находиться меньшие числа, а в правых – большие. Основные операции над деревьями – это занесение элемента в дерево, удаление элемента из дерева и обход дерева. Список рекомендуемой литературы: 1. Немнюгин C. "Turbo Pascal 7.0. Практикум", 2007 88 2. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 Семинар № 20. Графика. Текстовый и графический режимы 1. Инициализация графического режима. 2. Построение линий и фигур. 3. Обработка текстовой информации в графическом режиме. Модуль CRT. Процедуры и функции управления экраном В текстовом режиме наименьшей единицей изображения является не отдельный пиксел, а символ целиком – знакоместо. Каждый символ, конечно, состоит из пикселов, но процесс прорисовки каждого символа выполняет ОС. В видеопамяти изображение в текстовом режиме хранится следующим образом: под каждое знакоместо отводится 2 байта. Первый байт хранит код символа, а второй – цветовой атрибут символа. Байт цветового атрибута включает цвет символа (4 младших бита), цвет фона (3 старших бита) и специальный бит – бит мерцания, установка которого в единицу позволяет получить мерцающее изображение. Это используется для выдачи сообщений, которые должны привлечь внимание пользователя. Бит Бит Красный Зеленый Синий Красный Зеленый Синий мерцания яркости Цвет фона Цвет символа Табл. 1. Состав байта цветовых атрибутов в текстовом режиме. Единица в соответствующем бите говорит о наличии данной составляющей цвета. Из рисунка понятно, что все цвета образуются смешением трех цветов – синего, зеленого и красного. Цвет Наименование константы Значение константы Черный Black 0 Синий Blue 1 Зеленый Green 2 Бирюзовый Cyan 3 Красный Red 4 Малиновый Magenta 5 Коричневый Brown 6 Светло-серый LightGray 7 Темно-серый DarkGray 8 89 Светло-голубой Светло-зеленый Светлобирюзовый Светло-красный Светломалиновый Желтый Белый LightBlue LightGreen LightCyan 9 10 11 LightRed LightMagenta 12 13 Yellow White Табл. 2. Константы цветов. 14 15 В текстовом режиме возможны 16 различных цветов для символов (различные сочетания четырех битов от 0000 до 1111). Они обозначаются цифрами от 0 до 15 или константами, определенными в модуле CRT. Текстовый режим работы характеризуется двумя важными параметрами: максимальным числом символов в строке и количеством строк на экране. Стандартные значения этих параметров – 25 строк по 80 символов в каждой. Для изменения значений этих параметров применяется процедура textmode(mode), где mode – константа целого типа. Например: textmode(BW40); или textmode(0); - активизация черно-белого текстового режима 25 строк по 40 символов; textmode(259); или textmode(CO80+Font8x8); - активизация цветного текстового режима 50 строк по 80символов в строке. По умолчанию устанавливается режим mode = 3. Количество Наименование Значение строк, константы константы Тип адаптера Вид вывода символов в mode mode строке BW40 0 25x40 Цветной Черно-белый CO40 1 25x40 Цветной Цветной BW80 2 25x80 Цветной Черно-белый CO80 3 25x80 Цветной Цветной Mono 7 25x80 Моно Черно-белый Font8x8 +256 50 строк Цветной Цветной Табл.3. Текстовые режимы. Положение каждого знакоместа текстового экрана можно определить двумя координатами: левый верхний угол экрана имеет координаты (1,1). Координата X обозначает позицию символа в строке, а координата Y – номер строки, отсчитываемой по направлению от верха экрана к низу. Стандартные процедуры управления цветом модуля CRT. LowVideo, NormVideo - устанавливает режим нормальной яркости символов; HighVideo - устанавливает режим наибольшей яркости символов; 90 TextBackGround(Color) – устанавливает цвет фона выводимого символа; Color – выражение целого типа от 0 до 7; TextColor(Color) – устанавливает цвет выводимого символа; Color – выражение целого типа от 0 до 15. Процедуры и функции для управления выводом в активное окно Window(x1,y1,x2,y2) – определяет размер окна. Ощутить действие этой процедуры можно только после выполнения следующих за ней команд управления экраном; ClrScr – очищает активное окно и устанавливает курсор в левый верхний угол; ClrEol – очищает строку активного окна от текущей позиции курсора до конца строки без изменения позиции курсора; GoToXY(x,y) – перемещает курсор в позицию с координатами X и Y в рамках активного окна; WhereX – возвращает Х-координату текущей позиции курсора; WhereY - возвращает Y -координату текущей позиции курсора; Список рекомендуемой литературы: 1. Немнюгин В. "Turbo Pascal 7.0. Практикум", 2007 2. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 Семинар № 21 Графический режим. Модуль GRAPH В настоящее время графический режим является основным режимом работы видеоадаптера. Видеопамять в графике используется таким образом, что для каждого пиксела хранится его цвет. В этом режиме программист имеет возможность управлять каждым пикселом, что позволяет строить на экране любые изображения. Среда ТР использует текстовый режим, поэтому для использования графических средств компьютера нужно выполнить переключение в графический режим. Для работы в графическом режиме необходимо наличие графического драйвера. Это файл с расширением .BGI. обычно это файл EGAVGA.BGI, рассчитанный на работу с дисплейным адаптером VGA. Загрузка графического драйвера и инициализации графики осуществляется с помощью процедуры initgraph: Initgraph(Драйвер, Режим, ПутьКДрайверу); 91 Драйвер – номер драйвера - переменная типа integer, определяющая тип графического драйвера; Режим – номер режима - переменная типа integer, устанавливающая режим работы адаптера; ПутьКДрайверу – выражение типа string, содержащая путь к файлу драйвера. Основные процедуры и функции для переключения видеорежимов: Initgraph(gd,gm,path) – инициализация графического режима. Если gd=0 или = detect, то нужный драйвер определяется автоматически. Если path = '', то драйвер ищется в текущем каталоге; CloseGraph – выход из графического режима, восстанавливается режим, который был до инициализации графики; RestoreCrtMode – временное переключение в текстовый режим; SetGraphMode(Mode) - устанавливает новый графический режим; ClearDevice – очистка экрана в графическом режиме. Основные функции для работы с координатами Начало координат в графическом режиме находится в левом верхнем углу, также как и в текстовом режиме. Отсчет координат в графическом режиме начинается с нуля, т.е. левый верхний угол экрана имеет координаты (0,0). Горизонтальная координата (X) увеличивается слева направо, а вертикальная (Y) – сверху вниз. При разрешении экрана 640х480 максимальная координата X равна 639, а Y – 479. GetMaxX – возвращает максимальную координату X; GetMaxY – возвращает максимальную координату Y; GetX – возвращает текущую координату X; GetY – возвращает текущую координату Y; GetPixel(X,Y) – возвращает цвет точки с координатами (X,Y). Текущий указатель в графическом режиме играет ту же роль, что и курсор в текстовом режиме, только он невидим. Графические примитивы – это элементарные геометрические фигуры, для изображения которых в графическом режиме имеются специальные процедуры и функции. Процедуры для изображения графических примитивов: PutPixel(X,Y,Color) – выводит на экран точку с координатами (X,Y) и цветом Color, положение текущего указателя не изменяется; Line(X1,Y1,X2,Y2) – проводит прямую линию из точки с координатами (X1,Y1) в точку с координатами (X2,Y2); 92 MoveTo(X,Y) – перемещает текущий указатель в точку (X,Y); LineTo(X,Y) – проводит прямую линию из точки, где находится текущий указатель, в точку (X,Y). Текущий указатель тоже перемещается в эту точку; LineRel(Dx,Dy) – проводит прямую линию из точки, где находится текущий указатель, в точку с приращением координат на Dx (по X) и на Dy (по Y). Текущий указатель тоже перемещается в конец линии; Rectangle(X1,Y1,X2,Y2) – рисует прямоугольник с координатами (X1,Y1,X2,Y2); Bar(X1,Y1,X2,Y2) – заштрихованный прямоугольник с координатами (X1,Y1,X2,Y2); Bar3D(x1,y1,x2,y2,h,Top) – объемная прямоугольная полоса толщиной h, Top – логический параметр, принимающий значение TopOn или TopOff указывает, нужно ли изображать верхнюю грань; Circle(X,Y,Radius) – окружность с центром в точке (X,Y ) и радиусом Radius; Arc(X,Y,StAngle,EndAngle,Radius) – дуга окружности от угла StAngle до угла EndAngle с центром в точке (X,Y) и радиусом Radius. Углы задаются в градусах по направлению против часовой стрелки; Ellipse(X,Y, StAngle,EndAngle,Xradius,Yradius) – дуга эллипса с центром в точке(X,Y) и с радиусами Xradius – по оси X, и Yradius – по оси Y и от начального угла StAngle и до конечного угла EndAngle. Если StAngle = 0, а EndAngle = 360, то вычерчивается полный эллипс; FillEllipse(X,Y, Xradius,Yradius) - эллипс, заштрихованный текущим цветом; DrawPoly(N,ArrayOfPoint) – ломаная линия, которая имеет N вершин с координатами, заданными в массиве записей ArrayOfPoint; FillPoly(N,ArrayOfPoint) – заштрихованная замкнутая линия; FloodFill(X,Y,Border_Color) – заливка произвольной замкнутой области с цветом границ Border_Color. Установка цветов и стилей для фигур: При инициализации графического режима текущие цвета – черный для фона и белый – для линий и штриховок, текущие стили – сплошная линия и заливка. SetColor(Color) – устанавливает цвет выводимого изображения: SetBkColor(Color) – устанавливает цвет фона; SetFillStyle(Style,Color) – устанавливает тип и цвет штриховки; GetColor, GetMaxColor, GetBkColor – функции, возвращающие текущее и максимальное значение цвета для заданного графического режима и значение цвета фона. Для указания различных стилей наполнения пользуются следующими константами: Const EmtyFill = 0; - заполнить область фоновым цветом. 93 SolidFill = 1; - заполнить область заданным цветом. LineFill = 2; - заполнить толстыми горизонтальными линиями. LtSlashFill = 3; - -"- тонкими косыми линиями ///. SlashFill = 4; - -"- жирными косыми линиями ///. BkSlashFill = 5; - -"- жирными косыми линиями \\\. LtBkSlashFill = 6; - -"- жирными косыми полосами \\\. HatchFill = 7; - заполнить клеткой. XHatchFill = 8; - заполнить косой клеткой. InterLeaveFill = 9; - заполнить очень частой косой штриховкой. WideDotFill = 10; - заполнить редкими точками. CloseDotFill = 11; - заполнить частыми точками UserFill = 12; - штриховка, определенная пользователем. Обработка текстовой информации в графическом режиме При работе с графикой в ТР используются два вида шрифтов – растровые и векторные, которые различаются форматом. Растровый символ задается с помощью матрицы элементов изображения этого символа. Векторный шрифт задается набором векторов, указывающих графической системе, как рисовать символ. Если используется векторный шрифт, то при увеличении размера символа качество и разрешение остаются хорошими. В случае растрового шрифта для отображения увеличенных символов битовая матрица умножается на масштабный коэффициент. Если масштабный коэффициент большой, разрешение становится более грубым. Поэтому для вывода мелких надписей надо использовать растровые шрифты, а для более крупных – векторные шрифты. Каждый векторный шрифт хранится в виде отделного файла с расширением .chr. Вывод текста в графическом режиме выполняется только средствами модуля GRAPH. Для эффектного вывода на экран текста в графическом режиме не надо использовать процедуры write, writeln, clrscr, gotoxy. Для вывода текста в графическом режиме используются следующие процедуры: OutText(Text) – выводит на экран строку текста, начиная с текущей позиции; OutTextXY(X,Y,Text) - выводит на экран строку текста, начиная с позиции X, Y; SetTextStyle(Font,Direction,CharSize) – устанавливает шрифт, направление текста, размер символов; SetTextJustify(Horiz,Vert) – выравнивание текста относительно заданной точки; TextWidth(Stroka) – возвращает ширину строки текста на экране в пикселах, используя установленный шрифт; 94 TextHeight(Stroka) - -'- высоту строки текста; DefaultFont – шрифт по умолчанию; TriplexFont – SmallFont – SansSerifFont – GothicFont – Программа вывода текста в графическом режиме на экран: uses graph; var gd,gm: integer; begin gd:= detect; initgraph(gd,gm,''); setbkcolor(1); settextstyle(defaultfont,horizdir,3); settextjustify(centertext,centertext); setcolor(5); outtextxy(320,240,'GAME OVER'); end. Список рекомендуемой литературы: 1. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 2. Немнюгин В. "Turbo Pascal 7.0. Практикум", 2007 3. Абрамов В.Г. "Введение в язык Паскаль", 2004 4. Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 Семинар № 22 Модули в программировании 1. 2. 3. 4. Структура модуля. Модули, определяемые программистом. Компиляция модуля. Подключение модуля к программе. Процесс преобразования исходного кода программы в исполнимый код Программа, написанная на любом языке программирования, перед выполнением должна быть приведена к виду, пригодному для исполнения, т.е. переведена с языка программирования на машинный язык. Машинный язык – это система команд, которую понимает и может выполнить процессор. 95 Другими словами исходный код программы должен быть преобразован в исполнимый код. Прилагательное "исполнимый" представляет собой перевод английского слова executable, отсюда произошло известное расширение всех исполнимых файлов – exe. Для Turbo Pascal исходный код программы, находящийся в файле с расширением pas всегда может быть преобразован в исполнимый код с расширением exe. Обратная операция невозможна. Среда Turbo Pascal формирует исполнимый код по умолчанию в оперативной памяти и, не записывая его на диск, сразу выполняет. Поэтому, чтобы сохранить exe-файл на диск, нужно в ИС в меню Compile изменить установку Destination с Memory на Disk. После этого при запуске программы будет сформирован exe-файл в текущем каталоге. Процесс преобразования исходного кода программы в исполнимый код происходит в два этапа: Компиляция; Компоновка. На этапе компиляции исходная программа преобразуется в машинный код, но он еще не пригоден для исполнения, т.к. в него не включены коды стандартных процедур и функций, которые находятся в отдельном файле Turbo.tpl (библиотека Turbo Pascal). Код программы после компиляции называют объектным кодом. Эту процедуру выполняет программа-компилятор – ее основное назначение заключается в проверке программы на наличие синтаксических ошибок. На этапе компоновки к объектному коду добавляется объектный код стандартных процедур и функций из библиотеки Turbo Pascal, и в результате он превращается в исполнимый код программы. Эту процедуру выполняет программа-компоновщик. Ее назначение – добавить к программе весь недостающий код из других файлов, скомпоновав исполнимый код. Из всего сказанного вытекает важный вывод – компилятор способен откомпилировать и хранить на диске не только законченные программы, но и отдельные части программ, оформленные особым образом. Затем компоновщик соберет объектные коды из разных файлов и в результате будет получен исполнимый код для всей программы. Понятие модуля Библиотечный модуль оформляется как отдельная программная единица, содержащая различные элементы раздела описаний и операторы. В состав модуля входят описания констант, переменных, типов, процедур, функций. Процедуры и функции, содержащиеся в модуле, подключаются к программе на этапе компоновки. Хранится модуль, как в исходном, так и в откомпилированном виде (файлы pas и tpu соответственно). Таким образом, подпрограммы, используемые неоднократно, удобно оформлять в виде отдельных модулей. В ходе своей работы программист накапливает целую коллекцию таких полезных модулей – свою личную библиотеку. 96 В этом и заключается один из принципов современного программирования – принцип модульности. Структура модуля Исходный текст модуля делится на несколько разделов: Заголовок; Интерфейсная часть; Исполняемая часть; Инициализирующая часть. Unit <имя модуля>; Interface …. {Раздел открытых описаний – интерфейсная секция} …. Implementation {раздел закрытых описаний} begin ….. {секция инициализации} ….. end. Модуль начинается с зарезервированного слова Unit, за которым следует имя модуля. Далее следует зарезервированное слово Interface, обозначающее начало секции, видимой тем программам или модулям, в которых используется данный модуль. В случае, если данный модуль использует другие модули, после ключевого слова Interface необходимо поместить зарезервированное слово uses и список используемых модулей. Интерфейсный раздел – часть в модуле между словами Interface и Implementation. В этом разделе можно помещать константы, переменные, процедуры и функции, которые становятся "видимыми" для всех программ и модулей, использующих данный модуль. Но тела этих процедур и функций находятся в секции реализации, начинающейся после слова Implementation. В секции реализации могут находиться свои описания, невидимые для программ и модулей, использующих данный модуль. Описанные в секции интерфейса константы, типы, переменные, процедуры и функции являются видимыми в секции реализации. Те процедуры и функции, которые описаны в интерфейсной части, описываются в секции реализации еще раз, причем их заголовок должен быть точно таким же, как тот, который указан в секции интерфейса. Секция инициализации располагается между словами begin и end. Если слово begin отсутствует, то отсутствует и секция инициализации. 97 В секции инициализации помещаются операторы, выполняющиеся до передачи управления основной программе. Эти операторы обычно используются для подготовки программы к работе. В секции инициализации могут инициализироваться переменные, открываться файлы и т.д. При выполнении программы, использующей некий модуль, секция инициализации этого модуля вызывается перед запуском основного тела программы. При использовании нескольких модулей, их секции инициализации вызываются в порядке, указанном в операторе uses. При использовании модулей в программировании следует знать, что: 1. Имя модуля служит для его связи с другими модулями и основной программой, поэтому заголовок модуля опускать нельзя; 2. Имя модуля должно совпадать с именем его файла, в который помещается исходный текст модуля, что очень важно; 3. В интерфейсной части только общедоступные объявления, т.е. Доступные в любой программе или модуле, к которым будет подключен данный модуль; 4. Исполняемая часть содержит полное описание подпрограмм, объявленных в интерфейсной части. В ней могут располагаться также вспомогательные типы, константы, переменные процедуры и функции; 5. Все вспомогательные элементы, объявленные в исполняемой части, называются скрытыми, т.к. Они доступны только в данном модуле; 6. Инициализирующая часть завершает модуль. Она может отсутствовать вместе со словом begin или быть пустой – тогда за begin должно следовать слово end с точкой. 7. В инициализирующей части могут размещаться операторы, выполняющие какие-то действия еще до начала выполнения основной программы, например открытие файлов или задаваться начальные значения переменным. Компиляция модулей Результатом компиляции модуля является файл с тем же именем и расширением tpu (Turbo Pascal Unit), который можно сохранить на диске. Меню Compile содержит следующие опции: Compile Make Build Destination Primary file Первые три опции – это режимы компиляции. При компиляции модуля в режиме Compile все упоминающиеся в нем модули должны быть 98 откомпилированы предварительно. Если какой-нибудь модуль не откомпилирован, то система ищет подобный файл с расширением pas и при обнаружении компилирует его. В режиме Make система следит за возможными изменениями исходного текста модуля и, если в текст были внесены изменения, то система заново его компилирует и только затем приступает к компиляции основной программы. В режиме Build автоматически компилируются все модули, независимо от времени их обновления. Опция Destination нужна для задания возможности сохранения exe файлов на диске. Опция Primary file позволяет задать файл, который будет автоматически добавляться в начало исходного текста перед компиляцией. Таким способом можно отлаживать модули, подключая к ним исходную программу в качестве Primary file. Рассмотрим пример модуля, в котором описаны две функции – функция Min(X,Y), возвращающая минимум двух чисел, и функция Max(X,Y), возвращающая максимум двух чисел. Unit STUDY; Interface Function Min(X,Y: Integer): Integer; Function Max(X,Y: Integer): Integer; Implementation {раздел закрытых описаний} Function Min(X,Y: Integer): Integer; Begin If X<= Y then Min:= X Else Min:= Y; End; Function Max(X,Y: Integer): Integer; Begin If X>= Y then Max:= X Else Max:= Y; End; {секция инициализации отсутствует} end. Вопросы: 1. Что называется машинным языком? 2. Что такое исходный код программы? 99 3. Что такое исполнимый код программы? 4. Из каких этапов состоит процесс преобразования исходного кода в исполнимый код? 5. Что такое компиляция программы? 6. Что такое компоновка программы? 7. Что получается в результате компиляции? 8. Что получается в результате компоновки? 9. Что такое модуль? 10.Из каких частей состоит структура модуля? 11.Что такое исходный код программы? 12.Что такое исполнимый код программы? 13.Из каких этапов состоит процесс преобразования исходного кода в исполнимый код? 14.Назовите опции меню compile. 15.Охарактеризуйте каждую из опций меню compile. 100 ЛИТЕРАТУРА 6. Рапаков Г.Г., Ржеуцкая С.Ю. " Turbo Pascal для студентов и школьников", 2007 7. Фаронов В. "Turbo Pascal 7.0. Начальное пособие", 2006 8. Немнюгин С.А. " Turbo Pascal. Практикум" 9. Абрамов В.Г. "Введение в язык Паскаль", 2004 10.Пильщиков В. "Сборник упражнений на языке Паскаль", 2001 11.Прищепов М. "Basic, Pascal, Object Pascal в Delphi", 2006 12.Фаронов В. "Программирование в Delphi" 13.Климова Л. "Практическое программирование" 14.Марченко А. " Программирование в среде Turbo Pascal" 15.Борецкий Я. " Turbo Pascal с графикой для ПК" 16.Нейл Дейл "Программирование на СИ ДМК 2000" 17.“ Delphi 5. Самоучитель программиста”. И.Ю. Баженова, 18.Москва 2001г. 19.“Программирование в Delphi 5.” Нейл Рубенкинг, Киев 2000г. 20.“Работа в Delphi 5.” И.К. Коркин, Москва 2000г. 21. Раскин Л.Г. Математическое программирование.- Харьков: ХГПУ, 2000.- 68 22. Банди Б. Методы оптимизации.- М.: Радио и связь, 1984 23. Антонов А.В., Кишинский И.Ю. Направление развития информационнопоисковых и аналитических систем.- М.: НТИ, сер. 1, 2002, №3, с.31-34 24. Березовский Б.А., Борзенко В.И., Кемпнер А.М. Бинарные отношения в многокритериальной оптимизации.- М.: Наука, 1981.- 150 с. 25. Сергин М.Ю. Оптимизация информационно-поисковых систем.- М.:НТИ, сер. 2, 2001, №6, с. 1-4 26. Вентцель Е.С. Теория вероятностей.- М.: Наука, 1964 27. Ермаков С.М, Михайлов Г.А. Курс статистического моделирования.- М.: Наука, 1976 28.Мазманишвили А.С., Шкварко Ю.В. Практикум по численным методам.-К.:ИСДО, 1994.- 160 с. 29. Полляк Ю.Г.Вероятностное моделирование на электронных вычислительных машинах.- М.: сов. Радио, 1971. 101 Проверочные тесты к семинару № 1: 1. Алгоритм — это: А) Список набора команд; B) Понятное и точное предписание исполнителю совершить последовательность действий, направленных на достижение поставленных целей; C) Правила выполнения определенных действий. 2. Суть такого свойства алгоритма как результативность заключается в том, что: A) алгоритм должен обеспечивать решение не одной конкретной задачи, а некоторого класса задач данного типа; B) записывая алгоритм для конкретного исполнителя, можно использовать лишь те команды, что входят в систему его команд; C) при точном исполнении всех команд алгоритма процесс должен прекратиться за конечное число шагов, приведя к определенному результату; 3. Суть такого свойства алгоритма как массовость заключается в том, что: A) алгоритм должен обеспечивать решение не одной конкретной задачи, а множества однотипных задач с различными исходными данными; B) записывая алгоритм для конкретного исполнителя, можно использовать лишь те команды, что входят в систему его команд; C) алгоритм должен иметь дискретную структуру (должен быть разбит на последовательность отдельных шагов); 4. Суть такого свойства алгоритма как дискретность заключается в том, что: A) при точном исполнении всех команд алгоритма процесс должен прекратиться за конечное число шагов, приведя к определенному результату. B) алгоритм должен быть разбит на последовательность отдельных простых действий; C) алгоритм должен обеспечивать решение не одной конкретной задачи, а некоторого класса задач данного типа; 102 5. Алгоритм называется линейным: A) если ход его выполнения зависит от истинности тех или иных условий; B) если он составлен так, что его выполнение предполагает многократное повторение одних и тех же действий; C) если его команды выполняются в порядке их естественного следования друг за другом независимо от каких-либо условий; 6. Алгоритм называется циклическим: A) если ход его выполнения зависит от истинности тех или иных условий; B) если он составлен так, что его выполнение предполагает многократное повторение одних и тех же действий; C) если его команды выполняются в порядке их естественного следования друг за другом независимо от каких-либо условий. 7. Алгоритм включает в себя ветвление, если: A) если ход его выполнения зависит от истинности тех или иных условий; B) если он составлен так, что его выполнение предполагает многократное повторение одних и тех же действий; C) если его команды выполняются в порядке их естественного следования друг за другом независимо от каких-либо условий. 8. Графический блок применяется для обозначения: A) выполнения многократно повторяющихся действий. B) выбора напрвления выполнения действий в зависимости от условий; C) выполнения определенных действий; 9. Графический блок применяется для обозначения: A) выполнения многократно повторяющихся действий; B) выбора напрвления выполнения действий в зависимости от условий; C) выполнения определенных действий 10. Графический блок применяется для обозначения: A) выбора напрвления выполнения действий в зависимости от 103 условий; B) выполнения многократно повторяющихся действий; C) выполнения определенных действий. 11. Графический блок применяется для обозначения: A) выполнения многократно повторяющихся действий; B) ввода или вывода данных; C) выполнения определенных действий. 12. Графический блок применяется для обозначения: A) выполнения многократно повторяющихся действий; B) выполнения определенных действий. C) начала и конца программы; Проверочные тесты к семинару № 2: 1. По отношению к программе данные делятся на: A) числовые, строковые, символьные; B) исходные, результаты, промежуточные; C) целые, дробные, логические. 2. Константы – это величины, значения которых: A) нельзя изменить в процессе выполнения программы; B) можно изменить в процессе выполнения программы; C) можно изменить в программе после ее объявления. 3. Какими константы не могут быть: A) зарезервированными. B) именованными; C) линейными; 4. Переменные - это величины, которые в процессе выполнения программы: A) меняют свои значения; B) остаются неизменными; 104 C) являются зарезервированными словами языка ТР. 5. Из каких частей состоит структура программы? A) Информационная часть; Программная часть. B) Основная часть; Дополнительная часть; Заключительная часть. C) Заголовок программы; Описательная часть; Исполнительная часть. 6. Что такое идентификатор? А) Имя константы, переменной, метки, подпрограммы; B) Заголовок программы; C) Раздел программы. 7. Заголовок программы начинается с ключевого слова: A) BEGIN B) PROGRAM C) CONST 8. В системе Turbo Pascal начало раздела программы, содержащего список меток, фиксируется служебным словом: A) VAR; B) LABEL; C) CONST; 9. Служебное слово VAR в программе на языке Pascal фиксирует начало раздела программы, содержащего: A) список меток; B) описание переменных; C) операторы. 11. Служебное слово CONST в программе на языке Pascal фиксирует начало раздела программы, содержащего: A) перечень констант; B) описание переменных; C) список меток. 12. В качестве идентификатора в языке Pascal нельзя использовать: A) _END; B) END; 105 C) DEN. 13. Раздел подключаемых модулей начинается со слова: А) USES B) PROGRAM C) CONST 14. Исполнительная часть программы начинается с ключевого слова: A) PROGRAM B) BEGIN C) USES Проверочные тесты к семинару № 3: 1. Какой из перечисленных типов относится к целочисленному типу? А) BOOLEAN; B) BYTE; C) CHAR. 2. Какой из перечисленных типов относится к вещественному типу? А) INTEGER B) WORD; C) REAL; 3. Числа в языке Pascal различаются: A) как натуральные и целые; B) как целые и вещественные; C) как натуральные и вещественные; 4. 1 бит может принимать значение: A) 1 или 2; B) 0 или 1; C) от 0 до 9; 106 5. 1 байт равен: A) 16 бит; B) 8 бит; C) 4 бит; 6. Логический тип описывается как: A) BOOLEAN; B) REAL; C) CHAR; 7. Переменные логического типа могут принимать значения, равные: A) 0 или 1; B) TRUE или FALSE; C) BYTE или BIT; 8. Символьный тип в языке Pascal описывается как: A) WORD; B) BOOLEAN; C) CHAR; 10.Укажите правильное описание переменной перечисляемого типа: A) VAR COLOR = ('BLACK', 'RED', 'WHITE'); B)VAR COLOR: (BLACK, RED, WHITE); C)VAR COLOR = SET OF (BLACK, RED, WHITE); D) VAR COLOR = ['BLACK', 'RED', 'WHITE']. 11.Имеется описание: VAR S: (BOOK, PEN, PENCIL); Укажите значение, которое вернет функция ORD(S), если переменная S имеет значение равное PEN. A) 2. 107 B) PEN; C) 1; D) 0; 12.Имеется описание: VAR S: (BOOK, PEN, PENCIL); Укажите значение, которое вернет функция PRED(S), если переменная S имеет значение равное 1. A) 1; B) 0; C) PEN; D) 2. Проверочные тесты к семинару № 4: 1. В языке ТР оператор присваивания может быть записан так: A) A =: B; B) A:= B; C) A = B; 2. В языке Pascal в левой части оператора присваивания указывается: A) Имя переменной, которой присваивается новое значение; B) Имя переменной, значение которой остается неизменным; C) Значение, которое следует присвоить указанной переменной. 3. В языке Pascal в правой части оператора присваивания указывается: A) Имя переменной, которой присваивается новое значение; B) Имя переменной, значение которой остается неизменным. C) Значение, которое следует присвоить указанной переменной; 4. В языке Pascal выражения могут быть: A) Арифметические, логические, символьные; B) Целые, вещественные, строковые; C) Переменные, константы. 108 5. Имеется описание: VAR A: INTEGER; B: REAL; Укажите вариант оператора присваивания, при котором не возникнет ошибка о несовместимости типов: A) A:= B + B; B) A:= A + B; C) B:= A + B; 6. В языке Pascal для ввода данных применяется оператор: A) WRITELN (список ввода); B) READLN (список ввода); C) BEGIN (список ввода). 7. В языке Pascal для вывода данных применяется оператор: A) READLN (список вывода); B) BEGIN (список вывода). C) WRITE (список вывода); 8. Оператор READLN отличается от READ тем, что: A) Дает указание на переход в конец строки; B) Дает указание на переход к следующей строке; C) Дает указание на переход в начало строки. 9. Оператор WRITELN отличается от WRITE тем, что: A) Переводит курсор на следующую строку; B) Переводит курсор в конец строки; C) Переводит курсор в начало строки. 10. Сколько строчек появится на экране в результате выполнения следующих инструкций? ……….. Х:=2; У:=3; WRITE(Х); WRITE(Х*Х); WRITELN(Х*Х*Х); WRITE(Y); WRITELN(У*У); WRITELN(У*У*У); 109 A) 5; B) 3; C) 4. D) 6 11. Имеется описание: VAR B: REAL; Укажи верный вариант для вывода значения В в заданном формате 5-и позиций для числа, из них – 2 позиции для дробной части: A) WRITE (B:2:5); B) WRITE (B:5:2); C) WRITE (B-5-2); 12. Имеется описание: VAR K: REAL; I: BYTE; После выполнения операторов: K:= 5.25; I:= 10; WRITE('ОТВЕТ: '); WRITELN('I=', I:3, '; К=’, K:5:2); на экране появиться следующая информация: A) ОТВЕТ: I= 10; K= 5.25 B) ОТВЕТ: I= 10; K= 5.25 C) ОТВЕТ: I= 10K= 5.25 Проверочные тесты к семинару № 5: 1. В системе Turbo Pascal для получения остатка от целочисленного деления применяется операция: A) MOD; B) VAR; C) DIV. 2. В системе Turbo Pascal для получения числа без остатка от целочисленного деления применяется операция: 110 A) MOD. B) DIV; C) ABS; 3. В системе Turbo Pascal для вычисления квадратного корня из числа Х применяется функция: A) SQR(X); B) ABS(X). C) SQRT(X); 4. Результат выполнения операции 17 DIV 2 равен: A) 7; B) 8; C) 5. 5. Результат выполнения операции 17 MOD 2 равен: A) 1; B) 7; C) 8. 6. Результат выполнения операции 27 DIV 2 MOD 2 равен: A) 2. B) 1; C) 5; 7. Для ввода значений переменных применяется оператор: А) READ; B) WRITELN; C) RAED. 9. Для вывода значений переменных применяется оператор: A) WIRET; B) WRITE; C) READLN. 10.В системе Turbo Pascal для вычисления квадрата числа Х применяется функция: A) SQRT(X). B) SQR(X); 111 C) ABS(X); 10.Чему будет равно значение М в результате выполнения процедуры DEC: VAR M: BYTE; BEGIN M:= 12; DEC(M,3); END. A) 15; B) 9; C) 10. 11.Чему будет равно значение М в результате выполнения процедуры INC: VAR M: INTEGER; BEGIN M:= 100; INC(M,-1); END. A) 101; B) 99; C) 100. 12. Операторы в программе на языке Pascal отделяются друг от друга: A) Точкой с запятой; B) Пробелом; C) Запятой. Проверочные тесты к семинару № 6: 1. Какая из перечисленных операций не является операцией отношения? А) <>. B) >=; 112 C) :=; 2. Даны две переменные А и В. Если А не равно нулю, то В разделить на А. Выбрать правильный вариант записи: А) IF A # 0 THEN B/A; B) IF A <> 0 THEN C:= B/A; C) IF A <> 0 THEN C:= B:A. 3. Даны две переменные А и В. Если А больше В, то значение В увеличить в 2 раза, в противном случае В разделить на А. Выбрать правильный вариант записи: А) IF A > B THEN C:= 2*B ELSE C:= B/A; B) IF A > B THEN C:= 2A ELSE C:= B/A; C) IF A > B THEN C:= B/A ELSE C:= 2*B; 4. Дана программа: VAR X: INTEGER; BEGIN READLN(X); IF X MOD 2 = 0 THEN WRITELN(‘ДА’) ELSE WRITELN(‘НЕТ’) END. При каком значении X будет получен ответ “ДА”? A) 15; B) 4; C) 7; D) 3; E) 21. 2. Дана переменная А интервального типа (0..1000). Определить правильный вариант оператора выбора, определяющего значность числа А: A) CASE A OF 0..9: WRITELN(‘А - однозначное число’); 10..99: WRITELN(‘А - двузначное число’); 100..999: WRITELN(‘А - трехзначное число’); END; B) CASE A OF 113 0..10: WRITELN(‘А - однозначное число’); 11..100: WRITELN(‘А - двузначное число’); 101..1000: WRITELN(‘А - трехзначное число’); END; C) CASE A OF 1: WRITELN(‘А - однозначное число’); 2: WRITELN(‘А - двузначное число’); 3: WRITELN(‘А - трехзначное число’); END; 3. Логическое выражение (X>=A) AND (X<=B) истинно при: A) X принадлежит отрезку [A,B]; B) X принадлежит объединению интервалов [A,бесконечность] и [B,бесконечность]; C) X принадлежит объединению интервалов [минус бесконечность,A] и [B, плюс бесконечность]; 4. В качестве имени в языке Pascal нельзя использовать: A) WR B) BR; C) OR; Проверочные тесты к семинару № 7: 1. Какой из перечисленных операторов не является оператором цикла: A) WHILE. B) WRITE; C) FOR; 2. Какой из перечисленных операторов цикла является оператором цикла с параметром: A) REPEAT B) WHILE; C) FOR; 3. Какой из перечисленных операторов цикла является оператором цикла с предусловием: A) WHILE; 114 B) FOR; C) REPEAT. 4. Какой из перечисленных операторов цикла является оператором цикла с постусловием: A) WHILE; B) REPEAT; C) FOR. 5. Определите результат выполнения фрагмента программы: X:= 0; FOR I:= 4 DOWNTO 1 DO X:= X + I; WRITELN(X); A) B) C) D) 9; 10; 4; 7; 6. Определите результат выполнения фрагмента программы: B:= 4; FOR J:= 1 TO B DO X:= J; WRITELN(X - B + 7); A) 4; B) 0; C) 7; D) 1. 7. Определите результат выполнения фрагмента программы: X:= 4; S:= 0; WHILE X > 0 DO BEGIN S:= S + X; X:= X DIV 2; END; WRITELN(S); A) 0. B) 6; C) 4; D) 7; 115 8. Определите значение переменной S после выполнения следующих операторов: S:= 3; FOR J:= 1 TO 5 DO; S:= S + J; WRITELN(S); A) 8; B) 3; C) 0; D) 18; 9. Определите значение переменной S после выполнения следующих операторов: S:= 0; N:= 1; FOR J:= 2 TO N DO S:= S + 1/ J; A) 2; B) 0; C) 4; D) 1. 10. Определите значение переменной I после выполнения следующих операторов, если первоначально значение I было равно нулю: I:= 0; REPEAT I:= I+1; UNTIL I > 100; A) 100; B) 101; C) 99. 11.Определите значение переменной I после выполнения следующих операторов, если первоначально значение I было равно 1: I:= 1; WHILE I <= 100 DO INC(I,2); 116 A) 100; B) 98; C) 101. 12.Определите значение переменной K после выполнения следующих операторов, если первоначально значение K было равно 10: K:= 10; REPEAT DEC(K,-2); WRITE(K:3); UNTIL K > 10; A) 10; B) 12; C) 8. Проверочные тесты к семинару № 8: 1. Найдите правильное описание массива: A) ARRAY D[1..5]: OF INTEGER. B) D: ARRAY[1..5] OF REAL; C) D[1..5]:ARRAY OF INTEGER; 2. Что такое массив? A) Совокупность однотипных данных, хранящихся в последовательных ячейках памяти; B) Табличные данные; C) Набор данных разных типов, которые имеют порядковый тип; 3. Массив данных имеет: A) Общий индекс для всех элементов массива. B) Общее имя и один тип; C) Общее имя; D) Один тип; 4. В записи D[4]:= 3.5, D обозначает… A) Имя массива; B) Константу; C) Индекс элемента массива. 5.Что выполняет следующий фрагмент программы: FOR I:= 1 TO N DO WRITE (A[ I ], ‘ ’); 117 A) Производит ввод данных в массив; B) Выводит N значений массива на экран; C) Заполняет массив элементами определенных значений; 6. Индексом элемента массива называется… A) Значение элемента массива; B) Номер элемента в массиве; C) Первый элемент в массиве; D) Последний элемент в массиве. 7. Для заполнения массива случайными числами мы должны подключить датчик случайных чисел, используя команду… A) A[I]:=?; B) REWRITE(F). C) RANDOMIZE; D) CLRSCR; 8. Массив R[1]=12, R[2]=3, R[3]=-5, R[4]= -6, R[5]=4, R[6]=9, R[7]=0, R[8]=8. Определите значение суммы после выполнения следующего фрагмента программы: SUM:= 0; FOR I:= 1 TO 8 DO SUM:= SUM + R[I]; WRITELN (SUM); A) 15. B) -11; C) 36; D) 25; 9. Для заполнения массива путем ввода чисел с клавиатуры мы используем оператор… A) RANDOMIZE. B) WHILE; C) READLN; D) WRITE; 10.Для подсчета суммы элементов массива в цикле используем следующую запись… A) SUM:= A[I]+A[I+1]; B) SUM:= A[I]+SUM; C) SUM:= SUM+A(I); D) SUM:= A[I]; E) SUM:= A(I). 118 11. Найдите верное обозначение массива: A) Х[1:5]. B) Z[6….12]; C) N[2,4]; D) Х[1.5]; E) M[1..5]; . 12. Какое значение из предложенных может принимать индекс массива R[55]? A) 100. B) -55; C) 44; D) 56; Проверочные тесты к семинару № 9: 1. Определить, какой из предложенных вариантов объявления строкового типа неверен: A) VAR S1,S2: STRING(20); B) VAR ST: STRING[50]; S: STRING; C) TYPE STROKA = STRING[20]; VAR D1,D2: STROKA; 2. Какая из указанных функций определяет количество символов в строке: A) POS(S1,S2). B) LENGTH(S); C) COPY(S1,1,10); 3. Какая из указанных процедур выполнит удаление десяти символов из строки S с пятой позиции: A) DELETE(S,10,5); B) DELETE(S,5,10); C) DELETE(5,10,S). 119 4. Какая из указанных процедур выполнит вставку подстроки S1 в строку S2 с пятой позиции: A) INSERT(5,S1,S2); B) INSERT(S1,S2,5); C) INSERT(S2,S1,5). 5. Определите значение переменной S в результате выполнения следующей программы: VAR A, B, C, S: STRING; BEGIN S:= ‘МИСТИКА’; A:= COPY(S,2,4); A:= A+’НА’; B:= ‘ГДЕ-ТО ТАМ’; DELETE(B,7,4); S:= ‘РЯДОВОЙ’; C:= COPY(S,1,4); C:= C+’М’; S:= A+’ ’+B+’ ’+C+’!’; WRITELN(S); END. A) ‘Истина и дом рядом’. B) ‘Дом где-то там, рядом’; C) ‘Истина где-то рядом’; 6. Определите результат выполнения следующей программы: VAR A, B, C, D, E: STRING[15]; BEGIN A:='СТИХОТВОРЕНИЕ'; B:=COPY(A, 1, 4); C:=COPY(A, 2,4); D:=COPY(A, 6, 8); E:=COPY(A, 7, 3); WRITELN(B, ', ',C, ', ',D, ', ',E); READLN; END. A) ‘Тихо, Стих, Вор, Творение’; B) ‘Стих, Тихо, Творение, Вор’; C) ‘Творение, Стих, Тихо, Вор’. 7. Что получится в результате выполнения следующих операторов? 120 S1:= ‘Object Pascal базовым языком ’; S2:= ‘Delphi’; INSERT(‘ является’, S1, 15); WRITE(S1, ‘ ‘, S2, ‘!’); A) ‘Object Pascal является базовым языком Delphi ’. B) ‘Delphi является базовым языком Object Pascal’. C) ‘Object Pascal является базовым языком Delphi!’; 8. Если выполнить следующие действия, то в результате получим: S1:= ‘Object Pascal’; S2:= COPY(S1, 1, 6); WRITE(S2); A) Pascal B) Object C) Object Pascal 9. Если выполнить следующие действия, то в результате получим: S1:= ‘Turbo Pascal’; DELETE(S1, 7, LENGTH(S1)); WRITE(S1); A) Turbo B) Turbo Pascal C) Pascal 10. Что выведется на экран в результате выполнения следующей программы? VAR A,B: INTEGER; BEGIN А:=10; B:=5; WRITELN(' СУММА ', А ,' И ', B ,' РАВНА '); WRITE(А+B:10); WRITELN; WRITE(‘РАЗНОСТЬ ’, A,’ И ‘, B,’ РАВНА’,A-B:7); END. A) СУММА 10 И 5 РАВНА 15 РАЗНОСТЬ 10 И 5 РАВНА 5 B) СУММА A И B РАВНА 15 РАЗНОСТЬ A И B РАВНА 5 121 C) СУММА A И B РАВНА 15 РАЗНОСТЬ A И B РАВНА 5 11. При выполнении следующей программы VAR N: INTEGER; S: STRING; BEGIN N:= 1; S:= ‘-АЯ СТРОКА’; REPEAT INC(N); UNTIL N > 10; WRITE(N); WRITELN(S); END. на экран выйдет: A) 10-ая строка; B) 1-ая строка; C) 11-ая строка; D) Выведутся строки в виде «1-ая строка» «2-ая строка» и т.д. до 10. 12. Какое значение получит переменная S в результате выполнения следующего фрагмента программы? VAR S: CHAR; BEGIN READLN(S); S:= UPCASE(‘b’); WRITELN(S); END. A) значение, которое было введено оператором READLN(S). B) b; C) B; Проверочные тесты к семинару №10 1. Множества это: A) Наборы однотипных не связанных друг с другом данных; B) Наборы однотипных связанных друг с другом данных; 122 C) Структура данных, состоящая из фиксированного количества полей. 2. Элементы множества представляют собой… A) Пронумерованные данные, каждый элемент из которых имеет индекс; B) Элементы множеств могут быть пронумерованы, в зависимости от условия задачи. C) Данные, не имеющие индексов; 3. Укажите верный вариант значения множества: A) (1,2,5); B) [1,2,5 ]; C) /1,2,5/. 4. Укажите неверный вариант объявления множества: A) Type Mnog = set of 1..50; Var M1, m2: of mnog; B) Var M1, m2: mnog of integer; C) Var M1, m2: set of char; 5. Если множество объявлено следующим образом Var mn: set of 1..30, то задать значение множеству можно… A) Mn:= [-1..30]. B) Mn:= 30..1; C) Mn:= [15, 18, 25, 1..10]; 6. Какая из перечисленных операций не применяются к множествам: A) Деление 2-х множеств; B) Пересечение 2-х множеств; C) Объединение 2-х множеств. 7. Даны множества М1:= [2..5,8..12]; M2:= [0..6]. Определить результат операции пересечения этих множеств: A) [1,2,3,4,5,6]; B) [2,3,4,5]; C) [0,4,5,8]; 123 8. Даны множества М1:= [2..5,8..10]; M2:= [0..5]. Определить результат операции объединения этих множеств: A) [2,3,4,5]; B) [1,2,3,4,5]; C) [0,1,2,3,4,5,8,9,10]; 9. Даны множества М1:= [2..5,8..10]; M2:= [0..5]. Определить результат операции разности этих множеств: A) [8,9,10]; B) [1,2,3,4,5]; C) [2,3,4,5]; 10. В следующем блоке type rec = set of 5..500; var m1,m2: rec; объявлены: A) Записи; B) Множества; C) Переменные порядкового типа; D) Типизированные константы; E) Строки. 11. Найдите неверное обозначение массива: A) Z[1..5,1..10]; B) M[1..5]; C) N[2,4]; 12. Определите значение переменной I после выполнения следующих операторов, если первоначально значение I было равно нулю: I:= 0; REPEAT INC(I,2); UNTIL I > 100; A) 102; B) 100; C) 101. Проверочные тесты к семинару №11 1. Запись это: A) Наборы однотипных связанных друг с другом данных; 124 B) Структура данных, состоящая из фиксированного количества компонентов, называемых полями; C) Наборы, связанных друг с другом данных. 2. Полями записи могут быть… A) Данные одного типа; B) Данные разного типа; C) Данные только строкового типа. 3. Укажите верный вариант объявления записи: A) Type Zapis = record Field1: string; Field2: integer; Field3: real; End; Var zap: zapis; B) Var zapis: record; C) Type zapis = set of 1..50; Var z1, z2: of zapis; 4. Чтобы обратиться к значению поля записи, применяется составное имя… A) <Имя поля >.<Имя переменной>; B) <Имя поля >-<Имя переменной>; C) <Имя переменной>.<Имя поля >; 5. Для упрощения доступа к полям записи применяется оператор… A) WITH; B) WHILE; C) REPEAT; 6. Определить результат выполнения следующего фрагмента программы: Type Face = record N: integer; F,G: string[15]; A: byte; End; Var 125 S: Face; I: integer; Begin For I:= 1 to 10 do S.А:= I; S.F:= ‘Студент’; S. N:= 2000 + S. А; S.G:= ‘уч.год’; Writeln(S.F, ‘ы ‘,S.N, ‘ - 2011’, S.G,’a’); End. A) Студенты 2011 уч.года; B) Студенты 2010 - 2011 уч.года; C) Студенты 2010 - 2011 уч.год; 7. Определить результат выполнения следующего фрагмента программы: Type F = record N: integer; A: real; End; Var S: array[1..4] of F; I: integer; Begin For I:= 1 to 4 do Begin S[I].N:= I; S[I].A:= I/2; Write(S[I].N:2, S[I].A:3:1); End; End. A) 1 0.5 2 1 3 1.5 4 2; B) 1 2 3 4 0.5 1 1.5 2; C) 0.5 1 1.5 2 1 2 3 4; 8. Сколько элементов имеет ниже описанный массив? Var a: array [1..3,1..3] of integer; A) 6 B) 9 C) 3 126 9. Что выводиться на печать в результате выполнения следующей программы? Var i: integer; begin i:=1; while i<=3 do begin write (‘*’); i:=i+1; end. A) ‘***’ B) ‘*’ ‘*’ ‘*’ C) *** 10.Какое значение возвращает функция POS при следующих значениях переменных L и S? L=’т’, S=’студент' POS(L,S)=? A) 7 B) 2 C) 0 11.Что получиться в результате выполнения процедуры DELETE при следующих значениях переменных S и P? . S=’теле’, Р=’фон’ DELETE(S+P,3,4)=? A) ‘тен’ B) ’тел’ C) ’леф’ 12.В какой строке допущена ошибка в следующих операторах: 1) PROGRAM pr; 2) VAR A: ARRAY[1,10] OF REAL; 3) READLN(X); 4) WRITE(Y); 5) WHILE Z<=10 DO; A) 1 B) 4 C) 2 127 Проверочные тесты к семинарам №12, 13 1. Что такое процедура? A) Это оператор присваивания B) Это независимая часть программы, выполняющая определенные действия C) Это разветвляющийся алгоритм D) Это основная программа, написанная на языке программирования 2. Структура процедуры состоит из: A) Списка фактических параметров B) Операторов, следовавших в определенном порядке C) Заголовка, тела процедуры D) Списка формальных параметров 3. Заголовок процедуры имеет вид: A) Procedure; B) Procedure Proc: Integer; C) Procedure Proc(m, n: integer; var k: integer): Integer; D) Procedure Proc(m, n: integer; var k: integer); 4. Процедура может вызываться в основной программе: A) Только один раз B) Необходимое по решению задачи количество раз C) Два раза: в начале программы и в конце D) Три раза: в начале, в середине и в конце программы 5. Укажи оператор вызова процедуры Procedure Proc(m, n: integer; var k: integer); A) Proc; B) Proc(m, n); C) Proc(k); D) Proc(a, b, c); 6. Заголовок функции имеет вид: A) Function; B) Function (x, y: real): real; C) Function Fun(x, y: real); D) Function Fun(x, y: real): real; E) Function Fun(x, y): integer; 7. Укажи правильный вариант вызова функции Function Fun(x, y: real): real; A) Fun(m, n); B) Z:= Fun; 128 C) F:= Sqrt(Y) / Fun(m, n); D) D:= Fun(m); E) A:= Fun(m: real); 8. Какие переменные называются локальными? A) Переменные, которые описываются после заголовка процедуры и доступны только в пределах этой подпрограммы B) Переменные, которые описаны в вызывающей программе C) Переменные, которые описаны в списке формальных параметров D) Переменные, которые перечислены в списке фактических параметров 9. Какие переменные называются глобальными? A) Переменные, которые описаны в вызывающей программе B) Переменные, которые описываются после заголовка процедуры и доступны только в пределах этой подпрограммы C) Переменные, которые перечислены в списке фактических параметров D) Переменные, которые описаны в списке формальных параметров 10.Укажи локальные переменные в следующем примере: var a, b, d: integer; procedure p(var x: integer; y: integer); var c: integer; begin c:= 1; d:= 1; x:= 1; y:= 1; writeln(x:3, y:3, c:3, d:3); end; begin ... end. A) X,Y; B) C; C) A,B,D; D) C,D,X,Y. 11.Укажи глобальные переменные: var a, b, d: integer; procedure p(var x: integer; y: integer); var c: integer; begin c:= 1; d:= 1; x:= 1; y:= 1; writeln(x:3, y:3, c:3, d:3); 129 end; begin ... end. A) X,Y; B) C; C) A,B,D; E) C,D,X,Y. 12.Укажи параметр-переменную, передающую значение в основную программу: Program pr; var a, b, d: integer; procedure p(var x: integer; y: integer); var c: integer; begin c:= 1; d:= 1; x:= 1; y:= 1; writeln(x:3, y:3, c:3, d:3); end; begin ... end. A) X; B) Y; C) A,B,D; D) C. Проверочные тесты к семинару №14-16 1. Файл – это: A) Поименованная область на внешнем носителе. B) Место хранения дерева каталогов. C) Область оперативной памяти, зарезервированная программой. 2. Файлы бывают следующих видов: A) Цифровые. Символьные. Строковые. B) Целые. Вещественные. Порядковые. C) Текстовые. Типизированные. Нетипизированные. 3. Для объявления файла в программе применяется: A) Символьная переменная. B) Файловая переменная. C) Целочисленная переменная. 130 4. Для работы с текстовым файлом необходимо применить: A) Целочисленную переменную. B) Переменную множественного типа. C) Буферную переменную строкового типа. 5. Объявление текстового файла должно выглядеть так: A) Var F: file of string; B) Var F: file; C) Var F: text; 6. Назначение файловой переменной физического файла выполняется процедурой: A) Reset B) Rewrite C) Assign 7. Открытие существующего файла для чтения выполняется процедурой: A) Append (F); B) Read (F); C) Reset (F); 8. Открытие файла для записи выполняется процедурой: A) Write (F); B) Rewrite (F); C) Writeln (F,S); 9. Укажите процедуру, которая закрывает текстовый файл, если он перед этим был открыт, затем вновь его открывает для добавления информации в конец файла: A) Writeln(F,S); B) Append (F); C) Rewrite (F); 10.Для считывания строк из файла применяется процедура: A) Writeln(F,S); B) Rewrite (F); C) Readln (F,S); 11.Для записи строк в файл применяется процедура: A) Writeln (F,S); B) Rewrite (F); C) Readln (F,S); 12.Для закрытия файла применяется процедура: A) Reset (F); 131 B) Close (F); C) Rewrite (F); Задания на составление программ: Задание 1: В переменных m и n находятся численные значения. Перенести содержимое m в переменную n, а содержимое переменной n, наоборот – в переменную m. Задание 2: В переменной D находится двухзначное целое число. Написать последовательность операторов, которые вычисляют сумму цифр этого числа. Задание 3: Найти значение функции Y = arctg( (ax2 + b)/c + ln(ax2 + b)/c) При значении аргумента x = 1.5 и заданных a, b, c. Задание 4: Вычислить значение функции Y = sin a2 + 4·a· x3 + |a – b| для заданных значений переменных a, x, b (a=1.5, x=2, b=5). Задание 5: Температура С в градусах Цельсия изменяется от 0 до 100 с шагом 5. Напечатать таблицу перевода температуры из градусов Цельсия в градусы Фаренгейта (F). Формула перевода: F = 1,8 C + 32. Составьте блок-схему и программу решения задачи. Задание 6: Напечатать таблицу соответствия между весом в фунтах и весом в кг для значений от 1 до 10 фунтов с шагом 0,5 фунта. Формула перевода: 1 фунт = 400 г. Составьте блок-схему и программу решения задачи. Задание 7: Составьте таблицу значений функции y = 5x2 – 2x + 1 на отрезке [-5; 5] с шагом b = 2. Составьте блок-схему и программу решения задачи. Задание 8: Напечатать таблицу перевода расстояний из дюймов в сантиметры для значений от 1 до 10 дюймов с шагом 0,5 дюйма. Формула перевода: 1дюйм = 2,54 см. Составьте блок-схему и программу решения задачи. 132 Задание 9: Вычислить сумму ряда при заданном значении X: S x x2 x3 x4 x12 . Составьте блок-схему и программу решения 2! 3! 4! 12! задачи. Задание 10: Составить блок-схему и программу вычисления дроби: x S 2 x2 4 x2 x2 8 256 x2 2 x Задание 11: Дано натуральное число N. Вычислить y 3 6 9 ... 3( N 1) 3N . Составьте блок-схему и программу решения задачи. Задание 12: Составьте таблицу значений функции y = 4x3 – 5x – 10 на отрезке [-9; 9] с шагом b = 3. Составьте блок-схему и программу решения задачи. Задание 13: Составить программу "Калькулятор", имитирующую арифметический калькулятор. В программе использовать оператор выбора CASE для выбора операции сложения, вычитания, умножения, деления. В программе предусмотреть переход на повторение выбора арифметической операции с числами, введенными с клавиатуры. Составить блок-схему алгоритма решений. Задание 14: Составить программу, использующую перечисляемый тип данных и оператор CASE. В программе вводится порядковый номер дня недели, по которому определяется название дня недели. Задание 15: Дан одномерный массив случайных целых чисел. Написать программу поиска максимального элемента массива и вывода этого элемента и его порядкового номера на экран. Составить блок-схему алгоритма решения. Задание 16: В матрице размером 5х12 определить номер столбца, в котором содержится наибольшее количество отрицательных элементов. 133 Задание 17: Дано действительное число Х. получить действительную квадратную матрицу А из 5 строк 5 столбцов, формируя элементы матрицы Ai,j по следующей схеме (середина матрицы заполняется нулями) 1 x x2 x3 x4 x 0 0 0 x3 x2 0 0 0 x2 x3 0 0 0 x x4 x3 x2 x 1 Задание 18: Написать программу, сортирующую одномерный массив целых чисел по возрастанию. Массив состоит из 20 элементов, расположенных в произвольном порядке. Задание 19: Составить программу, в которой подсчитывается количество слов в строке, введенной с клавиатуры в произвольном порядке. Задание 20: Дана строка символов s1,s2,...sn, в которой встречаются цифры, пробелы, буква Е и знаки ‘+’ и ‘-‘. Известно, что первый символ строки является цифрой. Из данной строки выделить подстроку, предшествующую первому пробелу. Требуется определить: является ли это подстрока числом, если да, то выяснить - целым или вещественным, положительным или отрицательным. Задание 21: Из ведомости 3-х студентов с их оценками (порядковый номер, Ф.И.О. и три оценки) определить количество отличников и средний бал каждого студента. Задание 22: Составить программу, использующую подпрограмму-функцию для определения минимального элемента одномерного массива. Вывести на экран массив, минимальный элемент и его индекс. Задание 23: Составить программу, использующую подпрограмму-функцию для определения максимального элемента одномерного массива. Вывести на экран массив, максимальный элемент и его индекс. Задание 24: Составить программу, использующую подпрограмму-функцию для подсчета нулевых элементов в одномерном массиве. Вывести на экран массив, количество нулевых элементов и их индексы. 134 Задание 25: Из ведомости 3-х студентов с их оценками (порядковый номер, Ф.И.О. и три оценки) определить количество отличников и средний бал каждого студента. Задание 26: Программа, которая формирует типизированный файл из 10 символов - «+». В процедуре show_file в этот файл вставляются между плюсами запятые. В сформированном файле заменяется пятый элемент на «-»и выводится на экран в окончательном варианте. Задание 27: Составьте программу, которая создает файл, состоящий из 10 значений типа integer. Прочитайте файл и вычислите сумму его элементов. Задание 28: Составьте программу, которая создает файл, состоящий из неопределенного количества значений типа integer. Для ввода используйте цикл, выход из цикла — значение 999. После записи выведите файл на экран. Задание 29: Составьте программу, которая создает файл из элементов типа Char с помощью цикла while. Признак выхода из цикла — буква 'z'. Скопируйте созданный файл в другой файл и выведите его на экран. Задание 30: Составьте программу, которая создает файл, состоящий из пяти значений типа real. Выведите файл на экран. Задание 31: Составьте программу, которая создает файл, состоящий из N значений типа integer. Прочитайте файл и выведите только четные элементы. Тип record не используйте. Задание 32: Составьте программу, которая создает файл из элементов типа Char с помощью цикла while. Признак выхода из цикла — буква 'z'. Выведите его содержимое на экран. Задание 33: Программа, которая формирует список студентов. Для формирования списка используется типизированный файл, состоящий из записей. Поля записи отражают: порядковый номер, ФИО, группу и курс. Программа организует поиск нужной записи по номеру компонента. 135 Задание 34: Составьте таблицу значений функции y = 5x2 – 3x на отрезке [2;50] с шагом = 5, которая записывается в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 35: Составьте таблицу значений функции f = 2x2 – 3x – 14 на отрезке [-10; 10] с шагом b = 2, которая записывается в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 36: Составьте таблицу значений функции y = 4x3 – 5x – 10 на отрезке [-9; 9] с шагом b = 3, которая записывается в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 37: Составьте таблицу значений функции y = 5x2 – 2x + 1 на отрезке [-5; 5] с шагом b = 2, которая записывается в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 38: Составить программу, в которой подсчитывается сумма элементов каждой строки двумерного массива, состоящего из 5 строк и 5 столбцов. Результаты записываются в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 39: Составить программу, в которой подсчитывается среднее арифметическое элементов каждой строки двумерного массива, состоящего из 5 строк и 5 столбцов. Результаты записываются в текстовый файл. Составьте программу решения задачи и вывода результатов из текстового файла на экран. Задание 40: Составить программу, которая формирует типизированный файл из целых чисел, вводимых с клавиатуры. Их количество заранее неизвестно. Признаком конца является число 0. Программа находит: сумму и произведение чисел из файла, разность между вторым и предпоследним числами, а также наибольшее из чисел. 136