- •Для школьников, студентов и начинающих 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. Предметный указатель
-
Вставка в программу фрагментов из других программных файлов
Теперь рассмотрим совсем другие файлы – те, в которых вы храните свою программу. Предположим, вы с другом решили создать программу из 7 процедур. Вы делаете 3 процедуры и тело программы, а ваш друг - 4 процедуры. Друг записал все 4 процедуры в файл VSTAVKA.pas на вашем компьютере. Вот он:
PROCEDURE fa ; BEGIN Sound(698); Delay(300); NoSound END;
PROCEDURE sol; BEGIN Sound(784); Delay(300); NoSound END;
PROCEDURE la ; BEGIN Sound(880); Delay(300); NoSound END;
PROCEDURE si ; BEGIN Sound(988); Delay(300); NoSound END;
Конечно, файл вашего друга не является законченной программой и сам по себе не запускается.
А вот ваша программа:
USES CRT;
PROCEDURE doo; BEGIN Sound(523); Delay(300); NoSound END;
PROCEDURE re ; BEGIN Sound(587); Delay(300); NoSound END;
PROCEDURE mi ; BEGIN Sound(659); Delay(300); NoSound END;
begin
doo;re;mi;fa;sol;la;si;la;sol;fa;mi;re;doo
end.
Теперь вам нужно собрать оба куска в единую программу. Для этого вы можете скопировать текст из файла вашего друга в свой файл (как это делается, расказано в части IV). Но если вы не хотите этого делать, чтобы, скажем, не увеличивать свой файл, вы можете воспользоваться директивой компилятора $I. Директива компилятора - это специальная инструкция, вставленная в текст вашей программы на Паскале и предназначенная для управления компьютером на этапе компиляции вашей программы. Директива компиляции имеет вид {$....} и Паскаль не путает ее с обычным комментарием только из-за наличия значка доллара. Символы, стоящие после значка доллара, и являются управляющей информацией для компилятора. Директива {$I c:\PASC\F25} является приказом компилятору подставить в это место текст, находящийся в файле F25 из каталога PASC диска c. Если файл находится в текущем каталоге, то достаточно указать его имя. Вот ваша готовая к работе программа с директивой:
USES CRT;
PROCEDURE doo; BEGIN Sound(523); Delay(300); NoSound END;
PROCEDURE re ; BEGIN Sound(587); Delay(300); NoSound END;
PROCEDURE mi ; BEGIN Sound(659); Delay(300); NoSound END;
{$I VSTAVKA} {Директива компилятору на вставку текста из файла VSTAVKA}
begin
doo;re;mi;fa;sol;la;si;la;sol;fa;mi;re;doo
end.
-
Модули программиста
Известно, что в Паскале нет стандартной функции, возводящей число в целую неотрицательную степень. В целую степень, большую двух. Предположим, что вы математик, и вам нужна функция, возводящая число в любую целую неотрицательную степень. Напишем эту функцию:
FUNCTION st(a:Real; n:Word) :Real;
VAR step :Real;
i :Word;
BEGIN
step:=1;
for i:=1 to n do step:=step*a;
st:=step
end;
BEGIN
WriteLn(st(2,3)) {Это 2 в кубе, то есть 8}
END.
Пусть вы часто пишете программы, использующие возведение в степень. Но вам лень в каждую такую программу вставлять описание функции st. Вы можете пойти двумя путями:
-
Описать st и другие часто встречающиеся процедуры и функции в другом файле и использовать директиву $I.
-
Описать st и другие часто встречающиеся процедуры и функции в другом файле и оформить этот файл, как новый модуль.
Второй способ немного сложнее, но намного лучше первого. Вот как будет выглядеть ваш модуль:
UNIT Mathemat; {Заголовок модуля с придуманным вами именем}
INTERFACE {Раздел ИНТЕРФЕЙСА}
FUNCTION st(a:Real; n:Word) :Real;
IMPLEMENTATION {Раздел РЕАЛИЗАЦИИ}
FUNCTION st;
VAR step :Real;
i :Word;
BEGIN
step:=1;
for i:=1 to n do step:=step*a;
st:=step
end;
BEGIN {Раздел ИНИЦИАЛИЗАЦИИ, у нас он пуст}
END.
Вам нужно просто ввести этот текст, как обычную программу, в новое окно текстового редактора и сохранить на диске под именем Mathemat.pas, так как имя файла, в котором расположен модуль, должно совпадать с именем модуля. Однако, модуль не является программой и не может быть запущен на выполнение сам по себе. Пользоваться вашим новым модулем вы можете так же, как обычным стандартным. Вот ваша программа, вызывающая модуль:
USES Mathemat;
Begin
WriteLn(st(10,6) :20:4); {Это 10 в шестой степени}
WriteLn(st(5, 3) :20:4); {Это 5 в кубе}
End.
Файл-модуль на первых порах сохраняйте в том же каталоге, что и файл вызывающей его программы.
В разделе интерфейса вы приводите заголовки предназначенных для использования процедур, функций, а также описания типов, переменных и констант, которые вы также не хотите каждый раз описывать в вызывающей программе. В общем, все то, чем могут пользоваться другие программы.
В разделе реализации вы приводите краткие заголовки процедур и функций, полные заголовки которых приведены в разделе интерфейса, и описываете их тела. Если этим процедурам и функциям понадобятся для работы вспомогательные процедуры и функции, типы, константы и переменные, то они тоже описываются в разделе реализации.
Когда вы в первый раз запустите на выполнение программу, вызывающую ваш новый модуль, этот модуль откомпилируется и сохранится на диске под именем Mathemat.tpu. В следующий раз будет использоваться именно он, а не Mathemat.pas (до тех пор, пока вы не измените текст модуля).
Рассмотрим еше один пример. Предположим, что вы часто пишете графические программы и вам надоело в каждой программе инициализировать графику. К тому же вы недовольны, что стандартный модуль Graph позволяет вам рисовать кружочки и квадратики, но не позволяет рисовать крестики и треугольники. И наконец, вы бы хотели, чтобы в начале работы любой вашей программы экран был бы обведен золотой рамочкой. Вот модуль, решающий эти задачи:
UNIT Mygraph;
INTERFACE {Раздел ИНТЕРФЕЙСА}
PROCEDURE krest(x_tsentr, y_tsentr, razmer:Word);
{Задаются координаты центра и размер креста}
PROCEDURE treug(x1, y1, x2, y2, x3, y3 :Word);
{Задаются координаты трех вершин треугольника}
IMPLEMENTATION {Раздел РЕАЛИЗАЦИИ}
USES Graph; {Без этого не будет работать процедура Line}
PROCEDURE krest; BEGIN
Line(x_tsentr-razmer, y_tsentr, x_tsentr+razmer, y_tsentr);
Line(x_tsentr, y_tsentr-razmer, x_tsentr, y_tsentr+razmer);
END;
PROCEDURE treug; BEGIN
Line(x1,y1,x2,y2);
Line(x2,y2,x3,y3);
Line(x3,y3,x1,y1);
END;
{Раздел ИНИЦИАЛИЗАЦИИ}
VAR d,m :Integer; {Переменные для инициализации графики}
BEGIN
d:=0;
InitGraph(d,m,'<путь к гр.др>');{Инициализация графики}
SetColor(Yellow); {Рисуем рамочку}
SetLineStyle(0,0,ThickWidth);
Rectangle(10,10,630,470);
SetColor(White); {Возвращаем нормальный цвет}
SetLineStyle(0,0,NormWidth) {Возвращаем нормальную толщину линии}
END.
Если вы хотите, чтобы при запуске программы, использующей модуль, каждый раз перед выполнением самой программы автоматически выполнялись какие-то действия, вы задаете соответствующие операторы в разделе инициализации. Если для этого нужны константы, типы и переменные, они описываются в разделе реализации.
Вот программа, чертящая крест, треугольник и кружок:
USES Mygraph,Graph;
BEGIN
treug(500,50,600,300,450,450);
krest(200,150,80);
Circle(100,350,40);
ReadLn;
END.
Обращение здесь к модулю Graph понадобилось только из-за желания нарисовать кружок.
Использование модулей лучше использования директивы $I хотя бы по двум причинам:
-
Модуль уже откомпилирован и не требует каждый раз компиляции.
-
Объем программы без модулей не может превышать 64К. Каждый модуль может вмещать в себя дополнительные 64К.
Задание 129: Если хотите, создайте себе модули Music, Graphica или какие-нибудь другие.