
Вложенные циклы
Возможны случаи, когда внутри тела цикла необходимо повторять некоторую последовательность операторов, т. е. организовать внутренний цикл. Такая структура получила название цикла в цикле или вложенных циклов. Глубина вложения циклов (то есть количество вложенных друг в друга циклов) может быть различной. За один шаг основного цикла, вложенный пробегает все свои значения.
При использовании такой структуры для экономии машинного времени необходимо выносить из внутреннего цикла во внешний все операторы, которые не зависят от параметра внутреннего цикла. Необходимо также помнить, что первым всегда должен заканчиваться именно вложенный цикл.
Операторы и функции безусловнго перехода
EXIT; - выход из программы или подпрограммы
HALT(COD); - (COD) – необязательный параметр, определяет код
HALT; - безусловная остановка программы
ERRORLEVEL; - вниз
BREAK; - досрочный выход из цикла
CONTINUE; - прерывает выполнение текущей операции в цикле, передаёт управление следующему оператору.
Оператор перехода имеет вид:
goto <метка>;
Здесь goto - зарезервированное слово (перейти [на метку]).
Метка - это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Метка может стоять только перед одним оператором, а ссылающийся на нее оператор перехода может располагаться в любом месте раздела операторов. Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием. Перед тем как появиться в программе, метка должна быть описана. Описание меток состоит из зарезервированного слова label (метка), за которым следует список меток.
Действие оператора goto состоит в передаче управления соответствующему помеченному оператору.
С помощью этого оператора можно организовать циклы, рекурсивные вычисления и т.п. Однако, мощность в большинстве случаев влечет за собой возникновение ошибок. Кроме того, оператор перехода существенно затрудняет чтение программ. Поэтому оператор перехода следует применять только в исключительных ситуациях. Такой ситуацией является, например, аварийный выход из тела цикла, однако даже для этих случаев в конкретных реализациях языка предусмотрена альтернативная по имени инструкция (break, exit).
МАССИВ является статической структурой данных, которая не видоизменяется в процессе ее обработки. Различают однородные и неоднородные массивы. Массив называется однородным в том случае, когда все поля в записи однотипны. В противном случае массив считается неоднородным. В развитых языках программирования существуют средства, позволяющие отображать как однородные, так и неоднородные массивы. В частности, язык Паскаль располагает такими средствами. Под массивом также понимается переменная типа array.
С каждой структурой данных обычно связан некоторый типичный для нее набор операций или, точнее, действий, связанных с ее обработкой. По отношению к структуре типа array это просмотр массива, поиск компонент с заданными значениями и модификация структуры, т.е. вставка дополнительных и удаление “лишних” компонент.
Операция, которая позволяет обращаться к отдельным компонентам вектора, это селектор. Для этого вместе с именем соответствующей переменной в квадратных скобках задается порядковый номер (индекс) компоненты. То, что индексы вектора могут быть отрезком типа integer, позволяет применять к ним операции целочисленной арифметики, т. е. вычислять значения индексов. Поиск компонент с заданными значениями или определение индекса компоненты в массивах большой размерности мало эффективен, если массив предварительно не упорядочен.
ОРГАНИЗАЦИЯ ОДНОМЕРНГО МАССИВА
Под массивом понимается переменная типа array. Тип array – это регулярная структура, предназначенная для представления однородных информационных объектов. По сути, структура array - это структура, заданная в одномерном пространстве индексов, в связи с чем ее часто называют одномерной структурой (вектором). Компоненты структуры имеют один и тот же тип, который называют базовым. Кроме того, это структура с так называемым случайным или прямым доступом: все ее компоненты могут выбираться произвольно и одинаково доступны. Для обозначения отдельной компоненты в этом случае нужно указать только ее порядковый номер в структуре - индекс. Таким образом, для описания типа необходимо задать тип индексов, что определит количество компонент, и тип компонент:
<тип array> = array [<тип индексов>] of <тип компонент>
Согласно правилу, тип индексов задается в квадратных скобках.
При описании массивов их размерность, как правило, выбирается с некоторым “запасом”, исходя из максимальных требований к возможному количеству компонент. Количество компонент для конкретной переменной обычно фиксируется в некоторой ячейке, которая позволяет использовать только требуемую условиями задачи часть структуры.
Обычно составной тип данных воспринимается двойственно. С одной стороны это переменная, если это структура типа array. С другой стороны составной тип рассматривается как совокупность отдельных компонент.
СОРТИРОВКА ДАННЫХ В ОДНОМЕРНОМ МАССИВЕ
Процедура упорядочивания структур данных по некоторому признаку или ключу называется сортировкой. Основное требование к сортировке массивов – экономичное использование памяти. Есть сортировка включениями, выбором и обменом, сортировка с разделением.
Сортировка простыми включениями. Элементы условно разделяют на готовую последовательность и входную последовательность. На первом шаге i=2, затем это значение увеличивается на единицу на последующих шагах. На каждом из шагов выбирается первый элемент входной последовательности и передается в готовую последовательность с помощью вставки (включения) его на подходящее место в соответствии с функцией упорядочения. Процесс продолжается до тех пор, пока величина i не станет равной n. Для поиска подходящего места можно “просеивать” x, сравнивая его с очередным элементом. При просеивании предполагается, что если очередной элемент вектора W[I] >=X, то W[I] сдвигается на одну позицию направо (при первой проверке – на место X). Затем X либо вставляется на “освободившееся” место, либо сравнивается с очередным левым элементом вектора. Просеивание может закончиться при двух различных условиях (найден элемент wk с ключом меньшим, чем ключ wi или достигнут левый конец готовой последовательности). В общем случае сортировка включениями оказывается не очень эффективным методом, так как включение элемента связано со сдвигом всех предшествующих элементов на одну позицию, а эта операция неэкономна.
В основе сортировки простым выбором лежит просмотр последовательности с целью выбора элемента с наименьшим ключом, после чего он меняется местами с первым элементом. Эти операции повторяются с оставшимися n-1, затем n-2 элементами и так далее, пока не останется только один элемент – наибольший. Рассматриваемый метод в определенном смысле противоположен сортировке простыми включениями. Сортировка простым выбором предпочтительнее сортировки простыми включенями кроме случая, когда ключи заранее рассортированы или почти рассортированы. Тогда сортировка простыми включениями работает несколько быстрее.
Под сортировкой простым обменом принято понимать метод, основанный на сравнении и обмене пары соседних элементов при последовательном просмотре массива и повторении этих дествий до тех пор, пока не будут рассортированы все элементы. Этот метод часто называют сортировкой методом пузырька.
Сортировка с разделением является одним из лучших методов, он назван быстрой сортировкой.
Быстрая сортировка основана на том, что для достижения наибольшей эффективности желательно производить обмены элементов на больших расстояниях. Для этого необходимо сначала поменять местами самый левый и самый правый элементы и постепенно продвигаться с двух концов к середине. Этот пример позволяет предложить следующую процедуру: выбрать случайным образом какой-то элемент (пусть x) и просматривать массив, двигаясь слева направо, пока не найдется элемент аi > x, а затем просматривать его справа налево, пока не найдется элемент аj < x. Затем, поменяв местами эти два элемента и продолжить процесс "просмотра с обменом", пока два просмотра не встретятся где-то в середине массива. В результате массив разделится на две части: левую – с ключами меньшими, чем x, и правую – с ключами большими x.
ДВУМЕРНЫЕ МАССИВЫ
По сути структура array - это структура, заданная в одномерном пространстве индексов, в связи с чем ее часто называют одномерной структурой (вектором). Однако компоненты вектора в свою очередь могут быть составными. Так вектор, компонентами которого являются векторы, соответствует матрице или двухмерной структуре.
При обращении к компонентам таких структур селекторы должны соответствующим образом следовать один за другим. Если в разделе переменных определена матрица M, то M[I,J] обозначает J-ю компоненту строки M[I], которая является I-ой компонентой M.
МАССИВЫ СИМВОЛОВ – СТРОКИ
В памяти компьютера могут обрабатываться не только числа, но и символы. Символ занимает в памяти компьютера один байт и описывается в тексте программы служебным словом char. Символы, как и любые однотипные данные могут быть объединены в массивы. Обработка символьных массивов практически не отличается от обработки числовых. Удобнее всего обрабатывать символьную информацию, представленную в виде строк. Для этого в современные версии языка программирования введён дополнительный стандартный тип - String.
Тип string oпределяется описанием string = array [Index] of Char, но являясь встроенным, явного описания в тексте программы не требует. Этот тип относится к так называемым массивам с нулевой базой, для которых тип индексов определяется как Index =0 .. N, где N – количесво символов, размещаемое в массиве. Таким образом, в нем содержится одна “лишняя” компонента, значение которой равно реальному количеству заполненных компонент. Максимально возможная длина строковой переменной равна 255. Существует и другая форма определения типа string и описания соответствующих переменных, в которой явно указывается верхняя граница типа индексов.
Подобные переменные с точки зрения их обработки могут рассматриваться двояко:
допускается обработка всей строки как единого целого (возможность присвоить переменной строковую константу или выполнять объединение нескольких строк при присваивании);
переменную можно рассматривать как обычный массив, состоящий из компонент типа char, которые доступны при обработке каждая в отдельности.
Для строк определены также операции сравнения ( =, <>, >, <, <=, >= ). Сравнение строк производится слева направо до первого несовпадающего символа: длиннее считается та строка, в которой первый несовпадающий символ имеет больший номер в таблице кодов (буквы в таблице кодов расположены по возрастанию). Если строки имеют различную длину, но в общей части символы совпадают, считается, что короткая строка меньше.
С типом string связывается определенный набор стандартных процедур и функций:
Функция Length возвращает фактическую длину текстовой строки, передаваемой ей в качестве фактического параметра. При подсчете фактической длины строки учитываются все входящие в нее символы, в том числе и пробелы.
Функция Upcase – функция, преобразующая одиночный символ из строчной формы в прописную (ее параметр – переменная строкового типа). Она предполагает обработку отдельных символов, в связи с чем, для обработки строки символов, размещенной в переменной типа string, приходится использовать цикл.
Функция Cору. С помощью функции Cору можно скопировать фрагмент некоторой строки. Для этого при вызове функции в круглых скобках через запятую необходимо указать три параметра: имя строковой переменной, из которой должен извлекаться копируемый фрагмент; позицию, с которой в этой переменной начинается фрагмент; число копируемых компонент. В результате функция возвращает указанный фрагмент.
Функция Pos. С помощью функции Pos можно найти в строковой переменной заданный фрагмент. Если заданный фрагмент в ней присутствует, то функция возвращает номер позиции, с которой этот фрагмент начинается. При отсутствии фрагмента функция возвращает ноль. При вызове функции в качестве параметров необходимо указать имя строковой переменной, в которой отыскивается фрагмент, и имя переменной-фрагмента или соответствующую строковую константу. Функция "Pos" требует полного совпадения искомого фрагмента и фрагмента строки, в которой производится поиск. При этом нужно учитывать, что большие и малые буквы, а также совпадающие по начертанию буквы латинского алфавита и кириллицы считаются различными символами.
Процедуры Insert и Delete. С помощью этих процедур можно вставить одну строку в другую и удалить фрагмент из строки.
Оператор процедуры Insert(Str1,Str2,N) указывает, что в строку Str2 перед N-ой позицией необходимо, вставить строку Str1.
Оператор процедуры Delete(Str,M,N) позволяет удалить в строке Str фрагмент, начинающийся с позиции M и имеющий длину N.
Процедуры STR и VAL
Str(x[:f] [:n],s) – преобразует числовое значение x ( тип real ) в строку s ( возможно задание формата; в этом случае f – число позиций в числе, n – количество позиций после точки).
Val (s,x,err) – превращает строковое значение s (тип string) в числовую переменную x ( тип real ), err (тип integer) возвращает номер позиции, в которой произошла ошибка преобразования, или 0, если ошибки не было.