Как сделать сноску в паскале
В данной секции располагаются определенные пользователем константы. Синтаксис объявления констант выглядит так:
Данная секция предназначена для переменных и массивов. Переменные объявляются так:
Тип строка - это тип переменных, который позволяет хранить в переменной любой текст. Объявление строковой переменной:
Операция | Описание |
---|---|
s1 + s2 | Объединение строк |
s1*n | Дублирование строки n раз |
Операция | Описание |
---|---|
a + b | Сложение чисел |
a - b | Разность чисел |
a * b | Произведение чисел |
a div b | Целочисленное деление |
a mod b | Остаток от деления |
Декларация переменной типа real:
Пример присваивания переменной данного типа:
Операция | Описание |
---|---|
a + b | Сложение чисел |
a - b | Разность чисел |
a * b | Произведение чисел |
a / b | Частное чисел |
Данный раздел программы содержит все команды, выполняемые при ее запуске. Данная секция программы выглядит так:
Комментарий - это часть кода, которую игнорирует компилятор. Он создается следующим образом:
Массивы - это именованный список элементов одного типа.
P. S. Для работы с массивами существует учебный модуль Arrays.
Статические массивы имеют фиксированный размер. Общий синтаксис объявления данных массивов выглядит так:
, где N - длина массива.
Матрица - это n-мерный список значений, имеющий свой тип и ограниченный некоторыми значениями. Пока будем рассматривать только статические двухмерные и трехмерные матрицы. Перед тем, как перейти к их изучению вспомни таблицы в Excel. Каждая таблица имеет свой размер - ширину и длину. Возьмем за правило ассоциировать двухмерные матрицы с таблицами. Объявление матрицы:
, где N, M количество строчек и столбцов соответственно.
Трехмерный матрицы обладают третьим измерением:
Декларация N-мерной матрицы:
, где A..Z означают количество элементов в соответствующем измерении.
Динамические массивы позволяют управлять количеством элементом в каждом из их измерений во время выполнения программы.
Индекс массива - это номер элемента массива. Индекс может принимать значения [0, N - 1], где N - количество элементов некоторой размерности. Обращение к элементу одномерного массива с некоторым индексом:
Составим таблицу, которую следует запомнить:
Где i, j, k - индексы.
Индексом может быть значение элемента массива:
Вывести текст - это значит отобразить текст на экране. Общий синтаксис для вывода текста выглядит так:
Вывод значений произвольного количества переменных:
Для перехода на новую строку после вывода последнего значения используйте Writeln вместо Write.
Чтение с клавиатуры - это процесс ввода данных с клавиатуры и запись в соответствующий элемент программы этих данных. Элементами программы являются как переменные, так и элементы массивов. Тип данных, вводимых с клавиатуры, должен соответствовать типу элемента, в который записываются данные с клавиатуры. Использование Readln для чтения с клавиатуры и перехода на новую строку:
Общий синтаксис условного оператора if:
Команды . будут выполнены только при истинности условия.
Условные обозначения в программировании операций сравнения приведены в таблице:
Операция | Эквивалент в Паскале |
---|---|
<= (меньше или равно) | |
>= (больше или равно) | >= |
> (больше) | > |
= (равно) | = |
? (не равно) | <> |
Общий синтаксис сравнения двух величин:
Оператор case используется для сопоставления значения некоторого выражения с константными значениями:
Если некоторое i-тое константное выражение совпадает с значением выражения, то i-ая группа операторов будет выполнена. Группа операторов после else будет выполнена, если значение выражения не совпало ни с одной из констант. begin - end не нужны, если после двоеточия только один оператор.
Оператор цикла позволяет выполнять группу операторов (или один) циклически пока условие является истинным.
Если второе значение меньше первого - используйте downto вместо to.
Для выхода из цикла можно использовать break:
Для завершения текущей итерации цикла и начала другой используйте оператор continue.
Общий синтаксис описания функции:
Можно устанавливать значение переменной Result для указания возвращаемого значения.
Программирование. Динамические списки Pascal-Паскаль
- Скачено бесплатно: 19551
- Куплено: 414
-
->Программирование. Динамические списки Pascal-Паскаль
Динамические структуры данных
Объект данных обладает динамической структурой, если его размер изменяется в процессе выполнения программы или он потенциально бесконечен.
Классификация структур данных
Используемые в программировании данные можно разделить на две большие группы:
Данные статической структуры – это данные, взаиморасположение и взаимосвязи элементов которых всегда остаются постоянными.
Данные динамической структуры – это данные, внутреннее строение которых формируется по какому-либо закону, но количество элементов, их взаиморасположение и взаимосвязи могут динамически изменяться во время выполнения программы, согласно закону формирования.
Данные динамической структуры:
К данным динамической структуры относят файлы, несвязанные и связанные динамические данные.
Заметим, что файлы в данной классификации отнесены к динамическим структурам данных. Это сделано исходя из вышеприведенного определения. Хотя удаление и вставка элементов в середину файла не допускается, зато длина файла в процессе работы программы может изменяться – увеличиваться или уменьшаться до нуля. А это уже динамическое свойство файла как структуры данных.
Статические и динамические переменные в Паскале
В Паскале одной из задач описания типов является то, чтобы зафиксировать на время выполнения программы размер значений, а, следовательно, и размер выделяемой области памяти для них. Описанные таким образом переменные называются статическими.
Все переменные, объявленные в программе, размещаются в одной непрерывной области оперативной памяти – сегмент данных. Длина сегмента данных определяется архитектурой микропроцессора и составляет обычно 65536 байт.
Однако порой заранее не известны не только размеры значений, но и сам факт существования значения той или иной переменной. Для результата переменной приходится отводить память в расчете на самое большое значение, что приводит к нерациональному использованию памяти. Особенно это затруднительно при обработке больших массивов данных.
Предположим, например, что у вас есть программа, требующая массива в 400 строк по 100 символов каждая. Для этого массива требуется примерно 40К, что меньше максимума в 64К. Если остальные ваши переменные помещаются в оставшиеся 24К, массив такого объема проблемы не представляет. Но что если вам нужно два таких массива? Это потребовало бы 80К, и 64К сегмента данных не хватит. Другим общим примером является сортировка. Обычно когда вы сортируете большой объем данных, то делаете копию массива, сортируете копию, а затем записываете отсортированные данные обратно в исходный массив. Это сохраняет целостность ваших данных, но требует также наличия во время сортировки двух копий данных.
С другой стороны объем памяти компьютера достаточно велик для успешного решения задач с большой размерностью данных. Выходом из положения может служить использование так называемой динамической памяти.
Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК.
ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Например, при разработке САПР статическое распределение памяти невозможно, т.к. размерность математических моделей в разных проектах может значительно различаться.
И статические и динамические переменные вызываются по их адресам. Без адреса не получить доступа к нужной ячейке памяти, но при использовании статических переменных, адрес непосредственно не указывается. Обращение осуществляется по имени. Компилятор размещает переменные в памяти и подставляет нужные адреса в коды команд.
Адресация динамических переменных осуществляется через указатели. Их значения определяют адрес объекта.
Для работы с динамическими переменными в программе должны быть выполнены следующие действия:
- Выделение памяти под динамическую переменную;
- Инициализация указателя;
- Освобождение памяти после использования динамической переменной.
Программист должен сам резервировать место, определять значение указателей, освобождать ДП.
Вместо любой статической переменной можно использовать динамическую, но без реальной необходимости этого делать не стоит.
Указатели
Для работы с динамическими программными объектами в Паскале предусмотрен ссылочный тип или тип указателей. В переменной ссылочного типа хранится ссылка на программный объект (адрес объекта).
Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти.
Объявление указателей
Указатель, связанный с некоторым определенным типом данных, называют типизированным указателем. Его описание имеет вид:
Пример фрагмента программы объявления указателя
Указатель, не связанный с каким-либо конкретным типом данных, называется нетипизированным указателем. Для описания нетипизированного указателя в Паскале существует стандартный тип pointer. Описание такого указателя имеет вид:
С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе выполнения программы.
Значения указателей – адреса переменных в памяти. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе – смещение.
Следовало бы ожидать, что значение одного указателя можно передать другому. На самом деле можно передавать значения только между указателями, связанными с одним типом данных. Указатели на различные типы данных имеют различный тип, причем эти типы несовместимы.
Пример фрагмента программы объявления указателя различных типов
Однако это ограничение не распространяется на нетипизированный указатель. В программе допустимы будут следующие действия:
Выделение и освобождение динамической памяти
Вся ДП рассматривается как сплошной массив байтов, который называется кучей.
Расположение кучи в памяти ПК.
Существуют стандартные переменные, в которых хранятся значения адресов начала, конца и текущей границы кучи:
- Heaporg – начало кучи;
- Heapend – конец кучи;
- Heapptr – текущая граница незанятой ДП.
Выделение памяти под динамическую переменную осуществляется процедурой:
В результате обращения к этой процедуре указатель получает значение, соответствующее адресу в динамической памяти, начиная с которого можно разместить данные.
Пример фрагмента программы объявления указателя различных типов
Графически действие процедуры new можно изобразить так:
Освобождение динамической памяти осуществляется процедурой:
Следует помнить, что повторное применение процедуры dispose к свободному указателю может привести к ошибке.
Процедура dispose освобождает память, занятую динамической переменной. При этом значение указателя становится неопределенным.
Любые действия над указателем в программе располагаются между процедурами new и dispose.
При использовании динамически распределяемых переменных часто возникает общая проблема, называемая утечкой динамической памяти. Утечка памяти – это ситуация, когда пространство выделяется в динамически распределяемой памяти и затем теряется – по каким-то причинам ваш указатель не указывает больше на распределенную область, так что вы не можете освободить пространство. Общей причиной утечек памяти является переприсваивание динамических переменных без освобождения предыдущих. Простейшим случаем является следующий:
Пример фрагмента программы
При первом вызове New в динамически распределяемой памяти выделяется 2 байта, и на них устанавливается указатель IntPointer. Второй вызов New выделяет другие 2 байта, и IntPointer устанавливается на них. Теперь у вас нет указателя, ссылающегося на первые 2 байта, поэтому вы не можете их освободить. В программе эти байты будут потеряны.
Присваивание значений указателю
Для инициализации указателей существует несколько возможностей.
- процедура new отводит блок памяти в области динамических переменных и сохраняет адрес этой области в указателе;
- специальная операция @ ориентирует переменную-указатель на область памяти, содержащую уже существующую переменную. Эту операцию можно применять для ориентации на статическую и динамическую переменную.
Например,
Объявлены переменные разных типов: массив из 50 целых чисел и указатель на массив символов. Чтобы указатель pA указывал на массив X, надо присвоить ему адрес X
Операции с указателями
Для указателей определены только операции присваивания и проверки на равенство и неравенство. В Паскале запрещаются любые арифметические операции с указателями, их ввод-вывод и сравнение на больше-меньше.
Еще раз повторим правила присваивания указателей:
- любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти;
- указатели стандартного типа pointer совместимы с указателями любого типа;
- указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа данных.
Указатели можно сравнивать на равенство и неравенство, например:
В Паскале определены стандартные функции для работы с указателями:
- addr( x) – тип результата pointer, возвращает адрес x (аналогично операции @), где x – имя переменной или подпрограммы;
- seg( x) – тип результата word, возвращает адрес сегмента для x;
- ofs( x) – тип результата word, возвращает смещение для x;
- ptr( seg, ofs) – тип результата pointer, по заданному сегменту и смещению формирует адрес типа pointer.
Присваивание значений динамическим переменным
После того, как динамическая переменная объявлена, ей можно присваивать значения, изменять их, использовать в выражениях и т.д. Для этого используют следующее обращение: переменная_указатель^. Такое обращение называется операция разадресации (разыменования). Таким образом происходит обращение к значению, на которое указывает указатель, т.е. к данным. Если же за переменной_указателем значок ^ не стоит, то имеется в виду адрес, по которому расположены данные.
Динамически размещенные данные можно использовать в любом месте программы, где допустимо использование выражений соответствующего типа.
Недопустимо использовать выражения, подобные следующим:
Адрес --->R:= sqr( R^) + I^ -17 R^:= sqr( R) nil do
Begin
Writeln (u^.inf);
u:= u^.next;>
end;
Удаление элемента из списка
А)Удаление первого элемента. Для этого во вспомогательном указателе запомним первый элемент, указатель на голову списка переключим на следующий элемент списка и освободим область динамической памяти, на которую указывает вспомогательный указатель.
Б) Удаление элемента из середины списка. Для этого нужно знать адреса удаляемого элемента и элемента, стоящего перед ним. Допустим, что digit – это значение удаляемого элемента.
x:= u;
while ( x<> nil) and ( x^. inf<> digit) do
begin
dx:= x;
x:= x^.next;
end;
dx:= x^.next:
dispose(x);
В)Удаление из конца списка. Для этого нужно найти предпоследний элемент.
Прохождение списка. Важно уметь перебирать элементы списка, выполняя над ними какую-либо операцию. Пусть необходимо найти сумму элементов списка.
Динамические объекты сложной структуры
Использование однонаправленных списков при решении ряда задач может вызвать определенные трудности. Дело в том, что по однонаправленному списку можно двигаться только в одном направлении, от головы списка к последнему звену. Между тем нередко возникает необходимость произвести какую-либо операцию с элементом, предшествующим элементу с заданным свойством. Однако после нахождения элемента с данным свойством в однонаправленном списке у нас нет возможности получить удобный и быстрый способ доступа к предыдущему элементу.
Для устранения этого неудобства добавим в каждое звено списка еще одно поле, значением которого будет ссылка на предыдущее звено.
Динамическая структура, состоящая из звеньев такого типа, называется двунаправленным списком, который схематично можно изобразить так:
Наличие в каждом звене двунаправленного списка ссылки как на следующее, так и на предыдущее звено позволяет от каждого звена двигаться по списку в любом направлении. По аналогии с однонаправленным списком здесь есть заглавное звено. В поле Pred этого звена фигурирует пустая ссылка nil, свидетельствующая, что у заглавного звена нет предыдущего (так же, как у последнего нет следующего).
В программировании двунаправленные списки часто обобщают следующим образом: в качестве значения поля Next последнего звена принимают ссылку на заглавное звено, а в качестве значения поля Pred заглавного звена – ссылку на последнее звено:
Существуют различные методы использования динамических списков:
Программирование
Исходники Pascal (127)
Справочник
Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту
1. ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА
Алфавит
Алфавит (разрешенный к использованию набор символов) языка Паскаль составляют:
1. Прописные и строчные (воспринимаются одинаково) буквы латинского алфавита: А, В, …, Z, а, в, …, z .
2. Цифры от 0 до 9.
3. Символ подчеркивания “ _ ”.
4. Специальные символы :
* звездочка
/ дробная черта
; точка с запятой
: двоеточие
[ ] квадратные скобки
фигурные скобки
$ знак денежной единицы
( ) круглые скобки
^ тильда (стрелка вверх)
@ коммерческое а
Комбинации специальных символов могут образовывать составные символы:
: = присваивание
. . диапазон значений
меньше или равно
> = больше или равно
Примечание. Русские буквы в программе должны заключаться в апострофы, например, ‘Текст на русском языке’.
Слова
Слова – это неделимые последовательности символов алфавита, отделенные друг от друга разделителями и несущие определенный смысл.
Слова делятся на зарезервированные слова и идентификаторы (имена). Идентификаторы, в свою очередь, делятся на стандартные и идентификаторы пользователя.
Зарезервированные слова являются составной частью языка, имеют фиксированное начертание и навсегда определенный смысл.
Зарезервированные слова языка Паскаль
остаток от деления
Идентификаторы (имена) используются для обозначения программ, переменных и постоянных величин, процедур, функций.
Общие правила написания идентификаторов
1. Идентификатор может состоять только из букв, цифр и символа подчеркивания.
2. Идентификатор начинается только с буквы или символа подчеркивания (ис ключение составляют метки, которые могут начинаться с цифры).
3. Максимальная длина идентификатора 127 символов, но значимы только первые 63.
4. Между двумя идентификаторами должен быть, по крайней мере, один пробел.
Стандартные идентификаторы предназначены для обозначения стандартных, т.е. заранее определенных, объектов (констант, процедур и функций), например, integer , sin , cos , write .
Идентификаторы пользователя применяются для обозначения объектов, определенных самим программистом. При их записи следует учитывать, что: 1) идентификаторы в программе должны быть уникальными; 2) нельзя использовать в качестве идентификаторов пользователя зарезервированные слова и стандартные имена; 3) имена для объектов программы надо выбирать так, чтобы они наилучшим образом отражали их значение.
Примеры записи идентификаторов пользователя:
a , t1, r_756, summa – правильно;
Общая структура программы на Паскале
В Паскаль – программе могут быть написаны следующие разделы (рис.1):
1. Заголовок программы.
2. Раздел объявлений.
3. Тело программы (основной блок программы).
список используемых библиотек (модулей);
список меток в основном блоке программы;
определение констант программы;
определение глобальных переменных программы;
Основной блок программы
Рис. 1. Полный вариант структуры Паскаль - программы
Заголовок программы состоит из зарезервированного слова program и идентификатора программы.
Раздел объявлений может включать в себя любое количество объявлений используемых библиотек, меток, констант, типов, переменных, процедур и функций.
Правило. В любом месте программы можно использовать лишь те элементы, которые были объявлены ранее по тексту программы.
Основной блок – это собственно программа, использующая всё, что было объявлено. Он начинается словом begin и заканчивается словом end с точкой. После завершающей точки любой текст игнорируется.
Основной блок состоит из операторов (предложений языка программирования), записанных в соответствии с алгоритмом. Операторы отделяются друг от друга символом “ ; ”.
Операторы подразделяются на простые и структурные. К простым операторам относятся операторы присваивания, перехода, процедуры. К структурным – операторы условия, выбора, цикла, составные. Составной оператор представляет собой последовательность операторов, заключенных в слова begin и end .
Программист, набирая те кст пр ограммы, имеет право произвольно располагать строки на экране. Однако программа легче читается, если в строке записывается только один оператор, а логически подчиненные структуры записаны на одну строку ниже и на одну–две позиции правее по отношению к более старшим .
program primer ;
x , y , summa : real ;
writeln (‘Сумма x и y равна’, summa );
Константы и переменные
Константы – это элементы данных, значения которых не меняются в процессе выполнения программы. Константы задаются идентификаторами пользователя и описываются в разделе, который начинается зарезервированным словом const .
Пример описания констант:
t=13.4; max=1000; eps=0.15E – 5; myna m e= ‘Петя Иванов’;
Переменные – это величины, которые могут менять свои значения в процессе выполнения программы. Каждая переменная принадлежит к определенному типу данных. Имена переменных и их типы объявляются в разделе, который начинается зарезервированным словом var .
Пример объявления переменных.
Комментарии
Для лучшего понимания программы в ней может быть записан произвольный текст – комментарий. Комментарий можно записать в любом месте программы, где разрешен пробел. Текст комментария ограничен символами < >или (* *) и может содержать любые комбинации латинских и русских букв, цифр и других символов алфавита языка Паскаль. Ограничений на длину комментария нет, он может занимать несколько строк.
Блоки программы должны следовать в правильном порядке. Большая часть блоков программы может быть опущена, по этой причине минимальная работающая программа в Lazarus имеет вид:
Структура модуля на языке Pascal
Комментарии в языке Паскаль
В примерах кода мы использовали комментарии. Это текст который нужен для понимания того, что делает код. Компилятор Lazarus игнорирует комментарии, соответственно они никак не влияют на размер готовой программы.
Free Pascal поддерживает комментарии двух типов:
- однострочные - начинаются с символов // и продолжаются до конца строки
- многострочные
- начинаются с символа и заканчиваются символом >
- начинаются с символов (* и заканчиваются символами *)
Коментарии могут быть написаны в одной строке с кодом.
Их можно использовать для отключения части кода программы во время отладки.Читайте также: