
- •Для школьников, студентов и начинающих 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. Предметный указатель
-
Строковый тип String. Работа со строками
Со строковым типом String мы познакомились в 0.14.
Как можно сэкономить память, работая со строками? Если мы напишем VAR a:String, то Паскаль отведет под символы строковой переменной a 255 байтов. Если мы не собираемся присваивать переменной b значений длиннее, например, 20 байтов, то выгодно написать VAR b:String[20]. В этом случае под символы переменной b в памяти будет отведено 20 байтов.
Теперь разберем функции для работы над строками.
Исходные данные |
Операция |
Результат |
Пояснение |
s1:='Мото'; s2:='роллер' |
s3:=s1+s2 |
s3='Мото-роллер' |
Операция + над двумя строками просто соединяет две строки в одну |
s5:='Мото-роллер' |
k:=Pos('рол',s5) |
k=5 |
Функция Pos возвращает позицию, на которой находится строка 'рол' в строке s5 |
s3:='Мото-роллер' |
l:=Length(s3) |
l=10 |
Функция Length (длина) выдает (возвращает) количество символов в строк |
s3:='астро-ном' |
s4:=Copy(s3,3,4) |
s4= ‘трон’ |
Функция Copy возвращает часть строки длиной 4, начиная с третьего символа |
s5:='Коро-бочка'; |
Delete(s5,4,2) |
s5='Коро-чка' |
Процедура Delete удаляет из строки s5 два символа, начиная с четвертого |
s6:='Рука'; s7:='баш'; |
Insert(s7,s6,3) |
s6='Руба-шка' |
Процедура Insert вставляет в строку s6 строку s7, начиная с третьего символа |
x:=2.73284 |
Str(x:4:2,s8) |
s8='2.73' |
Процедура Str преобразует число в строку. 4:2 – это желаемый формат числа (см. 3.5) |
s8='2.73' |
Val(s8,x,Osh) |
x=2.73 |
Процедура Val преобразует строку в число. Параметр Osh должен иметь тип Integer. Он имеет смысл при анализе ошибки в преобразовании |
Процедура Str может вам понадобиться, например, вот в каком случае. Модуль Graph имеет возможность печатать на экране большими красивыми шрифтами (см. 4.6). Но так печатает он только строковый тип. А в программе “Торпедная атака” вам может захотеться печатать красивым шрифтом счетчик подбитых кораблей, который у вас описан, как целочисленный. Вот тут и пригодится Str. Примеры использования Str и Val см.в 4.6.
Если задана строка s:='Банка', то считается автоматически заданным массив символов с тем же именем: s[1]=’Б’, s[2]=’а’, s[3]=’н’, s[4]=’к’, s[5]=’а’. Тогда после выполнения оператора s[3]:=’р’ мы получим s='Барка'.
Строки можно сравнивать. Условие s1=s2 считается выполненным, если обе строки абсолютно одинаковы, включая и пробелы. Сравнение идет посимвольно слева направо. Поэтому считается, что ‘панк’ < ‘парк’, так как первый несовпадающий символ ‘р’ имеет больший номер, чем ‘н’.
Задание 114: Среди детей встречается игра, заключающаяся в зашифровке своей речи “для секретности” за счет вставки в произносимые слова какого-нибудь словосочетания, например, “быр”. Тогда вместо слова “корова” будет произнесено “кобырробырвабыр”. Составьте программу, которая распечатывает заданную строку, после каждой второй буквы вставляя “быр”.
Задание 115: Давайте поставим задачу шифрования текста более серьезно. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку. Способов шифровки вы можете придумать сколько угодно. Попробуйте такой – заменять каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Составьте, пожалуйста, и программу дешифровки. Когда вы познакомитесь с файлами, вы сможете уже зашифровывать и дешифровывать не отдельные строки, а целые тексты. В том числе и ваши паскалевские программы.
-
Записи
На вооружении флота 100 подводных лодок. Адмиралу часто приходится решать задачи такого типа: 1)перечислить названия лодок, имеющих скорость, превышающую скорость вражеской подводной лодки Шредер; 2)подсчитать, сколько лодок имеют на вооружении больше 10 торпед; и т.д. Чтобы ускорить решение таких задач, адмирал приказал занести в компьютер сведения обо всех лодках, включая вражеские лодки Шредер и Рокстеди, а именно: их названия, скорость и число торпед, находящихся на вооружении.
Отвести место в оперативной памяти под указанную информацию о 102 лодках можно двумя способами: 1)с помощью массивов, 2)с помощью записей.
Рассмотрим программу, использующую первый способ. В каждом массиве будет 102 элемента, причем элементы 101 и 102 отведены под лодки противника.
VAR nazvanie :array[1..102] of String; {Место под 102 названия} skorost :array[1..102] of Real; {Место под 102 скорости} torped :array[1..102] of Byte; {Место под 102 количества торпед} i :Integer; BEGIN {Здесь каким-нибудь способом заносим в отведенное место всю информацию, например, присвоением - nazvanie[1]:='Щука'.... или загрузкой из файла} {А теперь решим первую из двух задач:} for i:=1 to 100 do if skorost[i] > skorost [101] then WriteLn(nazvanie[i]) END.
В памяти компьютера информация размещается в том порядке, в котором она встречается в описаниях:
ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ |
ИНФОРМАЦИЯ |
nazvanie[1] |
Щука |
nazvanie[2] |
Дельфин |
........... |
........ |
nazvanie[101] |
Шредер |
nazvanie[102] |
Рокстеди |
skorost[1] |
26 |
skorost[2] |
24 |
........... |
........ |
skorost[101] |
20 |
skorost[102] |
18 |
torped[1] |
6 |
torped[2] |
10 |
........... |
........ |
torped[101] |
15 |
torped[102] |
22 |
i |
? |
Вы видите, что данные об одной лодке разбросаны по памяти.
Рассмотрим второй способ. Иногда бывает удобно, чтобы данные, касающиеся одной лодки, хранились в памяти рядом, вот так:
ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ |
ИНФОРМАЦИЯ |
lodka[1].nazvanie |
Щука |
lodka[1].skorost |
26 |
lodka[1].torped |
6 |
lodka[2].nazvanie |
Дельфин |
lodka[2].skorost |
14 |
lodka[2].torped |
10 |
. . . . . . . . . . . . . . |
. . . . . . . . . |
vr .nazvanie |
Шредер |
vr .skorost |
20 |
vr .torped |
15 |
prot .nazvanie |
Рокстеди |
prot .skorost |
18 |
prot .torped |
22 |
Выстроенную подобным образом информацию в памяти компьютера часто называют базой данных.
Сами по себе массивы не позволяют хранить информацию в таком порядке, для этого нужно использовать записи. Запись - это набор данных (полей) различных типов, касающийся одного объекта. Например, запись, касающаяся нашей первой лодки, это набор трех полей: название - Щука (тип String), скорость - 26 (тип Real), количество торпед - 6 (тип Byte). Точка отделяет имя поля от обозначения записи, содержащей это поле.
Напомним, что в массиве разрешается хранить данные только одного типа.
Прежде чем отводить место в памяти под всю информацию, объясним Паскалю, из чего состоит одна запись, то есть опишем ее, задав специальный тип записи record и придумав ему имя, скажем, podlodka:
TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; ..........
Тип определен, но место в памяти пока не отведено. Здесь нам, хочешь-не хочешь, придется воспользоваться массивом. При помощи VAR отведем место под массив из 100 записей для наших подлодок и отдельное место под две записи для вражеских. Массиву придумаем имя lodka.
VAR lodka :array[1..100] of podlodka; vr,prot :podlodka; {Записи для двух вражеских лодок} i :Integer;
..........................
Как видите, элементами массива могут быть не только отдельные числа, символы или строки, но и такие сложные образования, как записи.
Вот программа целиком:
TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; VAR lodka :array[1..100] of podlodka; vr,prot :podlodka; i :Integer;
BEGIN {Здесь задаем значения полям всех записей. Конечно, удобнее это делать при помощи типизированных констант (см.следующую программу) или файлов данных, но я использую простое присвоение:} lodka[1].nazvanie :='Щука'; lodka[1].skorost :=26; . . . . . . . . prot.torped :=22; {А теперь решаем первую задачу:} for i:=1 to 100 do if lodka[i].skorost > vr.skorost then WriteLn (lodka[i].nazvanie) END.
Согласитесь, что при использовании записей текст программы гораздо понятнее.
Теперь запишем нашу программу с использованием типизированных констант, для краткости ограничив наш флот тремя подводными лодками:
TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; CONST lodka : array[1..3] of podlodka = ((nazvanie:'Щука'; skorost:26; torped: 6), (nazvanie:'Дельфин'; skorost:14; torped:10), (nazvanie:'Леонардо'; skorost:28; torped:11)); vr : podlodka = (nazvanie:'Шредер'; skorost:20; torped:15); prot : podlodka = (nazvanie:'Рокстеди'; skorost:18; torped:22); VAR i : Integer; BEGIN for i:=1 to 3 do if lodka[i].skorost > vr.skorost then WriteLn(lodka[i].nazvanie); END.
Здесь вы видите, как правильно придавать начальные значения типизированным константам типа record.
Задание 116: Создайте базу данных о своих родственниках. О каждом родственнике должно быть известно:
-
Имя
-
Год рождения
-
Цвет глаз
Массивы не используйте. Программа должна:
-
Распечатать ваш возраст и цвет глаз
-
Ответить на вопрос – правда ли, что ваш дядя старше тети.
Задание 117: Создайте базу данных о своих однокашниках. О каждом однокашнике должно быть известно:
-
Фамилия
-
Имя
-
Пол
-
Год рождения
Обязательно используйте массив не меньше, чем из 10 записей. Программа должна:
-
Вычислить средний возраст ваших однокашников
-
Определить, кого среди них больше – дам или кавалеров
-
Ответить на вопрос – есть ли в вашей базе тезки (это нелегко).