
- •Для школьников, студентов и начинающих 1999 с,н.Лукин __________________________________________________________ Все права защищены ©
- •Оглавление
- •Часть I. Необходимые сведения о компьютере и программе 8
- •Часть II. Программирование на Паскале – первый уровень 29
- •Часть III. Программирование на Паскале – второй уровень 102
- •Часть IV. Работа в Паскале на компьютере 158
- •От автора
- •Предисловие
- •Кому нужна эта книга?
- •Почему Паскаль?
- •Какой из Паскалей?
- •Краткое содержание с рекомендациями
- •Часть III. Программирование на Паскале – второй уровень. Цели этой части:
- •Часть I. Необходимые сведения о компьютере и программе
- •№Первое представление о компьютере и программе
- •Что умеет делать компьютер
- •Что такое компьютер. Первое представление о программе.
- •Как человек общается с компьютером
- •Программа и программирование
- •Список команд. Командный и программный режимы
- •Последовательность работы человека с роботом
- •Что важно знать о программе
- •Понятие о процедуре. Может ли робот поумнеть?
- •Программа для компьютера на машинном языке
- •Языки программирования
- •Пример настоящей программы для компьютера на языке Лого
- •А теперь напишем программу:
- •Последовательность работы программиста на компьютере
- •Основные приемы программирования
- •Устройство и работа компьютера
- •Как устроен и работает компьютер
- •Порядок обмена информацией между устройствами компьютера
- •Устройство и размеры оперативной памяти
- •Взаимодействие программ в памяти
- •Внешние устройства компьютера
- •Устройства ввода
- •Устройства вывода
- •Внешняя память
- •Кодирование информации в компьютере
- •Часть II. Программирование на Паскале – первый уровень
- •Простые (линейные) программы. Операторы ввода-вывода. Переменные величины
- •Процедура вывода Write
- •8 'Котят' 3*3 'щенят'
- •Первая программа на Паскале
- •Точкой с запятой необходимо отделять операторы друг от друга. Служебные слова begin и end от операторов точкой с запятой отделять не нужно.
- •Выполняем первую программу на компьютере
- •Процедура вывода WriteLn. Курсор
- •Переменные величины. Оператор присваивания
- •Описания переменных (var)
- •Что делает оператор присваивания с памятью
- •Оператор присваивания меняет значение переменной величины
- •Имена переменных
- •Математика. Запись арифметических выражений
- •Вещественные числа в Паскале
- •Три совета
- •Порядок составления простой программы Задача:
- •Порядок составления программы:
- •5. Теперь нужно задать компьютеру действия, которые нужно проделать с исходными данными, чтобы получить результат.
- •Операторы ввода данных ReadLn и Read.
- •Интерфейс пользователя
- •Строковые переменные
- •Диалог с компьютером
- •Константы
- •Разветвляющиеся программы
- •Условный оператор if или как компьютер делает выбор
- •Правила записи оператора if
- •Составной оператор
- •Ступенчатая запись программы
- •Вложенные операторы if. Сложное условие в операторе if. Логические операции
- •Символьный тип данных Char
- •Оператор варианта case
- •Циклические программы
- •Оператор перехода goto. Цикл. Метки
- •Выход из цикла с помощью if
- •Оператор цикла repeat
- •Оператор цикла while
- •Отличия операторов repeat и while
- •Оператор цикла for
- •Типичные маленькие программы
- •Вычислительная циклическая программа
- •Роль ошибок
- •Счетчики
- •Сумматоры
- •Вложение циклов в разветвления и наоборот
- •Вложенные циклы
- •Поиск максимального из чисел
- •Процедуры
- •Компьютер звучит
- •Простейшие процедуры
- •Программа 1
- •Программа 2
- •Программа 3
- •Процедуры и операторы
- •Стандартные процедуры Halt и Exit
- •Графика
- •Стандартные модули
- •Стандартный модуль Graph, текстовый и графический режимы
- •Текстовый и графический режимы
- •Переключение между текстовым и графическим режимами
- •Рисуем простейшие фигуры
- •Работа с цветом. Заливка. Стиль линий и заливки
- •Используем в рисовании переменные величины
- •Использование случайных величин при рисовании
- •Движение картинок по экрану
- •Создаем первую большую программу
- •Постановка задачи
- •Программирование по методу “сверху-вниз”
- •Сначала – работа над структурой программы
- •Зачем переменные вместо чисел
- •Записываем программу целиком
- •Порядок описания переменных, процедур и других конструкций Паскаля
- •Управление компьютером с клавиатуры. Функции ReadKey и KeyPressed
- •Буфер клавиатуры
- •Гетерархия. Задание на игру “Торпедная атака”
- •Часть III. Программирование на Паскале – второй уровень
- •Алфавит и ключевые слова Паскаля
- •Алфавит
- •Ключевые слова
- •Использование пробела
- •Работа с разными типами данных Паскаля
- •Список типов
- •Комментарии к списку типов
- •Числовые типы
- •Массивы
- •Переменные с индексами
- •Одномерные массивы
- •Двумерные массивы
- •Какие бывают массивы
- •Определения констант
- •Типизированные константы
- •Придумываем типы данных
- •Логический тип Boolean
- •Перечислимые типы
- •Ограниченный тип (диапазон)
- •Действия над порядковыми типами
- •Символьный тип Char. Работа с символами
- •Строковый тип String. Работа со строками
- •Множества
- •Расположение информации в оперативной памяти. Адреса
- •Процедуры и функции с параметрами
- •Процедуры с параметрами
- •Функции
- •Подпрограммы. Локальные и глобальные переменные
- •Массивы как параметры
- •Параметры-значения и параметры-переменные
- •Индукция. Рекурсия. Стек
- •Сортировка
- •Строгости Паскаля
- •Структура программы
- •Структура процедур и функций
- •Выражения
- •Совместимость типов
- •Форматы вывода данных
- •Переполнение ячеек памяти
- •Дерево типов
- •Синтаксисические диаграммы Паскаля
- •Другие возможности Паскаля
- •Работа с файлами данных
- •Вставка в программу фрагментов из других программных файлов
- •Модули программиста
- •Дополнительные процедуры и функции модуля Graph
- •Копирование и движение областей экрана
- •Вывод текста в графическом режиме
- •Управление цветом в текстовом режиме (модуль crt)
- •Работа с датами и временем (модуль dos)
- •Нерассмотренные возможности Паскаля
- •Миг между прошлым и будущим
- •Часть IV. Работа в Паскале на компьютере
- •Что нужно знать и уметь к моменту выполнения первой программы?
- •Порядок работы в Паскале
- •(1) Запуск Паскаля
- •(2) Начало работы. Ввод программы. Выход из Паскаля
- •(3) Сохранение программы на диске. Загрузка программы с диска
- •(4) Выполнение программы
- •(5) Исправление ошибок. Отладка программы.
- •Пошаговый режим
- •Работа с окнами пользователя и отладчика
- •Отладка больших программ
- •Работа с несколькими окнами.
- •Копирование и перемещение фрагментов текста
- •Обзор популярных команд меню
- •Создание исполнимых файлов (exe)
- •Приложения. Справочный материал п1. Как вводить программу в компьютер или работа с текстом в текстовом редакторе
- •Работа с одной строкой текста
- •Работа с несколькими строками
- •Собственно работа с несколькими строками.
- •П2. Файловая система магнитного диска
- •Имена файлов и каталогов
- •Пример структуры каталогов на диске
- •Логические диски. Путь (дорожка) к файлу
- •П3. Список некоторых операций, процедур и функций Паскаля
- •Математика
- •Модуль crt
- •Модуль Graph
- •П4. Произношение английских слов
- •П5. Решения заданий
- •П6. Список литературы
- •П7. Предметный указатель
-
Порядок описания переменных, процедур и других конструкций Паскаля
Если вы помните (0.6), перед тем, как выполниться, программа на Паскале компилируется на машинный язык. При компиляции она просматривается сверху вниз, при этом Паскаль строго следит, чтобы ни одна переменная, процедура или другая конструкция не была в тексте программы применена выше, чем описана. Что имеется в виду?
У нас переменные описаны в разделе VAR. А под применением переменной будем пока понимать ее упоминание в разделе операторов основной программы или среди операторов в описаниях процедур, то есть там, где эта переменная должна “работать” в процессе выполнения программы.
Посмотрим на нашу программу. Мы мудро поместили раздел VAR на самый верх программы. А если бы мы поместили его, скажем, между описаниями процедур Music и Flying_Saucer, то например, переменная i была бы применена в тексте (в операторе for расположенной выше процедуры Landscape) выше, чем описана, на что Паскаль среагировал бы сообщением об ошибке. То же касается и переменной y_goriz, которая бы в этом случае была применена два раза ниже описания (в операторах repeat и y_goriz:=240), но один раз - выше (в операторе Line(0, y_goriz, 640, y_goriz) ). Не путайте - в данном конкретном случае важен не порядок исполнения операторов в процессе выполнения программы, о котором мы заранее часто и сказать ничего не можем, а примитивный порядок записи описаний и операторов в тексте программы.
Те же рассуждения применимы и к процедурам и другим конструкциям. Так, описание процедуры Tree ни в коем случае нельзя было помещать ниже описания процедуры Landscape, так как в процедуре Landscape процедура Tree применяется, причем три раза.
В некоторых случаях, однако, возникает необходимость, чтобы не только процедура, скажем, P1 обращалась к процедуре P2, но и процедура P2 обращалась к процедуре P1. Очевидно, программа должна была БЫ строиться по такой схеме:
Procedure P2; описание процедуры P2
BEGIN….
P1 ..... применение процедуры P1
END;
Procedure P1; описание процедуры P1
BEGIN .....
P2 ..... применение процедуры P2
END;
begin .....
P1 ..... применение процедуры P1
end.
Но эта схема противоречит упомянутому принципу, так как применение процедуры P1 предшествует ее описанию. В Паскале существует способ справиться с этой ситуацией. Достаточно полный заголовок процедуры P1 скопировать в любое место выше описания процедуры P2, снабдив его так называемой директивой FORWARD. Программа примет такой вид:
Procedure P1; forward; опережающее описание процедуры P1
Procedure P2; описание процедуры P2
BEGIN….
P1 ..... применение процедуры P1
END;
Procedure P1; описание процедуры P1
BEGIN .....
P2 ..... применение процедуры P2
END;
begin .....
P1 ..... применение процедуры P1
end.
-
Управление компьютером с клавиатуры. Функции ReadKey и KeyPressed
Попробуйте запустить программу, которая долго делает свое дело, не обращая на вас внимания. Например, такую:
BEGIN repeat WriteLn(‘А нам все равно!’) until 2>3 END.
Вы сидите перед компьютером и ждете, когда он закончит печатать свой текст. А он никогда не закончит. Вы принимаетесь стучать по клавишам, надеясь, что это прервет бессмысленный цикл. Бесполезно.
Только когда вы, удерживая нажатой клавише Ctrl, щелкнете по клавише Break, программа прервет свою работу.
Пока программы работают, они не реагируют на клавиатуру, если вы об этом специально не позаботились. А чтобы позаботиться, вы должны включить в них специальные функции ReadKey и KeyPressed из модуля CRT. О смысле функций вообще мы поговорим в 2.2, а сейчас разберем на примерах эти две.
Дополним нашу упрямую программу парой строк:
USES CRT;
BEGIN
repeat
if KeyPressed then WriteLn(‘Хозяин нажал клавишу!’)
else WriteLn(‘А нам все равно!’)
until 2>3
END.
Выражение “if KeyPressed then” можно перевести как “если нажата клавиша, то”. Наткнувшись на это выражение, Паскаль проверяет, была ли нажата клавиша на клавиатуре. Когда вы запустите эту программу, она будет бесконечно печатать А нам все равно! Но как только вы щелкнете по какой-нибудь клавише, программа станет бесконечно печатать Хозяин нажал клавишу!
Если функция KeyPressed просто реагирует на то, была ли нажата какая-нибудь клавиша, то функция ReadKey сообщает, какая именно клавиша была нажата.
Вот программа, которая бесконечно печатает текст А нам все равно! и одновременно непрерывно ждет нажатия на клавиши, и как только клавиша нажата, однократно докладывает, была ли нажата клавиша “w” или другая клавиша, после чего продолжает печатать А нам все равно! Если мы захотим, чтобы программа закончила работу, мы должны нажать на клавишу “q”.
USES CRT;
VAR klavisha : Char;
BEGIN
repeat
Delay (1000); {иначе программа печатает слишком быстро}
WriteLn(‘А нам все равно!’);
if KeyPressed then begin
klavisha:= ReadKey;
if klavisha=’w’ then WriteLn(‘Нажата клавиша w’)
else WriteLn(‘Нажата другая клавиша’)
end {if}
until klavisha=’q’
END.
Программа доберется до строки klavisha:= ReadKey только в случае, если будет нажата какая-нибудь клавиша. Функция ReadKey определяет, какой символ был на нажатой клавише, и присваивает его значение переменной, которую мы придумали - klavisha. С этого момента вы можете как хотите анализировать эту переменную и в зависимости от ее значения управлять работой компьютера.
Наша программа будет бесконечно печатать А нам все равно!, а при каждом нажатии на клавишу будет однократно сообщать Нажата клавиша w или Нажата другая клавиша. Почему однократно, а не бесконечно? Грубо это можно объяснить тем, что после выполнения функции ReadKey Паскаль “забывает”, что на клавиатуре была нажата клавиша.
Вы спросите, а зачем здесь вообще нужна строка if KeyPressed then? Дело в том, что если перед выполнением функции ReadKey клавишу на клавиатуре не нажать, то функция ReadKey останавливает программу и заставляет ее ждать нажатия на клавишу, а после нажатия программа продолжает работу. Если вам в вашей программе паузы не нужны, то вам придется использовать KeyPressed.
Функция ReadKey напоминает процедуру ReadLn. Однако у нее есть интересное отличие: при вводе символов по процедуре ReadLn они появляются на экране, а при вводе символа по функции ReadKey - нет. Благодаря этому свойству, с помощью ReadKey можно организовать “секретный ввод” информации в компьютер - человек, стоящий у вас за спиной и видящий экран монитора, но не видящий ваших пальцев, никогда не догадается, на какие клавиши вы нажимаете.
Подробнее о механизме действия ReadKey и KeyPressed см. в следующем параграфе.
Задача “Пароль на программу”.
Пусть вы сделали какую-нибудь интересную программу и не хотите, чтобы ее запускал кто угодно. Для этого сделаем так, чтобы программа начинала свою работу с предложения пользователю ввести пароль. Если пользователь набрал правильный пароль, то программа нормально продолжает свою работу, в противном случае прерывается.
Пусть ваш пароль - typ. Тогда для решения задачи вам достаточно вставить в начало вашей программы следующий фрагмент:
WriteLn(‘Введите, пожалуйста, пароль’);
Simvol1:= ReadKey;
Simvol2:= ReadKey;
Simvol3:= ReadKey;
if NOT ((Simvol1=’t’) AND (Simvol2=’y’) AND (Simvol3=’p’)) then Halt;
{Продолжение программы}
Вы скажете: Кто угодно перед запуском моей программы посмотрит в ее текст и сразу же увидит пароль. Совершенно верно. Чтобы текст программы не был виден, преобразуйте ее в исполнимый файл с расширением exe (см. часть IV).
Задание 96 “Светофор”: Нарисуйте светофор: прямоугольник и три окружности. При нажатии нужной клавиши светофор должен загораться нужным светом.
Задание 97 “Зенитка”: Вверху справа налево медленно движется вражеский самолет (эллипс). В подходящий момент вы нажатием любой клавиши запускаете снизу вверх зенитный снаряд (другой эллипс).