- •Содержание
- •1Алгоритмы линейных структур
- •2 Циклы
- •Введение
- •1 Алгоритмы линейных структур
- •1.1 Этапы разработки программы
- •1.2 Основные понятия
- •1.3 Основная структура программы
- •1.4 Алфавит языка
- •1.5 Идентификаторы
- •1.6 Константы
- •1.7 Понятие переменной Типы
- •1.8 Оператор присваивания Арифметические выражения
- •1.9 Операторы ввода и вывода информации
- •1.10 Практические задачи
- •1.11 Примеры решения задач
- •2 Циклы
- •2.1 Цикл с предусловием
- •Цикл с постусловием
- •Цикл со счетчиком
- •2.2 Задачи
- •2.3 Примеры
- •3 Немного об алгоритмах Алгоритм Кнута - Морриса - Пратта
- •Алгоритм Бойера – Мура
- •Алгоритм Рабина
- •Алгоритмы сортировки
- •Метод пузырька.
- •Сортировка выбором
- •Метод Шелла
- •Метод Хoopа
- •3.1 Разветвляющиеся алгоритмы
- •3.2 Задачи Свойства и виды треугольников (задачи 1-4)
- •Свойства и виды четырехугольников (задачи 5, 6)
- •Каким будет значение переменной а после выполнения фрагмента программы с составным оператором?
- •4 Массивы
- •4.1 Объявление массива
- •4.2 Действия над массивами
- •4.3 Вывод массива
- •4.4 Ввод массива
- •4.5 Сортировка массива
- •4.6 Поиск в массиве
- •4.7 Поиск минимального (максимального) элемента массива
- •4.8 Многомерные массивы
- •4.9 Ошибки при использовании массивов
- •4.10 Практические задачи
- •5 Множества
- •5.1 Описание типа множество
- •5.2 Операции над множествами
- •5.3 Группы операций
- •5.4 Упражнения
- •5.5 Задачи Тема: Множества
- •6 Записи
- •6.1 Понятие записи
- •6.2 Оператор присоединения With ... Do
- •6.3 Вариантные записи
- •6.4 Работа с файлами записей
- •6.5 Задачи
- •7 Файлы
- •7.1 Работа с файлами
- •7.2 Текстовые файлы
- •7.3 Типизированные файлы
- •7.4 Нетипизированные файлы
- •7.5 Задачи
- •8 Графика
- •8.1 Графика в Турбо Паскале
- •8.2 Базовые процедуры и функции
- •Процедуры модуля Graph
- •Функции модуля Graph
- •8.3 Экран и окно в графическом режиме
- •8.4 Вывод простейших фигур
- •8.5 Графические процедуры
- •8.6 Построение прямоугольников
- •8.7 Построение многоугольников
- •8.8 Построение дуг и окружностей
- •8.9 Работа с текстом
- •8.10 Построение графиков функций
- •8.11 Циклы в графике. Построение случайных процессов
- •8.12 Создание иллюзии движения
- •Задания
- •Контрольные тесты
- •1. Программирование алгоритмов линейных структур
- •2. Программирование алгоритмов разветвляющейся структуры
- •3. Программирование алгоритмов циклических структур
- •4. Массивы
- •5. Множества
- •6. Записи
- •7. Файлы
- •8. Графика
6.2 Оператор присоединения With ... Do
Обращение к конкретным полям записи связано с некоторыми
неудобствами. Составные идентификаторы получаются длинными.
При совместной обработке ряда полей одной записи длину идентификаторов
можно сократить.
Чтобы упростить доступ к полям записи, используется оператор
присоединения With:
with <переменная> do <оператор>
Здесь with, do - ключевые слова (с, делать); <переменная> - имя
переменной типа запись, за которым, возможно, следует список вложенных полей; <оператор> - любой оператор Турбо Паскаля.
Оператор присоединения with ... do открывает запись. В поле его действия имена полей записи сокращаются. Например:
with c.bd do month := 9;
Это эквивалентно :
with с do with bd do month := 9;
или c.bd.month := 9.
В такой записи не чувствуется преимущество использования оператора
with. Когда обрабатываются все поля записи, оператор with ... do дает
существенную экономию в размере программы.
Задача. Составить программу формирования архива данных по
изданным книгам. Данные включают: автора, название, год издания, город, где издана, и цену книги.
Предположим, что в архив необходимо занести данные о 50 книгах. Данные будут представлять собой массив записей. Каждая запись состоит из:
1) фамилии И. О. автора (author);
2) названия книги (title);
3) названия города, в котором книга выпущена, (city);
4) года издания (year);
5) цены (cost).
Данные author, title, city - символьного типа. Year - может быть переменной интервального типа. Цена (cost) должна быть переменной вещественного типа. Объявление нового типа данных entry как записного будет выглядеть
следующим образом:
entry = record
author, title, city : string;
year : 1..9999;
cost: real;
end;
Далее следует объявить массив из 50 элементов, имеющих тип entry. Ввод элементов записи (рис. 16) организуем в цикле, причем окончание цикла зафиксируем вспомогательной переменной ch. Перед вводом содержимого очередной записи сделаем запрос на продолжение пополнения архива.
Для ввода компонентов записи используем оператор readln.
Компоненты записи в программе имеют составные
имена: m[i]. author, m[i]. title, m[i].city, m[i].year, m[i].cost.
Программа:
program archives;
uses crt;
label 10;
type
entry = record {Выходные данные по книге} author, title, city : string;
year : 1..9999;
cost : real;
end;
var m : array[1..50] of entry;
{Архив не превышает 50 книг}
{Массив, элементами которого являются записи}
i: integer;
ch : char;
begin i := 0;
{Блок формирования архива данных по книгам}
writein ('Пополняешь архив? - Да - [Y]');
ch := readkey;
if upcase(ch) = 'Y' then repeat i :=i+1;
writeln ('Автор книги '); readln(m[i].author);
writeln ('Название книги '); readln(m[i].title);
writeln ('Город издания '); readln(m[i].city);
writeln ('Год издания '); readln(m[i].year);
writeln ('Цена книги '); readtn(m[i].cost);
writeln ('Пополняешь архив? - Да - [Y]');
ch := readkey
until upcase(ch) <> 'Y'
else
begin write ('Вы передумали? До cвидания!');
goto 10 end;
repeat until keypressed;
10:end.
Задача. Усложним предыдущую задачу. Составить программу подборки книг по указанному автору из сформированного массива записей.
Для формирования архива используем предыдущую программу. Введем переменную символьного типа ss - фамилию автора, список книг которого необходимо вывести. Размер архива запомним в переменной k. Для более компактного представления используемых переменных, воспользуемся оператором присоединения with ... do. При этом имена полей записи могут фигурировать как имена обычных переменных. Для возможности вывода нескольких списков организуем внешний цикл с признаком окончания ch = ‘Y'.
Программа:
program archives2;
uses crt;
label 10;
type
entry = record {Выходные данные по книге}
author, title, city : string;
year : 1..9999;
cost : real;
end;
var m : array[1..50] of entry;
{Архив не превышает 50 книг}
{Массив, элементами которого являются записи}
i, i, k : integer;
ss : string; {Фамилия для поиска} ch : char;
begin i :=0;
{Блок формирования архива данных по книгам}
writein ('Пополняешь архив? - Да - [Y]');
ch := readkey;
if upcase(ch) = 'Y' then
repeat
i := i+1;
with m[i] do begin
writeln('Автор книги');readln(author);
writeln('Название книги'); readln(title);
writeIn(‘ Город издания'); readln(city);
writeln('Год издания '); readln(year);
writeln('Цена книги '); readln(cost);
end;
writein ('Пополняешь архив? - Да - [Y]);
ch := readkey
until upcase(ch) <> 'Y'
else
begin
write ('Вы передумали? До свидания!');
goto 10;
end;
k:=i;
{Блок подборки всех книг по указанному автору}
repeat writeln('Укажите фамилию автора'); readln(ss);
writeln('Cnиcoк книг, автор которых ', ss : 15);
for i := 1 to k do with m[i] do begin if ss = author then
begin
writeln(title);
writeln(‘Город '.city);
writeln(‘Год издания '.year);
writeln('Цена ",cost:8:2);
writein end end;
writeln( "Нужно еще выдавать авторский список? - Да -[Y]');
ch := readkey;
until upcase(ch) <> 'Y';
repeat until keypressed;
end.
После объявления в программе типа «запись» к каждому ее полю можно обратиться, указав сначала идентификатор переменной-записи, а затем через точку – имя поля.
Независимо от количества объявленных переменных данного типа, поля каждой из них будут называться одинаково.
Переменная записи называется полной переменной, а поле для переменной записи называется частичной переменной. Для присвоения полной переменной конкретного значения надо определить значения всех полей переменных. Для полных переменных существует единственная операция – присвоение. Над полем переменной (если она сама не является записью) можно производить все операции, которые возможны над элементами типа этого поля.
Для облегчения работы с полями записей в языке вводится оператор присоединения:
WITH Имя Переменной _Записи DO Оператор;
Внутри оператора (он может быть и составным) обращение к полям записи производится без указания имени самой (полной) переменной.
program lec9_0;
Type complex=Record
re, im : Real
End;
Var x,y,u,v,v1: complex;
BEGIN
{ввод исходных данных}
write('x.re='); readln(x.re);
write('x.im='); readln(x.im);
write('y.re='); readln(y.re);
write('y.im='); readln(y.im);
{вычисление разности}
u.re:=x.re-y.re;
u.im:=x.im-y.im;
{вывод разности}
writeln('x-y=',u.re:6:2,'+',u.im:6:2,'*i');
{вычисление произведения}
v.re:=x.re*y.re-x.im*y.im;
v.im:=x.re*y.im+x.im*y.re;
{вывод произведения}
writeln('x*y=',v.re:6:2,'+',v.im:6:2,'*i');
{присвоения полной переменной}
v1:=v;
writeln('v1=',v1.re:6:2,'+',v1.im:6:2,'*i');
END.
Записи могут быть вложенными. Если поле В записи А есть в свою очередь запись, то по отношению к этому полю А.В есть полная переменная: если в этой записи есть поле С, то для ссылки на это поле используют тот же прием: А.В.С. Если же некоторое поле С является массивом, то для ссылки на компоненты этого массива используется переменная с индексами А.В.С[i].
Если же элементами массива являются записи, то обозначение должно быть следующим: R[i].Поле Записи.