- •Для школьников,студентови начинающих 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. Предметный указатель
Сумматоры
Если вы поняли идею счетчика, то понять идею сумматора вам будет нетрудно. Посмотрим, как будет работать следующий фрагмент:
s:=0; {Обнуляем сумматор. Это не менее важно, чем обнулить счетчик}
m: ReadLn(a);
s:=s+a; {Увеличиваем сумматор}
WriteLn(‘Сумма=’, s);
goto m;
Пусть мы вводим числа 8, 4, 10 . . . В этом случае порядок выполнения операторов будет такой:
Оператор |
а |
s |
Печать |
s:=0 |
? |
0 |
|
ReadLn(a) |
8 |
0 |
|
s:=s+a |
8 |
8 |
|
WriteLn(‘Сумма=' ,s) |
8 |
8 |
Сумма=8 |
goto m |
8 |
8 |
|
ReadLn(a) |
4 |
8 |
|
s:=s+a |
4 |
12 |
|
WriteLn(‘Сумма=' ,s) |
4 |
12 |
Сумма=12 |
goto m |
4 |
12 |
|
ReadLn(a) |
10 |
12 |
|
s:=s+a |
10 |
22 |
|
WriteLn(‘Сумма=' ,s) |
10 |
22 |
Сумма=22 |
goto m |
10 |
22 |
|
………. |
|
|
|
Как видите, в ячейке sнакапливается сумма вводимых чиселa, поэтому назовем эту ячейкусумматором. Отличие сумматора от счетчика в том, что счетчик увеличивается на 1 операторомc:=c+1, а сумматор - на суммируемое число операторомs:=s+a.
Задача:В компьютер вводится N чисел. Вычислить и один раз напечатать их сумму.
Программа:
VARi,N :Integer;
a,s :Real;
BEGIN
ReadLn(N);
s:=0;
for i:=1 to N do begin
ReadLn(a);
s:=s+a
end {for};
WriteLn(‘Сумма равна ' ,s:20:10)
END.
Задание 49:Пусть N=2, a=5 и 3. Тогда по этой программе Паскаль напечатает 8. Что он напечатает, если:
Вместо s:=0написать s:=10.
Вместо s:=s+a написать s:=s+a+1.
Строки end {for}иWriteLnпоменять местами.
Строки s:=0иforпоменять местами.
Строки for иReadLn поменять местами.
Строки s:=s+aи end {for}поменять местами.
Вместо for i:=1 to N написать for i:=2 to N.
Задания 50-52: Написать программы для следующих задач:
Во дворце 40 залов. Известны длина и ширина каждого зала. Вычислить площадь пола всего дворца.
Вычислить средний балл учеников вашего класса по физике.
Вычислить произведение N произвольных чисел.
Вложение циклов в разветвления и наоборот
Реальная программа на Паскале представляет собой сложную мозаику из циклических и разветвляющихся частей, вложенных друг в друга. Мы уже видели в 1.7, как в оператор case был вложен оператор for. В свою очередь в оператор цикла могут быть вложены другие операторы, как в 3.3, и так до бесконечности.
Для тренировки определите, что напечатает следующий фрагмент:
for i:=1 to 5 do begin
a:=9;
if i*i = a then for k:=5 to 8 do Write(k)
else WriteLn(1997);
end{for}
Ответ:
1997
1997
56781997
1997
Вложенные циклы
Поставим себе задачу - напечатать таблицу умножения. В следующем виде:
1*1= |
1 |
1*2= |
2 |
1*3= |
3 |
1*4= |
4 |
1*5= |
5 |
1*6= |
6 |
1*7= |
7 |
1*8= |
8 |
1*9= |
9 |
2*1= |
2 |
2*2= |
4 |
2*3= |
6 |
2*4= |
8 |
2*5= |
10 |
2*6= |
12 |
2*7= |
14 |
2*8= |
16 |
2*9= |
18 |
3*1= |
3 |
3*2= |
6 |
3*3= |
9 |
3*4= |
12 |
3*5= |
15 |
3*6= |
18 |
3*7= |
21 |
3*8= |
24 |
3*9= |
27 |
4*1= |
4 |
4*2= |
8 |
4*3= |
12 |
4*4= |
16 |
4*5= |
20 |
4*6= |
24 |
4*7= |
28 |
4*8= |
32 |
4*9= |
36 |
5*1= |
5 |
5*2= |
10 |
5*3= |
15 |
5*4= |
20 |
5*5= |
25 |
5*6= |
30 |
5*7= |
35 |
5*8= |
40 |
5*9= |
45 |
6*1= |
6 |
6*2= |
12 |
6*3= |
18 |
6*4= |
24 |
6*5= |
30 |
6*6= |
36 |
6*7= |
42 |
6*8= |
48 |
6*9= |
54 |
7*1= |
7 |
7*2= |
14 |
7*3= |
21 |
7*4= |
28 |
7*5= |
35 |
7*6= |
42 |
7*7= |
49 |
7*8= |
56 |
7*9= |
63 |
8*1= |
8 |
8*2= |
16 |
8*3= |
24 |
8*4= |
32 |
8*5= |
40 |
8*6= |
48 |
8*7= |
56 |
8*8= |
64 |
8*9= |
72 |
9*1= |
9 |
9*2= |
18 |
9*3= |
27 |
9*4= |
36 |
9*5= |
45 |
9*6= |
54 |
9*7= |
63 |
9*8= |
72 |
9*9= |
81 |
Начнем с малого - пусть нужно напечатать
1*1=1
Вот фрагмент программы:
Фрагмент 1
a:=1;
b:=1;
proizv:=a*b;
Write(a, ’*’ ,b, ’=’ ,proizv)
Здесь в операторе Write 5 элементов:
сомножитель a,
символ знака умножения ’*’,
сомножитель b,
символ ’=’,
значение произведения proizv
Усложним задачу. Попробуем заставить компьютер напечатать первую строку таблицы:
1*1= |
1 |
1*2= |
2 |
1*3= |
3 |
1*4= |
4 |
1*5= |
5 |
1*6= |
6 |
1*7= |
7 |
1*8= |
8 |
1*9= |
9 |
Замечаем, что здесь нам нужно решить 9 элементарных задач на вычисление произведения, первую из которых решает фрагмент 1. Все они очень похожи и различаются лишь значением второго сомножителя. Таким образом, для решения каждой из 9 задач подошел бы наш фрагмент 1, если бы в нем в операторе b:=1вместо единицы стояла нужная цифра. В данном случае идеально подходит оператор for:
Фрагмент 2
a:=1;
forb:=1to9dobegin
proizv:=a*b;
Write(a, ’*’ ,b, ’=’ ,proizv, ’ ’ )
end{for}
Для того, чтобы печать была аккуратной, оператор Write мы дополнили символом пробела ’ ’. Он нужен для того, чтобы отдельные столбцы таблицы не сливались.
Следующая ступень усложнения - последняя - напечатать не одну строку таблицы, а девять. Для этого фрагмент 2 должен быть выполнен 9 раз, каждый раз - с новым значением a. Чтобы этого достичь, “обнимем” фрагмент 2 оператором for точно так же, как мы это сделали с фрагментом 1.
Фрагмент 3
for a:=1 to 9 do
for b:=1 to 9 do begin
proizv:=a*b;
Write(a, ’*’ ,b, ’=’ ,proizv, ’ ’ )
end {for b}
end{for a}
Печатать фрагмент 3 будет неаккуратно. Приведем окончательную запись программы с необходимыми добавлениями для аккуратной печати, а также для удобства объяснений снабдим программу комментариями с нумерацией строк:
VARa,b,proizv: Integer; {1}
BEGIN{2}
for a:=1 to 9 do begin {3}
WriteLn; {4}
for b:=1 to 9 do begin {5}
proizv:=a*b; {6}
Write(a, ’*’ ,b, ’=’ ,proizv:3, ’ ’ ) {7}
end {for b} {8}
end {for a} {9}
END.{10}
WriteLn нужен для того, чтобы каждая новая строка таблицы начиналась с новой строки экрана.
Формат :3означает, что на изображение произведения на экране отведено три позиции. Формат в нашем примере нужен для того, чтобы разные по количеству цифр произведения (например, 4 и 25) занимали на экране одинаковое по размеру место, а то не получится у нас аккуратных столбиков в таблице.
В целом программа иллюстрирует идею вложенных циклов, когда один, внутренний, цикл вложен внутрь другого, внешнего. У нас тело внешнего цикла (строки 4 и 5) выполняется 9 раз, а тело внутреннего (строки 6, 7 и 8) - 81 раз, так как на каждое выполнение строки 5 оно выполняется 9 раз.
Задания 53-56:
Распечатать все возможные сочетания из двух цифр - первая цифра может быть любой от 3 до 8, вторая - любой от 0 до 7. Например, 36, 44, 80.
Распечатать все возможные сочетания из четырех цифр, каждая из которых может принимать значения 1,2,3. Например, 2123, 3312, 1111.
Подсчитать количество таких сочетаний.
Подсчитать количество неубывающих сочетаний, то есть таких, где каждая следующая цифра не меньше предыдущей - 1123, 1223, 2222 и т.п., но не 3322.