ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.12.2024
Просмотров: 3670
Скачиваний: 1
СОДЕРЖАНИЕ
Часть I. Необходимые сведения о компьютере и программе 8
Часть II. Программирование на Паскале – первый уровень 29
Часть III. Программирование на Паскале – второй уровень 102
Часть IV. Работа в Паскале на компьютере 158
Часть III.Программирование на Паскале – второй уровень. Цели этой части:
Последовательность работы человека с роботом
Что нужно знать и уметь к моменту выполнения первой программы?
(2) Начало работы. Ввод программы. Выход из Паскаля
(3) Сохранение программы на диске. Загрузка программы с диска
(5) Исправление ошибок. Отладка программы.
Работа с окнами пользователя и отладчика
Копирование и перемещение фрагментов текста
Создание исполнимых файлов (exe)
Собственно работа с несколькими строками.
П2. Файловая система магнитного диска
Пример структуры каталогов на диске
Рассмотрим второй способ. Иногда бывает удобно, чтобы данные, касающиеся одной лодки, хранились в памяти рядом, вот так:
|
ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ |
ИНФОРМАЦИЯ |
|
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 записей. Программа должна:
Вычислить средний возраст ваших однокашников
Определить, кого среди них больше – дам или кавалеров
Ответить на вопрос – есть ли в вашей базе тезки (это нелегко).
Множества
Множествомв Паскале называется набор значений какого-нибудь порядкового типа, подчиняющийся специфическим правилам, о которых мы поговорим дальше. В программе множество записывается в виде списка этих значений в квадратных скобках. Например,[7,5,0,4]или[‘п’ , ’ж’ , ’л’]. Множество не должно состоять более, чем из 256 элементов и не должно содержать элементов с порядковыми номерами меньше 0 и больше 255.
Если в множестве элемент повторяется, то считается, что он входит туда только один раз. Например, множества [2,5,2]и[2,5]эквивалентны.
Порядок элементов в множестве не играет роли. Множества [2,5]и[5,2]эквивалентны.
В описании тип множества задается словами set of. Например, конструкция
VAR a : set of Byte
говорит о том, что задана переменная, значением которой может быть любое множество из любого числа элементов типа Byte. Так, в некоторый момент процесса выполнения программы значениемaможет быть множество[210, 3, 92], а через пару секунд -[8, 5, 3, 26, 17].
Конструкция VAR c: set of (april, may, june)говорит о том, что переменнаяc может иметь значением любое множество из именapril, may, june. Например,[april, june].
Конструкция VAR d: set of 10..18говорит о том, что переменнаяd может иметь значением любое множество целых чисел из диапазона от 10 до 18.
Над множествами определено несколько операций. Рассмотрим три из них: объединение(+),пересечение(*) иразность(-).
|
Операция |
Результат |
Пояснение |
|
[1,4,4,5] + [1,2,3,4] |
[1,2,3,4,5] |
В результирующее множество входят элементы, имеющиеся хотя бы в одном из исходных множеств |
|
[1,4,4,5] *[1,2,3,4] |
[1,4] |
В результирующее множество входят только те элементы, которые имеются в каждом из исходных множеств |
|
[1,2,3,4] -[1,3,5] |
[2,4] |
В результирующее множество входят те элементы “уменьшаемого”, которые не встречаются в “вычитаемом” |
Операция [1,2]*[3,4]будет иметь результатом[ ], то естьпустое множество.
Вот операции сравнения множеств:
|
if a = b then ... |
Если множества aиbсостоят из одинаковых элементов ... |
|
if a <> b then ... |
Если множества aиbотличаются хотя бы одним элементом ... |
|
if a <= b then ... |
Если aявляетсяподмножествомb, то есть все элементыaявляются элементамиb... |
|
if a >= b then ... |
Если bявляетсяподмножествомa, то есть все элементыbявляются элементамиa... |
Операция проверки вхожденияэлементаEв множествоa:
if E in a then ...
Например, a:= [1,2,4]; if 2 in a then ... {Если 2 входит в множество a ....}
К сожалению, Паскаль не желает выводить множества на печать, точно так же, как он не желает печатать перечислимые типы. Поэтому просто так узнать, из каких элементов состоит множество, не удастся. Вот один из обходных путей:
Пусть задано множество a, описанное, какset of Byte. Будем пробовать уменьшать его на все элементы подряд, от 1 до 255, и каждый раз, когда это удается, распечатывать соответствующее число. Вот подходящий фрагмент, в котором мне понадобится “для транзита” еще одно множествоb:
for i:=1 to 255 do begin b:=a-[i]; if a<>b then begin WriteLn(i); a:=b end end {for}
Вот гораздо более короткий и естественный путь:
for i:=0 to 255 do if i in a then WriteLn(i)
Я думаю, что работа с множествами Паскаля - любопытное и полезное занятие. Например, она нужна математикам, чтобы проверять свои теоремы. Я проиллюстрирую работу с множествами на простеньком примере:
Медиум загадывает шестерку чисел, каждое в диапазоне от 0 до 10 (числа могут и совпадать). Экстрасенс отгадывает их, называя свою шестерку. Есть ли между шестерками совпадающие числа? Если есть, то распечатать их.
Сначала решим задачу традиционными методами, а именно с применением массивов, а не множеств:
CONSTrazmer = 10; kol = 6;