- •Для школьников,студентовИ начинающих 1999 с,н.Лукин __________________________________________________________ Все права защищены ©
- •Оглавление
- •Часть I. Необходимые сведения о компьютере и программе 8
- •Часть II. Программирование на Паскале – первый уровень 29
- •Часть III. Программирование на Паскале – второй уровень 102
- •Часть IV. Работа в Паскале на компьютере 158
- •От автора
- •Предисловие
- •Кому нужна эта книга?
- •Почему Паскаль?
- •Какой из Паскалей?
- •Краткое содержание с рекомендациями
- •Часть III.Программирование на Паскале – второй уровень. Цели этой части:
- •Часть I. Необходимые сведения о компьютере ипрограмме
- •Первое представление о компьютере и программе
- •Что умеет делать компьютер
- •Что такое компьютер. Первое представление о программе.
- •Как человек общается с компьютером
- •Программа и программирование
- •Список команд. Командный и программный режимы
- •Последовательность работы человека с роботом
- •Что важно знать о программе
- •Понятие о процедуре. Может ли робот поумнеть?
- •Программа для компьютера на машинном языке
- •Языки программирования
- •Пример настоящей программы для компьютера на языке Лого
- •А теперь напишем программу:
- •Последовательность работы программиста на компьютере
- •Основные приемы программирования
- •Устройство и работа компьютера
- •Как устроен и работает компьютер
- •Порядок обмена информацией между устройствами компьютера
- •Устройство и размеры оперативной памяти
- •Взаимодействие программ в памяти
- •Внешние устройства компьютера
- •Устройства ввода
- •Устройства вывода
- •Внешняя память
- •Кодирование информации в компьютере
- •Часть II. Программирование на Паскале – первый уровень
- •Простые (линейные) программы. Операторы ввода-вывода. Переменные величины
- •Процедура вывода Write
- •8 'Котят' 3*3 'щенят'
- •Первая программа на Паскале
- •Выполняем первую программу на компьютере
- •Процедура вывода 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
- •Модуль dos
- •П5. Решения заданий
- •П6. Список литературы
- •П7. Предметный указатель
Функции
В 0.9 мы с вами уже сталкивались со стандартными функциями. Например, выражение 10+Sqr(3)имеет значение 19, так как функцияSqr(3)обозначает 32.
Вы можете создавать собственные функции. Предположим, вам часто приходится вычислять периметры прямоугольников. Тогда вам было бы удобно иметь функцию perimetr(10,4), которая имела бы значение периметра прямоугольника со сторонами 10 и 4. Рассмотрим, как это делается, на примере программы вычисления суммарной длины забора вокруг трех несоприкасающихся прямоугольных дворов:
FUNCTIONperimetr(dlina,shirina:Word) : Integer;
BEGIN perimetr:=2*(dlina+shirina) END;
BEGIN
WriteLn(perimetr(10,4)+ perimetr(20,30)+ perimetr(3,8));
END.
Функции очень похожи на процедуры. Но функция в отличие от процедуры обладает некоторыми свойствами переменной величины и поэтому описание функции отличается от описания процедуры следующими двумя вещами:
В заголовке функции после скобок с формальными параметрами должен быть указан тип функции (у нас это Integer).
Внутри описания функции между BEGIN и END ей хотя бы раз должно быть присвоено какое-нибудь значение (у нас это perimetr:=2*(dlina+shirina)).
Рассмотрим более сложный пример. Вспомним задачу из 1.3 о среднегодовой температуре, где исходными данными является массив из 365 значений температуры. Попробуем узнать, в январе (дни 1-31) или в декабре (дни 335-365) самый теплый день месяца был теплее. Мы можем предвидеть, что для вычисления понадобятся два похожих фрагмента программы, каждый длиной строчки по три-четыре. Чтобы не писать два раза похожие фрагменты, создадим функцию нахождения максимального элемента из заданного диапазона массива температур. Назовем ее max. Используя ее, мы можем в программе записать, например, так:u:=max(20,30), подразумевая, что переменнойuдолжно быть присвоено значение максимального элемента массива температур, выбирая из элементов с 20-го по 30-й. Вот программа:
VARt :array[1..365]ofInteger; { t - массив температур за год}
FUNCTIONmax (perv,posledn:Word) :Integer;
VAR i,m :Integer;
BEGIN
m:=t[perv];
for i:=perv+1 to posledn do if t[i]>m then m:=t[i];
max:=m
END;
BEGIN
........ {Здесь присваиваем значения элементам массива температур}
if max(1,31)>max(335,365) then WriteLn(‘В январе’) else WriteLn(‘В декабре’);
END.
Задание 120:В Паскале не хватает функции для вычисления произвольной целой степени числа. Создайте функциюPowerтакого смысла:Power(2,3)должна иметь значение 23, то есть 8.
Задание 121:Если вы никак не можете смириться с системой координат графического режима, то напишите пару простеньких функций (например, с именамиxиy), которые позволят вам считать, что отныне осьy направлена вверх, а центр координат расположен в центре экрана. Если вы правильно напишете эти функции, то, например, операторCircle (x(310), y(230), 10)нарисует вам кружочек в правом верхнем углу экрана.
Подпрограммы. Локальные и глобальные переменные
Будем называть процедуры и функции подпрограммами, так как они входят внутрь программы.
Деление переменных на локальные и глобальные является способом повышения надежности больших программ и понижения вероятности запутаться при их написании. Программы, создаваемые сегодня профессиональными программистами, очень велики - десятки и сотни тысяч строк. Таково, например, большинство игровых программ. Естественно, один человек не может достаточно быстро создать такую программу, поэтому пишется она обычно большой группой программистов. Для этого программа делится на десятки и сотни подпрограмм, и каждый программист пишет одну или несколько подпрограмм.
Исследуем взаимодействие подпрограмм в такой программе. Для этого рассмотрим глупую простую "сложную" программу А, вся задача которой - выполнить по порядку следующие вещи:
присвоить значение 5 переменной х,
затем вызвать процедуру В, зачем-то возводящую 10 в квадрат и печатающую текст "Результат равен",
и наконец, напечатать значение х:
VARx,y : Integer;
PROCEDURE B; BEGIN y:=10*10; Write('Результат равен ') END;
begin
x:=5;
B;
WriteLn(x);
end.
Очевидно, программа напечатает Результат равен 5.
Пусть программу Апишет программистА, он же руководитель всего проекта, а процедуруВ- программистВ. Когда дело касается большой программы, каждый программист досконально знает только задачу, решаемую его подпрограммой, а об остальных подпрограммах и обо всей программе он может иметь лишь минимальное представление. Задача руководителя проекта - умело разделить программу на подпрограммы и четко поставить задачу для каждой подпрограммы.
Сами подпрограммы тоже достаточно велики, и каждая из них может использовать десятки переменных. При этом возникает опасность, что автор какой-нибудь подпрограммы случайно использует внутри подпрограммы для ее нужд имя переменной, используемой в другой подпрограмме или в общей программе для других нужд, и таким образом испортит ее значение. Пусть, например, в нашей процедуре Вее автор опрометчиво присвоил бы значение 10*10 переменной с именемх. Тогда программа выглядела бы так:
VARx,y : Integer;
PROCEDURE B; BEGIN x:=10*10; Write('Результат равен ') END;
begin
x:=5;
B;
WriteLn(x);
END.
Очевидно, данная программа напечатала бы Результат равен 100.
Для защиты от таких ошибок руководитель проекта должен внимательно следить, чтобы разные подпрограммы не использовали переменных с одинаковыми именами. Но для больших программ этот контроль очень трудоемок и неудобен. Вместо этого в современных языках программирования разработан механизм локальных переменных. Локальнаяпеременная - это переменная, описанная не в главной программе, а внутри подпрограммы. Если программистВзнает, что его число 10*10 нигде, кроме как в процедуреВ, не нужно, он описывает соответствующую переменнуюхвнутрипроцедурыВ, ничуть не заботясь, что переменные с таким же именем встречаются в других местах программы:
VARx : Integer;
PROCEDUREB;
VAR x : Integer;
BEGIN x:=10*10; Write('Результат равен ') END;
begin
x:=5;
B;
WriteLn(x);
END.
Данная программа напечатает Результат равен 5. Произойдет это вот по какой причине: Переменные, описанные внутри и снаружи подпрограммы, компилятор считает разными переменными, даже если они имеют одинаковые имена. Переменнаях, описанная в программе, это совсем другая переменная, чемх, описанная в подпрограмме, и помещаются эти переменные в разных местах памяти. Поэтому и не могут друг друга испортить. Вы можете вообразить, что это переменные с разными именамиxглобиxлок.
Переменная, описанная внутри подпрограммы, невидима снаружи. Она локальнав этой подпрограмме. Она существует, пока работает подпрограмма, и исчезает при выходе из подпрограммы.
Переменная, описанная в главной программе, называется глобальнойпеременной. Она видна отовсюду в программе и внутри подпрограмм и каждая подпрограмма программы может ее испортить. Но когда подпрограмма натыкается на переменнуюx, описанную внутри самой этой подпрограммы, то она работает только с ней и не трогает переменнуюx, описанную снаружи.
Рассмотрим еще один пример:
VARx,z : Integer;
PROCEDUREB;
VAR x,y : Integer;
BEGIN
x:=20; y:=30; z:=40
END;
begin
x:=1; z:=2;
B;
WriteLn(x,' ',z)
END.
Программа напечатает 1 40. Пояснение: ОператорWriteLn(x,z)находится снаружи процедурыВ, и поэтому локальная переменнаях=20, описанная внутриВ, из него не видна. Зато прекрасно видна глобальная переменнаях=1, которую он и печатает. Переменная жеz не описана внутриВ, поэтому она глобальна, и операторz:=40с полным правом меняет ее значение с2на40.
Для полной ясности приведу порядок работы компьютера с этой программой:
В сегменте данных оперативной памяти компилятор отводит место под Х глобальное иZглобальное.
Программа начинает выполняться с присвоения значений Хглобальное = 1 иZглобальное = 2.
Вызывается процедура В. При этом в стеке оперативной памяти отводится место подХлокальное иУлокальное.
Присваиваются значения Хлокальное = 20,Улокальное = 30 иZглобальное = 40.
Программа выходит из процедуры В. При этом исчезают переменныеХлокальное = 20 иУ локальное = 30.
Компьютер печатает Хглобальное = 1 иZглобальное = 40.
Формальные параметры подпрограмм являются локальными переменными в этих подпрограммах. Сколько их ни меняй внутри подпрограммы – одноименные глобальные переменные не изменятся. Не изменятся также и фактические параметры. В этом смысле они «защищены», что значительно повышает надежность программ. (Это не относится к так называемым параметрам-переменным, о которых речь позже).