Upload
khangminh22
View
3
Download
0
Embed Size (px)
2
1. Информация из ФГОС, относящаяся к дисциплине 1.1. Вид деятельности выпускника Дисциплина охватывает круг вопросов относящиеся к виду деятель-
ности выпускника: - проектно-конструкторская деятельность; - проектно-технологическая деятельность; - научно-исследовательская деятельность. 1.2. Задачи профессиональной деятельности выпускника В дисциплине рассматриваются указанные в ФГОС задачи професси-
ональной деятельности выпускника:
Проектно-конструкторская деятельность: - сбор и анализ исходных данных для проектирования; - проектирование программных средств; - разработка и оформление проектной и рабочей технической доку-
ментации;
Проектно-технологическая деятельность: - применение современных инструментальных средств при разработке
программного обеспечения; - использование стандартов и типовых методов контроля и оценки ка-
чества программной продукции;
Научно-исследовательская деятельность: - проведение экспериментов по заданной методике и анализ результа-
тов; - составление отчета по выполненному заданию. 1.3. Перечень компетенций, установленных ФГОС Освоение программы настоящей дисциплины позволит сформировать
у обучающегося следующие компетенции: - готов к кооперации с коллегами, работе в коллективе (ОК-3); - стремится к саморазвитию, повышению своей квалификации и ма-
стерства (ОК-6); - осознает сущность и значение информации в развитии современного
общества; владеет основными методами, способами и средствами получе-ния, хранения, переработки информации (ОК-11);
- имеет навыки работы с компьютером как средством управления ин-формацией (ОК-12);
- осваивать методики использования программных средства для ре-шения практических задач (ПК-2);
- разрабатывать интерфейсы «человек-ЭВМ» (ПК-3); - разрабатывать компоненты программных комплексов (ПК-5); - обосновывать принимаемые проектные решения, осуществлять по-
становку и выполнять эксперименты по проверке их корректности и эф-фективности (ПК-6).
3
1.4. Перечень умений и знаний, установленных ФГОС Студент после освоения программы настоящей дисциплины должен:
знать: - современные технические и программные средства взаимодействия с
ЭВМ; - технологию разработки алгоритмов и программ, методы отладки и
решения задач на ЭВМ в различных режимах; - основы объектно-ориентированного подхода к программированию.
уметь: - ставить задачу и разрабатывать алгоритм ее решения, использовать
прикладные системы программирования, разрабатывать основные про-граммные документы;
- работать с современными системами программирования, включая объектно-ориентированные.
владеть: - языками процедурного и объектно-ориентированного программиро-
вания, навыками разработки и отладки программ не менее, чем на одном из алгоритмических языков программирования высокого уровня;
- методами и средствами разработки и оформления технической до-кументации.
2. Цели и задачи освоения программы дисциплины Целью освоения программы дисциплины является приобретение ком-
петенций, необходимых для реализации программ, используя языки про-граммирования высокого уровня и среды программирования.
Задачами освоения программы дисциплины являются: - изучение технологий структурного и объектно-ориентированного
программирования; - использование современных методов и средств разработки алгорит-
мов и программ, основных конструкций языков программирования и спо-собов записи алгоритмов на языке программирования высокого уровня для сформулированной задачи;
- развитие практических навыков по разработке программ с использо-ванием языков программирования высокого уровня и сред для разработки программ.
3. Место дисциплины в структуре ООП Для изучения дисциплины, необходимо освоения содержания дисци-
плин: - Математика, - Информатика. Знания и умения, приобретаемые студентами после освоения содер-
жания дисциплины, будут использоваться при изучении дисциплин, свя-
4
занных с программированием: - Объектно-ориентированное программирование, - Технологии программирования, - Операционные системы, - Системное программное обеспечение, - Дискретная математика, - Построение и анализ вычислительных алгоритмов, - Базы данных, - Проектирование систем. Знания и умения, полученные после освоения дисциплины, будут ис-
пользоваться также при прохождении учебной и производственной прак-тик, выполнении выпускной квалификационной работы.
4. Компетенции обучающегося, формируемые освоения дисци-
плины (результаты освоения дисциплины) В результате освоения дисциплины обучающийся должен:
знать: - понятие алгоритма и основные его свойства; - операторы структурного программирования; - понятие подпрограмм и виды подпрограмм в языке высокого уровня; - типы и структуры данных, виды их использования; - основные алгоритмы работы со структурами данных, алгоритмы по-
иска и обработки информации; - основные принципы разработки, написания и отладки программ для
ЭВМ разной степени сложности на языках программирования высокого уровня с использованием современных инструментальных средств;
- основы модульного и объектно-ориентированного подхода к про-граммированию.
уметь: - работать с современными системами программирования, включая
объектно-ориентированные; - правильно выбирать структуры данных для решения требуемой за-
дачи. - записывать алгоритмы на языке программирования; - проверять корректность программ аналитически и путём отладки и
тестирования.
владеть: - навыками составления и описания алгоритма решения задачи; - навыками написания программы на языке высокого уровня (проце-
дурном и объектно-ориентированном языках); - навыками отладки программы с использованием встроенных отла-
дочных средств.
5
5. Основная структура дисциплины. Таблица 1 – Структура дисциплины
Вид учебной работы Трудоемкость, часов Всего Семестр
№ 1 № 2 № 3 Общая трудоемкость дисциплины 360 150 140 30 Аудиторные занятия, в том числе: 175 85 90
лекции 70 34 36 лабораторные работы 88 34 54 практические/семинарские занятия 17 17
Самостоятельная работа (в том числе курсовое проектирование)
145 65 50 30
Вид промежуточной аттестации (итого-вого контроля по дисциплине), в том числе курсовое проектирование
Зачет, Экз.,40, КР, 30
За-чет
Экз., 40
КР, 30
6. Содержание дисциплины 6.1. Перечень основных разделов и тем дисциплины Введение. Обобщенная структурная схема ЭВМ. Технические сред-
ства ЭВМ. Процессор и оперативная память. Система команд компьютера. Принцип автоматической обработки информации в ЭВМ. Основные этапы решения задач на ЭВМ. Критерии качества программы; жизненный цикл программы; постановка задачи и спецификация программы. Алгоритм, его свойства. Способы описания алгоритмов: словесный, схемный, с помощью псевдокода или языка программирования. Понятие языка программирова-ния; виды языков программирования; словесное описание языка програм-мирования. Компиляторы и интерпретаторы. Формальные способы описа-ния синтаксиса языка. Способы конструирования и верификации про-грамм; способы отладки и тестирования программы.
Основные конструкции алгоритмического языка высокого уров-ня. Алфавит языка; основные лексемы; структура программы; стандартные типы данных и их представление в памяти ЭВМ: целый, вещественный, символьный, логический типы, строковый тип данных. Операторы присва-ивания, ввода-вывода. Представление основных управляющих структур программирования; условный оператор, оператор выбора. Программиро-вание простых циклов; циклические операторы.
Программирование с использованием пользовательских структур данных. Массивы; обработка массивов, методы сортировки массивов. Ли-терные переменные и строки. Процедуры и функции для работы со стро-ковыми данными. Множества. Основные операции над множествами. За-писи. Файлы, виды файлов; процедуры и функции для работы с файлами.
Модульное программирование. Нисходящее проектирование про-грамм. Способы реализации модульных программ на языке высокого
6
уровня. Подпрограммы. Процедуры и функции. Видимость переменных. Синтаксис записи подпрограмм. Формальные и фактические параметры. Библиотеки подпрограмм. Области памяти. Локальные и глобальные пе-ременные. Виды передачи параметров в подпрограммы. Передача пара-метров по ссылке и по значению. Другие возможные виды передачи пара-метров.
Среда визуального проектирования программ. Введение в объект-но-ориентированное программирование. Основные классы и компоненты: свойства, методы, события. Формы, меню, диалоговые окна, сообщения. Графические возможности среды программирования.
Рекурсивные определения и алгоритмы. Функциональный стиль программирования. Рекурсия. Виды рекурсивных алгоритмов. Разработка рекурсивных алгоритмов. Анализ рекурсивных программ. Реализация ре-курсии на языках высокого уровня. Применение рекурсивных алгоритмов. Достоинства и недостатки рекурсивных программ.
Динамическая память и абстрактные типы данных. Распределение памяти под данные программы: адресация. Указатели. Способы их описа-ния, допустимые операции. Динамические структуры данных, основные виды. Список, очередь, стек, дерево. Линейные списки и способы их реа-лизации.
Верификация программ. Теорема структуризации и структурное программирование. Анализ программ, утверждения о программе, коррект-ность программ, правила вывода для основных структур программирова-ния, инвариантные утверждения. Правильность структурированных про-грамм. Методы верификации программ. Методы отладки программ. Мето-ды индукции и дедукции. Обратное отслеживание.
Тенденции развития средств и систем для проектирования про-грамм. Обзор современных языков и систем программирования. Совре-менные технологии программирования.
6.2. Краткое описание содержания теоретической части разделов и
тем дисциплины
Лекция 1. Введение. Обобщенная структурная схема ЭВМ. Техни-ческие средства ЭВМ. Процессор и ОП. Система команд компьютера. Принцип автоматической обработки информации в ЭВМ.
Обобщенная структурная схема ЭВМ представлена на рис. 1. УУ (устройство управления) организует автоматическое выполне-
ние программ и функционирование вычислительной машины. Основная задача УУ – выработка управляющих сигналов и распределение их по це-пям управления.
АЛУ (арифметико-логическое устройство) предназначено для вы-полнения арифметических и логических операций над поступающими данными.
Память – запоминающее устройство для хранения информации. Па-мять делится на два основных вида – оперативную и внешнюю. Оператив-
7
ная память предназначена для временного хранения информации. Она со-стоит из ячеек, которые имеют адрес и содержимое. Ячейки состоят из бо-лее мелких элементов памяти– байтов, их может быть от 1 до 8.
Рис. 1 – Структурная схема (Джордж Фон Нейман)
Адрес ячейки – номер левого байта ячейки. Содержимое – это данное, находящееся в ячейке и закодированное в двоичном виде.
Внешняя память предназначена для длительного хранения информа-ции и обмена с оперативной памятью. К внешней памяти относят различ-ные накопители (лазерные диски CD и DVD-диски, flash-память и др.).
Единицами измерения памяти являются байты, килобайты, мегабай-ты, гигабайты, терабайты, петабайты….
Вместе УУ и АЛУ образуют ЦП (центральный процессор). УВВ – устройства ввода-вывода. Система команд ЭВМ Важной составной частью архитектуры ЭВМ является система ко-
манд. Несмотря на большое число разновидностей ЭВМ, на самом низком (“машинном”) уровне они имеют много общего. Система команд любой ЭВМ обязательно содержит следующие группы команд обработки инфор-мации. Основной набор команд довольно слабо изменился в ходе бурной эволюции ЭВМ:
1. Команды передачи данных (перепись), копирующие информацию из одного места в другое.
2. Арифметические операции. 3. Логические операции. 4. Сдвиги двоичного кода влево и вправо. 5. Команды ввода и вывода информации для обмена с внешними
устройствами. 6. Команды управления, реализующие нелинейные алгоритмы. Алгоритм, его свойства и описание Одним из важнейших понятий, на котором базируется применение
ЭВМ в инженерных расчетах, является понятие алгоритма. Алгоритм решения задачи – это последовательность действий, кото-
рые надо выполнить над начальными (исходными) данными, чтобы полу-
8
чить искомый результат. Под алгоритмом понимается конечная совокуп-ность точно сформулированных правил решения некоторой задачи.
Основные характеристики алгоритма: - определенность; - дискретность; - массовость; - результативность (конечность). Из многих изобразительных средств алгоритма (словесный, псев-
докод, операторы язык программирования) наиболее наглядным и простым является графический в виде блок-схемы.
Блок-схема – это графическое изображение алгоритма. Каждый этап вычислений представлен в виде геометрических фигур (блоков).
Лекция 2. Основные этапы решения задач на ЭВМ. Критерии ка-
чества программы; жизненный цикл программы; постановка задачи и спецификация программы. Алгоритм, его свойства. Способы описа-ния алгоритмов: словесный, схемный, с помощью псевдокода или языка программирования.
Основные этапы решения задач на ЭВМ Обычно выделяются следующие этапы решения задач на ЭВМ: 1) Постановка задачи. 2) Математическая формулировка задачи. 3) Построение таблицы внешних спецификаций. 4) Выбор численного метода решения задачи. 5) Подбор и расчет контрольных примеров. 6) Алгоритмизация. 7) Программирование. Программирование – это запись разработанного алгоритма на языке
программирования (ЯП). В ЯП для указания выполняемых действий слу-жит оператор.
8) Отладка и тестирование. 9) Анализ результатов выполнения программы 10) Оформление отчета о проделанной работе На практическом задании рассматривается пример оформления отчета
с демонстрацией всех этапов проектирования программы (на примере ре-шения несложной задачи).
Основные критерии оценки качества программы для ЭВМ. 1. Программа работает и решает поставленную задачу. Эта характери-
стика программы является самой важной. 2. Минимальное время, затрачиваемое на тестирование и отладку про-
граммы. 3. Уменьшение затрат на сопровождение. 4. Гибкость программы. Программа должна допускать модификацию. 5. Уменьшение затрат на разработку. 6. Простота и эффективность. Жизненный цикл программы – интервал времени от момента за-
9
рождения идеи о том, чтобы создать или приобрести программную систе-му для решения определенных задач, до момента полного прекращения использования последней ее версии. Жизненный цикл включает в себя следующие этапы: 1) Анализ, 2) Проектирование, 3) Реализация, 4) Сбор-ка, тестирование, испытание, 5) Внедрение (выпуск), 6) Сопровождение.
Модели жизненного цикла: Waterfall («водопад», каскадная модель), прототипирование, итерационная модель (спираль).
Лекции 3-4. Понятие языка программирования; виды языков
программирования; словесное описание языка программирования. Компиляторы и интерпретаторы. Формальные способы описания синтаксиса языка. Способы конструирования и верификации про-грамм; способы отладки и тестирования программы.
Понятие языка программирования; виды языков программиро-вания
Языки программирования – это формальные языки специально со-зданные для общения человека с компьютером. Каждый язык программи-рования, равно как и «естественный» язык (русский, английский и т.д.), имеет алфавит, словарный запас свои грамматику и синтаксис, а также се-мантику.
Алфавит – фиксированный для данного языка набор основных симво-лов, допускаемых для составления текста программы на этом языке.
Синтаксис – система правил, определяющих допустимые конструк-ции языка программирования из букв алфавита.
Семантика – система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и опре-деляемые ею свойства программных объектов или процесса обработки данных.
Языки программирования разделяются на две основные категории языки высокого уровня и языки низкого уровня.
Языки программирования делятся также на процедурные (императив-ные), функциональные, декларативные, логические, скриптовые, объектно-ориентированные и др.
Формальные способы описания синтаксиса языка Для описания синтаксических конструкций языка программирования
в настоящее время наиболее распространены два формальных метода. Первый использует форму записи, предложенную Джоном Бэкусом и Пи-тером Науром, когда они описывали синтаксис языка Алгол-60. С тех пор эта форма называется Backus Naur Form, или сокращенно BNF.
Другой формальный метод, наглядно представляющий синтаксиче-ские конструкции языка в графическом виде, использует синтаксические диаграммы. Популяризировал синтаксические диаграммы создатель языка Pascal H. Вирт.
10
Приводятся примеры описаний конструкций языка двумя указанными методами.
Трансляторы, интерпретаторы, компиляторы Трансляция (компиляция) – это метод перевода программ, написанных
на языках высокого уровня, в эквивалентные программы на машинном языке используемого компьютера.
Транслятор – это языковой процессор, который воспринимает про-граммы на некотором исходном языке в качестве входных данных, а на выходе выдает эквивалентные по своей функциональности программы, но уже на другом, так называемом объектном языке (который также может быть произвольного уровня).
Интерпретатор – вид транслятора, осуществляющего пооператор-ную (покомандную) обработку и выполнение исходной программы или за-проса (в отличие от компилятора, транслирующего всю программу без её выполнения).
Ассемблер – это транслятор, у которого исходным языком является символическое представление машинного кода (ассемблер), а объектным языком является некая разновидность машинного языка какого-либо ре-ального компьютера.
Компилятор – транслятор, для которого исходным является язык вы-сокого уровня, а его объектный язык близок к машинному языку реального компьютера. Это либо язык ассемблера, либо какой-нибудь вариант ма-шинного языка.
Способы конструирования и верификации программ; способы отладки и тестирования программы.
Существует несколько основных способов конструирования про-грамм.
Метод нисходящего проектирования предполагает последовательное разложение общей функции обработки данных на простые функциональ-ные элементы («сверху-вниз»). В результате строится иерархическая схе-ма, отражающая состав и взаимоподчиненность отдельных функций, кото-рая носит название функциональная структура алгоритма решения задачи.
Разложение должно носить строго функциональный характер. Приводятся примеры нисходящего проектирования программ, реали-
зующих различные виды алгоритмов. Модульное программирование основано на понятии модуля– логиче-
ски взаимосвязанной совокупности функциональных элементов, оформ-ленных в виде отдельных программных модулей.
Модуль характеризуют один вход и один выход, функциональная за-вершенность, логическая независимость, слабые информационные связи с другими программными модулями, обозримый по размеру и сложности программный элемент.
Структурное программирование основано на модульной структуре программного продукта и типовых управляющих структурах алгоритмов обработки данных различных программных модулей
При восходящем проектировании вначале проектируют программы
11
низшего уровня. Например, если требуется обеспечить определенные ха-рактеристики, начинают проектирование с модулей AAA и ААВ. Затем добавляют модуль АА, который, используя характеристики модулей AAA и ААВ, позволяет получить новые характеристики. Этот процесс продол-жается до тех пор, пока не будут получены все характеристики, требуемые для системы.
Верификация и тестирование программы. Верификация программы – более общее понятие, чем тестирование.
Целью верификации является достижение гарантии того, что верифициру-емый объект (требования или программный код) соответствует требовани-ям, реализован без непредусмотренных функций и удовлетворяет проект-ным спецификациям и стандартам. Процесс верификации включает в себя инспекции, тестирование кода, анализ результатов тестирования, форми-рование и анализ отчетов о проблемах. Таким образом, принято считать, что процесс тестирования является составной частью процесса верифика-ции, такое же допущение сделано и в данном учебном курсе.
Валидация программы – процесс, целью которого является доказа-тельство того, что в результате разработки системы мы достигли тех целей, которые планировали достичь благодаря ее использованию. Иными слова-ми, валидация – это проверка соответствия системы ожиданиям заказчика. Вопросы, связанные с валидацией выходят за рамки данного учебного кур-са и представляют собой отдельную интересную тему для изучения.
Цель тестирования – обнаружение максимального количества из имеющихся в программе ошибок для последующего устранения их. Наихудшей из всех методологий проектирования тестов является тестиро-вание со случайными входными величинами.
При разработке тестов для небольших программ или модулей (частей) программы рекомендуется сначала использовать только спецификацию программы (методы черного ящика), а затем проанализировать ее логику для получения дополнительных тестов (методы белого ящика).
Методы черного ящика 1) Эквивалентное разбиение. 2) Анализ граничных значений. 3) Анализ причинно-следственных связей. 4) Предположение об ошибке. Методы белого ящика. После разработки алгоритма необходимо убедиться, что разработан-
ные тесты обеспечивают выполнение всех условных переходов (разветвле-ний) алгоритма в каждом возможном направлении (покрытие решений или переходов).
«Белый ящик» – тестирование кода на предмет логики работы про-граммы и корректности её работы с точки зрения компилятора того языка на котором она писалась.
Стратегия тестирования по принципу Белого ящика – также называе-мая стратегией тестирования управляемая логикой программы – позволяет проверить внутреннюю структуру программы. Исходя из этой стратегии,
12
тестировщик получает тестовые данные путем анализа логики работы про-граммы. Стратегия Белого ящика включает в себя следующие методы те-стирования:
- покрытие операторов; - покрытие решений; - покрытие условий; - покрытие решений и условий; - комбинаторное покрытие условий. Приводятся примеры составления тестов указанными методами. Лекции 5-6. Основные конструкции алгоритмического языка вы-
сокого уровня Алфавит языка. Алфавит – фиксированный для данного языка набор
основных символов, допускаемых для составления текста программы на этом языке.
Язык Pascal включает следующий набор основных символов: 1) 26 латинских строчных и 26 латинских прописных букв; 2) _ подчеркивание; 3) 10 цифр: 0 1 2 3 4 5 6 7 8 9; 4) знаки операций: + – * / = <> < > <= >= := @; 5) ограничители: . , ' ( ) [ ] (. .) { } (* *) .. : ; 6) спецификаторы: ^ # $; 7) служебные (зарезервированные) слова (program, begin, end и др.); Основные лексемы. Из символов алфавита строятся базовые элемен-
ты языка-лексемы. Лексемы – это минимальные значимые единицы текста в программе,
написанной на Паскале. Они представлены такими категориями как специ-альные символы, зарезервированные слова, идентификаторы, метки, числа и строковые константы.
Зарезервированные (или ключевые) слова – это ограниченная группа слов, которые имеют фиксированный смысл в языке.
Идентификаторы (имена) выступают в качестве имен констант, ти-пов, переменных, процедур, модулей, программ и полей в записях. Имя должно начинаться с буквы и не может содержать пробелов. После перво-го символа идентификатора можно использовать буквы, цифры и символ подчеркивания '_'.
Структура Паскаль-программы: 1) заголовок программы, 2) описания данных, с которыми оперируют действия; 3) описания действий, которые необходимо выполнить. В программе могут быть следующие разделы: - раздел описания используемых модулей; - раздел описания меток; - раздел описания констант; - раздел описания типов; - раздел описания переменных;
13
- раздел описания процедур и функций. Обязательная часть – тело программы или Раздел операторов – это
группа операторов, ограниченных служебными словами Begin и end (начи-нается словом begin и заканчивается словом end с точкой). Операторы раз-деляются символом ';' (точка с запятой).
Типы данных Любой реально существующий тип данных, каким бы сложным он ни
казался на первый взгляд, представляет собой простые составляющие, ко-торыми процессор может манипулировать.
Порядковые типы. Из простых типов данных порядковые – самые простые. В этих типах информация представляется в виде отдельных эле-ментов. Связь между отдельными элементами и их представлением в па-мяти определяет естественные отношения порядка между этими элемента-ми. Отсюда и название порядковые. Они представлены в табл. 2.
Таблица 2 – Операции над порядковыми типами Операция Описание
Low (T) Минимальное значение порядкового типа Т
High(T) Максимальное значение порядкового типа Т
Ord(X)
Порядковый номер значения выражения порядкового типа. Для целого вы-ражения — просто его значение. Для остальных порядковых типов Ord воз-вращает физическое представление результата выражения, трактуемое как целое число. Возвращаемое значение всегда принадлежит одному из целых типов
Pred(X) Предыдущее по порядку значение. Для целых выражений эквивалентно Х-1
Succ(X) Следующее по порядку значение. Для целых выражений эквивалентно Х+1
Dec(V) Уменьшает значение переменной на 1. Эквивалентно V := Pred(V)
Inc(V) Увеличивает значение переменной на 1. Эквивалентно V := Succ(V)
Целые типы В переменных целых типов информация представляется в виде целых
чисел, т.е. чисел не имеющих дробной части. Определенные в Object Pascal целые типы подразделяются на физические (фундаментальные) и логиче-ские (общие). Диапазоны значений для всех физических типов перечисле-ны в табл. 3.
Таблица 3 – Физические целые типы Тип Диапазон значении Физический формат
Shortint -128-127 8 бит, со знаком
Smallint -32 768-32 767 16 бит, со знаком
Longint -2 147 483 648-2 147 483 647 32 бит, со знаком
Byte 0-255 8 бит, без знака
Word 0-65 535 16 бит, без знака
Диапазоны значений и форматы физических целых типов не зависят от микропроцессора и операционной системы, в которых выполняется программа. Они не меняются (или, по крайней мере, не должны меняться) с изменением реализации или версии Object Pascal.
Диапазоны значений логических целых типов (Integer и Cardinal) определяются совершенно иным образом. Как видно из табл. 4, они никак не связаны с диапазонами соответствующих физических типов. Обратите внимание, что в Delphi по умолчанию задано 32-разрядное представление.
14
Таблица 4 – Логические целые типы
Тип Диапазон значений Физический формат
Integer -32 768-32 767 16 бит, со знаком (SmalIInt)
Integer -2 147 483 648-2 147 483 647 32 бит, со знаком (Longint)
Cardinal 0-65 535 16 бит, без знака (Word)
Cardinal 0-2 147483647 32 бит, без знака (Longint)
Над целыми данными выполняются все операции, определенные для порядковых типов, но с ними все же удобнее работать как с числами, а не с "нечисленными порядковыми типами". Как и "живые" числа, данные це-лых типов можно складывать (+), вычитать (-) и умножать (*). Однако не-которые операции и функции, применяемые к данным целых типов, имеют несколько иной смысл (табл. 5).
Таблица 5 – Дополнительные операции, применимые к целым типам Операция Результат
Abs (X) Возвращает абсолютное целое значение Х Х Div Y Возвращает целую часть частного деления Х на Y Х Mod Y Возвращает остаток частного деления Х на Y
Odd (X) Возвращает булево True (истина), если Х — нечетное целое, и False (ложь) — в противном случае
Sqr (X) Возвращает целый квадрат Х (т.е. Х*Х)
Символьные типы В реализациях языка Pascal для первых микропроцессоров была при-
менена 7-битовая схема, названная ASCII (American Standard Code for Information Interchange — Американский стандартный код для обмена ин-формацией). Эта схема и поныне широко распространена, но информация хранится, как правило, в 8-битовых участках памяти. Дополнительный бит удваивает число возможных представлений символов, но реализации рас-ширенного набора символов ASCII часто бывают далеки от стандарта. В данной версии Delphi определен набор 8-битовых символов, известный как расширенный (extended) ANSI (American National Standards Institute – Аме-риканский национальный институт стандартов). Как бы то ни было, сим-вольную схему приходится воспринимать так, как ее воспринимает опера-ционная система. Для оконных операционных систем фирмы Microsoft это схема ANSI, включающая ограниченное число предназначенных для выво-да международных знаков. В стремлении же применить более обширный набор международных знаков весь компьютерный мир переходит к 16-битовой схеме, именуемой UNICODE, в которой первые 256 знаков совпа-дают с символами, определенными в схеме ANSI.
Для совместимости со всеми этими представлениями в Object Pascal определены два физических символьных типа и один логический.
Физические типы перечислены ниже. АnsiChar – однобайтовые символы, упорядоченные в соответствии с
расширенным набором символов ANSI. WideChar – Символы объемом в слово, упорядоченные в соответствии
с международным набором символов UNICODE. Первые 256 символов совпадают с символами ANSI.
Символьные типы объемом в двойное слово (32 бит) отсутствуют.
15
Логический символьный тип именуется char. В классическом языке Pascal char – единственный символьный тип. В Delphi char всегда соответ-ствует физическому типу данных AnsiChar.
Chr (X) – преобразует целую переменную в переменную типа char с тем же порядковым номером. В Delphi это эквивалентно заданию типа Char (X).
UpCase – Преобразует строчную букву в прописную Булевы типы Таблица 6 – Размеры переменных булевых типов
Тип Размер Boolean 1 байт ByteBool 1 байт WordBool 2 байт (объем Word) LongBool 4 байт (объем Longint)
По аналогии с целыми и символьными типами, подразделяющимися на физические и логические, естественно предположить, что ByteBool, WordBool и LongBool — физические типы, Boolean — логический. Но в данном случае это не совсем так. Все четыре типа различны. Для Object Pascal предпочтителен тип Boolean, остальные определены для совмести-мости с другими языками программирования и операционными системами.
Переменным типа Boolean можно присваивать только значения True (истина) и False (ложь). Переменные ByteBool, WordBool и LongBool могут принимать и другие порядковые значения, интерпретируемые обычно как False в случае нуля и True — при любом ненулевом значении.
Перечислимые типы Type enum type = (first value, value2, value3, last value); Обычно данные перечислимых типов содержат дискретные значения,
представляемые не числами, а именами. Тип Boolean— простейший пере-числимый тип в Object Pascal. Булевы переменные могут принимать два значения, выражаемые именами True и False, а сам тип определен в Object Pascal так, как будто он объявлен следующим образом: Type Boolean = (False, True);
Поддиапазонные типы Переменные поддиапазонного типа содержат информацию, соответ-
ствующую некоторому pаданному диапазону значений исходного типа, представляющего любой порядковый тип, кроме поддиапазонного. Син-таксис определения поддиапазонного типа имеет следующий вид:
Type subrange type = low value...high value; Поддиапазонные переменные сохраняют все особенности исходного
типа. Единственное отличие состоит в том, что переменной поддиапазон-ного типа можно присваивать только значения, входящие в заданный под-диапазон. Контроль за соблюдением этого условия задается командой про-верки диапазона (range checking).
Необходимость явно определять поддиапазонный тип возникает неча-сто, но все программисты неявно применяют эту конструкцию при опреде-
16
лении массивов. Именно в форме поддиапазонной конструкции задается схема нумерации элементов массива.
Совместимость типов имеет место при выполнении одного из следу-ющих условий: оба типа являются одинаковыми; оба типа являются веще-ственными типами; один тип является отрезком другого или оба типа яв-ляются отрезками одного и того же основного типа.
Лекция 7. Операторы присваивания, ввода- вывода. Представле-
ние основных управляющих структур программирования; условный оператор, оператор выбора.
Оператор языка Паскаль представляет собой элемент программы, ко-торый позволяет выполнить определенные алгоритмические действия. Все операторы, используемые в программе, должны обязательно отделяться от всех других элементов (в том числе и от других операторов ) с помощью символа ;.
Все операторы в Паскале можно условно разбить на две группы: Простым оператором является такой оператор, который не содержит
в себе других операторов. Составные операторы используются для объединения группы опера-
торов там, где синтаксис Паскаля допускает использование только одного оператора. Операторы заключаются в ограничители begin и end, и отделя-ются друг от друга точкой с запятой.
Оператор присваивания Оператор присваивания – основной оператор обработки данных. В
его левой части указывается имя переменной, правая часть представляет собой выражение того же типа, что и переменная. Пара символов ":=" означает "присвоить значение". Действие оператора состоит в том, что вы-числяется значение выражения и присваивается переменной, указанной слева от знака":=", оператор присваивания заменяет текущее значение пе-ременной новым значением. Например, в результате выполнения операто-ров присваивания: X := 4; X:=3*X-1; переменная Х получит значение 11.
При выполнении оператора присваивания возможны аварийные ситу-ации.
Процедуры ввода и вывода Способ передачи информации в виде потока символов, состоит в том,
что на вход подается поток символов, содержащий значения одной или не-скольких переменных, разделенных хотя бы одним пробелом. Оператор процедуры Readln активизирует встроенную процедуру ввода данных. Оператор имеет следующие форматы
READ(список данных ввода); READLN[(список данных ввода)]; Список данных состоит из имен простых или индексных переменных,
значения которых оператор READ читает из буфера ввода. Буфер ввода– это область оперативной памяти объемом 126 байтов, выделенная для при-ема кодов символов, набранных на клавиатуре. Если буфер пуст, то маши-на переходит в режим ожидания ввода данных с клавиатуры.
17
Вывод результатов работы программы Экран дисплея служит для организации работы в форме диалога чело-
века и машины, удобен для вывода небольшого количества результатов. Вызов встроенной процедуры вывода в виде потока символов имеет три варианта записи:
WRITE (список вывода); WRITELN (список вывода); WRITELN; Имеются средства редактирования вывода. Например, для целых пе-
ременных после элемента вывода можно указать ширину поля вывода M в виде x: M, где х– выводимое выражение, а M– ширина поля вывода. M может быть задано выражением целого типа. Пусть записан оператор: WRITELN (1:4);
Выводимая константа (1) займет 4 позиции на экране. Перед значащей единицей будут три пробела. Для вещественных чисел нужно указать ши-рину поля и количество цифр в дробной части в виде х:M:N, где n– число знаков после запятой. Например, WRITE (1E-3:5:3).
Операторы условного перехода Операторы условного перехода IF и CASE служат для реализации
разветвляющегося вычислительного процесса в программе. К ним относят-ся оператор перехода, условный оператор и оператор выбора.
Условный оператор Условный оператор служит для описания базовой конструкции "раз-
вилка" и имеет две формы записи: короткую и полную. Короткая форма соответствует конструкции «обход» IF условие THEN оператор 1; Пример короткого If: If b>x then x:=b; Полная форма условного оператора: IF условие Then оператор ветви 1 Else оператор ветви 2; Пример полного If: if a>b then x:=a else x:=b; Ветви 1 и 2 могут быть любыми операторами языка Паскаль, в том
числе и условными, т. е. допускаются вложенные условные операторы. Если ветви представлены больше чем одним оператором, то необхо-
димо их заключить в операторные скобки: Begin– end, т.е. использовать составной оператор.
Оператор выбора CASE Оператор выбора CASE предназначен для реализации в программе
разветвляющегося процесса, который позволяет выбрать один из несколь-ких альтернативных путей решения в зависимости от проверки нескольких условий.
Общий вид оператора: Case N of C1,..,Cm: S1;
18
D1,..,Dl: S2; … end; Лекции 8-9. Программирование простых циклов; циклические
операторы. Циклическим называется вычислительный процесс, который преду-
сматривает многократное выполнение некоторой последовательности бло-ков. Для программирования циклических алгоритмов используются опера-торы цикла. Каждой базовой циклической конструкции в языке Паскаль соответствует свой оператор цикла.
Оператор цикла с постусловием (Repeat) В этом операторе оператор(ы) тела цикла располагаются между клю-
чевыми словами repeat и until: repeat операторы тела цикла until выражение; Оператор repeat задает повторяющееся выполнение операторов тела
цикла. После каждого выполнения тела цикла производится проверка зна-чения булевского выражения, которое служит критерием повторения: пока результат выражения не примет значение True, тело цикла продолжает выполняться. Цикл завершается, как только значение выражения станет True . Последовательность операторов выполнится по крайней мере один раз.
Цикл ввода переменной P будет повторяться до тех пор, пока не будет введено правильное значение.
Оператор цикла с предусловием Оператор цикла с предусловием начинается ключевым словом while и
содержит выражение-условие, которое управляет повторным выполнением тела цикла. Общий вид оператора while выражение-L do оператор-S;
Перед каждым выполнением тела цикла происходит вычисление зна-чение булевского выражения. Если это выражение принимает значение Тruе, то оператор тела цикла S выполнится и управление опять передается на вычисление выражения L;в противном случае (значение выражения False) выполнение цикла завершается. Если выражение с самого начала принимает значение False, то цикл с предусловием не выполнится ни разу.
Если в теле цикла S не предусмотрены действия, влияющие на выра-жение L, и значение L всегда имеет значение Тruе, то оператор S будет вы-полняться бесконечно, то есть произойдет зацикливание.
Оператор While действует только на один оператор, поэтому если те-ло цикла состоит из нескольких операторов, то следует их заключить в операторные скобки, то есть применить составной оператор.
Оператор цикла с параметром (for) Если число повторений цикла заранее известно, и параметр цикла ме-
няется по закону арифметической прогрессии с постоянным шагом, рав-ным 1, то подходящей конструкцией является оператор for. Оператор for
19
имеет два вида записи: for i:=a to c do S;– цикл по возрастающим значениям параметра I; for i:=a downto c do S;- цикл по убывающим значениям параметра i;
Здесь:i – переменная, параметр (или счетчик цикла); a и c– выражения, определяющие начальное и конечное значения параметра цикла i; S- оператор тела цикла.
Замечания: 1) параметром цикла For может быть переменная целого или символь-
ного типов; 2) внутри цикла For не следует изменять ни начальное, ни конечное
значения параметра цикла (A и C), а также и текущее значение переменной цикла I;
3) переменная I не должна входить в выражения A и С; 4) после завершения цикла значение переменной I становится неопре-
деленным, поэтому не следует использовать счетчик цикла после выхода из него.
Пример 3. Демонстрация работы оператора For. For x:=1 TO 5 do Write(x:5); writeln; For x:=5 DOWNTO 1 do write(x:5); readln; На экран будут выведены вначале значения X : 1 2 3 4 5 Затем эти же числа по убыванию : 5 4 3 2 1 Разбор примеров циклических программ. 1) Для вводимой последовательности целых чисел запрограммировать
элементарные схемы вычислений: сумма, среднее арифметическое, произ-ведение. Все вычисления выполняются при вводе, без запоминания после-довательности.
2) Логической переменной P присвоить значение TRUE, если целое N (N>1) простое число, и значение False в противном случае.
3) Найти наибольший общий делитель(НОД) и наименьшее общее кратное(НОК) двух заданных натуральных чисел X и Y. НОД двух целых чисел – это наибольшее число, на которое оба заданных числа делятся без остатка. НОК двух чисел – это наименьшее число, делителями которого являются оба заданных числа.
4) Составить программу, печатающую разложение на простые множи-тели заданного натурального числа N>1. Ниже приведен один из вариантов решения. Разберите программу и составьте блок-схему алгоритма.
5) Подсчитать количество цифр в десятичной записи целого неотри-цательного числа N.
Вычисление суммы бесконечного ряда с помощью итерационного цикла.
Итерационными называются циклы с неизвестным заранее числом повторений. Вычисления в таких циклах ведутся до достижения некоторой заданной точности . Итерационными циклами реализуются приближен-ные методы вычислений.
Пример: Пусть известно, что некоторую функцию y=F(x) можно пред-
20
ставить в виде следующего разложения:
0
32
...!3!2!1
1!n
n xxx
n
x
Требуется вычислить значение этой функции в точке x с заданной
точностью . Отметим, что для решения поставленной задачи заданный ряд должен быть сходящимся в точке Х. Вычисления следует завершить,
как только будет найден очередной член ряда !nxn
, по абсолютной вели-чине не превышающий данного положительного .
Введем обозначения. X – аргумент вещественного типа; Eps – точность или погрешность, положительное число, меньшее 1. Результат: Y – сумма ряда (значение функции); Вспомогательные величины K – номер очередного слагаемого ; U – очередное слагаемое; Алгоритм решения данной задачи представляет собой цикл, в теле ко-
торого к сумме y нужно добавить очередное слагаемое u =x*k/k! Приведем словесное описание алгоритма «накопление суммы»: 1) Ввести X и EPS. 2) Положить номер первого слагаемого K равным 0: k:=0 3) Положить первое слагаемое u равным 1: u:=1 4) Положить сумму равной 0: y:=0 5) Пока очередное слагаемое u по модулю больше eps , т.е. abs(u)>eps
делать: - Добавить к сумме y очередное слагаемое u : y:=y+u; - Вычислить следующее слагаемое u=x*k/k!. - Иначе, т. е. когда abs(u) <=eps, завершить цикл и перейти к п.6 6) Вывести x, y Нетрудно заметить следующую закономерность: для вычисления но-
вого слагаемого U нужно умножить старое значение U на X и разделить на номер нового слагаемого K U:=U*x / k
Шаг вычисления следующего слагаемого u=xk/k! будет состоять из двух действий: 1) увеличить номер К k:=k+1, 2) вычислить U:=U*x/k.
Лекции 10-12. Программирование с использованием пользова-
тельских структур данных Массивы; обработка массивов. Массив– составной тип данных. Массив состоит из фиксированного
числа элементов одинакового типа. Число элементов массива фиксируется при описании типа и при исполнении программы не меняется.
Объявление массива в Паскале В языке Паскаль существует два способа описания типов: сокращен-
ный и полный. Первый способ имеет место, когда тип переменной опреде-
21
ляется при описании переменной в разделе VAR. При использовании второго способа в разделе описаний типов от-
дельно описывается тип данных и определяется его имя. Описание типа помощью TYPE используется, когда нет стандартного типа, например, типа массив. Полное описание массива имеет вид:
TYPE Имя типа = array [тип индекса1, тип индекса2,.,тип индексаn] of <тип элемента> ;
Тип индекса– имя порядкового типа или отрезок порядкового типа, т.е. значениями индекса может быть интервал любого скалярного порядко-вого типа. Типом элементов может быть любой тип данных (скалярных или структурированных), за исключением файлового.
Пример описания массивов: TYPE vector = array [1..10] of real; matric=array[1..5,1..4) of byte; VAR x :vector; y :matric;
В результате этого описания в оперативной памяти будут выделены 60 байт под вектор x[10] и область длиной в 20 байт под матрицу y[5,4].
Доступ к отдельному элементу массива указывается с помощью име-ни массива и индексов. Обращение к элементу массива имеет вид
имя массива [список индексов] Количество индексов должно соответствовать числу измерений мас-
сива. Если число измерений массива больше 1, индексы указываются через запятую. Индекс может быть задан константой, переменной или выраже-нием, значения которого должны лежать в интервале, определенном типом данного индекса. В памяти элементы массивов располагаются по возраста-нию индексов, причем более правый индекс изменяется быстрее (в лекси-кографическом порядке).
Примеры работы с одномерными массивами Во всех примерах используется массив типа vector. В циклах ввода-
вывода элементов массива использован оператор цикла с параметром For, так как число повторений заранее известно. Параметр цикла– индекс эле-мента массива меняется с постоянным шагом, равным 1 или -1.
Ввод и вывод массива { 1. ВВОД МАССИВА } Repeat Write (' введите число элементов N от 1 до 100 '); Readln (N); until (N> =1) and (N < = 100); Writeln('в массиве ', N', элементов'); for i = 1 to N do begin write('X[', i,'] ='); ReadLn(X[i]); end; WriteLn ('конец ввода'); readln; { 2. ВЫВОД МАССИВА на ЭКРАН } clrscr; writeln(' Массив X[N] '); for i:=1 to n do
22
write(x[i]:12:3); writeln; END.
Последовательный поиск компоненты вектора. Заданы вектор A(n) и X целого типа. Если в векторе А есть элемент,
равный Х, то переменной Х присвоить значение true, а переменной K при-своить индекс найденного элемента. В противном случае присвоить пере-менной P значение False .
В задачах поиска последовательный перебор элементов массива соче-тается с проверкой некоторого условия, поэтому в программах использо-ван оператор цикла итерационного типа repeat.
Работа с матрицами Пусть задана матрица
A
a a a
a a a
a a a
a a a
1 1 1 2 1 3
2 1 2 2 2 3
3 1 3 2 3 3
4 1 4 2 4 3 Для заданной матрицы рассмотрим несколько задач: Задача 1. Подсчитать в каждом столбце количество элементов, имею-
щих отрицательное значение. Исходные данные: массив А(4,3) вещественного типа. Искомые данные: вектор К(3) целого типа, элементы которого могут
принимать значения от 0 до 4. Используемые обозначения: Aij– элемент матрицы, где i– номер стро-
ки, j– номер столбца. Кj– количество отрицательных элементов в j-ом столбце матрицы.
При таких обозначениях следует взять i-за параметр внутреннего цик-ла, j-за параметр внешнего цикла. Элементы каждого столбца матрицы следует рассматривать как вектор, к которому можно применить типовой алгоритм: определение количества элементов массива, удовлетворяющих некоторому условию: Если A[i,j]<0, то Kj=Kj+1 иначе Kj=Kj
На первом этапе решение выглядит как структура следования: По методу нисходящего проектирования алгоритма выполняем дета-
лизацию выделенных этапов. Методы сортировки массивов. Алгоритм 1. Сортировка вставкой. Это изящный и простой для понимания метод. Создается новый мас-
сив, в который мы последовательно вставляем элементы из исходного мас-сива так, чтобы новый массив был упорядоченным. Вставка происходит следующим образом: в конце нового массива выделяется свободная ячей-ка, далее анализируется элемент, стоящий перед пустой ячейкой (если, ко-нечно, пустая ячейка не стоит на первом месте), и если этот элемент боль-ше вставляемого, то подвигаем элемент в свободную ячейку (при этом на том месте, где он стоял, образуется пустая ячейка) и сравниваем следую-
1. Ввод мат-рицы
2. Вывод матрицы
3.Вычислить K[4]
4. Вывод вектора
23
щий элемент. Таким образом, по очереди вставляем все элементы исходно-го массива. Очевидно, что если до вставки элемента массив был упорядо-чен, то после вставки перед вставленным элементом расположены все эле-менты, меньшие его, а после — большие. Так как порядок элементов в но-вом массиве не меняется, то сформированный массив будет упорядочен-ным после каждой вставки. А значит, после последней вставки мы полу-чим упорядоченный исходный массив.
Алгоритм 2. Пузырьковая сортировка. Реализация данного метода не требует дополнительной памяти. Метод
очень прост и состоит в следующем: берется пара рядом стоящих элемен-тов, и если элемент с меньшим индексом оказывается больше элемента с большим индексом, то мы меняем их местами. Эти действия продолжаем, пока есть такие пары. Легко понять, что когда таких пар не останется, то данные будут отсортированными. Для упрощения поиска таких пар дан-ные просматриваются по порядку от начала до конца. Из этого следует, что за такой просмотр находится максимум, который помещается в конец мас-сива, а потому следующий раз достаточно просматривать уже меньшее ко-личество элементов. Максимальный элемент как бы всплывает вверх, от-сюда и название алгоритма Так как каждый раз на свое место становится по крайней мере один элемент, то не потребуется более N проходов, где N – количество элементов.
Алгоритм 3. Сортировка подсчетом. Этот метод подходит для сортировки целых чисел из не очень боль-
шого диапазона (сравнимого с размером массива). Для каждого элемента найти, сколько элементов, меньших определенного числа, и поместить это число на соответствующие место. Делается это так: за линейный проход по массиву мы для каждого из возможных значений подсчитываем, сколько элементов имеют такое значение. Потом добавляем к каждому из найден-ных чисел суму всех предыдущих. Получая, таким образом, сколько есть элементов, значения которых не больше данного значения. Далее, опять-таки за линейный проход, формируем из исходного массива новый отсор-тированный. При этом следим, чтобы два одинаковых элемента не были записаны в одно место:
Существуют и другие методы сортировки: сортировка Шейкером, сортировка двоичной кучей, цифровая сортировка, быстрая сортировка, сортировка слиянием и другие.
См.: (http://base.vingrad.ru/view/130-Algoritmyi-sortirovki. Лекции 13-14. Литерные переменные и строки. Процедуры и
функции для работы со строковыми данными Литерные переменные В языке Паскаль для описания символьных (литерных) переменных
используется тип char. Переменная типа char может принимать значения из определенной
упорядоченной последовательности символов, разрешенной транслятором с Паскаля на данной ЭВМ.
24
Две стандартные функции позволяют поставить в соответствие дан-ную последовательность символов множеству целых неотрицательных чи-сел (порядковым номерам символов последовательности).
Эти функции называются функциями преобразования: ord(c) – выдает номер символа c (нумерация с нуля), chr(i) – выдает i-ый символ из таблицы символов. Пример. ord(H) выдает номер символа Н в последовательности всех
символов, используемых транслятором. chr(15) выдает 15-ый символ этой последовательности.
Кроме того, для символьных переменных применяются такие функ-ции:
pred(ch) – возвращает предыдущий символ; succ(ch) – возвращает следующий символ; upcase(ch) – преобразует строчную букву в заглавную. Обрабатывает
буквы только латинского алфавита. Тип данных String Для удобства обработки текстовой информации на языке Паскаль
предусмотрен специальный тип String(строка). Он позволяет эффективно работать с цепочкой символов длиной не более 255. Переменная типа String может быть объявлена в одной из двух форм:
Имя: string; Имя: string [константное выражение]; Пример 1. Описание строковых переменных. Var X: string [5]; Name: string;
Переменная X займет в памяти 6 байт и может иметь длину от 0 до 5, переменная Name – 256 байт, может иметь длину от 0 до 255.
Переменная типа string может быть элементом списка процедуры вво-да Readln. Например, ввод строковой переменной X: string[5]:
writeLn ('ввести строку Х'); ReadLn(X);
Если набрано больше 5 символов, то из буфера ввода в поле перемен-ной Х будут скопированы только первые 5. Если ничего не набрано, и нажата клавиша Enter, то в поле Х в нулевой байт занесется число 0, то есть переменная Х имеет значение пустой строки.
Строковые данные могут быть напечатаны с помощью процедуры write или writeln.
Пример 3: Печать строковых переменных. write (X); {ширина поля вывода равна текущей длине} X:='ABC'; write (X:2); {символ 'C' не будет выведен}
Строковые данные можно выводить посимвольно. Например, печать строки по одному знаку: x:='abcde': For i:=1 to 5 do write(x[i]);
Сравнение строк Для сравнения строк используются знаки операций: <,<=,=,>=,>,<>. Допустимы массивы строк: SPISOK: array [1..5] of string [20]; Каждый элемент массива строк будет занимать одинаковое количе-
ство байт, но текущая длина каждого элемента может быть различна. Стандартные процедуры и функции для обработки строк
25
В Паскале определены следующие стандартные подпрограммы обра-ботки строк:
а) Функции Cоncat, Length, Copy, Pos. б) Процедуры Delete, Insert, Str, Val.
1. Функция Cоncat выполняет соединение (конкатенацию) списка строк.
Concat(s1, [s2, ..., sn]; string) Тип результата: строковый (string). Если длина результирующей стро-
ки превышает 255 символов, то она обрезается до 255 символов. Функция аналогична операции "+".
2. Функция Сору возвращает подстроку строки. Соpy(s, index, count) Тип результата: строковый (string). Параметр s представляет собой выражение строкового типа. Парамет-
ры index и count являются выражениями целого типа. 3. Функция Length возвращает динамическую длину строки. Length(s) Тип результата: целый (integer). Параметр s представляет собой выражение строкового типа. Результа-
том будет длина строки s. 4. Функция Роs производит поиск подстроки в строке. Pos(st1, st2) Тип результата: байт (byte). Параметры st1 и st2 являются выражениями строкового типа. Данная
функция ищет подстроку, заданную параметром st1 в строке st2 и возвра-щает целое значение, являющееся позицией первого символа подстроки в строке s. Если подстрока не найдена, то функция возвращает значение 0.
5. Процедура Insert(scr, res, index) вставляет строку scr внутрь res, начиная с позиции index. Параметр scr представляет собой выражение строкового типа. Параметр res – переменная строкового типа любой дли-ны. Параметр index является выражением целого типа. Если получившаяся в результате строка превышает 255 символов, то она усекается до 255 сим-волов.
6. Процедура Delete(s, index, count) удаляет из строки s подстроку длиной count, начиная с позиции index. Если значение параметра index пре-вышает длину строки, то символы не удаляются. Если параметр count зада-ет больше символов, чем остается в строке, начиная c позиции index, то удаляется остаток строки.
7. Процедура Str(Val_n, Var_s) преобразует численное значение Val_n в его строковое представление, которое присваивает переменной Var_s. Val – это арифметическое выражение, а Var_s – имя строковой переменной. После выражения Val_n, может следовать выражение целого типа, которое задает количество символов в Var_s.
8. Процедура Val(s, v, code) – преобразует строковое значение s в чис-ло и присваивает его значение переменной v. Параметр v является пере-менной целого или вещественного типа. Параметр code – это переменная
26
целого типа, которая хранит код завершения. Если преобразование прошло благополучно, то значение code=0, иначе code содержит номер первого ошибочного символа в строке s.
Лекция 15. Множества. Основные операции над множествами.
Записи. Термин множество в программировании используется аналогично
его математическому пониманию. Множество – это набор различных объ-ектов одного типа. В языке Паскаль множества могут состоять из элемен-тов только порядковых типов. Тип элемента множества называется базо-вым. Максимальное количество значений базового типа множества назы-вается его мощностью.
Описание переменной типа множества в Паскале Формат полного описания: Type <имя типа_множество> =set of <базовый тип> Var <имя переменной типа множество>: <имя типа_множество>
Можно задать множественный тип и без предварительного описания типа: VAR имя переменной типа множество>: SET OF <базовый тип>
Операции над множествами Операции над множествами выполняются по правилам теории мно-
жеств (таблица 7). Таблица 7 – Операции над множествами Математиче-ское обозначе-
ние Действие
Обозначение в Паскале
Тип результата
Объединение множеств + множество
Пересечение множеств * множество
\ Разность множеств - множество
Принадлежность элемента множеству
IN Boolean
() Является ли подмноже-ством
<= Boolean
() Включает подмножество >= Boolean
Результатом операции объединения двух множеств А+В будет мно-жество С, включающее элементы, принадлежащие обоим множествам.
Результатом операции пересечения двух множеств А*В будет множе-ство С, состоящее только из тех элементов, которые принадлежат одно-временно обоим множествам.
Результатом операции разности двух множеств А-В будет множе-ство С, состоящее только из тех элементов множества А, которые не вхо-дят в множество В.
Записи Запись – иерархически упорядоченная совокупность данных, состоя-
щих из разнотипных элементов. Элементами структуры могут быть струк-туры и массивы. К структуре и всем ее элементам обращаются по именам.
27
Составное имя используется для обращения к элементу структуры. Оно образуется объединением имен всех иерархически старших структур, содержащих данный элемент, и имени самого элемента.
С помощью зарезервированного слова record (запись) в одном типе можно объединять данные разных типов. Общий синтаксис объявления этого типа выглядит следующим образом:
record fieldnamel: fieldtypel; fieldname2, fieldname3: fieldtype2; case optional tagfield: required ordinal type of 1: variantnamel: varianttype3; 2, 3: variantname2: varianttype4; end;
Данное объявление состоит из фиксированной и вариантной частей. Однако вовсе не обязательно вставлять в одно объявление записи обе эти части. Обычно удобнее работать с каждой из этих частей отдельно.
Фиксированные записи В фиксированной части записи определяется одно или несколько не-
зависимых полей. Каждому полю обязательно присваивается имя и тип: Record fieldnamel: fieldtypel; fieldname2, fieldname3: fieldtype2; end;
Имея доступ к информации в записи, можно обрабатывать всю запись целиком (все поля одновременно) или только отдельное поле. Для обраще-ния к отдельному полю наберите имя записи, точку и идентификатор поля, например, MyRec.Fieldnamel.
Для доступа ко всей записи просто нужно указать ее имя. Вариантные записи Вариантная часть типа record дает возможность по-разному тракто-
вать область памяти, совместно занимаемую вариантами поля: Record case optional tagfield: required ordinal type of 1: variantnamel: varianttype3; 2, 3: variantname2: varianttype4; end;
Для сокращения обращения к полям записи применяется оператор присоединения With.
Далее рассматриваются примеры работы с записью. Лекции 16-17. Файлы, их виды; процедуры и функции для работы
с файлами. Под файлом понимается область памяти на внешнем запоминающем
устройстве, способная хранить некоторую совокупность информации. В эту область внешней памяти можно как помещать определенные
данные, так и извлекать из нее. Эти действия имеют общее название ввод-вывод. Для работы с файлами должны быть описаны специальные переменные файловых типов, которые считаются представителями физических файлов в программе.
28
В языке Pascal есть три типа файлов (файловых переменных) – текстовые файлы, файлы с типом (типизированные) и файлы без типа.
Примеры описания файловых типов и переменных: type elem=record nom:integer; name:string[20] end; file_1:file of elem; var f1:text; {f1-переменная, тип: текстовый файл} f2:file_1; {f2-переменная, тип: файла с типом} f3:file of integer;{f3-переменная, тип: файл с типом данных integer} f_no_type:file;{f4-переменная, тип: бестиповый файл}
Операции с файлами реализованы в виде стандартных процедур и функций.
Операции с файловыми переменными в Паскале можно разбить на четыре основные группы:
- установочные и завершающие операции; - собственно ввод-вывод; - перемещения по файлу; - специальные операции.
Установочные и завершающие операции Эта группа операций реализована в виде следующих процедур: Assign,
Rewrite, Reset, Close. Рассмотрим эти процедуры (В Delphi к большинству подпрограмм для
работы с файлами добавляется «File», например, AssignFile, CloseFile ): а) Assign(F,Name:String) – присвоить файловой переменной F имя
файла Name. Параметр Name указывает имя реального файла и может включать в себя обозначение дисковода, цепочку каталогов, приводящую к нужному файлу, и полное имя файла.
Пример: Assign(F,'d:\mydir\my_file.dat'); С момента выполнения этой процедуры все действия над переменной
F будут равносильны действиям над файлом my_file.dat. Параметр Name может быть также строкой, содержащей имена, связанные с конкретными физическими устройствами: CON – консоль (экран дисплея в случае вывода, а в случае ввода – клавиатура): PRN – печатающее устройство (принтер); NUL – фиктивное (несуществующее) устройство. Может использоваться для фиктивного вывода информации при отладке программ.
б) Инициировать файл – значит указать для него направление передачи данных. Файл можно открыть для чтения и/или для записи информации. До открытия файловая переменная должна быть связана с внешним файлом с помощью процедуры Assign.
Процедура Reset(F) открывает файл для чтения. В случае попытки инициировать чтение из несуществующего файла возникает ошибка, код которой можно получить из ненулевого значения функции IOResult
29
Процедура Rewrite(F) открывает файл для записи информации. Если физический файл ранее существовал, процедура Rewrite уничтожает его и никаких сообщений об этом не передает. В обоих случаях выполняется установка текущего указателя файла на его начало.
в) Процедура Close (F) завершает действия с файлом, который указывается ее единственным параметром. Она освобождает выделенные при открытии файла буферы ввода/вывода. Связь между файловой переменной и физическим файлом разрывается, после чего файловую переменную можно связать с каким либо другим дисковым файлом посредством процедуры Assign.
Операции ввода-вывода В эту группу входят две процедуры: Read и Write. Если в процессе чтения будет достигнут конец файла, то чтение будет
прекращено, процедура Read завершится преждевременно и возникнет ситуация "конец файла" – End Of File (EOF).
Процедура Write помещает очередное значение в файл в место, отмеченное текущим указателем, после чего текущий указатель будет передвинут на одну позицию.
Текстовые файлы Текстовый файл – это файл, состоящий из строк переменной длины,
каждая из которых завершается маркером конца строки CR/LF(код $0D/$0A.). Файл завершается маркером конца файла Ctrl/Z(код $1A). Текстовые файлы можно обрабатывать только последовательно. К тому же ввод и вывод нельзя выполнять одновременно для одного и того же текстового файла.
Объявление текстового файла: Var F: Text; Процедуры для работы с текстовыми файлами Rewrite(F) – создает новый текстовый файл, в который можно
передавать информацию. Reset(F) – открывает существующий текстовый файл для чтения ,
после чего из этого файла можно только последовательно читать. Append(F) – открывает существующий файл для добавления новых
данных в конец файла. Read([F,,]V1[,V2,...Vn]) – читает информацию из файла в заданные
переменные. Процедура чтения зависит от типа переменой, стоящей в списке.
Readln([Var F:Text,][V1,V2,...Vn]) – читает информацию из файла в заданные переменные. Отличие от процедуры Read состоит в том, что после исчерпания списка переменных пропускаются все оставшиеся символы в данной строке и маркер конца строки. Если в процедуре отсутствует список переменных, то происходит переход к следующей строке.
Write([Var F:Text,]V1[,V2,...Vn]) – записывает информацию в файл из заданных переменных. Процедура записи зависит от типа переменой, стоящей в списке. Для символьных, арифметических и строковых переменных выводится их значение в виде строки символов, а для Boolean
30
выводится строка True или Fasle в зависимости от ее значения. Переменные могут сопровождаться указанием формата вывода. При указании формата вывода значение выводится в поле заданной длины. Если поле задает больше позиций, чем требуется для вывода, то оно слева дополняется пробелами, иначе выводятся самые правые символы из представления переменной.
Ch:='X'; Bool:=1>2; S:='abcd'; I:=12; r1:=1.25; r2:=r1; Write('!',Ch:3,Bool:7,S:8,I:4,R1:18,R2:12:4,'!'); Результат: ! X FALSE abcd 12 1.2500000000E+00 1.2500!
Writeln([Var F:Text,][V1,V2,...Vn]) – записывает информацию в файл из заданных переменных. Отличатся от процедуры Write тем, что после вывода всех переменных в файл записывается маркер конца строки.
Close(F) – закрывает файл. Когда новый текстовый файл закрывается, к нему автоматически добавляется маркер конца файла.
Функции для работы с текстовыми файлами EoF[(F:Text)]:boolean возвращает True, если следующий за
последним прочитанным символом идет маркер конца файла. Если файловая переменная не указана, то предполагается стандартный файл ввода.
Eoln[(F:Text)]:boolean возвращает True, если следующий за последним прочитанным символом идет маркер конца строки. Если файловая переменная не указана, то предполагается стандартный файл ввода. Если EpF(F)=true, то и Eoln(F)=true.
SeekEoln[(F:Text)]:boolean – аналогична Eoln, однако до проверки на маркер конца строки удаляет все последующие пробелы и символы горизонтальной табуляции.
SeekEof[(F:Text)]:boolean – аналогична Eoln, однако до проверки на маркер конца файла удаляет все последующие пробелы, символы горизонтальной табуляции и CR/LF.
Типизированные файлы Длина любого компонента типизированного файла строго постоянна,
что дает возможность организовать прямой доступ к каждому из них. Перед первым обращением к процедурам ввода-вывода указатель
файла находится в начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла.
Объявление файла с типом: Type FT = Record Fl1: String[33]; Fl2: Word; Fl3: Char; Fl4: Array[1..33] of ShortInt; End; Var F1 : File Of Real;
31
F2 : File Of String[80]; F3 : File Of FT;
Процедуры для работы с типизированными файлами Assign(F;Name:String) – связывает файловую переменную с внешним
именем (именем файла на диске). Rewrite(F) – создает новый файл, если файл с таким именем уже
существует, на диске, то он удаляется и создается новый. Reset(F) – открывает существующий файл для чтения. Но
типизированный файл, открытый процедурой Reset, можно обновлять и при необходимости расширять с помощью процедуры Write.
Seek(F, N:LongInt) – передвигает указатель файла на n-ую компоненту (n-целое выражение). Первая компонента имеет номер 0. Для того, чтобы расширить файл, следует передвинуть указатель в конец файла процедурой
Seek (F, FileSize(F)). Функция FileSize(F) возвращает число записей в файле F, т.е. указывает номер следующей компоненты после последней
Read(F,V1,[V2...]) – читает из файла компоненты в указанные переменные. Тип файла и переменных должен совпадать.
Write(F,V1,[V2...]) – записывает в файл содержимое указанных переменных. Тип файла и переменных должен совпадать.
Close(F) – закрывает файл F. Функции для обработки типизированных файлов EoF(F:Text):boolean – возвращает True, если была прочитана
последняя компонента. FileSize(F):LongInt – возвращает количество компонент в открытом
файле. FilePos(F):LongInt – возвращает номер текущей компоненты
открытого файла (первая компонента имеет номер ноль!). Создание файлов а) Режим прямого доступа При создании баз данных обычно в записях имеется поле,
идентифицирующее эту запись. Будем называть его ключом записи. Очень удобно, когда это поле числовое и целое. Если значение ключа меняется в границах [А1, А2], то можно определить N – число участков в дисковой памяти для хранения файла по формуле A2-A1+1, а номер NREG=KEY-A1 будет указывать позицию в файле записи с ключом KEY. Например, запись с ключом 1 будет занимать участок с номером 0.
Пусть в файле F хранятся сведения о рабочих: табельный номер, фамилия, стаж работы, размер зарплаты. Табельный номер, уникальный для каждого рабочего, будет служить ключом для записи в файле F. Ниже дается описание типа записей файла F и переменных.
TYPE zapis=record
tn :word; {табельный номеp} fio :string[15]; {фамилия }
st :0..50; {стаж работы } okl :real {заpаботок } end; VAR S: zapis;
32
Ch:char; F: file of zapis; NreG: word; {поле позиции записи в файле}
Пусть в файле табельные номера TN лежат в пределах [100,1000], номера участков в файле соответственно будут в пределах [0,900]. К моменту создания файла подготовлены сведения об отдельных рабочих, допустим, с табельными номерами 100,130,205,206,207,300,500. В подобных случаях созданию файла предшествует процесс – "форматизация" файла, т.е. заполнение всего файла пустыми записями.
Procedure init_file; var Pust_z:zapis; begin with pust_zs do begin tn:=0; fio:=''; st:=0; okl:=0; end; assign(f,'l1.dat'); rewrite(f); for i:=0 to 900 write(f,pust_z); close(f); writeln('форматизация завершена'); end;
б) Последовательный доступ. Если нет возможности организовать прямой доступ, работа с файлом
ведется в последовательном режиме. Записи размешаются на диске в порядке поступления.
Procedure seq_create; begin Assign(f,'имя файла на диске'); reset(f); repeat ..{ операторы ввода данных в запись S}…… write(f,s); write(‘Есть еще записи? Да-Y, нет-N’); ch:=readkey; until upcase(ch)=’N’; close(f); end;
Поиск нужной записи выполняется либо последовательным перебором, начиная с первой записи файла, либо в режиме прямого доступа с помощью процедуры seek(f, nrec), если существует простая связь между номером записи nrec и значением N- ключевого поля записи.
Удаление записи из файла осуществляется двумя способами: либо пометкой удаленной записи специальным символом (например, первому символу какого-либо поля в начало прибавляется‘*’; затем все помеченные таким образом записи при чтении игнорируются), либо путем копирования всех записей, кроме удаляемой, в новый файл. После закрытия файлов следует удалить старый файл и переименовать новый файл в старый.
Лекции 18-19. Модульное программирование. Нисходящее проектирование программ. Способы реализации мо-
дульных программ. Подпрограммы. Процедуры и функции. Синтак-сис записи подпрограмм.
33
Программу, состоящую только из большого числа операторов, назы-вают монолитной. До сих пор мы писали только такие программы.
Модульное программирование – это организация программы как сово-купности небольших независимых блоков, называемых модулями.
Принцип “разделяй и властвуй” известен со времен Юлия Цезаря и является методом решения трудных проблем путем разделения проблемы на множество мелких независимых, которые легче понимать и решать.
Удачная структура модульной программы позволяет улучшить про-цесс ее разработки. Количество модулей в комплексе должно определяться разбиением поставленной задачи на независимые подзадачи. Число моду-лей, вызываемых каким-либо модулем, называется размахом или шириной управления модулями. Слишком большая ширина управления является признаком плохой схемы разбивки на модули.
Среди множества модулей различают: головной модуль – управляет запуском программного продукта (существует в единственном числе); управляющий модуль – обеспечивает вызов других модулей на обработку; рабочие модули – выполняют функции обработки; сервисные модули и библиотеки – осуществляют обслуживающие функции.
В работе программного продукта активизируются необходимые про-граммные модули. Управляющие модули задают последовательность вы-зова на выполнение очередного модуля. Информационная связь модулей обеспечивается либо через общие данные, либо межмодульной передачей данных через переменные обмена, называемые параметрами.
Структурный подход к программированию состоит из трёх частей: нисходящее проектирование, структурное программирование и тестирова-ние.
Нисходящее проектирование Разработку алгоритма удобно вести, двигаясь по дереву сверху вниз,
как говорят нисходящим методом, т.е. от общего к частному. На первом этапе весь алгоритм представляется в виде единственного процедурного блока. Затем исходный алгоритм разбивается на части, выполняющие определенные функции. Процесс разработки алгоритма продолжается ана-логично, пока весь алгоритм не будет разложен на достаточно простые блоки. Модульная структура программы позволяет сократить текст про-граммы за счет выделения одинаковых участков обработки в отдельные модули. Разбивать программу на отдельные модули рекомендуется даже в тех случаях, когда эти модули используются однократно.
Представление программы в виде иерархии относительно обособлен-ных фрагментов со строго определёнными интерфейсами делает её легко проверяемой и приводит к повышению качества и эффективности про-граммы.
34
Рисунок 2. Пример иерархии модулей.
Модуль или подпрограмма – это часть программы, оформленная в ви-де отдельной синтаксической конструкции и снабженная именем.
Любая подпрограмма кроме задания последовательности действий может содержать описание некоторой совокупности локальных объектов – констант, типов, переменных и так далее. Эти объекты предназначены для внутреннего использования внутри этой подпрограммы.
Подпрограмма может быть предназначена для работы с различными данными. Гибкость и универсальность подпрограммного механизма обес-печивают с помощью понятия параметров.
Общая структура подпрограммы Структура подпрограммы подобна структуре паскаль–программы, что
имеет глубокий смысл: "Часть подобна целому". При описании подпрограммы необходимо задать три основные ком-
поненты: - интерфейс подпрограммы, то есть информацию, необходимую
для её вызова; - совокупность описаний локальных рабочих объектов; - собственно действия (операторы), составляющие смысл под-
программы. Интерфейс задается с помощью заголовка. Вторая часть представляет
собой раздел описаний локальных данных, третья – операторы вычисле-ний. В дальнейшем будем называть блок описаний и операторов телом подпрограммы.
В языке Паскаль имеется два вида подпрограмм: процедуры и функ-ции. Они отличаются назначением и способом их использования.
Подпрограмму или модуль обычно оформляют в виде функции, если результатом ее выполнения является одно скалярное значение. Если под-программа в результате работы не выдает ни одного результата, например, выполняет графические построения, или выдает больше одного результа-та, то ее оформляют в виде процедуры.
Например, видом модуля, выполняющего транспонирование матрицы, очевидно, будет процедура, а модуль, выполняющий вычисление опреде-лителя матрицы, следует оформить как функцию.
Для досрочного выхода из подпрограммы используется стандартная процедура Exit.
Процедуры и функции Описания процедур и функций должны располагаться в программе
после описания переменных перед секцией основного кода, который нахо-дится между последними операторами begin и end программы и управляет
35
логикой программы. Описание процедуры Описание процедуры позволяет связать идентификатор с процедур-
ным блоком. <Описание процедуры>::=<заголовок процедуры><тело процедуры>; Заголовок именует идентификатор процедуры и задает список фор-
мальных параметров (если они имеются): <заголовок процедуры>::=procedure <идентификатор>;| procedure <идентификатор> (список формальных параметров); <тело процедуры>::=<раздел описаний> begin <операторы> end;| begin <операторы> end;
Операторы, которые выполняют назначение процедуры, содержатся в операторной части модуля процедуры между begin и end.
В качестве примера рассмотрим описание процедуры, выполняющей ввод с контролем ошибок ввода переменной вещественного типа.
Идентификатор процедуры read_real. Входные параметры процеду-ры: X – адрес вводимой переменной, и два значения X1 и X2, определяю-щие границы допустимых значений переменной X.
Описание процедуры имеет вид: Procedure read_real(var x:real; x1,x2:real);{ Заголовок процедуры } Var { раздел описаний} Iocode:integer; { локальных } Fl:boolean; { переменных } Begin { Раздел операторов процедуры } Repeat Write(' Введите число в интервале от ', x1, ' до ',x2); {$I-} readln(x); {$I+} iocode:=ioresult; fl:= (iocode=0) and(x>=x1) and(x2<=x2); if not fl then writeln(' Неверное значение! Повторите ввод'); until fl; end; { конец описания процедуры read_real }
В начале работы процедуры отменяется автоматическая проверка ошибок ввода-вывода с помощью директивы компилятора {$I-}. Для ввода данного используется цикл repeat ... until до тех пор, пока не будет введено правильное значение Х.
Процедура активизируется с помощью оператора процедуры, в кото-ром содержатся имя процедуры и необходимые параметры. Для ввода пе-ременной z, значения которой лежат в интервале от -5.5 и 9, нужно запи-сать оператор процедуры будет иметь вид read_real(z,-5.5,9);
Директивы near и far Для некоторых специальных целей может потребоваться использовать
модель с дальним типом вызова. Чтобы переопределить автоматический выбор модели вызова компилятором, можно использовать директиву ком-пилятора {$F+}. Процедуры и функции, компилируемые в состоянии {$F+}, всегда будут иметь дальний тип вызова far. По умолчанию исполь-зуется директива {$F-}.
Директива forward Описание процедуры, содержащее вместо блока операторов директи-
36
ву forward, называется опережающим описанием. Определяющее описание – это описание, в котором используется тот
же идентификатор процедуры, но опущен список формальных параметров, и в которое включен блок операторов. Описание forward и определяющее описание должны присутствовать в одной и той же части описания проце-дуры и функции. Между ними могут описываться другие процедуры и функции, которые могут обращаться к процедуре с опережающим описа-нием.
Описание функции Описание функции похоже на описание процедуры, но имеются три
различия: 1. Заголовок модуля-функции начинается с ключевого слова function и
в отличие от процедуры заканчивается указанием типа возвращаемого ре-зультата.
function <идентификатор>(список формальных параметров):< тип>; 2.Функция не может возвращать структурный тип (массив, запись или
файл). 3. В операторной части блока функции среди операторов, которые
должны выполняться при активизации функции, должен быть, по крайней мере, один оператор присваивания, в котором идентификатору функции присваивается значение. Результатом функции является последнее присво-енное значение.
Вызов функции аналогичен обращению к встроенным функциям Пас-каля, то есть указывается имя функции и в круглых скобках аргументы, необходимые для вычисления функции.
Аналогично процедурам функции могут описываться, как с ближним типом вызова (near), так и с дальним (far) и как опережающие (forward).
Лекция 20. Формальные и фактические параметры. Видимость
переменных. Области памяти. Локальные и глобальные переменные. Формальные и фактические параметры. В описании процедуры или функции задается список формальных па-
раметров. Формальный параметр или фиктивный аргумент используется для обозначения входных (выходных) данных подпрограммы. Формальные параметры являются локальными по отношению к описываемой процедуре или функции.
В операторах тела подпрограммы все действия описаны с формаль-ными параметрами. Но при активизации подпрограммы формальные па-раметры заменяются на фактические, и вычисления ведутся с фактиче-ским данными.
Для формальных параметров и локальных переменных подпрограмм на время выполнения подпрограммы выделяется место в оперативной па-мяти машины в соответствии с их типом и размерами. Эта область памяти носит название стек. В стек заносится либо значение фактического пара-метра, либо адрес его расположения в памяти.
Локальные и глобальные определения данных
37
Переменные, описанные внутри подпрограммы, являются ее локаль-ными переменными. Локальные переменные "невидимы" и недоступны вне подпрограммы.
Переменные, описанные в главной программе, называются глобаль-ными. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней переменные, но и сохраняется доступ ко всем переменным верхнего уровня.
Исключение составляют те глобальные переменные, имена которых совпадают с именами переменных, локализованных в подпрограмме.
Что напечатает данная программа? Значение локальной переменной i при входе в процедуру P не определено, хотя одноименная глобальная пе-ременная имеет значение 1. Если убрать описание переменной i из проце-дуры, то на экран будет выдано значение глобальной переменной i, т.е. 1.
Все выше сказанное относится не только к переменным, но и к типам, константам.
Область действия описания конкретного идентификатора называется его областью видимости. Другими словами, область видимости перемен-ной – это множество операторов, в которых данную переменную можно использовать.
Если в подпрограмме описаны другие процедуры или функции, то об-ласть видимости описанных в ней переменных распространяется на вло-женные подпрограммы, если только в них не описаны переменные с таки-ми же именами.
Лекция 21. Виды передачи параметров в подпрограммы. Переда-
ча параметров по ссылке и по значению. Другие возможные виды пе-редачи параметров.
Параметры подпрограмм Существует четыре вида параметров: значение, константа, перемен-
ная и нетипизированная переменная. Они характеризуются следующим: 1. Группа параметров без предшествующего ключевого слова является
списком параметров-значений. 2. Группа параметров, перед которыми следует ключевое слово const
и за которыми следует тип, является списком параметров-констант. 3. Группа параметров, перед которыми стоит ключевое слово var и за
которыми следует тип, является списком типизированных параметров-переменных.
4. Группа параметров, перед которыми стоит ключевое слово var или const, за которыми не следует тип, является списком нетипизированных параметров.
Параметры-значения Формальный параметр-значение обрабатывается, как локальная по
отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактиче-ского параметра при активизации процедуры или функции. Изменения, ко-торые претерпевает формальный параметр-значение, не влияют на значе-
38
ние фактического параметра. Фактический параметр должен иметь тип, совместимый по присваи-
ванию с типом формального параметра-значения может быть выражением. Если параметр имеет строковый тип, то формальный параметр будет иметь атрибут размером 255 символов.
Параметры-константы Формальные параметры-константы работают аналогично локальной
переменной, доступной только по чтению, которая получает свое значение при активизации процедуры или функции от соответствующего фактиче-ского параметра. Присваивания формальному параметру-константе не до-пускаются. Формальный параметр-константа также не может передаваться в качестве фактического параметра другой процедуре или функции.
function Max(const a: Vector; n: integer): extended;
Параметр-константа, соответствующий фактическому параметру в операторе процедуры или функции, должен подчиняться тем же правилам, что и фактическое значение параметра. В тех случаях, когда формальный параметр не изменяет при выполнении процедуры или функции своего значения, вместо параметра-значения следует использовать параметр-константу.
Параметры-переменные Параметр-переменная используется, когда значение должно переда-
ваться из процедуры или функции вызывающей программе. Соответству-ющий фактический параметр в операторе вызова процедуры или функции должен быть ссылкой на переменную. При активизации процедуры или функции все действия подпрограммы выполняются над фактическими па-раметрами, любая ссылка на формальный параметр-переменную приводит к доступу к самому фактическому параметру .
Procedure NullsArray(var a: Vector; n: integer); Var i:Integer; Begin {обнуление массива} For i:=1 to n do a[i]:=0; End;
Тип фактического параметра должен совпадать с типом формаль-ного параметра-переменной.
Примечание: файловый тип может передаваться только как пара-метр-переменная.
Нетипизированные параметры Когда формальный параметр является нетипизированным парамет-
ром-переменной, то соответствующий фактический параметр может пред-ставлять собой любую ссылку на переменную или константу, независимо от ее типа. Нетипизированный параметр, описанный с ключевым словом var, может модифицироваться, а нетипизированный параметр, описанный с ключевым словом const, доступен только по чтению.
Нетипизированный параметр несовместим с переменными всех типов, пока ему не будет присвоен определенный тип с помощью присваивания типа переменной.
Процедурные типы и переменные. Параметры-процедуры и па-
39
раметры-функции Для объявления процедурного типа используется заголовок процеду-
ры (функции) без указания имени процедуры или функции, например: Type Proc1 = Procedure (a, b: real; var c: real); Proc2 = Procedure (var a, b: integer ); Func1 = Function: String; Func2 = Function (a: Real): Real;
Имена параметров в описании процедурного типа никакого действия не вызывают. После определения процедурного типа появляется возмож-ность описывать переменные этого типа. Такие переменные называют про-цедурными переменными. Например, с учетом описаний типа из предыду-щего примера, можно объявить следующие переменные:
var P: Proc2; F: Func2;
Процедурной переменной можно присвоить значение только проце-дурного типа. Таким значением может быть другая процедурная перемен-ная, или идентификатор процедуры или функции. Например, пусть мы имеем следующие описания процедуры и функции:
procedure Swap(var A,B: integer); var Temp: integer; begin Temp := A; A := B; B := Temp; End; function Tan(Angle: real): real; begin Tan := Sin(Angle) / Cos(Angle); end.
Описанным ранее переменным P и F теперь можно присвоить значе-ния: P := Swap; F := Tan;
После такого присваивания обращение P(i,j) эквивалентно Swap(i,j) и F(X) эквивалентно Tan(X).
Программирование и отладка модульных программ При нисходящей разработке программирование модулей программы
начинается с модуля самого верхнего уровня, переход к программирова-нию какого-либо другого модуля выполняется в случае, когда если уже за-программирован модуль, который к нему обращается.
Первым тестируется головной модуль программы, который представ-ляет всю тестируемую программу. Те модули, к которым может обращать-ся головной, заменяются их имитаторами (так называемыми заглушками). Каждый имитатор модуля, в основном, сигнализирует о самом факте об-ращения к имитируемому модулю и выдает, если это необходимо, заранее запасенный подходящий результат. После завершения тестирования и от-ладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами. Для этого имитатор выбранного для тестирования модуля заменяется самим этим модулем и, кроме того, добавляются имитаторы тех
40
модулей, к которым может обращаться выбранный для тестирования мо-дуль.
Лекция 22. Среда визуального проектирования программ. Введение в объектно-ориентированное программирование. Ос-
новные классы и компоненты: свойства, методы, события. Delphi – среда программирования, в которой используется язык про-
граммирования Object Pascal. Объектно-ориентированное или объектное программирование (в
дальнейшем ООП) – парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее извест-ном варианте языков с прототипированием, — прототипов).
Класс – это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответ-ствовали объектам предметной области.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т. е. объ-екта.
Объект – сущность в адресном пространстве вычислительной систе-мы, появляющаяся при создании экземпляра класса (например, после за-пуска результатов компиляции (и связывания) исходного кода на выполне-ние).
Объектно-ориентированные особенности Delphi: Инкапсуляция Объединение и скрытие объектных данных, а также обрабатывающих
их методов внутри конкретного класса от пользователя называется инкап-суляцией.
Наследование При создании новых объектов получить все свойства и методы от
своих предков называют наследованием. Такие объекты унаследывают по-сле своего создания все поля, свойства, события, методы и прочее от своих предков. Наследование часто избавляет разработчиков от рутинной работы и позволяет не мешкая приступить к разработке чего-то нового.
Полиморфизм Это методы различных объектов, которые могут иметь одинаковые
имена, но по внутреннему содержимому отличаются друг от друга. Среда разработчика Delphi позволяет визуально строить приложение.
После запуска системы на экране размещается пустая форма – главное окно приложения. На данной форме можно размещать различные компоненты, а также добавлять в проект новые формы приложения – дочерние.
41
Проект имеет расширение *.dpr, формы – *.dfm, исходные тексты модулей – *.pas, *.dcu – откомпилированные модули.
В верхней части располагается главное меню Delphi, ниже представлены страницы палитры компонент, в левой части отображается окно инспектора объектов (Object Inspector), с помощью которого можно на этапе проектирования изменять различные свойства компонентов (закладка Properties) и описывать реакцию на события (Events).
Структура программы, созданной с помощью Delphi, несколько отличается от традиционной, что, в свою очередь, обусловливает особенности создания подобных программ. Подобную программу можно представить себе, состоящей из двух частей: интерфейса – части программы, предназначенной для ввода в программу и вывода из нее информации, и собственно операторов, предназначенных для непосредственного решения задачи. В своей работе программа взаимодействует с операционной системой, различными внешними устройствами, базами данных, файлами, другими программами и т.п.
Интерфейс представляет собой совокупность объектов, с помощью которых осуществляется передача информации в соответствующем направлении, – формы, диалоговые окна, элементы управления и т.д. Во многом выбранный интерфейс определяет структуру всей программы.
Так как объекты в программе являются достаточно автономными, для передачи информации между ними, а также между программой и операционной системой, программой и внешними устройствами и т.д. используется система сообщений. Обычно программа после своего запуска находится в режиме ожидания очередного сообщения, при появлении которого программа анализирует его, определяет, какие действия следует выполнить, и выполняет их, после чего ожидает следующее сообщение. Так как при появлении различных сообщений программа, как правило, выполняет различные действия, все исполняемые операторы представляют собой совокупность подпрограмм, оформленных в виде тех или иных методов различных объектов (включая и методы обработки сообщений и событий), либо самостоятельных подпрограмм.
Приложение – основной связующий объект проекта, организующий цикл по обработке поступающих сообщений.
Форма – интерфейсный элемент, посредством которого осуществляется обмен информацией между приложениями и внешними устройствами. Формы размещаются в приложении, а само приложение может содержать одну или несколько форм.
Компоненты – объекты, размещаемые на формах и предназначенные для выполнения тех или иных операций по отображению, получению и преобразованию информации.
Основные свойства компонентов Свойство – важный атрибут любого компонента. Изменение свойства
в инспекторе объектов сразу отражается на визуальной компоненте. Например, если выделить главную форму и в инспекторе объектов поменять свойства Width, то незамедлительно изменится ширина окна
42
формы. Значение свойств можно менять и программно, в ходе выполнения приложения.
Рассмотрим основные свойства, присущие большинству компонентов. Name – имя компоненты. Height – длина компоненты. Width – ширина компоненты. Top – положение левого верхнего угла компоненты по оси Y. Left – положение левого верхнего угла компоненты по оси X. Caption – заголовок. Font – шрифт текста компоненты. Style – стиль. Text – отображаемый текст (например, для компоненты ввода Edit) и др. События компонентов Обработка событий заключается в написании кода – обработчика
реакции на какое-либо событие. Например, при активном главном окне найдем в инспекторе объектов на закладке Events событие OnClose, которое возникает при закрытии окна. Дважды щелкнув на пустое поле справа от имении события, Delphi автоматически построит каркас обработчика – создаст процедуру:
procedure TИмяФормы.FormClose(Sender: TObject; var Action: TCloseAc-tion);
begin {Тело процедуры} end;,
в теле которой можно написать, например, код для отображения окна сообщения:
ShowMessage('Форма закрывается!');
Событие OnCreate возникает при создании компонента, OnClick – при щелчке мышкой по компоненте, OnDblClick – для двойном щелчке мышкой по компоненте, OnMouseMove – при движении курсора мыши над компонентом и т.п.
Таким образом, чтобы, например, вызвать другую форму при нажатии кнопки, необходимо написать соответствующий код в обработчике события OnClick для данной кнопки.
Компоненты Delphi Палитра компонентов содержит несколько страниц (Standard, Addi-
tional, Dialog, Sample и др.) Рассмотрим некоторые компоненты страницы Standard (стандартные
компоненты). 1) MainMenu – главное окно программы. Служит для создания
сложных иерархических меню. 2) PopupMenu – вспомогательное меню, обычно появляется в виде
отдельного окна после нажатия правой кнопки мыши. Привязывается к конкретному компоненту.
3) Label – метка. Используется для размещения на форме не очень длинных однострочных надписей.
43
4) Edit – строка ввода. Предназначена для ввода и/или отображения одной текстовой строки.
5) Memo – многострочный текстовый редактор. Используется для ввода и/или отображения многострочного текста.
6) Button – командная кнопка. Обработчик события OnClick обычно используется для реализации некоторой команды.
7) CheckBox – независимый переключатель. Щелчок мышью по компоненту в работающей программе изменяет логическое свойство Checked.
8) RadioButton – зависимый переключатель. Обычно объединяется как минимум еще с одним таким же компонентом в группу. Щелчок по переключателю приводит к автоматическому освобождению ранее выбранного переключателя в той же группе.
9) ListBox – список выбора. Содержит список предлагаемых вариантов (опций) и дает возможность проконтролировать текущий выбор.
10) ComboBox – комбинированный список выбора. Представляет собой комбинацию списка выбора и текстового редактора.
11) GroupBox – группа элементов. Используется для группировки нескольких связанных по смыслу компонентов.
12) RadioGroup – группа зависимых переключателей. Содержит специальные свойства для обслуживания нескольких связанных зависимых переключателей.
13) Panel – Панель. Используется для визуального объединения нескольких компонентов.
Некоторые компоненты страницы Additional: 1) BitBtn – командная кнопка с надписью и пиктограммой. 2) SpeedButton – пиктографическая кнопка. Обычно используется для
быстрого доступа к тем или иным опциям главного меню. 3) MaskEdit – специальный текстовый редактор. Способен
фильтровать вводимый текст, например, для правильного ввода даты (задается маска).
4) StringGrid – таблица строк. Обладает мощными возможностями для представления текстовой информации в табличном виде.
5) DrawGrid – произвольная таблица. Строки этого компонента могут содержать произвольную информацию, в том числе и рисунки.
6) Image – рисунок. Предназначен для отображения рисунков. 7) Shape – фигура. Помогает вставить правильную графическую
фигуру – прямоугольник, эллипс, окружность и т.п. При изучении возможностей компонентов следует воспользоваться
встроенной справочной службой Delphi. Методы – это процедуры или функции, принадлежащие объекту. Ме-
тоды определяют поведение объекта. Для вызова метода объекта сначала записывается имя объекта, с которым ассоциирован данный метод, затем, через точку, название метода. Например: Buttonl.Click вызывает метод нажатия (click) кнопки (Buttonl).
Для создания метода его нужно сначала объявить внутри описания
44
класса или компонента, содержащего данный метод. Например: type TMyComponent = class(TObject) procedure DoSomething; end;
Здесь, внутри описания нового компонента, объявляем метод DoSomething с помощью служебного слова procedure. После того как мы объявили новый метод, мы должны создать тело данного метода. Эта про-цедура может находиться где угодно внутри модуля, в котором был описан компонент. Например:
procedure TMyComponent.DoSomething; begin // Здесь размещаем команды и операторы, которые должны выполняться // при вызове метода DoSomething на выполнение end;
Лекции 23-24. Формы, меню, диалоговые окна, сообщения. Гра-
фические возможности среды программирования. Подобно фундаменту здания, форма представляет собой фундамент
программы, на котором строится все остальное. Форма — это место, где пользователь общается с программой. Приложение может иметь несколько форм, каждая из которых выполняет свое особое предназначение.
Delphi инкапсулирует концепцию форм в класс TForm, и каждая фор-ма, создаваемая с помощью конструктора форм (Form Designer), наследует основные свойства, методы и события этого класса.
Класс TForm не является прямым потомком TWinControl. Работа с формами Как известно, существуют информационные окна (формы) и
диалоговые. Информационное окно предназначено в основном для вывода информации пользователю. Диалоговые окна – специальные формы, предназначенные для организации диалога пользователя с программой посредством этого окна. Здесь возможна двусторонняя передача информации – как программе, так и пользователю.
Окна могут быть также модальными и немодальными. При открытии окна в немодальном режиме, возможен переход на окно, его вызвавшее, и на другие. При вызове окна в модальном режиме невозможен переход на другие окна до тех пор, пока не закроется модальное окно.
Вызов модального окна осуществляется с помощью метода ShowMod-al:
Имя_формы.ShowModal;
Немодальное окно вызывается методом Show. Метод Close закрывает окно (при этом возникает событие закрытия
окна OnClose), Hide – делает скрытым (для его отображения используется метод Show).
С каждой формой связан модуль (*.pas). Определив глобальные переменные, например, в главной форме, их можно сделать доступными в дочерних окнах с помощью пункта меню File – Use unit и указать модуль, содержащий описание глобальных переменных.
Обратиться к компоненте другой формы можно, указав сначала имя формы, затем имя компоненты и требуемое свойство.
45
Для обработки исключительных ситуаций используется конструкция try //начало опасного блока … except // обработка исключительных ситуаций … end;
Для исключения возможных ошибок ввода следует использовать компоненты MaskEdit – ввод с маской, SpinEdit, ComboBox, ListBox, Radi-oGroup, CheckBox, позволяющие выбрать возможные значения из фиксированного набора.
Окна сообщений используются для привлечения внимания пользова-теля. При помощи окна сообщения программа может, к примеру, проин-формировать об ошибке в исходных данных или запросить подтверждение выполнения необратимой операции, например, удаления файла.
Вывести на экран окно с сообщением можно при помощи процедуры ShowMessage или функции MessageDlg.
Процедура ShowMessage выводит на экран окно с текстом и команд-ной кнопкой ОК.
В общем виде инструкция вызова процедуры ShowMessage выглядит так: ShowMessage(‘Сообщение’);
где сообщение — текст, который будет выведен в окне. Следует обратить внимание на то, что в заголовке окна сообщения,
выводимого процедурой ShowMessage, указано название приложения, ко-торое задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла.
Функция MessageDig более универсальная. Она позволяет поместить в окно с сообщением один из стандартных значков, например "Внимание", задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь.
В приложениях, написанных на Delphi, могут быть реализованы меню двух основных видов:
Главное меню. Такое меню принадлежит форме и отображается вме-сте с ней под ее панелью заголовка. Если в приложении несколько форм, то для удобства можно объединять меню всех активных форм в одном.
Всплывающее (контекстное) меню. Такое меню предусмотрено по-чти у всех компонентов — элементов управления Windows. Оно возникает (всплывает) при нажатии правой кнопки мыши на этом компоненте. Предусмотрено такое меню и у формы.
Графические возможности Delphi. Поверхности, на которую программа может выводить графику, соот-
ветствует свойство Canvas. В свою очередь, свойство canvas — это объект типа TCanvas. Методы этого типа обеспечивают вывод графических при-митивов (точек, линий, окружностей, прямоугольников и т. д.), а свойства позволяют задать характеристики выводимых графических примитивов: цвет, толщину и стиль линий; цвет и вид заполнения областей; характери-стики шрифта при выводе текстовой информации.
Карандаш используется для вычерчивания точек, линий, контуров
46
геометрических фигур: прямоугольников, окружностей, эллипсов, дуг и др. Вид линии, которую оставляет карандаш на поверхности холста, опре-деляют свойства объекта.
Color– Цвет линии Width– Толщина линии Style– Вид линии Mode– Режим отображения Кисть (canvas.Brush) используется методами, обеспечивающими вы-
черчивание замкнутых областей, например геометрических фигур, для за-ливки (закрашивания) этих областей. Кисть, как объект, обладает двумя свойствами TBrush (кисть):
Color– цвет закрашивания замкнутой области Style– стиль (тип) заполнения области Область внутри контура может быть закрашена или заштрихована. В
первом случае область полностью перекрывает фон, а во втором — сквозь незаштрихованные участки области будет виден фон.
В качестве значения свойства Color можно использовать любую из констант типа TColor.
В Delphi существует множество различных методов для рисования геометрических фигур: окружностей, прямоугольников, эллипсов, линий и т.п.
Лекция 25. Рекурсивные определения и алгоритмы. Функциональное программирование предполагает обходиться вычис-
лением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Соот-ветственно, не предполагает оно и изменяемость этого состояния (в отли-чие от императивного, где одной из базовых концепций является перемен-ная, хранящая своё значение и позволяющая менять его по мере выполне-ния алгоритма).
Рекурсия – это одна из фундаментальных концепций в математике и программировании. Рекурсия – это одна из форм мышления, это мощное средство, позволяющее строить элегантные и выразительные алгоритмы.
Рекурсивным называется объект, частично состоящий или определяе-мый с помощью самого себя. Рекурсивные определения представляют со-бой мощный аппарат в математике.
Например: 1) Натуральные числа: а) 0 есть натуральное число, б) число, следующее за натуральным, есть натуральное. 2) Функция n! факториал (для неотрицательных целых чисел). Факториал – это произведение натуральных чисел от единицы до ка-
кого-либо данного натурального числа. Он определяется формулой: N!=N((N-1)!, для N>=1 и 0! = 1.
Например, 5! = 5*4*3*2*1 = 120. Мощность рекурсивного определения состоит в том, что с помощью
47
конечного высказывания позволяет определить бесконечное множество объектов.
Аналогично с помощью конечной рекурсивной программы можно описать бесконечное вычисление, причем программа не будет содержать явных повторений.
Если некоторая процедура Р вызывает сама себя, то ее называют пря-мо-рекурсивной. Если же процедура Р вызывает процедуру Q, содержащую вызов процедуры Р, то Р называют косвенно рекурсивной. Поэтому по тек-сту программы рекурсивность не всегда явно определима.
Общий вид рекурсивной процедуры: Р::=Р[S,Р]; S – множество операторов, не содержащих обращения к процедуре Р; Р – оператор процедуры Р; [] – границы блока – тела процедуры. Основное требование к организации рекурсивных процедур: рекур-
сивное обращение к Р должно управляться некоторым условием В, кото-рое в какой-то момент становится ложным.
Более точно схему рекурсивных алгоритмов можно представить в форме определения рекурсивной процедуры с помощью металингвистиче-ской формулы, где метасимвол «::=» означает «это есть».
1. P::= If B Then P[S,P]; 2. P::= P[S, If B Then P].
Здесь В – логическое выражение, при В=True происходит обращение к процедуре P.
Основной способ доказательства конечности некоторого повторяюще-гося процесса таков:
1.Определяется функция К(x), где x – множество переменных, такое, что из К(x)<0 следует истинность условия окончания цикла (WHILE, REPEAT).
2.Доказывается, что при каждом прохождении цикла значение К(x) уменьшается.
Аналогично обстоит дело и с рекурсивной процедурой. Пусть логическое условие выполнения рекурсии B выражается усло-
вием N>0. Величину N следует описать в заголовке процедуры как пара-метр-значение. При рекурсивном обращении к Р указать вместо N закон его изменения (в данном случае уменьшения), т.е. выражение N-1.
1. P(n)::= if N>0 then P[S,P(n-1)]. 2. P(n)::= P[S,if N>0 then P(n-1)].
Иными словами, в каждую рекурсивную процедуру, чтобы ее выпол-нение когда-нибудь закончилось, обязательно нужно включить либо услов-ный оператор, либо оператор Сase!
Необходимо убедиться, что максимальная глубина рекурсий не только конечна, но и мала. Как правило, с процедурой связывают множество ло-кальных переменных, которые определены только в этой процедуре. При каждой рекурсивной активации процедуры порождается новое множество локальных, связанных переменных. Хотя они имеют те же самые имена,
48
что и соответствующие элементы локального множества предыдущего по-коления этой процедуры, их значения отличны от последних, а любые конфликты по именам разрешаются с помощью правил, определяющих область действия идентификаторов: идентификатор всегда относится к са-мому последнему порожденному множеству переменных. Иначе говоря, каждое поколение доступно для вычислений только во время работы со-здавшего его экземпляра рекурсивной функции. Порождение все новых копий рекурсивной подпрограммы до выхода на граничное условие назы-вается рекурсивным спуском. Максимальное количество копий рекурсив-ной подпрограммы, которое одновременно может находиться в памяти компьютера, называется глубиной рекурсии. Завершение работы рекурсив-ных подпрограмм, вплоть до самой первой, инициировавшей рекурсивные вызовы, называется рекурсивным подъёмом.
Для временного размещения параметров процедур и функций отво-дится сегмент памяти, называемый стеком, размер которого ограничен. Слишком большая глубина рекурсии может явиться причиной аварийного завершения, вызванного переполнением стека.
Лекции 26-27. Реализация рекурсии на языках высокого уровня.
Применение рекурсивных алгоритмов. Достоинства и недостатки ре-курсивных программ.
В качестве примера рассмотрим функцию вычисления N! в двух вари-антах: обычная с циклом (итеративная) и рекурсивная.
Первый вариант: {итеративная функция} function FACTI (n: byte):longint; var i :byte; f :longint; begin f:=1; for i:=1 to n do f:=f*i; {факториал вычисляется как произведение1*2*3*..*n} FACTI:=f; end;
Второй вариант: {рекурсивная функция} function FACT (n: byte):longint; begin if n=0 then FACT:=1 else FACT:=n*FACT(n-1); {n!=n*(n-1)!} end;
Основной метод построения рекурсивных алгоритмов – это метод де-композиции. Идея метода состоит в разделении задачи на части меньшей размерности, получение решение для полученных частей и объединение решений.
Алгоритм быстрой сортировки (рекурсивный). Основа алгоритма была разработана в 1960 году Хором (C.A.R.Hoare)
и с тех пор внимательно изучалась многими людьми. Быстрая сортировка особенно популярна ввиду легкости ее реализации; это довольно хороший
49
алгоритм общего назначения, который хорошо работает во многих ситуа-циях, и использует при этом меньше ресурсов, чем другие алгоритмы.
Суть алгоритма: число операций перемены местоположений элемен-тов внутри массива значительно сократится, если менять местами далеко стоящие друг от друга элементы. Для этого выбирается для сравнения один элемент х, отыскивается слева первый элемент, который не меньше х, а справа первый элемент, который не больше х. Найденные элементы ме-няются местами. После первого же прохода все элементы, которые меньше х, будут стоять слева от х, а все элементы, которые больше х,– справа от х. С двумя половинами массива поступают точно также. Продолжая деление этих половин до тех пор пока не останется в них по 1 элементу.
Рекуррентное соотношение – это рекурсивная функция с целочис-ленными значениями. Значение любой такой функции можно определить, вычисляя все ее значения начиная с наименьшего, используя на каждом шаге ранее вычисленные значения для подсчета текущего значения.
Рекуррентные выражения используются, в частности, для определе-ния сложности рекурсивных вычислений.
Например, при попытке вычислить числа Фибоначчи по рекурсивной схеме F(i) = F(i-1) + F(i-2), при N >= 1; F(0) = 0; F(1) = 1;
Текст программы будет таким: Function F( n : integer ) : longint; begin if n < 2 then F := n else F := F(n-1) + F(n-2) end;
Общий подход для реализации рекурсивных программ, который дает возможность получать эффективные и элегантные решения для обширного класса задач.
Технология, называемая восходящим динамическим программирова-нием (bottom-up dynamic programming) основана на том, что значение ре-курсивной функции можно определить, вычисляя все значения этой функ-ции, начиная с наименьшего, используя на каждом шаге ранее вычислен-ные значения для подсчета текущего значения.
Она применима к любому рекурсивному вычислению при условии, что мы можем позволить себе хранить все ранее вычисленные значения. Что в результате позволит уменьшить временную зависимость с экспонен-циальной на линейную!
Нисходящее динамическое программирование (top-down dynamic programming) позволяет выполнять рекурсивные функции при том же ко-личестве итераций, что и восходящее динамическое программирование. Технология требует введения в рекурсивную программу неких средств, обеспечивающих сохранение каждого вычисленного значения и проверку сохраненных значений во избежание их повторного вычисления.
Достоинства и недостатки рекурсивных программ Во-первых, рекурсивные алгоритмы есть универсальное средство ре-
шения разнообразных алгоритмических проблем. Показано, что любая разрешимая задача такого рода имеет рекурсивное решение, которое при
50
этом отличается изяществом и простотой для восприятия человеком. Во-вторых, рекурсивные алгоритмы часто имеют более низкую
асимптотическую сложность, чем эквивалентные им итерационные. То есть теоретически они быстрее.
В-третьих, развитие современных программных средств сделало прак-тическое использование рекурсии достаточно несложным делом, а новые концепции и технологии программирования преодолели проблему низкой эффективности рекурсивных программ, созданную необходимостью вызо-ва большого количества подпроцедур.
Рекурсивные подпрограммы отличаются простотой, наглядностью и компактностью текста. Однако выполнение рекурсивных подпрограмм требует значительно большего размера оперативной памяти во время вы-полнения, чем нерекурсивных. При каждом рекурсивном вызове для ло-кальных переменных, а также для параметров подпрограмм, которые пере-даются по значению, выделяются новые ячейки памяти.
Лекция 28-29. Динамическая память и абстрактные типы данных.
Распределение памяти под данные программы: адресация. Указатели. Способы их описания, допустимые операции.
Наряду с широко известными структурами данных, поддерживаемы-ми во многих языках программирования, такими, как скаляр, массив, за-пись, при решении ряда задач возникает необходимость в более сложных информационных объектах. Эти задачи таковы, что используемые в них структуры изменяются во время выполнения. Поэтому такие структуры данных можно назвать динамическими. С другой стороны, так как эти структуры не всегда поддерживаются средствами языка программирова-ния, а моделируются имеющимися в языке средствами, то их можно назвать абстрактными.
Целью данного раздела является знакомство с такими абстрактными структурами данных, как список, стек, граф, дерево, а также со средствами реализации этих структур в языке высокого уровня.
До сих пор мы рассматривали программирование, связанное с обра-боткой только статических данных. Статическими величинами называ-ются такие, память под которые выделяется во время компиляции и сохра-няется в течение всей работы программы. Раздел оперативной памяти, рас-пределяемый статически, называется статической памятью.
Указатели Работа с динамическими величинами связана с использованием еще
одного типа данных – ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.
Указатель содержит адрес поля в памяти, хранящего величину опре-деленного типа. Адрес величины – это номер первого байта поля памяти, в котором располагается величина. Размер поля однозначно определяется типом.
Рассмотрим указатели и действия с ними в языке Pascal.
51
Величина ссылочного типа или указатель описывается с использова-нием символа каре (^). Можно в разделе типов описать новый тип:
<тип_указателя>: ^< имя типа>; Вот примеры описания указателей c предварительным описанием ти-
па указателя: TYPE MAS1 = ARRAY[1..100] OF INTEGER; MAS1_PTR=^MAS1; I_PTR=^INTEGER; STRING_PTR=^STRING; VAR P1 : I_PTR; P2 : STRING_PTR; PM : MAS1_PTR; X:INTEGER;
Здесь P1 – указатель на динамическую величину целого типа; P2 – указатель на динамическую величину строкового типа; Pm – указатель на динамический массив, тип которого задан в разделе Type. Все три указателя типизированные указатели. Переменная X целого типа, размещается в памяти на этапе компиляции, ее выделяется область длиной 2 байта, согласно ее типу. Адрес размещения X в памяти можно найти с помощью операции @. @X – это адрес целочисленной переменной X. Этот адрес можно присвоить переменной-указателю, то есть, переменной, содержащей адрес данных типа Integer.
P1:= @X; Разыменование указателей. Чтобы разыменовать указатель,
поместите символ каре (^) после идентификатора указателя, например, P1^. Разыменовав типизированный указатель, можно работать с ним так, как, если бы это была переменная типа, на которую он указывает. Ниже показан пример разыменования указателя:
P1:=@x; {указатель Р1 равен адресу статической переменной Х} p1^:=6; {Динамическая переменная целого типа, на которую указывает Р1} {получает значение 6 и переменная Х тоже} Writeln(x); {печатается число 6, значение Х} x:=x*x; {Переменная Х получает значение 36} Writeln(p1^);{печатается значение динамической переменной Р1^, равное
36}
Динамическая память В версиях Паскаля, работающих под операционной системой MS DOS,
под данные одной программы выделяется 64 килобайта памяти (или, если быть точнее, 65520 байт). Это и есть статическая область памяти. При необходимости работать с большими массивами информации этого может оказаться мало. Динамически распределяемая область памяти – это вся па-мять, которую операционная система делает доступной для программы и которая не используется ее кодом, сегментом данных и стеком. Размер динамической памяти – много больше (сотни килобайт). Существует воз-можность занять память в динамически распределяемой области, полу-чить к ней доступ через указатель, а затем снова освободить память. Этот способ выделения памяти под данные называется динамическим. В этом случае память под величины отводится во время выполнения программы.
52
Такие величины будем называть динамическими, динамически распределя-емый раздел памяти называется динамической памятью.
Использование динамических величин предоставляет программисту ряд дополнительных возможностей: подключение динамической памяти позволяет увеличить объем обрабатываемых данных; использование дина-мической памяти позволяет создавать структуры данных переменного раз-мера.
Лекция 30.Динамические структуры данных, основные виды.
Список, очередь, стек, дерево. Списки Списком называется структура данных, элемент которой кроме соб-
ственно данных содержит адрес элемента, являющимся следующим в про-цессе обработки (логически следующим).
Логический порядок следования может не совпадать с физическим расположением элементов в памяти машины. Объединение элементов в список производится по разным критериям в зависимости от решаемой за-дачи. Например, если в виде списка организуется информация об авиарей-сах, то понятие "следующий" может относиться к авиарейсу, время вылета которого позднее, чем время вылета рейса, который будет "предыдущий".
Графически списковая структура данных имеет вид:
Списковая структура является удобным средством организации часто
меняющихся как по составу, так и по значениям данных. Основные опера-ции (вставка, удаление, замена) выполняются без физического перемеще-ния данных в памяти, путём изменения значений адресов следующих эле-ментов.
Виды списков Списки подразделяются на однонаправленные и двунаправленные,
циклические и ациклические. Однонаправленным списком является такой, элементы которого связаны адресами или ссылками в одном направлении. В двунаправленном списке каждый элемент содержит две ссылки: адрес последующего и адрес предыдущего элементов.
В любом списке кроме совокупности элементов необходимо задать адрес его первого элемента ("голову" списка), а в двунаправленном списке удобно хранить ещё и адрес последнего элемента – "хвост" списка с тем, чтобы была возможность двигаться как от начала списка к его концу, так и наоборот.
Для определения конца цепочки связанных элементов служит послед-ний элемент. У ациклического (некольцевого) списка в последнем элементе адрес следующего элемента равен Nil; в циклическом (кольцевом) списке у последнего элемента адрес следующего элемента равен адресу первого.
53
Обозначим элемент списка ELEM; в его состав для однонаправленно-го списка входят поля:
Д – данные и UKS – указатель (адрес) следующего элемента, а для двунаправленного списка – поля Д, UКР – указатель предыдущего элемен-та. Голову списка обозначим HEAD, хвост – LAST. Будем предполагать, что элементы списка размещаются в оперативной памяти по адресам S1,S2, ... Sn.
Стек Стеком или магазином называется такая память, в которую добавле-
ние возможно только в конец, и потребление (чтение) – также только с конца. Таким образом, обработка стека происходит по принципу: "первый пришел – последний ушел" или "последний пришел – первый ушел".
Если ввести в рассмотрение N-номер поколения стека, то добавление к стеку происходит согласно алгоритму:
1. N=N+1 2. Xn=Y Исключение из стека происходит по алгоритму: 1. Y=Xn 2. N=N-1 Очередь, дерево, пирамида Существуют также другие разновидности связанных динамических
данных. Очередь – частный случай линейного односвязного списка, для кото-
рого разрешены только два действия: добавление элемента в конец (хвост) и удаление элемента из начала (головы) списка.
Деревья – динамические данные иерархической структуры произволь-ной конфигурации. Элементы дерева называются вершинами (узлами).
Пирамидой (упорядоченным деревом) называется дерево, в котором значения вершин (узлов) всегда возрастают или убывают при переходе на следующий уровень. Пример возрастающей пирамиды:
1 3 2
5 7 7 12 10 15 Лекции 31-32. Линейные списки и способы их реализации. Каждый элемент списка есть запись: type list=^elem; dan=record zach: string[10]; fam : string[20]; end; elem=record inf : dan; next : list; end;
54
Запись представляет собой структуру данных, состоящую из фиксированного числа компонентов (полей), которые могут быть различного типа. Поэтому поля именуются. Например, запись dan состоит из двух компонент: zach и fam.
Структура описания записи такова: <имя> = RECORD <список полей> END; Для доступа к отдельному компоненту записи можно получить
доступ, используя составное имя, т.е. указать имя переменной и имя поля через точку: dan.zach.
Элемент однонаправленной списковой структуры состоит из данных (inf) и указателя на следующий элемент (next). Для двунаправленного списка необходимо ввести дополнительное поле для указания предыдущего элемента.
Создание однонаправленного ациклического списка Пусть требуется хранить в оперативной памяти данные в виде одно-
направленного списка. Алгоритм создания списка состоит из следующих шагов: 1. HEAD=0. 2. Разместить ELEM, адрес запомнить в поле Р. 3. Ввести INF. 4. Если обнаружен конец данных, то на 9. 5. Если HEAD=0,то 5.1. HEAD=P, иначе 5.2. UКS(LAST)=Р. 6. UКS(P)=0. 7. LAST=P. 8. На 2. 9. Конец.
Добавление элемента к однонаправленному ациклическому спис-ку
Для добавления элемента к списку необходимо определить место вставки, разорвать ранее существующую связь между элементами и вклю-чить в эту связь новый элемент.
Удаление элемента из двунаправленного ациклического списка Задан список, его "голова" HEAD, "хвост" LAST и адрес UKD удаляе-
мого элемента. При удалении необходимо исключить элемент из связей в прямом и обратном направлениях.
Печать от хвоста к голове производится аналогично: 1. Если LAST=0, то 1.1. Печать "список пуст"; 1.2. На 4. 2. P=LAST 3. Пока Р<>0 выполнить 3.1. Вывод D; 3.2. P=UKP(p); 4. Конец. Лекция 33. Верификация программ. Теорема структуризации и
структурное программирование. Анализ программ, утверждения о программе, эффективность алгоритмов.
Впервые основные идеи структурного программирования были вы-сказаны Эдсгером Дейкстрой в 1965 году и позже опубликованы в его ра-
55
боте [1]. Основная задача, которую Э.Дейкстра решал, разрабатывая идеи структурного программирования, была задача доказательства правильно-сти программы. Его внимание было сосредоточено на вопросе, «какими должны быть структуры программ, чтобы без чрезмерных усилий мы мог-ли находить доказательство их правильности».
Теоретической основой структурного программирования принято считать принципы, изложенные в классической работе Бома и Джакопини (Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules). Эта работа в оригинале на итальянском языке была опубликована в 1965 г., а в английском переводе – в 1966 г.
В соответствии с так называемой «структурной» теоремой, сформу-лированной и доказанной в этой работе, всякая программа может быть по-строена с использованием только трех основных типов блоков.
1. Функциональный блок. Ему в языках программирования соответ-ствуют операторы ввода и вывода или любой оператор (группа операто-ров) присваивания. В виде функционального блока может быть изображе-на любая последовательность операторов, выполняющихся один за дру-гим, имеющая один вход и один выход.
2. Условная конструкция. Этот блок включает проверку некоторого логического условия (P), в зависимости от которого выполняется либо оператор S1, либо оператор S2: If P Then S1 Else S2;.
3. Блок обобщенного цикла. Этот блок обеспечивает многократное повторение выполнения оператора(ов) S, пока выполнено логическое условие P. Аналог блока обобщенного цикла на языке Pascal: While P Do S; .
Важной особенностью всех перечисленных блоков является то, что каждый из них имеет один вход и один выход.
Кроме того, блоки S, S1, S2, входящие в состав условной конструкции или блока обобщенного цикла, сами могут быть одним из рассмотренных типов блоков, поэтому возможны конструкции, содержащие «вложенные» блоки. Однако какова бы ни была степень и глубина «вложенности», важ-но, что любая конструкция в конечном итоге имеет один вход и один вы-ход. Следовательно, любой сложный блок можно рассматривать как «чер-ный ящик» с одним входом и одним выходом.
Эффективность алгоритмов Один из способов определения временной эффективности алгоритма
заключается в следующем: на основе данного алгоритма надо написать программу и измерить время ее выполнения на определенном компьютере для выбранного множества входных данных. Хотя такой способ популярен и, безусловно, полезен, он поролсдает определенные проблемы. Определя-емое здесь время выполнения зависит не только от используемого алго-ритма, но также от архитектуры и набора внутренних инструкций данного компьютера, от качества компилятора, да и от уровня программиста, реа-лизовавшего тестируемый алгоритм. Время выполнения может существен-но зависеть от выбранного множества тестовых входных данных. Эта зави-симость становится совершенно очевидной при реализации одного и того
56
же алгоритма с использованием различных компьютеров, различных ком-пиляторов, при привлечении программистов разного уровня и при исполь-зовании различных тестовых входных данных. Чтобы повысить объектив-ность оценок алгоритмов, ученые, работающие в области компьютерных наук, приняли асимптотическую временную сложность как основную меру эффективности выполнения алгоритма. Термин эффективность является синонимом этой меры и относится в основном к времени выполнения в самом худшем случае (в отличие от среднего времени выполнения).
Лекция 34. Правильность структурированных программ. Методы
верификации программ. Методы отладки программ. Методы индук-ции и дедукции.
Алгоритм считается правильным, если он дает правильные результаты для любых допустимых исходных данных. Правильность алгоритмов ре-шения прикладных задач и наличие в них ошибок можно проверять двумя основными способами.
Первый способ– проверка основных этапов построения алгоритма: - задача, постановка, метод, алгоритм. Второй способ– анализ результатов выполнения алгоритмов и их
сравнение с выбранными методами решения и постановкой задачи: - алгоритм, метод, постановка, задача Сравнение результатов выполнения алгоритма с описанием метода
решения показывает, что это одна и та же система формул, что подтвер-ждает правильность алгоритма.
Систематические методы анализа правильности алгоритмов и про-грамм опираются на сопоставление тех же самых описаний, которые ис-пользуются при их систематическом составлении.
Основные типы алгоритмических ошибок в программах: - ошибки в выбранных методах решения; - ошибки в постановке решаемых задач; - дефекты в сценариях диалога с ЭВМ; - ошибки организации ввода данных; - неправильная реализация методов решения. Исчерпывающий анализ правильности алгоритмов и устранение из
программ ошибок всех перечисленных типов возможны только при нали-чии соответствующих спецификаций: постановок задач, описаний методов решения и спецификаций ввода-вывода данных.
Программа считается надежной, если не дает сбоев и отказов ни при каких исходных данных. Надежность – обязательное условие для всех про-грамм, которые используются для решения практических задач на ЭВМ.
Верификация программ. Верификация (подтверждение правильности) – состоит в проверке и
доказательстве корректности разработанной программы по отношению к совокупности формальных утверждений, представленных в спецификации и полностью определяющей связь между входными и выходными данными этой программы. При этом отношения между переменными н входе и вы-
57
ходе программы анализируется не в виде значений, как при тестировании, а в виде описаний их свойств, проявляющихся при любых процессах обра-боток этих переменных контролируемой в программе.
Верификация программы в принципе исключает необходимость её те-стирования и отладки, так как при этом на более высоком уровне понятий и описаний всех переменных, устанавливается корректность процессов, их обработка и преобразования.
Метод индуктивных утверждений. Для изучения этого метода программа снабжается утверждениями о
свойствах её переменных в некоторых точках: - Входные переменные не меняются в процессе исполнения программ; - Описываются состояния переменных в промежуточных точках; - Выходные переменные описываются с помощью отношениями меж-
ду переменными после завершения программы. Верификация состоит в последовательной демонстрации того, что из
входных переменных и преобразований, выполненных на первом шаге следует истинность утверждения, сформированного в следующей проме-жуточной точке.
Дедуктивное умозаключение– это умозаключение, в котором пере-ход от общего к частному является логически необходимым, следователь-но, из посылок, выражающих знания большей степени общности, получа-ем вывод как знание меньшей степени общности.
Правила дедуктивного вывода определяются характером посылок, ко-торые могут быть простыми или сложными суждениями.
Методы отладки программ. Отладка– это процесс поиска и исправления ошибок в программе,
препятствующих корректной работе программы. Перед тем как углубиться в специфические средства IDE, которые помогают при отладке, дадим краткое описание видов ошибок, которые Вы можете наблюдать, и различ-ного рода операций, которые будут использоваться для их поиска.
Основной смысл использования встроенного отладчика состоит в управляемом выполнении. Отслеживая выполнение каждой инструкции, Вы можете легко определить, какая часть Вашей программы вызывает проблемы. В отладчике предусмотрено пять основных механизмов управ-ления выполнением программы, которые позволяют вам:
1) Выполнять инструкции по шагам (Выполнение по шагам– это про-стейший способ выполнения программы по элементарным фрагментам).
2) Трассировать инструкции (Трассировка программы во многом ана-логична ее выполнению по шагам. Единственное исключение состоит в том, что когда встречается оператор вызова процедуры/функции, при трас-сировке эти процедуры и функции также выполняются по шагам, а при простом выполнении по шагам управление возвращается вам после завер-шения выполнения подпрограммы).
3) Выполнять программу до заданной точки (Точка останова– это обо-значенная в коде программы позиция, в которой вы хотите прекратить вы-полнение программы и вернуть выполнение отладчику. В этом смысле
58
точка останова работает аналогично команде GoTo Cursor, при которой программа выполняется обычным путем до достижения определенной точ-ки. Основное различие состоит в том, что вы можете задать несколько то-чек останова и точки останова, которые будут срабатывать не при каждом их достижении).
4) Находить определенную точку. 5) Выполнять сброс программы. Лекция 35. Тенденции развития средств и систем для проектиро-
вания программ. Обзор современных языков и систем программиро-вания. Современные технологии программирования.
Широкое внедрение вычислительной техники в различные сферы дея-тельности человека стимулировало развитие автоматизированных методов и инструментальных средств создания прикладного программного обеспе-чения (ПО). Производство современного ПО происходит на фоне высоких требований к его качеству, так как сложность и ответственность выполня-емых им функций непрерывно возрастает. Создание качественной про-граммы, как и любого другого продукта, зависит не только от опыта разра-ботчика, но и от инструмента, которым он пользуется. “Идеальной” техно-логией программирования была бы такая технология, которая по некото-рому неформальному описанию объекта программирования автоматически генерировала бы текст синтаксически и семантически корректной про-граммы.
Язык программирования С++ Являясь одним из самых популярных языков программирования, C++
широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраивае-мых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры). Существует несколько реализаций языка C++ – как бесплатных, так и коммерческих. Их производят Проект GNU, Microsoft, Intel и Embarcadero (Borland). C++ оказал огромное влия-ние на другие языки программирования, в первую очередь на Java и C#.
При создании C++ Бьёрн Страуструп стремился сохранить совмести-мость с языком C. Множество программ, которые могут одинаково успеш-но транслироваться как компиляторами C, так и компиляторами C++, до-вольно велико — отчасти благодаря тому, что синтаксис C++ был основан на синтаксисе C.
Язык программирования Java Java – объектно-ориентированный язык программирования, разрабо-
танный компанией Sun Microsystems. Приложения Java обычно компили-руются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) независимо от компьютерной архитекту-ры.
Программы на Java транслируются в байт-код, выполняемый вирту-альной машиной Java (JVM) – программой, обрабатывающей байтовый код
59
и передающей инструкции оборудованию как интерпретатор. Язык программирования Python Python – высокоуровневый язык программирования общего назначе-
ния с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная биб-лиотека включает большой объём полезных функций.
Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, импера-тивное и аспектно-ориентированное. Основные архитектурные черты – динамическая типизация, автоматическое управление памятью, полная ин-троспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в мо-дули (которые в свою очередь могут быть объединены в пакеты).
Python– активно развивающийся язык программирования, новые вер-сии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.
Язык программирования Prolog Пролог – язык и система логического программирования, основанные
на языке предикатов математической логики дизъюнктов Хорна, представ-ляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила ло-гического вывода и запросы, позволяющие описывать базы знаний, проце-дуры логического вывода и принятия решений.
Факты в языке Пролог описываются логическими предикатами с кон-кретными значениями. Правила в Прологе записываются в форме правил логического вывода с логическими заключениями и списком логических условий.
Особую роль в интерпретаторе Пролога играют конкретные запросы к базам знаний, на которые система логического программирования генери-рует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вы-вода.
Факты в базах знаний на языке Пролог представляют конкретные све-дения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведени-ями.
Язык программирования PHP PHP – скриптовый язык программирования общего назначения, ин-
тенсивно применяемый для разработки веб-приложений. В настоящее вре-мя поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяю-
60
щихся для создания динамических веб-сайтов. Языки параллельного программирования. Linda – язык программирования, предназначенный для параллельной
обработки данных. При использовании языка Linda прикладной процесс делится на группу процессов, среди которых выделяется главный. Указан-ные процессы осуществляются одновременно и синхронизированы один относительно другого. Язык предоставляет программистам эффективные средства создания параллельных программ. Ядром языка является про-странство кортежей — совокупностей взаимосвязанных данных. Каждая из них содержит ключевое слово для выборки кортежа.
Т++ – язык программирования указания необходимости параллельных вычислений с синтаксисом и семантикой, расширяющими язык C++, а именно расширением его несколькими словами, указывающими на воз-можность проведения параллельных вычислений. Само распараллеливание вычислений производится автоматически библиотекой времени исполне-ния интегрированной средой Т-системы во время выполнения программы, то есть динамически, которая расширяет интегрированную среду C++ Microsoft Visual Studio патчем. Для указания необходимости распаралле-ливания вычислений функция, используемые её внешние переменные и указатели помечаются соответственными ключевыми словами.
Язык программирования Oz включает в себя большинство концеп-ций популярных парадигм программирования, в том числе логического, функционального (причём как ленивые, так и «энергичные» вычисления), императивного, объектно-ориентированного, программирования с ограни-чениями, распределённого и параллельного программирования. С одной стороны, Oz обладает простой формальной семантикой, а с другой — для него создана эффективная программная реализация.
6.3. Краткое описание лабораторных работ 6.3.1. Перечень рекомендуемых лабораторных работ Лабораторная работа №1. Разветвляющийся вычислительный процесс. Лабораторная работа №2. Циклический вычислительный процесс. Лабораторная работа №3. Массивы и матрицы (с возможностью чте-
ния данных из текстового файла). Лабораторная работа №4. Строковые и литерные переменные. Лабораторная работа №5. Модульный принцип программирования.
Процедуры и функции. Лабораторная работа №6. Работа с типизированными файлами. Лабораторная работа №7. Рекурсивные алгоритмы. Лабораторная работа №8. Работа с динамическими списками. Лабораторная работа №9. Работа с графикой в Delphi. 6.3.2. Методические указания по выполнению лабораторных ра-
бот Лабораторная работа №1. Разветвляющийся вычислительный про-
цесс. Цель работы:
61
- освоение организации разветвляющихся вычислительных алгорит-мов на Паскале,
- приобретение навыков отладки и тестирования программ. Примеры индивидуальных заданий: 1. Даны действительные положительные числа A, B, C, X, Y. Выяс-
нить, пройдет ли кирпич с ребрами A, B, C в прямоугольное отверстие со сторонами X,Y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каж-дой из сторон отверстия.
2. Заданы действительные положительные числа X, Y, Z. а) Выяснить существует ли треугольник с длинами сторон Х, Y, Z. б) Если треугольник существует, то ответить– является ли он остро-
угольным. Лабораторная работа №2. Циклический вычислительный процесс.
Цель работы:
- приобретение навыков проектирования циклических алгоритмов; - приобретение навыков применения операторов цикла; - приобретение навыков отладки и тестирования программ. Примеры индивидуальных заданий: 1. Вычисление функции, заданной в виде суммы бесконечного ряда,
необходимо выполнить тремя способами: с заданной погрешностью EPS, с заданным числом K первых членов ряда и по аналитической формуле F(x).
а) sh x , 1x , x
nx
x x xn
n
2 1
1
3 5 7
2 1 3 5 7!
( )! ! !....
б) a ex x a ln , 1x , ( ln )
!
ln
!
( ln )
!
( ln )
!...
x a
n
x a x a x an
n
11 2 3
2 3
0
2. Решить неформализованную задачу. а) Среди простых чисел, не превосходящих заданного N, найти такое,
в двоичной записи которого максимальное число единиц. б) Два простых числа называются "близнецами", если они отличают-
ся друг от друга на 2 (таковы, например, числа 41 и 43). Напечатать все па-ры "близнецов" из отрезка [n, 2n], где n– натуральное число, большее 2.
Лабораторная работа №3. Массивы и матрицы (с возможностью
чтения данных из текстового файла). Цель работы: - получение навыков описания массивов; - составление и отладка программ работы с массивами; - закрепление навыков тестирования программ. Задание к лабораторной работе включает в себя две следующие за-
дачи. 1. Разработать программу по формированию и обработке одномерного
62
массива. 2. Разработать программу по обработке двумерного массива. Замечания. 1. Рекомендуется распечатывать все исходные и промежуточные ре-
зультаты по формированию и обработке массивов. 2. При отладке и тестировании программ иногда приходится много-
кратно вводить элементы массивов с клавиатуры. Можно создать тексто-вый файл с исходными данными, а в программе использовать оператор ввода данных из файла.
Примеры индивидуальных заданий на массивы: 1. Задан целый вектор X(n), n16. Сформировать массив К из тех
элементов вектора Х, которые являются степенью числа 2. 2. Задан целый вектор A(n), n12. Сформировать вектор Х из тех эле-
ментов вектора А, сумма цифр которых в десятичной записи больше за-данного числа N.
Примеры индивидуальных заданий на матрицы: 1. Для матрицы D(m,n), 1<(m, n)<10, индексы максимального элемен-
та массива и его значение. Переставить строки по убыванию значений сумм элементов строк.
2. Для матрицы G(m,n), 1<(m, n)<10, найти значение минимального элемента. Переставить столбцы по убыванию количества положительных элементов в столбцах.
Лабораторная работа №4. Строковые и литерные переменные. Цель работы: - освоение операций со строковыми данными на Паскале. Общая постановка задачи для всех вариантов: Задан текст, состоящий из слов, записанных через пробелы или запя-
тые. Длина текста не больше 255 символов. В тексте могут быть использо-ваны любые символы. Словом считать последовательность символов, не содержащую пробел. Необходимо введенный текст вывести на экран до и после его преобразования.
Примеры индивидуальных заданий: 1. Сформировать массив из 5-символьных слов без повторяющихся
букв. Найти в тексте первое цифровое слово и возвести его значение в куб. 2. Найти одинаковые 5-символьные слова и подсчитать число их по-
вторений. Найти первое цифровое слово и уменьшить его значение в 3 ра-за.
Лабораторная работа №5. Модульный принцип программирования.
Процедуры и функции. Цель работы: - получение навыков нисходящего проектирования, структурного
программирования, тестирования, оформления программы; - применение процедур и функций. Указания к выполнению лабораторной работы:
63
- обмен данными между модулями осуществлять только через список параметров.
- структурные типы формальных параметров необходимо описать в разделе типов главного модуля.
Если в задаче используются несколько массивов, отличающихся толь-ко границами своих измерений, целесообразно объявить глобальный тип с максимальными значениями по каждой размерности. Имя этого типа будет типом формального параметра в заголовке модуля.
Примеры индивидуальных заданий: 1. Даны два вектора А(10), В(20) и число К. Если в векторе нет ком-
поненты, равной К, то в данном векторе заменить первую наибольшую компоненту на К. Если в векторе есть компонента, PАВHАЯ K, то "сжать" массив – удалить все элементы массива, равные К.
2. Даны векторы A[10], B[8], C[6]. Получить y=min A[i]. Все компо-ненты вектора В, предшествующие первой по порядку компоненте с наименьшим значением, заменить их квадратами. Символьной переменной Т присвоить значение TRUE, если компонента вектора С с наименьшим значением находится в первой половине вектора, и значение FALSE – в противном случае.
Требования к оформлению программы 1. В начале программы должен быть помещен комментарий вида: { название программы, назначение программы автор программы (ф.и.о., группа) дата написания или последней корректировки } 2. В начало каждого модуля должен быть помещен комментарий, опи-
сывающий функции данного модуля. 3. В тексте программы в ключевых точках должны быть помещены
комментарии, текст которых сообщает об особенностях алгоритма и по возможности соответствует тексту из блок-схемы.
Лабораторная работа №6. Работа с типизированными файлами. Цель работы: - Знакомство с файловыми типами в Паскале. - Получение навыков операций с файлами - Применение навыков проектирования сложных программ - Применение навыков создания пользовательского интерфейса Лабораторная работа №7. Рекурсивные алгоритмы. Цель работы: - знакомство с рекурсивными определениями; - применение рекурсивных процедур и функций для решения задач.
Примеры индивидуальных заданий: 1. Написать рекурсивную функцию вычисления i-го числа Фибоначчи. 2. Получить двоичное представление заданного натурального числа N. 3. Построить синтаксический анализатор для понятия "идентифика-
тор":
64
<идентификатор>::=<буква> <идентификатор>::=<идентификатор> <буква> <идентификатор>::=<идентификатор> ,<цифра> <буква>::=’A’..’z’,’_’ <цифра>::=’0’..’9’ Лабораторная работа №8. Работа с динамическими списками. Цель работы: - освоение методов работы с динамической памятью; - применение процедур и функций для работы с динамической памя-
тью. Требования к программе 1. В программе должны быть выделены следующие модули: - создание списка; - изменение списка (добавление и удаление); - печать списка; - процедура обработки, указанная в варианте задания; - главный модуль, который обеспечивает тестирование модулей че-
рез меню; - вывести карту состояния динамической памяти в различные мо-
менты работы программы (до создания списка, после создания, по-сле удаления элемента и т.д.).
2. В программе должна быть предусмотрена обработка исключитель-ных состояний (конец данных, недопустимость преобразования вычисли-тельных состояний).
3.Вывод элементов списка на печать осуществлять в форме, удобной для интерпретации, например, в виде таблицы с заглавием.
4.Можно рекомендовать ввод данных для создания списка и дополни-тельных данных из разных файлов.
Примеры индивидуальных заданий: 1) Структура элемента однонаправленного списка SPI: Фамилия И.,О.,
табельный номер, стаж работы, оклад, специальность, указатель. А 1. Вывести на печать те элементы списка, в которых стаж работы
содержится в заданных пределах и специальность совпадает с заданной. А 2. Вывести на печать фамилии и оклады из всех записей списка SPI,
найти среднее значение оклада для лиц со стажем 12 лет. 2) Элементы двунаправленного списка имеют структуру DSP: Шифр
детали, наименование, расценка, вес, указатель предыдущего, указатель последующего.
В 1. Удалить элемент, предшествующий 2-му с конца списка элемен-ту.
В 2. Удалить элемент с заданным номером К от начала списка. Лабораторная работа №9. Работа с графикой в Delphi. Цель работы: - использование графических средств Delphi;
65
- приобретение навыков построения графиков, масштабирования. Примеры индивидуальных заданий: I. Построить графики четырех функций. Все графики построить раз-
личными цветами. Интервал изменения аргумента, цвет графика должны задаваться пользователем (используемые компоненты: Chart с нескольки-ми сериями Series, ColorBox для выбора цвета линий ). Вариант f1(x) f2(x) f3(x) f4(x)
1. cos(x) 2cos(x) cos(2x) cos(x/2) 2. sin(x) 2sin(x) sin(2x) sin(x/2)
II. Построить график функции, заданной в параметрическом виде.
Цвет, значение параметра (-ов), диапазон, и шаг изменения угла задаются пользователем.
1. Улитка Паскаля: tbtax coscos2 , tbttay sinsincos , 0a , 0b , 20 t . Рассмотреть случаи, когда ab 2 , aba 2 , ba .
2. Кардиоида: )cos1(cos ttax , )cos1(sin ttay , 0a , 2,0t . Порядок выполнения лабораторных работ №№1-4 1. Проектирование программы: - определение входных и выходных данных; - определение метода решения задачи; - описание алгоритма; - проектирование тестовых наборов. Результаты внешнего проектирования представляются в виде следу-
ющих документов: - таблица спецификации модулей; - математическая модель; - таблица сообщений; - блок-схема алгоритма; - таблицы тестовых данных, спроектированные по принципу " чер-
ного ящика". 2. Кодирование и отладка алгоритма программы. 3. Тестирование отлаженной программы. 4. Оформление и защита отчета. Порядок выполнения лабораторных работ №№5-9 1. Внешнее проектирование программы: - определение входных и выходных данных; - определение модульной структуры программы; - проектирование тестовых наборов. Результаты внешнего проектирования представляются в виде следу-
ющих документов: - схема иерархии модулей; - таблица спецификации модулей; - алгоритм главного модуля;
66
- таблица сообщений; - формат подготовки к вводу исходных данных; - формы выдачи результатов; - таблицы тестовых данных, спроектированные по принципу " чер-
ного ящика". 2. Внутреннее проектирование программы: Для каждого модуля разработать - структуру и состав его внутренних данных; - алгоритм работы; - дополнительные тесты для проверки работы модуля. 3. Сквозной контроль алгоритма, проверка правильности, соответ-
ствия спецификациям. 4. Кодирование и отладка алгоритма программы. 5. Тестирование отлаженной программы. 6. Оформление и защита отчета. Требования к оформлению отчета к лабораторным работам
№№1-4. 1. Постановка задачи 2. Математическая модель. 3. Таблица спецификаций. 4. Таблица сообщений об ошибках. 5. Таблица тестов. 6. Блок-схема алгоритма. 7. Программа на языке программирование. 8. Результаты тестирования. Требования к оформлению отчета к лабораторным работам
№№5-9. 1.Схема иерархии модулей 2. Таблица спецификаций составляется для каждого модуля, содержит
информацию обо всех входных и выходных данных: - имя данных, используемое в спецификациях; - описание алгоритма, блок-схема к программе; - назначение данных; - допустимые диапазоны значений; - единицы измерений, тип величины (не использовать служебные слова языка программирования).
3. Таблица сообщений об ошибках должна содержать следующую ин-формацию:
- имя модуля, печатающего сообщение; - полный и точный текст печатаемого сообщения; - описание причины, вызвавшей печать сообщения; - рекомендации пользователю по организации поиска и устранения
ошибки. 4.Инструкции по подготовке исходных данных должны содержать ис-
черпывающее описание ввода данных (порядок следования, разделители). 5. Макет выходного документа должен давать полное представление о
67
виде, размерах и содержимом печатаемого документа. 6. Таблица тестовых данных содержит следующую информацию: - какая часть или особенность алгоритма программы тестируется; - состав входных данных; - ожидаемые результаты. 7. Таблица основных структур данных должна содержать исчерпыва-
ющую информацию обо всех основных (упоминаемых в описании алго-ритма или блок-схеме, но не включенных в таблицу внешних специфика-ций) структурах данных, т.е. структуру, тип, размерность, атрибуты, се-мантику переменных.
8. Краткое словесное описание алгоритма программы. 6.4. Краткое описание практических занятий 6.4.1. Перечень практических занятий (наименования, темы) Практическое задание №1. Знакомство со средой программирования
на языке высокого уровня. Практическое задание №2. Реализация разветвляющегося вычисли-
тельного процесса. Практическое задание №3. Реализация циклических алгоритмов и их
отладка. Практическое задание №4. Использование рекуррентных формул для
приближенного вычисления математических функций. Практическое задание №5. Использование литерных переменных и
множеств. Практическое задание №6. Обработка массивов данных. Сортировка
массивов. Практическое задание №7. Преобразование матриц. Практическое задание №8. Решение задач на строки. 6.4.2. Методические указания по выполнению заданий на практи-
ческих занятиях Практическое задание №1. Знакомство со средой программирования
на языке высокого уровня. Цель: знакомство со средой программирования: главное окно прило-
жения, меню (работа с файлами, окнами, отладка, запуск приложения, справочная система).
Практическое задание №2. Реализация разветвляющегося вычисли-тельного процесса.
Цель: закрепление умений программирования разветвляющихся алго-ритмов.
Практическое задание №3. Реализация циклических алгоритмов и их отладка.
Цель: закрепление умений программирования циклических алгорит-мов.
Практическое задание №4. Использование рекуррентных формул для приближенного вычисления математических функций.
68
Цель: закрепление умений программирования циклических алгорит-мов на примере приближенного вычисления функций, разложенных в бес-конечный ряд.
Практическое задание №5. Использование литерных переменных и множеств.
Цель: закрепление умений работы с литерными переменными и мно-жеств.
Практическое задание №6. Обработка массивов данных. Сортировка массивов.
Цель: закрепление навыков написания программ, обрабатывающих массивы.
Практическое задание №7. Преобразование матриц. Цель: закрепление навыков написания программ, обрабатывающих
двумерные массивы. Практическое задание №8. Решение задач на строки. Цель: закрепление умений работы со строковыми переменными. На всех практических занятиях преподаватель на примерах написания
программ иллюстрирует применение соответствующих алгоритмов. Сту-денты повторяют алгоритмы за своими ПК.
Далее студентам предлагается набор задач для решения. Студенты де-лятся на несколько групп (по рядам) и решают группой задачу. Одну зада-чу могут решать несколько групп, обсуждая между собой алгоритмы.
Затем группа программирует оптимальный алгоритм из предложен-ных и демонстрирует его работоспособность.
Применяемые технологии: синхронное решение задач с преподавате-лем на практическом занятии (с использованием ПК и мультимедиа-техники); применение «метода мозгового штурма» при решении задач, групповое решение задачи и тестирование алгоритмов и др.
6.5. Краткое описание видов самостоятельной работы 6.5.1. Общий перечень видов самостоятельной работы 1. Самостоятельное изучение отдельных разделов дисциплины. 2. Подготовка к лабораторным и практическим занятиям. 3. Тестирование и отладка алгоритмов, составленных на практических
и лабораторных занятиях. 4. Подготовка доклада/презентации по выбранному разделу курса
(например, «Рекурсия и ее применение»). 5. Составление отчета и подготовка к защите лабораторной работы. 6. Выполнение домашней контрольной работы. 7. Подготовка к зачету/экзамену. 6.5.2. Методические рекомендации для выполнения для каждого
задания самостоятельной работы 1) Самостоятельное изучение отдельных разделов дисциплины Цель: получение более глубоких знаний и навыков по специальным
разделам дисциплины:
69
Жизненный цикл программного Методы оценки сложности алгоритмов Методы тестирования и верификации приложений Применение рекурсивных алгоритмов И др. 2) Подготовка к лабораторным и практическим занятиям. Цель: повторение лекционного материла для защиты работы. 3) Тестирование и отладка алгоритмов, составленных на практи-
ческих и лабораторных занятиях. Цель: обнаружение ошибок в алгоритме и их устранение. Возможно
применение взаимной проверки студентами решений задач. 4) Подготовка доклада/презентации по выбранному разделу курса Цель: развитие навыков сбора, обработки и представления материала
в виде презентаций по дополнительным разделам курса, например, «Фрак-талы».
5) Составление отчета и подготовка к защите лабораторной ра-боты.
Цель: Подготовка документации по разработанным программам 6) Выполнение домашней контрольной работы. Цель: закрепление полученных знаний и навыков на практике. Студенту предлагается решить несколько задач по определенной те-
матике без использования ПК (например, на тему «Циклы», «Массивы» и др.).
Для каждой задачи необходимо все этапы решения задач на ЭВМ: - условие задачи, - математическая модель, - таблица внешних спецификаций, - таблица тестов, - структурированная блок-схема алгоритма, - текст программы. Пример заданий на «Циклы»: 1) Вычислить, не используя стандартные функции LN(x) и EXP(x) 2n, n– натуральное число; 2) Вычислить s= (1+1/12)(1+1/22)*…*(1+1/n2); 3) Логической переменной T присвоить значение true или false в за-
висимости от того, является натуральное число R , не большего 100000, степенью 3 или нет.
Пример заданий на семестровую домашнюю контрольную работу: 1) Многоугольник задан координатами вершин, определить, является
ли он выпуклым. 2) Упорядочить по возрастанию односвязный список целых чисел. 3) Посчитать, сколько раз в файле целых чисел встречается его мини-
мальный элемент. 7) Подготовка к зачету/экзамену.
70
Цель: закрепление полученных в ходе изучения дисциплины знаний, умений и навыков по определенному перечню вопросов для самоподготов-ки, включающему теоретическую и практическую части.
6.5.3. Описание курсовой работы Цель: 1) организация диалоговой программы и закрепление в процессе ее
создания всех основных элементов программирования на языке Паскаль и Си (Delphi, C++ Builder).
2) закрепление навыков представления информации в программах на языках высокого уровня;
3) демонстрация полученных в ходе изучение дисциплины знаний, умений и навыков;
4) приобретение профессиональных компетенций. Выполнение курсовой работы «Сравнительный анализ двух языков
программирования на примере решения задачи». Работа состоит из теоретической и практической частей. 1) Теоретическая часть должна содержать следующие обязательные
пункты: - Определение языка программирования - Краткая сравнительная характеристика двух языков программирова-
ния (структура программы; типы данных и их описание; описание основ-ных операторов; технология создания программ и др.).
- Сравнение указанных элементов языков согласно варианту. 2) Практическая часть представляет пример составления программы
на двух языках. - Заключение с выводами. - Список литературы. Курсовая работа по учебной дисциплине «Программирование» вы-
полняется в соответствии с индивидуальным заданием и предполагает вы-полнение следующих этапов:
1.Внешнее проектирование программы. 2.Выбор тестовых наборов. 3.Согласование результатов внешнего проектирование с руководите-
лем курсовой работы. 4.Внутреннее проектирование программы. 5.Кодирование и отладка программы. 6.Тестирование программы. 7.Оформление и сдача работы. Основные требования к программе: 1. Программа должна иметь модульную программу, т.е. должна состо-
ять из отдельных функций. 2. Рекомендуется апробировать переменных разных классов памяти. 3. При реализации программы следует разработать приемлемый для
диалоговой программы интерфейс. Работа программы должна начинаться с выдачи на экран дисплея «заставки», содержащей название игры и основ-
71
ные правила. 4. Должны быть предусмотрены простейшие защиты от неправильно-
го ввода. 5. Должна быть предусмотрена возможность прерывания текущей
игры в любой момент по желанию пользователя. Игроку при этом следует сообщить его текущие результаты и количество сделанных ходов и дать возможность, по желанию, повторить игру.
Порядок выполнения курсовой работы и график выполнения 1. Получить индивидуальное задание согласно варианту (1 неделя). 2. Уточнить все вопросы по теме работы у руководителя проекта (2
неделя). 3. Изучить способы описания синтаксиса языков (3-4 недели). 4. Выполнить внешнее проектирование разрабатываемых игровых
программ (5-6 недели). 5. Знакомство с описаниями языков. Составить краткие сравнитель-
ные характеристики (7-8 недели): Структура программы; Типы данных и их описание; Описание основных операторов: Технология создания программ. Пример отладки указанных простых программ на языке Си 6. Выполнить сравнение указанных элементов языков (9 неделя) 7. Программирование игровых программ на языках Паскаль и Си
(10-14 недели) 8. Отладка и тестирование (15 неделя) 9. Оформление пояснительной записки (16 неделя) 10. Защита курсовой работы по графику защит (17 неделя). Оформление и сдача работы. Работа оформляется в форме пояснительной записки и должна содер-
жать следующие разделы, (большая часть разделов была уже названа и пояснена выше):
1.Оглавление. 2.Постановка задачи. 3.Спецификация программы. 4.Схема иерархии модулей. 5.Спецификации модулей. 6.Проект инструкции пользователя (таблица сообщений). 7.Тестовые наборы. 8. Блок схемы алгоритмов (для каждого модуля). 9.Протоколы тестирования. 10.Листинг программы. Для сдачи курсовой работы необходима демонстрация работы про-
граммы преподавателю, программа демонстрируется как на тестах, пред-ложенных студентом, так и на тестах, которые могут быть предложены ру-ководителем курсовой работы.
Примеры индивидуальных заданий:
72
1 Игра “Морской бой“ (два игрока) На поле 4*4 клетки игроки устанавливают 3 корабля по одной клетке
(у каждого игрока свое поле). Программа “запоминает” положение кораб-лей. Затем игроки начинают поражать корабли противника, по очереди указывая координаты предполагаемого корабля. Результат попадания (по-пал или мимо) отмечается на поле (например, “*”- попал, “+” – мимо).
2. Игра "Тренировка памяти– слова" (1 игрок) Программа на определенное время высвечивает несколько слов- су-
ществительных. Слова выбираются и специального файла или из специ-альной таблицы случайным образом. Игрок должен воспроизвести слова. Время для запоминания может быть различным. Например, в программе предусматривается три временных режима
Число слов для запоминания может быть различным. Игрок может иг-рать в 2-х режимах: а) просто воспроизвести слова; б) воспроизвести слова в заданном порядке.
Студент может предложить свою тему работы, согласовав с препода-вателем.
6.5.3. Учебно-методическое обеспечение самостоятельной работы
студентов 1. Сетевой диск кафедры ВТ 2. \\172.27.100.23\Cyber\Program (сеть ВЦ ИрГТУ) 3. Непейвода Н.Н, Скопин И.Н. Основания программирования.
Ижевск-Москва, РХД, 2003 г. 4. 3. Кнут Д. Искусство программирования для ЭВМ в 7 т. т. 3 — M.
Мир, 1976. 5. Программирование на языке высокого уровня : метод. указания
по выполнению курсового проекта / Иркут. гос. техн. ун-т. - Ир-кутск: Изд-во ИрГТУ, 2009.
6. http://base.vingrad.ru/view/130-Algoritmyi-sortirovki 7. http://www.codenet.ru/ 8. Казанкова Р.Е. Толковый терминологический англо-русский сло-
варь по ВТ и программированию с илл. / Р. Е. Казанкова. – Иркутск : Изд-во ИрГТУ, 2008.
7. Применяемые образовательные технологии При реализации данной программы применяются образовательные
технологии, описанные в табл. 8. Таблица 8 – Применяемые образовательные технологии
Технологии Виды занятий
Лекции Л. р. Пр./Сем. СРС Курсовой проект
Слайд– материалы + + Виртуальное модели-рование
73
Работа в команде + + + + Игра Проблемное обучение Проектный метод + + Исследовательский метод
+
Тренинг Другие методы + + Также применяются: 1. Синхронное решение задач с преподавателем на практическом занятии (с использованием ПК и мультимедиа-техники). 2. Применение метода «мозгового штурма» (проектный метод) на практи-ческих занятиях (постановка проблемы, генерация идей, оценка и отбор идеи и реализация). 3. Групповая разработка алгоритмов, тестирование и выбор оптимального. 4. Взаимная проверка лекционных контрольных работ и тестирование ал-горитмов.
8. Контрольно-измерительные материалы и оценочные средства
для текущего контроля успеваемости, промежуточной аттеста-ции по итогам освоения дисциплины
8.1. Краткое описание контрольных мероприятий, применяемых контрольно-измерительных технологий и средств.
1. Промежуточное тестирование с использованием программной си-стемы тестирования (разработчик Дорофеев А.С.). 2. Демонстрация и тестирование работоспособности алгоритмов, вы-полненных в ходе лабораторных занятий. 3. Экспресс-тестирование на лекции. 4. Зачет. 5. Экзамен. 6. Демонстрация работоспособности и защита пояснительной записки к курсовой работе. 8.2. Описание критериев оценки уровня освоения учебной програм-
мы. Текущий контроль успеваемости оценивается преподавателем и зано-
сится в журнал успеваемости. По основным разделам дисциплины проводится промежуточное те-
стирование с использованием программной системы тестирования, реше-нии контрольных задач на практических заданий, домашних контрольных работ.
Зачет по дисциплине (семестр №1) ставится при наличии защищенных лабораторных работ, запланированных в первом семестре; наличии вы-полненной домашней контрольной работы №1 «Циклы»; решении зачет-ной задачи.
74
До экзамена по дисциплине (семестр №2) допускаются студенты, сдавшие все лабораторные работы, предусмотренные планом, контрольные работы. При наличии сданных в срок лабораторных работ, активной рабо-те на лекции и практических занятиях, написании итоговой контрольной работы, выполнении всех видов СРС, возможно выставление автоматиче-ского экзамена после предварительного собеседования с преподавателем (обычно в форме тестирования).
Оценка за курсовую работу (семестр №3) складывается из выполне-ния индивидуального задания, качества оформленного отчета, демонстра-ции работоспособности разработанного приложения, результатов защиты курсовой работы.
8.3. Контрольно измерительные материалы для итоговой аттестации
по дисциплине Пример тестовых заданий: Тест А. Подсчитайте значение P, P:= (20 div (10 div 3)) mod 4 Варианты ответов: 1) 1 2) 2 3) 10 4) 3 Тест В. Укажите тип результата вычисления выражения: 10+15/5 Варианты ответов: 1) вещественный 2) логический 3) целый 4) строковый Примеры заданий к зачету: 1) Дан массив А(10) целых чисел. Сформировать массив В из положи-тельных элементов массива А, кратных 3. 2) Перевести число 1<N<10 в 16 с/с. Примеры билетов к экзамену: Билет А. 1) Этапы решения задач. Основные блоки блок-схемы. 2) Основные операции с массивами. 3) В строке S из N слов найти произведение цифровых слов. Билет Б. 1) Оператор цикла с заданным числом повторений. 2) Методы сортировки массивов. 3) Дана строка S. Вывести символы строки в обратном порядке и ис-пользование рекурсивного алгоритма. 9. Рекомендуемое информационное обеспечение дисциплины 9.1. Основная учебная литература
1. Голицына О.Л. Языки программирования: учеб. пособие. Издатель-ство: «ИНФРА-М, Форум», 2010. 2. Егорова Н.Н. Программирование на языке высокого уровня. Учебное пособие. – Иркутск: ИрГТУ, 2001. 3. Бобровский С.И. Delphi 7 : учеб. курс. - СПб. : Питер, 2006. 5. Егорова Н.Н., Дорофеев А.С. Лабораторный практикум по курсу «Программирование на языке высокого уровня» – Иркутск: ИрГТУ,
75
2003. 6. Фаронов В.В. Turbo Pascal 7.0. Учебный курс: Учеб. пособие. – М.: КноРус, 2011. 7. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов. - Спб.: Питер, 2010.
9.2. Дополнительная учебная и справочная литература. 1. Фленов М. Библия Delphi – Спб: BHV, 2011 г. 2. Непейвода Н.Н, Скопин И.Н. Основания программирования. Ижевск-Москва, РХД, 2003 г. 3. Информатика. Базовый курс: учеб. пособие для втузов / С. В. Симонович [и др.] ; под ред. С.В. Симоновича. – 2-е изд. – СПб. : Питер, 2010 (Учебник для вузов). 4. Кнут Д. Искусство программирования для ЭВМ в 7 т. т. 3 — M. Мир, 1976.
9.3. Электронные образовательные ресурсы: 9.3.1. Ресурсы ИрГТУ, доступные в библиотеке университета или
в локальной сети университета. 1. Сетевой диск кафедры ВТ 2. \\172.27.100.23\Cyber\Program
9.3.2. Ресурсы сети Интернет. 1. http://delphibasics.ru/ 2. http://base.vingrad.ru/view/130-Algoritmyi-sortirovki 3. http://www.codenet.ru/ 4. http://delphid.dax.ru/ 5. http://www.cmcspec.ru/ipb/index.php?showtopic=426 10. Рекомендуемые специализированные программные сред-
ства 1. Free Pascal (свободно-распространяемый продукт) 2. Delphi 10 3. C++ Builder 4. Tester (разработанная на кафедре ВТ Дорофеевым А.С. программа
для тестирования знаний по дисциплине).
11. Материально-техническое обеспечение дисциплины Лекции по дисциплине проводятся в мультимедийном классе, обору-
дованном проектором и экраном. Практические занятия по дисциплине проводятся в компьютерном классе ИрГТУ (24 ПК), оборудованном про-ектором и экраном. Лабораторные работы по дисциплине проводятся в компьютерном классе ИрГТУ (24 ПК).
Промежуточное тестирование проводится с помощью разработанной на кафедре вычислительной техники программной системы тестирования.
Приложение к программе (обязательное) – календарно-
тематический план