ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования П...
150 downloads
515 Views
2MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Л. В. Гурьянов, Л. С. Гурьянова, С. В. Самуйлов
ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ. PASCAL И DELPHI Лабораторный практикум
ПЕНЗА 2006
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования
«Пензенский государственный университет»
Л. В. Гурьянов, Л. С. Гурьянова, С. В. Самуйлов
ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ. PASCAL И DELPHI Лабораторный практикум
Издательство Пензенского государственного университета Пенза 2006
УДК 681.3 Г95 Р е ц е н з е н т ы: Кафедра «Прикладная информатика» Российского государственного университета инновационных технологий и предпринимательства (Пензенский филиал) Кандидат технических наук, доцент заместитель директора по учебной работе Пензенского филиала Всероссийского заочного финансово-экономического института И. Ю. Семочкина
Г95
Гурьянов, Л. В. Введение в программирование. Pascal и Delphi: лабораторный практикум / Л. В. Гурьянов, Л. С. Гурьянова, С. В. Самуйлов. – Пенза: Изд-во Пенз. гос. ун-та, 2006. – 168 с. : ил. – Библиогр. : с. 161.
Рассматриваются базовые понятия программирования, необходимые для разработки сложных программ; принципы взаимодействия программ и структура программных модулей; работа в интегрированных средах программирования Turbo Pascal и Delphi. Приведены задания для выполнения лабораторных работ. Лабораторный практикум подготовлен на кафедре «Математическое обеспечение и применение ЭВМ» и рекомендуется для студентов специальности 23.01.05 по курсам «Алгоритмические языки и программирование» и «Структуры и алгоритмы обработки данных».
УДК 681.3
© Гурьянов Л. В., Гурьянова Л. С., Самуйлов С. В., 2006 © Издательство Пензенского государственного университета, 2006
2
СОДЕРЖАНИЕ Введение. Что мы понимаем под программированием.......................................................6 1. Обработка информации на компьютере............................................................................8 1.1. Модель обработки информации на компьютере............................................... 8 1.2. Основные объекты языка программирования................................................. 10 1.2.1. Синтаксические элементы языка программирования ........................... 10 1.2.2. Значения и типы ....................................................................................... 11 1.2.3. Константы и переменные ........................................................................ 12 1.2.4. Выражения................................................................................................ 13 1.2.5. Операторы................................................................................................. 15 1.3. Простая программа............................................................................................ 17 1.4. Работа в среде Turbo Pascal .............................................................................. 20 1.4.1. Создание, загрузка и сохранение программы ........................................ 20 1.4.2. Компиляция и выполнение программы.................................................. 21 1.5. Лабораторные задания ...................................................................................... 22 1.5.1. «Логические» задачи................................................................................ 22 1.5.2. Составление простых программ ............................................................. 24 2. Управляющие структуры ..................................................................................................27 2.1. Обзор управляющих структур.......................................................................... 27 2.2. Составной оператор .......................................................................................... 30 2.3. Операторы прерывания выполнения цикла .................................................... 30 2.4. Работа в среде Turbo Pascal .............................................................................. 32 2.4.1. Редактирование текста программы. Работа с блоками ......................... 32 2.4.2. Отладка программ .................................................................................... 34 2.5 Лабораторные задания ....................................................................................... 37 2.5.1. Реализовать схемы программ с помощью операторов языка Pascal .... 37 2.5.2. Выполнить трассировку и определить результаты программы ........... 41 2.5.3. Программирование с использованием управляющих структур ........... 47 3. Структуры данных..............................................................................................................50 3.1. Массивы ............................................................................................................. 50 3.1.1. Действия над массивами.......................................................................... 51 3.2. Строки ................................................................................................................ 52 3.2.1. Стандартные процедуры работы со строками ....................................... 53 3.2.2. Стандартные функции работы со строками........................................... 53 3.3. Записи................................................................................................................. 54
3
3.4 Лабораторные задания ....................................................................................... 56 3.4.1. Одномерные массивы .............................................................................. 56 3.4.2. Двумерные массивы................................................................................. 57 3.4.3. Строки ....................................................................................................... 59 3.4.4. Записи........................................................................................................ 60 4. Структура программы........................................................................................................64 4.1. Подпрограммы................................................................................................... 64 4.1.1. Глобальные данные.................................................................................. 66 4.1.2. Способы передачи параметров................................................................ 67 4.1.3. Функции .................................................................................................... 68 4.1.4. Процедуры ................................................................................................ 70 4.1.5. Передача массивов в качестве параметров ............................................ 70 4.1.6. Передача подпрограммы как параметра................................................. 74 4.1.7. Рекурсивные подпрограммы ................................................................... 75 4.2. Лабораторные задания. Подпрограммы .......................................................... 77 4.2.1. Оформление алгоритма обработки информации в виде подпрограммы .................................................................................................... 77 4.2.2. Разработка рекурсивных подпрограмм .................................................. 77 4.2.3. Разработка программы сложной структуры .......................................... 78 4.3. Модули ............................................................................................................... 79 4.4. Лабораторные задания. Модули....................................................................... 83 5. Хранение информации.......................................................................................................84 5.1. Файлы. Основные понятия и операции ........................................................... 84 5.2. Типизированные файлы .................................................................................... 87 5.3. Текстовые файлы............................................................................................... 88 5.4. Лабораторные задания. Процедуры работы с файлами ................................. 90 6. Динамические структуры данных. Указатели ................................................................91 6.1. Основные понятия и определения ................................................................... 91 6.2. Процедуры работы с динамическими структурами данных.......................... 93 6.2.1. Процедуры New и Dispose ....................................................................... 93 6.2.2. Процедуры GetMem и FreeMem.............................................................. 95 6.3. Применение динамических структур для организации списков ................... 96 6.4 Лабораторные задания. Указатели, список .................................................... 100 7. Введение в объектно-ориентированное программирование. Классы и объекты.....102 7.1. Основные понятия и определения ................................................................. 102
4
7.2. Объектно-ориентированная разработка модуля «Геометрические фигуры» .................................................................................... 103 7.3. Лабораторное задание ..................................................................................... 112 8. Объектно-ориентированное программирование на языке Object Pascal...................113 8.1. Классы и объекты ............................................................................................ 113 8.1.1. Структура класса.................................................................................... 113 8.1.2. Создание и уничтожение объектов....................................................... 114 8.1.3. Пример. Класс – динамический массив................................................ 115 8.1.4. Операции с объектами ........................................................................... 118 8.1.5. Свойства.................................................................................................. 122 8.1.6. События .................................................................................................. 124 8.1.7. Исключительные ситуации ................................................................... 124 9. Визуальная разработка программ в Delphi....................................................................127 9.1. Интегрированная среда разработки программ.............................................. 128 9.1.1. Проект ..................................................................................................... 129 9.2. Конструирование простого приложения ....................................................... 133 9.2.1. Интерфейс пользователя........................................................................ 134 9.2.2. Визуальное конструирование................................................................ 135 9.2.3. Реализация методов ............................................................................... 142 9.2.4. Обработка исключительных ситуаций ................................................. 145 9.2.5. Файлы приложения Калькулятор.......................................................... 146 9.3. Компоненты ввода/вывода данных StringGrid и Memo................................ 147 9.3.1. Компонент StringGrid – таблица строк ................................................. 147 9.3.2. Ввод массива. Компонент StringGrid.................................................... 149 9.3.3. Компонент Memo – многострочное окно редактирования ................. 151 9.3.4. Ввод массива. Компонент Memo .......................................................... 152 9.4. Немного о графике .......................................................................................... 154 9.4.1. Свойство Canvas. Построение графика функции ................................ 154 9.4.2. Событие OnPaint..................................................................................... 160 10. Тестирующая программа по основам языка Pascal....................................................162 10.1. Руководство преподавателя.......................................................................... 162 10.2. Руководство пользователя ............................................................................ 166 Список литературы...............................................................................................................168 Приложение А. Текст модуля Figures................................................................................169 Приложение Б. Тексты файлов ProjectCalc.dpr и UnitCalc.pas .......................................169
5
Введение Что мы понимаем под программированием Реальность программного обеспечения не встраивается естественным образом в пространство. У него нет готового геометрического представления подобно тому, как местность представляется картой, кремниевые микросхемы – диаграммами, компьютеры – схемами соединений. Абстрактной сущностью программного объекта является конструкция, состоящая из сцепленных вместе концепций: наборов данных, взаимосвязей между элементами данных, алгоритмов и вызовов функций. Однако программная конструкция реальна в том смысле, что она работает, производя видимые результаты, которые отделимы от самой конструкции: печатает значения данных, рисует картинки, производит звуки, приводит в движение рычаги. В наше время осуществилось волшебство мифа и легенды. С клавиатуры вводится верное заклинание, и экран монитора оживает, показывая то, чего никогда не было и не могло быть. Компьютерная программа – это послание человека машине. Строго выстроенный синтаксис и тщательные определения нацелены на то, чтобы бездумной машине стали понятны намерения человека. Однако при составлении программы необходима безошибочная точность действий. В этом отношении компьютер также напоминает волшебство. Один неверный знак, одна пауза в заклинании, и чудо не состоялось. Человеку несвойственно совершенство, и оно является необходимым лишь в немногих сферах его деятельности. При освоении программирования труднее всего привыкнуть к требованию совершенства [По материалам статьи: Брукс Ф. Мифический человекомесяц или как создаются программные системы. – Изд. 2. – 1995]. 6
Программировать – это исключительно точно, шаг за шагом, описать последовательность преобразования информации с такой строгостью, которая не требуется ни при каком другом виде человеческой деятельности. Сложность программирования связана не столько с изучением какого-нибудь языка программирования, сколько с освоением нового способа мышления. Чтобы освоить этот способ описания преобразования информации в виде программы, мы выбрали простой, но в то же время обладающий достаточной мощью, строго типизированный язык программирования – Pascal. Этот язык выбран нами в качестве базового, потому что он содержит основные конструкции и способы обработки данных, которые присущи всем современным языкам программирования. Поняв его, программисту будет легче осваивать такие языки, как Object Pascal, С++, Java, C#, Eiffel и многие другие.
7
1. Обработка информации на компьютере 1.1. Модель обработки информации на компьютере Обработка информации – это практическая реализация некоторой функции F, которая отображает множество данных D во множество возможных результатов R. F – произвольная функция, которую надо «вычислить»: перевод текста с русского на английский, нахождение максимума, расчет траектории ракеты, построение оптимального плана и так далее. Чтобы выполнить обработку информации на компьютере необходимо располагать тремя «физическими» представлениями (рисунок 1.1): D' – физическое представление данных D; R' – физическое представление результатов R; F' – физическое представление функции обработки F.
8
Рисунок 1.1 – Модель обработки информации на компьютере
Таким образом, обработка информации на компьютере включает в себя следующие процессы: • ввод данных – чтение данных с устройства ввода (например, клавиатура) в оперативную память компьютера. При этом данные из «внешнего» представления кодируются в представление на уровне компьютера; • вычисление – выполнение последовательности действий, которые необходимы для преобразования данных в результаты. Данная последовательность должна быть описана таким образом, чтобы ее мог выполнить процессор компьютера; • вывод данных – отображение (запись) полученных результатов на устройстве вывода (например, дисплей). При этом результаты из представления на уровне компьютера преобразуются к виду, понятному человеку. Введем несколько ключевых понятий. Программа – это совокупность данных, результатов и автоматизированного преобразования, такого, что каждому x из множества данных D ставится в соответствие результат y, принадлежащий множеству результатов R. В зависимости от уровня представления данных и функции автоматизированного преобразования информации говорят об исходной программе (данные D, R и функция F) и машинной программе (данные D', R' и функция F'). Описание исходной программы выполняется на языке программирования высокого уровня (например, Pascal, C++), описание машинной программы – на языке низкого уровня (например, Assembler). Язык программирования – это система описания программ, достаточно близкая к человеку, чтобы программу можно было легко написать, понять и изменить, но в то же время достаточно строго определенная, чтобы ее мог выполнить компьютер. Что делает язык программирования высокого уровня? Он освобождает программу от значительной доли необязательной сложности. Исходная (абстрактная) программа состоит из концептуальных конструкций: операций, типов данных, последовательностей и других 9
абстрактных компонентов. Машинная программа связана с битами, регистрами, условиями, переходами, каналами, дисками и пр. В той мере, в какой в языке высокого уровня воплощены необходимые абстрактной программе конструкции и избегаются конструкции низшего порядка, он ликвидирует целый уровень сложности, совершенно не являющийся необходимым свойством программы. Компилятор – это специальная программа, которая переводит текст исходной программы, написанной на языке программирования, в последовательность команд процессора. Компилятор создает машинную программу на языке процессора, эквивалентную исходной программе.
1.2. Основные объекты языка программирования 1.2.1. Синтаксические элементы языка программирования Синтаксис языка программирования – это система обозначений правильных последовательностей синтаксических элементов программы. Правило построения правильных последовательностей символов программы может быть записано как в текстовом представлении (например, нормальная форма Бэкуса – НФБ), так и в графическом (например, синтаксический граф). И в том, и в другом случае для задания правила используются терминальные символы, определенные в языке программирования, и нетерминальные, вспомогательные символы. Пример НФБ: ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Это правило читается так: "Цифра по определению есть 0 или 1, или 2, или … или 9". Символы этого правила: – нетерминальный символ (заключается в < >); ::= – операция "по определению есть"; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – терминальные символы; | – операция "или".
10
Данное правило определяет, что в языке допустимыми – правильными – являются только десять арабских цифр (от 0 до 9). К синтаксическим элементам языка программирования обычно относят следующие. Набор символов – буквы и цифры (например, символы ASCII, американского стандарта обмена информацией), а также ряд специальных символов. Идентификаторы – имена объектов языка (типов, констант, переменных и др.). Идентификатор состоит из последовательности букв и цифр, которая всегда начинается с буквы. Символы (знаки) операций, ограничители и скобки – например, символы арифметических и логических операций (+, -, /, *, not, and, or и др.), символы операций отношения (, =, >= и др.); символ ; – ограничитель операторов; круглые скобки и операторные скобки begin … end – парные ограничители. Ключевые слова – идентификаторы, используемые в качестве фиксированной части синтаксиса какой-либо конструкции языка (например, слово if служит началом условного оператора). Выражения – конструкции языка для вычисления и изменения значений. Выражения включают символы операций и операнды (константы, переменные и другие объекты языка). Операторы – конструкции языка, необходимые для управления порядком действий по обработке информации. Самые важные синтаксические компоненты языка. Комментарии – пояснения, включаемые в текст программы, но не обрабатываемые компилятором. Комментарии заключаются в фигурные скобки: { текст в фигурных скобках – это комментарий }
1.2.2. Значения и типы Цель программы состоит в вычислении значений. Значение данных может представлять собой число, символ или указатель на другой объект данных. При этом компьютер оперирует с физическими представлениями значений, которыми являются сово-
11
купности битов, байтов или слов оперативной памяти (множества D' и R'на рисунке 1.1). Одной из главных характеристик данных является тип. Тип определяет физическое представление данных, а также множество допустимых значений и операций над ними. Например, тип integer (целый) определяет целые значения со знаком, которые занимают в памяти 2 байта. Допустимые значения такого типа лежат в диапазоне от –32768 до +32767. Тип в языке Pascal может определяться программистом: type =
Пример: type boolean = (false, true);
Простые типы языка Pascal приведены в таблице 1.1. Таблица 1.1 – Простые типы языка Pascal Тип данных
Ключевое слово
Интервал допустимых значений
Целый
integer
–32768 ..+32767
Байтовый
byte
0 .. 255
Вещественный
real
2.9*10 .. 3.4*10
Логический
boolean
false, true
Символьный
char
Символы кодовой таблицы
-39
38
1.2.3. Константы и переменные Константы – это данные, значения которых не изменяются при выполнении программы. Константа в языке программирования характеризуется следующими атрибутами: • наименование; • значение. Формат описания в программе: = ;
12
Пример: N = 10; {N – имя константы, 10 – значение}
Переменные – это данные, значения которых изменяются при выполнении программы. Переменная в языке программирования характеризуется следующими атрибутами: • наименование; • тип; • текущее значение. Формат описания в программе: : ;
Пример: X: byte; {X – имя переменной, byte – тип}
Описание переменной подразумевает выделение памяти для хранения ее значения, но не определяет само значение переменной! Поэтому в программе все начальные значения переменных должны быть инициализированы (заданы) до первого «использования» переменных. Инициализировать переменные можно, например, с помощью операторов присваивания или ввода.
1.2.4. Выражения Выражение предназначено для вычисления значения и состоит из операндов (констант, переменных, функций) и операций над ними. Порядок действий в выражении определяется приоритетами знаков операций и круглыми скобками. Типы операндов, входящих в выражение, должны совпадать или удовлетворять правилам согласования типов языка программирования. Выражения называют арифметическими, «отношения», логическими и символьными в зависимости от того, какого типа операнды и операции в них используются. Арифметические выражения включают операции, допустимые для переменных числовых типов (integer, byte, real и др.). Приоритет операций в порядке убывания следующий: /, ∗, div (частное от деления целых чисел), mod (остаток от деления целых чисел),
13
and (поразрядное «и»), or (поразрядное «или»), shl (сдвиг влево), shr (сдвиг вправо), −, +.
Пример: 45.2 / 4 { результат 11.3 } r mod 10 {если r = 25, результат 5 } r div 10 {если r = 25, результат 2 } d1 shl 2 {если d1 = 2, результат 8 }
Выражения отношения выполняют сравнение операндов и определяют истинно выражение или ложно. Все операции выражения являются бинарными. Приоритет операций в порядке убывания следующий: =, , , =, in (операция принадлежности множеству). Результат всегда имеет логический тип. Пример: W ,; uses < список модулей, используемых в программе >; const < раздел описания констант >; type < раздел описания типов >; var < раздел описания переменных >; function < описание функции >; procedure < описание процедуры >; begin {основной блок программы } ; end.
17
Пример простой программы Программа вычисляет значение общих затрат на приобретение определенного количества товара по известной цене за его единицу. Покупка товара осуществляется в фирме «Товары – почтой», где, кроме стоимости товара, взимается почтовый сбор. Программа вычисляет значение: общие затраты = количество товара × стоимость единицы + + почтовый сбор
Текст программы Account (расчет) и пояснения приведены ниже (таблица 1.3). Таблица 1.3 – Текст программы Account Текст программы
Пояснения
18
program Account;
Заголовок программы Account
const POSTAGE = 5;
Раздел описания констант почтовый сбор: имя константы – POSTAGE значение –5
Var number: integer;
Раздел описания переменных Количество товара : имя – number тип – целый Цена единицы товара: имя – price тип – целый Стоимость товара : имя – cost тип – целый
price
: integer;
cost
: integer;
begin readln(number, price); cost:= number ∗ price;
cost:= cost + POSTAGE;
writeln(cost); end.
Раздел операторов (основной блок) Оператор ввода с клавиатуры значений переменных number и price Оператор присваивания переменной cost значения произведения значений переменных number и price (результат – стоимость товара без почтового сбора) Оператор присваивания переменной cost суммы ее предыдущего значения и значения константы POSTAGE (другими словами, увеличивает значение переменной cost на значение константы POSTAGE). Вычисленное значение – общие затраты Оператор вывода на дисплей значения переменной cost (общие затраты) Завершение раздела операторов (завершение текста программы) После символа «.» (точка) любой текст компилятором не воспринимается и не обрабатывается!
Выполним трассировку (прослеживание) программы при значении переменных number = 4, price = 10. В таблицу занесем точное отображение того, как изменяются значения переменных в основном блоке программы (таблица 1.4). Таблица 1.4 – Трассировка программы Account Оператор
Значения констант и переменных POSTAGE
19
number
price
cost
вход в программу
Begin 5
?
?
?
readln ( number, price );
5
4
10
?
cost := number ∗ price;
5
4
10
40
cost := cost + POSTAGE;
5
4
10
45
writeln ( cost );
Вывод на дисплей: 45
End
Выход из программы
1.4. Работа в среде Turbo Pascal 1.4.1. Создание, загрузка и сохранение программы Создание новой программы и сохранение ее текста. Выполните следующую последовательность действий: • войдите в интегрированную среду разработки (ИСР) программ на языке Pascal и по клавише F10 вызовите главное меню; • войдите в меню File (рисунок 1.2).
Рисунок 1.2 – Меню работы с файлами (File)
На рисунке 1.2: New Open Save Save as Change dir
– «Новый», – «Открыть», – «Сохранить», – «Сохранить как», – «Изменить каталог»,
20
– «Печать», – «Выход». Exit Переход по пунктам меню осуществляется клавишами управления курсором, а выбор пункта – клавишей Enter. • Для первоначального сохранения текста программы на диске выберите в меню File пункт Save as (см. рисунок 1.2). В появившемся окне Save File as наберите имя файла (можно без расширения pas) и щелкните левой кнопкой мыши по кнопке OK. Переключение между элементами окна Save File as осуществляется клавишей Tab, выполнение действия – клавишей Enter. Сохранение программы. Если необходимо сохранить текст программы в файле, имя которого уже определено, выберите в меню File пункт Save (см. рисунок 1.2) и нажмите Enter. Это же действие можно выполнить, нажав на клавишу F2. Загрузка программы. Для работы с уже созданной программой (файл с расширением pas уже существует) необходимо выполнить загрузку программы в среду разработки: • войдите в ИСР Pascal, • по клавише F10 вызовите главное меню и войдите в меню File, • выберите в меню File пункт Open (см. рисунок 1.2). В появившемся окне Open a File наберите имя программного файла и щелкните левой кнопкой мыши по кнопке Open. Это же действие можно выполнить, нажав на клавишу F3. Print
1.4.2. Компиляция и выполнение программы Компиляция программы. Компилятор ИСР Pascal выполняет синтаксический анализ исходного текста программы (файл с расширением pas) и в случае отсутствия ошибок создает эквивалентную ему машинную программу (файл с расширением exe). Для компиляции программы выберите из меню Compile пункт Compile или нажмите комбинацию клавиш ALT+F9. При обнаруже-
21
нии ошибки в верхней части окна появится соответствующее сообщение. В этом случае необходимо устранить ошибку и повторно выполнить компиляцию. Если ошибок не обнаружено, на экране появляется сообщение об успешной компиляции (рисунок 1.3). Сообщение может быть удалено с экрана нажатием любой клавиши.
Рисунок 1.3 – Сообщение об успешной компиляции
Выполнение программы. Для выполнения успешно откомпилированной программы необходимо выбрать в меню Run пункт Run или нажать клавиши Ctrl+F9. Просмотр результатов. Для просмотра результатов работы программы нажмите клавиши Alt+F5. Возврат в окно редактирования программы осуществляется нажатием любой клавиши.
1.5. Лабораторные задания 1.5.1. «Логические» задачи 1. В поезде ехали Аня, Галя и Женя. Их профессии – журналист, доктор и менеджер. Они читали газеты «Аргументы и факты», «Жизнь России», «Правда». Кто какую газету читал и у кого какая профессия, если известно, что:
22
Галя не доктор, Аня не читала «Аргументы и факты», имя, профессия одного из пассажиров и название газеты совпадают по первой букве. 2. Программист был в гостях у своего друга, у которого трое детей. Друг предложил программисту определить возраст каждого ребенка, сообщив ему, что произведение их возрастов равно 36. Обдумав задачу, программист сказал, что ему необходима подсказка. Тогда его друг назвал ему сумму возрастов детей. Подумав еще немного, программист попросил еще какую-нибудь подсказку. «Старший играет на пианино». Услышав это, программист назвал возраст каждого ребенка. Сколько лет детям? 3. Когда вы садились в лодку, ваша шляпа упала в воду, но вы этого не заметили. Скорость течения реки 2,5 км/ч. Шляпа поплыла вниз по течению. Тем временем вы плыли вверх против течения реки со скоростью 4,75 км/ч (относительно воды). Спустя 10 мин вы заметили пропажу, развернули лодку и поплыли вниз по реке догонять шляпу. Через какое время вы поймаете шляпу? 4 Допустим, у нас есть большой и маленький стаканчики для вина. Сначала наполним вином маленький стаканчик и перельем его в большой. Затем наполним маленький стаканчик водой. Перельем некоторое количество воды из маленького стаканчика в большой стаканчик и смешаем воду с вином. После этого перельем смесь из большого стаканчика в маленький стаканчик, пока он не наполнится. Чего теперь больше в маленьком стаканчике – воды в вине или вина в воде?
5. Перед соревнованиями участники A, B, C, D делали прогнозы: участник A предсказал, что победит B, участник B предсказал, что D будет последним, участник C предсказал, что A будет третьим, участник D предсказал, что сбудется прогноз A.
23
Только один прогноз был верным, и это был прогноз победителя. В каком порядке закончили соревнования участники? 6. Путешественник, у которого есть золотая цепочка из 7 звеньев, должен остановиться в уединенном отеле на 7 ночей. Плата за каждую ночь в отеле составляет одно звено его цепочки. Какое наименьшее число звеньев надо разрезать, чтобы путешественник мог платить владельцу отеля одно звено каждое утро, не внося плату заранее? 7. Отец с двумя сыновьями отправился в поход. На их пути встретилась река, у берега которой находилась лодка. Лодка выдерживает на воде либо отца, либо сыновей. Как переправиться на другой берег путешественникам и сколько им потребуется времени, если каждая поездка через реку занимает 5 мин? 8. На некоторой планете Х деревья растут очень быстро. За день пока солнце поднимается и находится в зените, они вырастают на 1 м, когда же солнце заходит, их рост сокращается на 10 см. На какой день высота нового дерева превысит 4,5 м? 9. В кафе встретились три друга: скульптор Белов, скрипач Чернов и художник Рыжов. «Замечательно, что один из нас имеет белые, другой – черные, а третий – рыжие волосы, но при этом ни у одного из нас нет волос того цвета, на который указывает фамилия», – заметил черноволосый. «Ты прав», – сказал Белов. Какой цвет волос у художника? 10. Определите значение выражения x and 1 = 0 при различных значениях логической переменной x. Зависит ли значение выражения от x?
1.5.2. Составление простых программ 1. Написать программу, которая присваивает переменной A результат вычисления заданного выражения (значения переменных выражения вводятся с клавиатуры): a. (S > 6) and (F 2) b. (R shl 2) + 1
24
c. (K mod 10) ∗ 5 d. W / T ∗ 10 – 1.25 e. (C div D) > 3
2. Написать программу вывода таблицы истинности для логической операции: a. «ИЛИ», b. «И», c. «НЕ», d. «Исключающее ИЛИ». Если операнды имеют различные значения, то значение операции «Исключающее ИЛИ» – true, в противном случае – false.
3. Написать программу, которая преобразует дробное число в денежный формат. Например, число 25.5 преобразуется в 25 руб. 50 коп. 4. Написать программу, которая пересчитывает временной интервал, заданный в минутах, в количество часов и минут. Например, число 150 преобразуется в 2 ч 30 мин. 5. Написать программу, которая переводит вес, заданный в фунтах, в килограммы (1 российский фунт = 409.5 г). 6. Написать программу, которая вычисляет площадь треугольника, если известны координаты его углов x1, y1; x2, y2; x3, y3: 1 S = ± ∗ (( x1 − x3 ) ∗ ( y 2 − y3 ) − ( x2 − x3 ) ∗ ( y1 − y3 )) . 2
7. Написать программу, которая вычисляет время, через которое встретятся движущиеся навстречу друг другу автомобили, если их скорости V1 и V2, а начальное расстояние между ними – S. 8. Написать программу, рассчитывающую расстояние, которое пройдет автобус (его скорость V1), пока его не догонит легковой автомобиль. Легковой автомобиль отправляется из того же пункта, что и автобус, с задержкой в 30 мин. Скорость автомобиля – V2 9. Программа печатает квадрат на экране из символов '∗' и '9': ∗99∗99∗99∗ 25
∗99999999∗ ∗99999999∗ ∗99∗99∗99∗ 10. Программа выводит на экран рисунок, состоящий из символов '∗' и '9': a)∗9999
b) ∗∗∗∗∗
c) 9999∗ d) ∗∗∗∗∗
∗∗999
∗∗∗∗9
999∗∗
9∗∗∗∗
∗∗∗99
∗∗∗99
99∗∗∗
99∗∗∗
∗∗∗∗9 ∗∗∗∗∗
∗∗999 ∗9999
9∗∗∗∗
999∗∗
∗∗∗∗∗
9999∗
26
2. Управляющие структуры 2.1. Обзор управляющих структур Процессор компьютера способен выполнять некоторое число элементарных операций над данными: сложение, вычитание, присваивание, сравнение и др. Процессор может самостоятельно управлять последовательностью этих операций во времени по заданной программе. Каким образом с помощью программы можно указать порядок выполнения операций? Для этого в программе используют три основные категории управляющих структур: последовательность; ветвление (порядок выполнения определяется значением условия); цикл (повторение). Эти структуры дают нам «конструктор», комбинируя элементы которого, можно реализовать процесс вычислений произвольной сложности, сохраняя отчетливое видение общей структуры процесса. Все управляющие структуры имеют один вход и один выход. Базовыми структурами являются структуры «Последовательность», «Если_То_Иначе» и «Цикл_Пока». Все современные языки программирования имеют операторы, которые однозначно реализуют управляющие структуры. Рассмотрим управляющие структуры и операторы языка Pascal, которые их реализуют (таблица 2.1). Для графического представления управляющих структур будем использовать следующие узлы (рисунок 2.1). Функциональный
Предикатный (условный) Да
A Определяет изменение данных
P
Слияния
Нет
Определяет последовательность выполнения
Объединяет «ветви» выполнения
Рисунок 2.1 – Узлы управляющих структур
27
Таблица 2.1 – Управляющие структуры Оператор языка Pascal
Управляющая структура
Пример
A; B; Последовательность
Если_То_Иначе
Сначала выполняется A, затем B. A, B – операторы обработки информации
readln(x); y:= x;
if P then A else B;
if x>0 then y:= 1
Если значение логическо- else y:=0; го выражения P истинно, то выполняется A, иначе – B Если_То if P then A;
Выбор
case K of 1: A; 2: B; 3: C else D; end; K – переключатель, пе-
ременная, значение которой определяет выполнение операторов: если K = 1, то A; если K = 2, то B; если K = 3, то C, иначе – D
28
if x>0 then y:= 1;
var ch: char; begin ... case ch of '0'..'9': writeln ('Это цифра'); 'a'..'z': writeln ('Это буква') else writeln ('Это другой символ'); end; ... end.
Продолжение таблицы 2.1 Оператор языка Pascal
Управляющая структура
Пример
Цикл_Пока (цикл с предусловием)
while P do A;
while N>0 do
Пока значение логического выражения P истинно, оператор A выполняется
N:=N-1;
Цикл_со_счетчиком (цикл с предусловием) for i:= to
A;
Переменная i – это показатель цикла, значение которого на каждом шаге цикла автоматически увеличивается (или уменьшается) на 1
Цикл_До
for i:= 1 to N do writeln(i); for i:= N downto 1 do writeln(i);
repeat
(цикл с постусловием)
A; until P;
repeat
Оператор A выполняется до тех пор, пока логическое выражение P не станет истинным
until N 0 then begin y:= 1; { здесь составной оператор – это операторы y:=1 и k:=k+1,} k:= k+1; { которые выполняются только при условии, что x > 0 } end;
На практике использование составного оператора означает, что мы просто заменяем функциональный узел «внутри» управляющей структуры такой управляющей структурой, которая необходима для реализации алгоритма. В приведенном примере функциональный узел в структуре «Если_То» был заменен структурой «Последовательность» (рисунок 2.2). Этот способ построения программы дает нам возможность, используя всего несколько базовых структур, построить программу любой сложности. При этом разработка программы осуществляется «сверху вниз»: от общей структуры программы, как одного функционального узла, к ее конкретному уточненному представлению в виде совокупности вложенных управляющих структур.
2.3. Операторы прерывания выполнения цикла Реализация циклических алгоритмов требует в некоторых случаях прекращения «шага» цикла или всего цикла до выполнения условия
30
его завершения. Для этих целей в языках программирования предусмотрены специальные операторы (НЕ управляющие структуры!).
A
Да
Составной оператор содержит операторы y:=1; k:=k+1;
P Нет
begin Да
y:=1
k:=k+1
end
x>0 Нет
Рисунок 2.2 – Составной оператор
В языке Pascal это такие операторы: continue – оператор завершения шага цикла. По этому оператору прекращается выполнение текущего шага цикла, и управление передается на следующий шаг; break – оператор «выхода» из цикла. Прекращается выполнение цикла и управление передается оператору, следующему за последним оператором цикла; exit – оператор «выхода» из программы. По этому оператору выполнение программы завершается. Рекомендуется использовать для выхода из подпрограмм. В качестве примера рассмотрим такую задачу. Пусть компьютер «задумал» случайное число (переменная M) в диапазоне от 0 до 10. Пользователь вводит с клавиатуры число (переменная N), пытаясь угадать «задумку» компьютера. Программа подсчитывает количество «угадываний» пользователя (переменная K).
31
uses crt; { Подключение системного модуля crt языка Pascal } { Здесь он нужен для генерации случайных чисел. } var K, M, N: byte; begin randomize; { Инициализация датчика случайных чисел } M := random(10); { Генерация случайного числа в диапазоне } { от 0 до 10 } K := 0; { Количество угадываний в начале равно 0 } while true do { «Бесконечный» цикл } begin writeln('Введите число в диапазоне от 0 до 10'); readln(N); K := K+1; { Количество «угадываний» увеличивается на 1. } if N = M then break; { Выход из цикла: Пользователь угадал число } end; writeln('Число угадываний = ', K); end.
2.4. Работа в среде Turbo Pascal 2.4.1. Редактирование текста программы. Работа с блоками Блок – горизонтальный участок текста, содержащий символы одной или нескольких строк. Для работы с блоками используют меню Edit (рисунок 2.3) или комбинации клавиш.
32
Рисунок 2.3 – Меню работы с блоками (Edit)
На рисунке 2.3: Undo – отменить действие; Redo – повторить действие; Cut – вырезать и поместить в буфер обмена (clipboard); Copy – копировать (поместить копию) в буфер обмена; Paste – вставить в текст из буфера обмена; Clear – удалить выделенный текст; Show clipboard – показать буфер обмена. Комбинации клавиш для работы с блоками следующие: отметить блок можно клавишами управления курсором при нажатой клавише Shift; копировать отмеченный блок в указанную курсором позицию можно клавишами Ctr+K+C или за два шага: – Ctrl+Ins – копировать блок в буфер обмена (clipboard), – Shift+Ins – вставить блок из буфера обмена в текст; переместить отмеченный блок в указанную курсором позицию можно клавишами Ctrl+K+V или за два шага: – Shift+Del – вырезать блок и поместить в буфер обмена, – Shift+Ins – вставить блок из буфера обмена в текст; удалить отмеченный блок можно клавишами Ctrl+Del или Ctrl+K+Y;
спрятать (убрать отметку)/показать блок можно клавишами Ctrl+K+H;
33
записать блок в файл можно клавишами Ctrl+K+W. Имя файла для сохранения блока указывается в появляющемся диалоговом окне; считать блок из файла можно клавишами Ctrl+K+R. Блок помещается в текст, начиная с текущей позиции курсора. Имя файла указывается в появляющемся окне; Вывести блок на печать можно клавишами Ctrl+K+P.
2.4.2. Отладка программ Отладка программы – это поиск ошибок в программе (тестирование) и исправление ошибок. Интегрированная среда разработки Pascal предоставляет программисту средства, которые позволяют просматривать и модифицировать значения данных в процессе выполнения программы, а также выполнять программу в пошаговом режиме и прерывать ее выполнение в точке останова (точке прерывания). Режим выполнения программы определяется пунктами меню Run. Меню отладки Debug позволяет задать точки останова, просмотреть и модифицировать данные. Режимы выполнения программы. Меню Run (рисунок 2.4) содержит следующие пункты, которые определяют режимы выполнения программы: Run – выполнение программы; Trace over – выполнение программы «по шагам» (трассировка программы): оператор за оператором. При этом вызов подпрограммы выполняется за один шаг. Если операторы расположены на одной строке, то шаг отладки будет распространяться на все операторы строки. Чтобы точно определить, какие операторы выполняются, располагайте на строке только один оператор!
34
Рисунок 2.4 – Меню выполнения программы (Run)
Trace into – выполнение программы «по шагам» с трассировкой операторов подпрограмм; Go to cursor – выполнение программы до оператора, указанного курсором; Program reset – завершение (прерывание) выполнения программы; Parameters... – задание параметров программы. Меню отладки. Меню Debug приведено на рисунке 2.5.
Рисунок 2.5 – Меню отладки программы (Debug)
На рисунке 2.5: Breakpoints…
– окно конфигурирования точек останова,
Call stack
– окно просмотра стека,
Register
– окно просмотра регистров,
35
Watch
– окно просмотра значений переменных,
Output
– Окно просмотра выводимых значений,
User screen
– «Экран пользователя»,
Evaluate/modify… – вычисление и изменение значений, Add watch…
– добавить переменную в окно Watch,
Add breakpoints… – добавить точки останова.
Как видно из названия пунктов меню Debug, ИСР Pascal позволяет организовать выполнение и отладку программы в многооконном режиме. Пример пошаговой отладки программы с использованием окна просмотра значений переменных приведен на рисунках 2.6 и рисунке 2.7.
Рисунок 2.6 – Добавление значения переменной i в окно Watch
36
Рисунок 2.7 – Пошаговая отладка программы с просмотром значений переменных в окне Watch
2.5. Лабораторные задания 2.5.1. Реализовать схемы программ с помощью операторов языка Pascal (рисунок 2.8) 1.
2. X>0
3.
K=K+1
Нет
Да X=X–1 X>0
X=X–1
4.
Вывод K, X
Да
Не
K=K+1 Нет X=X+1
K=K+1 X0
X=X–1
Да Нет
K=K+1 K=K+1 Вывод K, X
Рисунок 2.8 – Схемы программ. Продолжение
39
X=X–1
9.
10.
Нет
Да
X>0
X=X–1
K=0
K=–1
K= 1
Да
K>N или X≤0
K=K+1
Нет
Вывод K, X
X=X–1 X>0 Да
Нет
Нет
X=y then begin max:= x; min:= y; end else begin max:= y; min:= x; end; if x∗y>0 then f:=max else f:=min; writeln(f); end.
2. Нарисуйте область на плоскости, при попадании в которую точки с координатами x, y программа выводит значение True. program exam2_2; var x, y : integer; b:boolean; begin readln(x,y); b:= (abs(x-y)0 do begin s:=s+d∗x; x:=x+d; n:=n-1; end; writeln(s:5); end.
8. Пользователь ввел с клавиатуры значение переменной х. Выполните трассировку программы и определите результат, если х равно: 5; 8. Можно ли использовать программу для определения, простое число или нет? program exam2_8; var n, f, i: integer; begin readln(n); i:=2; f:=1;
45
while in} repeat p:= m mod n; if p0 then begin m:= n; n:= p; end; until p=0; writeln(n); end.
10. Выполните трассировку и определите вид арифметического выражения, значение которого (переменная р) вычисляет программа.
46
program exam2_10; var s, i, k, n, p: integer; begin p:= 1; k:= 1; n:= 1; for i:=1 to 4 do begin s:=0; while k, =,