- •Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7
- •Глава 7. Составные типы данных 29
- •Глава 8. Подпрограммы и функции 46
- •Глава 9. Файлы 50
- •Глава 10. Динамические переменные (списки) 58
- •Тип и функциональные возможности языка
- •Структура программы на Паскале
- •Алфавит языка
- •Правила написания имен
- •Структура блока описаний
- •Глава 2. Простые типы данных в языке Паскаль Понятие и классификация типов данных
- •Целочисленные типы
- •Вещественные типы
- •Логический тип
- •Символьный тип
- •Интервальный тип пользователя
- •Перечисляемый тип пользователя
- •Глава 3. Встроенные функции Понятие и классификация типов функций
- •Математические функции
- •Функции преобразования типов
- •Глава 4. Выражения Понятие и классификация типов выражений
- •Арифметические операции
- •Логические операции
- •Отношения
- •Битовые операции
- •Глава 5. Выполняемые операторы языка (для программ линейной структуры) Понятие и классификация
- •Классификация инструкций Паскаля
- •Оператор присваивания
- •Простейшие операторы ввода с клавиатуры
- •Простейшие операторы вывода на экран дисплея
- •Глава 6. Выполняемые управляющие операторы языка Простые управляющие операторы
- •Оператор безусловного перехода.
- •Оператор продолжения цикла.
- •Операторы ветвлений
- •Оператор условного перехода.
- •Неполный условный оператор.
- •Полный условный оператор.
- •Операторы циклов
- •Оператор арифметического цикла
- •Операторы итеративных циклов
- •Организация цикла с помощью условного перехода
- •Оператор итеративного цикла с предусловием
- •Оператор итеративного цикла с постусловием
- •Глава 7. Составные типы данных Классификация составных типов
- •Массивы Основные определения
- •Вывод массива
- •Примеры программ работы с массивами
- •Сортировки массива
- •Алгоритмы основных методов сортировок
- •Строки Строковые переменные
- •Стандартные (встроенные) процедуры работы со строками
- •Стандартные (встроенные) функции работы со строками
- •Структуры
- •Глава 8. Подпрограммы и функции Понятие подпрограмм в языке Паскаль.
- •Процедуры.
- •Описание и вызов функций
- •Параметры процедур и функций
- •Глава 9. Файлы Классификация внешних данных
- •Стандартные процедуры работы с файлами
- •Процедуры
- •Функции
- •Особенности работы с текстовыми файлами
- •Пример работы с текстовыми файлами.
- •Двоичные файлы (в машинных кодах) Типизированные файлы
- •Процедуры при работе с типизированными файлами
- •Функции при работе с типизированными файлами
- •Пример работы с типизированными файлами.
- •Файлы без типов
- •Процедуры, используемые при работе с нетипизированными файлами
- •Функции, используемые при работе с нетипизированными файлами.
- •Глава 10. Динамические переменные (списки) Понятие динамических переменных
- •Списочные данные
- •Односвязные списки
- •Двусвязные списки
- •Нульсвязные списки
- •Глава 11.Стандартный модуль работы с текстовым экраном Crt
- •2) Координаты экрана
- •3) Управление графическим режимом
- •4) Управление экраном и окном
- •5) Управление цветом
- •6) Вывод точек
- •7) Вывод линий
- •8) Вывод и закраска контуров
- •9) Окружности, эллипсы, дуги
- •10) Вывод текста
- •11) Последовательность работ при использовании графического режима
- •11) Пример программы приложения
Глава 7. Составные типы данных Классификация составных типов
Составные данные представляют некоторые совокупности простых данных, объединенных под общим именем для удобства выполнения операций пересылки, поиска, выбора и для возможности использования в операторах циклов.
Операции обработки процессор может выполнять только над простыми элементами, входящими в составные данные, поэтому кроме общего имени должны существовать или внутренние имена входящих в них элементов, или какие-либо другие способы их выбора.
Все составные данные делятся на три различных типа
Составные
данные
Массивы
Структурыыы
Списки
и
Строки
Рисунок 12.
Классификация составных даных
В языке Паскаль составные типы называются структурированными. Стандартно предусмотрены описатели для типов-массивов и типов-структур. Специальных описателей для списков нет. Однако возможно задание списков с помощью средств динамического выделения памяти для объектов типа структуры, содержащих в качестве одного или нескольких элементов данных адресного типа.
Массивы Основные определения
Массивом называется совокупность однотипных простых данных, имеющих общее имя и расположенных в памяти ЭВМ подряд; обращение к элементам, составляющим массив, осуществляется с помощью индексных выражений. Количество индексов, задающих отдельный элемент массива, определяет размерность массива.
Массивы являются наименее сложными из всех составных типов и, поэтому, реализованы во всех алгоритмических языках.
Впамяти массив представляет собой подряд расположенные ячейки одного типа. Все имеют одно и то же имя, и могут вызываться используя это имя и индекс (порядковый номер для одномерного массива).
Благодаря тому, что индекс может задаваться выражением (в частности – именем переменной), Элементы массива удобно использовать в циклах. При этом обращение к разным элементам массива выглядит одинаково: A[i].
Такая возможность определяет назначение массивов – хранение в памяти данных одного типа, которые следует обрабатывать одинаковыми операциями.
Массивы бывают одномерные и многомерные. Одномерные массивы иногда называют векторами, двумерные - матрицами.
В общем случае массивом может выступать совокупность однотипных составных данных, например массив структур, массив символьных строк и т.д. Такие массивы реализованы не во всех языках (в Turbo Pascal - разрешены).
В линейной памяти ЭВМ одномерные массивы размещаются в порядке возрастания индекса, многомерные "вытягиваются в цепочку элементов" или с наиболее быстрым ростом первого индекса - "по столбцам" (в языке Фортран) или с наиболее быстрым ростом последнего индекса - "по строкам" (Паскаль).
Чтобы выбрать из памяти нужный элемент массива, процессор должен выполнить некоторые вспомогательные расчеты (вычислить адрес элемента массива в памяти по адресу начала массива и смещению элемента относительно начала). Эти вычисления выполняются по формуле доступа, которая тем сложнее, чем больше размерность массива.
Например, для двумерного массива А[MxN], состоящего из элементов длиной d байт каждый, где M - число строк, а N -столбцов, адрес элемента А[i,j] (@A[i,j]) будет вычисляться по формуле:
@A[i,j] = @A[1,1] + d*( N*(i-1) + (j-1))
Отсюда видно, что работа с элементами массива будет идти медленнее, чем с простыми переменными, особенно это будет заметно для многомерных массивов. Поэтому стараются не использовать массивов размерности свыше 3, хотя язык не ограничивает число измерений массива.
B Turbo Pascal компоненты массива могут быть любого (в том числе - составного) типа, индексы могут быть любого порядкового типа (т.е. не вещественного), но не Longint. Описание массива можно производить двумя способами: через задание типа-массива и непосредственно.
Например:
Создание массивов с использованием описателей типов
TYPE
mas1 = array[1..100] of integer; {описатель для целочисленных
одномерных массивов длиной не более 100 элементов}
vector = array [1..30] of real; {описатель для вещественных
одномерных массивов длиной не более 20 элементов}
mas2 = array[1..8, 1..10] of Char; {описатель для символьных
двумерных массивов размерами не более 8 строк и 10 столбцов }
matrix = array[1..12] of vector; {описатель для вещественных
двумерных массивов размерами не более 10 строк и 20 столбцов.}
Последний описатель можно было бы задать без использования описателя типа vector:
matrix = array[1..12, 1..30] of real;
После задания типов, можно описать переменные таких типов:
VAR {здесь выделяется место под все массивы }
Names : mas2;
Numbers, Ages : mas1;
Day_Tempr,Day_Wind : vector;
Tempr1996 : matrix;
Создание массивов без использования специальных описателей типов
VAR Ball_Groop_1,B_M170 : array[1..30] of real; {выделение места под два одномерных вещественных массива }
B_M175 : array[1..30] of real;
Ball_Kurs : array[1:12, 1..30] of real; {выделение места под двумерный вещественный массив }
Массивы созданные одним оператором описания или разными операторами, но использующими общий писатель являются совместимыми, для них возможны операции присваивания, операции отношения (только равно и не равно). Для массивов описанных выше можно написать операторы:
. . .
Ball_Groop1 := B_M170;
Numbers:= Ages;
If Day_Tempr=Day_Wind then ...
Но недопустим ни один из операторов:
Ball_Kurs := Tempr1996;
Ball_Groop1 := B_M175;
B_M175 := B_M170;
While B_M175<> B_M170 do ...
Следует отметить, что оператор присваивания переписывает значения из элементов массива, стоящего в правой части в соответствующие элементы массива, имя которого указано в левой части оператора присваивания. Два совместимых массива равны (и результат сравнения равен TRUE), если каждый элемент одного массива равен соответствующему элементу второго массива. При нарушении равенства хотя бы для одной пары элементов результат сравнения - FALSE.
Заполнение массива данными
Заполнить массив значениями можно тремя способами (как и любую переменную).
Во-первых, можно задать все элементы массива, или начало массива при описании его в разделе CONST. (В дальнейшем заданные значения можно изменить.)
TYPE
mas = array[1..10] of real;
CONST
A1 : mas = (-5,4,-3,2,-1);
Во-вторых, элементы массива можно заполнить с помощью оператора присваивания:
for I := 1 to M do
for j := 1 to N do
A2[I,j] := 1;
Наконец, в-третьих, массив можно полностью или частично заполнить вводом (с клавиатуры или из файла). В этом случае, заполнение включает ввод количества элементов массива (с проверкой допустимости введенного значения) и ввод самих элементов массива в указанном количестве. Если ввод значений предусмотрен с клавиатуры, перед каждым оператором чтения должен быть запрос на ввод. (Работа с файлами рассмотрена в главе 9). Пример заполнения массива числами с клавиатуры:
CONST MIN=2;
MAX=20
. . .
BEGIN
. . .
Repeat
Writeln(' Введи длину массива');
Read(N);
if(N<MIN) or (N>MAX) then
Writeln('Недопустимое количество, введите снова');
Until(N>MIN)and(N<=MAX); {здесь MIN и MAX задают диапазон изменения индекса
в одномерном массиве }
fori:=1toNdo
begin
WriteLn(‘Введите очередное число в массив’);
ReadLn(A3[i]);
end;
. . .
Следует помнить, что место, которое занимает массив в памяти, определяется не количеством введенных в него значений, а количеством элементов, указанном при описании, и размером отдельного элемента.