
- •Билет 20 Объявление типов и использование имен типов для описания данных.
- •Процедуры вывода write и writeln. Управление форматом вывода числовых и текстовых величин.
- •Билет 21
- •Особенности использования массивов в качестве параметров процедур и функций.
- •Билет 22 Открытые и динамические массивы. Запрос и освобождение памяти во время работы программы.
- •Цикл repeat.
- •Билет 23 Раздел констант.
- •Типизированные "константы" в Паскале.
- •Присвоение переменным начальных значений.
- •Специфика Object Pascal.
- •Процедуры ввода read, readln
- •Билет 25 Управление форматом выводимых данных с помощью. Процедуры Format
- •Операторы цикла. Назначение операторов break и continue.
- •Билет 26 Управление файлами в стиле Windows. Управление файлами в стиле Windows
- •В чем разница между выборкой данных из текстового файла по операторам read и readln.
Специфика Object Pascal.
Object Pascal (Объектный Паскаль) — язык программирования, разработанный в фирме Apple Computer в 1986 году группой Ларри Теслера, который консультировался с Никлаусом Виртом. Произошёл от более ранней объектно-ориентированной версии Паскаль[2], называвшейся Clascal, который был доступен на компьютере Apple Lisa.
Далее объяснение из интернета :D
object - продолжение турбы. Основное отличие обджекта - ВСЁ объекты. Опрерируют только со свойствами и методами этих объектов. Все переменные - по сути указатели. Основное тело программы в принципе есть, но ты его не видишь...
В турбо объекты тоже есть, но как сбоку припёка. Все действия выполняются из основного тела программы. Использование указателей - примерно 50%.
с помощью object pascal вы сможете создавать графические элементы типа окошек, кнопочек, комбобоксов и т.д. а турбо паскаль - он досовский и в нем таких понятий как компоненты нету... и всего что с ними связано... турбо паскаль стал прародителем для object pascal, а он уже, в свою очередь, стал прародителем для Delphi
Дальше по-научному длинно
Начнем рассмотрение темы с того, каким образом следует вносить комментарии в программу на языке Object Pascal. Этот язык поддерживает три типа комментариев — с использованием фигурных скобок, пар скобка–звездочка и двойной наклонной чер ты (в стиле C++). Ниже приведены три примера комментариев Object Pascal:
{ Комментарий с использованием фигурных скобок }
(* Комментарий с использованием пары скобка+звездочка *)
// Комментарий с использованием двойной наклонной черты
Поведение первых двух типов комментариев идентично. Object Pascal считает комментарием все, что находится между символом (или парой символов) начала ком ментария и символом завершения комментария, включая символы перехода на новую строку. Комментарий в виде двойной косой черты продолжается только до конца строки.
НА ЗАМЕТКУ
В Object Pascal нельзя использовать вложенные комментарии одного и того же типа. И хотя синтаксис Object Pascal позволяет создавать вложенные комментарии различного типа, но пользоваться этой возможностью не рекомендуется.
{ (* Допустимо *) } (* { Допустимо } *)
(* (* Недопустимо *) *)
{ { Недопустимо } }Дополнительные возможности процедур и функций
Поскольку процедуры и функции — довольно обширная тема, а речь здесь идет лишь о сравнительном анализе различных языков программирования, не будем слиш ком углубляться в данный вопрос, а отметим лишь малоизвестные и новые возможно сти Delphi в этой области.
Скобки при вызове функций
Хотя добавление скобок при вызове функции или процедуры без параметров не является новинкой, но про такую возможность знают далеко не все. В Object Pascal считаются корректными оба варианта вызова:
Form1.Show; Form1.Show();
Это, конечно, возможность не из тех, которые сильно удивляют. Однако програм мисты, вынужденные делить свое рабочее время между разными языками (например Delphi, C и Java), оценят ее по достоинству, ибо им не придется задумываться о разли чии синтаксиса вызова функций в различных языках.
Перегрузка
В Delphi 4 была реализована концепция перегрузки функций (overloading), которая позволяет иметь несколько различных функций или процедур с одинаковым именем, но разными списками параметров. Такие процедуры и функции должны быть описа ны с применением директивы overload:
procedure Hello(I: Integer); overload; procedure Hello(S: String); overload; procedure Hello(D: Double); overload;
Заметим, что правила перегрузки методов класса, сформулированные в соответст вующей главе книги, несколько отличаются от правил перегрузки обычных процедур и функций. Хотя предоставления возможности перегрузки функций программисты требовали с момента выхода в свет Delphi 1, тем не менее это не самая безопасная возможность языка. Наряду с уже имевшейся возможностью использования в разных модулях функций с одним и тем же именем, применение перегруженных функций может стать неиссякаемым источником трудноуловимых ошибок в программе. По этому сто раз подумайте, прежде чем использовать перегрузку. Помните золотое пра вило: “Можно потреблять, но не злоупотреблять!”.
Значения параметров по умолчанию
В Delphi 4 была введена еще одна полезная возможность — использование значе ний параметров по умолчанию. Она позволяет установить принимаемое по умолча нию значение параметра процедуры или функции. Это значение будет использовать ся в тех случаях, когда вызов процедуры или функции осуществляется без указания значения данного параметра. В объявлении процедуры либо функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:
procedure HasDefVal(S: string; I: Integer = 0);
Процедура HasDefVal() может быть вызвана двумя способами. В первом случае —
как обычно, с указанием обоих параметров:
HasDefVal(‘hello’, 26);
Во втором случае можно задать только значение параметра S, а для параметра I
использовать значение, установленное по умолчанию:
HasDefVal(‘hello’); // Для I используется значение по умолчанию
При использовании значений параметров по умолчанию следует помнить о не
скольких приведенных ниже правилах.
• Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встре чаться в списке после параметра, имеющего значение по умолчанию.
• Значения по умолчанию могут присваиваться только параметрам обычных ти
пов, указателям или множествам.
• Значение по умолчанию может передаваться только по значению либо с моди фикатором const. Оно не может быть ссылкой или нетипизированным пара метром.
Одним из важных преимуществ применения значений параметров по умолчанию является простота расширения функциональных возможностей уже имеющихся про цедур и функций с соблюдением обратной совместимости. Предположим, на рынок программных продуктов была выпущена программа, ключевым звеном которой явля ется функция сложения двух целых величин:
function AddInts(I1, I2: Integer): Integer;
begin
Result := I1 + I2;
end;
Допустим, что маркетинговые исследования показали целесообразность добавле ния в программу возможности сложения трех чисел. Замена существующей функции на другую, способную складывать три числа, приведет к необходимости исправить весь код программы, который перестанет компилироваться из за внесения в функцию еще одного параметра. Но при использовании значений параметров по умолчанию проблема решается легко и просто. Достаточно изменить объявление функции так, как показано ниже.
function AddInts(I1, I2: Integer; I3: Integer = 0);
begin
Result := I1 + I2 + I3;
end;
Переменные
У начинающих программистов бытует мнение: “Если мне понадобится еще одна переменная — я опишу ее прямо здесь, посреди кода, в том месте, где она понадоби лась”. Для таких языков, как Java, C или Visual Basic, — это вполне допустимо. Но в языке Object Pascal все переменные обязательно должны быть описаны в соответст вующем разделе var, расположенном в начале процедуры, функции или программы. Предположим, на C++ код функции выглядит так:
void foo(void)
{
int x = 1;
x++;
int y = 2;
float f;
//…и так далее…
}
Аналогичная функция на Object Pascal должна выглядеть следующим образом:
Procedure Foo;
var
x, y: Integer;
f: Double;
begin
x := 1;
inc(x);
y := 2;
//…и так далее…
end;
НА ЗАМЕТКУ
Object Pascal (как и Visual Basic), в отличие от Java и C, не чувствителен к регистру символов. Использование строчных и прописных символов сводится к тому, чтобы сделать код более удобочитаемым. Например, сложно воспринять имя процедуры, за- писанное как:
procedure thisprocedurenamemakenosense;
Значительно понятнее имена процедур, которые записаны в таком виде:
procedure ThisProcedureNameIsMoreClear;
Возникает вполне резонный вопрос: в чем же тогда преимущества и удобства Object Pascal? Вскоре вы убедитесь, что такая строгая структура программы делает ее более понятной, удобочитаемой и, как следствие, она проще в отладке и сопровожде нии, чем у других языков, которые полагаются скорее на общепринятые соглашения, а не на жесткие правила.
Обратите внимание, Object Pascal позволяет объявить более одной переменной одинакового типа в одной строке:
VarName1, VarName2: SomeType;Не забывайте, что объявление переменной в Object Pascal состоит из ее имени, двоеточия и типа переменной. Запомните: в Object Pascal переменная всегда инициа лизируется отдельно от своего объявления.
Начиная с Delphi 2.0, язык позволяет инициализировать глобальные переменные в разделе их объявления (var). Приведенный ниже пример демонстрирует синтаксис такого объявления.
var
i: Integer = 10;
S: string = ‘Hello world’;
D: Double = 3.141579;
НА ЗАМЕТКУ
Предварительная инициализация возможна только для глобальных переменных и недо-
пустима для переменных, являющихся локальными для процедуры или функции.CОВЕТ
Компилятор Delphi автоматически инициализирует все глобальные переменные нуле- вым значением. Таким образом, при запуске программы все глобальные переменные целого типа примут значение 0, переменные с плавающей точкой — 0.0, строки ока- жутся пустыми, а указатели будут иметь значение nil. Поэтому в исходном коде спе- циальная инициализация глобальных переменных нулевым значением не требуется.
Константы
Константы в Object Pascal определяются в специальном разделе директивой const, действие которой аналогично ключевому слову const в языке C. Вот пример объявле ния трех констант в языке C:
const float ADecimalNumber = 3.14;
const int i = 10;
const char * ErrorString = "Danger, Danger, Danger!";
Основное отличие между константами в языках C и Object Pascal заключается в том, что в Object Pascal (как и в Visual Basic) не требуется указывать тип константы. Компилятор Delphi автоматически выделяет необходимую память, основываясь на инициализирующем значении (а в случае скалярных констант, таких как целое значе ние, он просто подставляет его в нужные места в программе, совсем не выделяя памя ти). Объявления тех же констант в Object Pascal выглядят следующим образом:
const
ADecimalNumber = 3.14;
i = 10;
ErrorString = ‘Danger, Danger, Danger!’;НА ЗАМЕТКУ
Выделение памяти для констант происходит так: целые значения размещаются в наи- меньшей, но достаточной для этого области памяти (в частности, значение 10 будет раз- мещено как переменная типа ShortInt, 32000 — как SmallInt и т.д.). Алфавитно-цифровые значения, а попросту — строки, размещаются как тип Char или те- кущий тип String, определенный директивой $H. Значения с плавающей точкой разме- щаются как данные типа extended, кроме значений, имеющих менее четырех десятич- ных знаков, — в этом случае используется тип Comp. Массивы целых (Integer) или сим- вольных (Char) данных хранятся в собственном представлении.
Хоть это и необязательно, но в объявлении константы можно указать ее тип. Это позволит компилятору осуществлять полный контроль типов данных при работе с та кими константами:
const
ADecimalNumber: Double = 3.14;
I: Integer = 10;
ErrorString: string = ‘Danger, Danger, Danger!’;
Object Pascal допускает применение в объявлениях констант (const) и перемен ных (var) функций, вычисляемых во время компиляции. К этим функциям относятся: Ord(), Chr(), Trunc(), Round(), High(), Low() и SizeOf(). Так, все объявления в следующем примере абсолютно корректны:
type
A = array[1..2] of Integer;
const
w: Word = SizeOf(Byte);
var
i: Integer = 8;
j: SmallInt = Ord(‘a’);
L: Longint = Trunc(3.14159);
x: ShortInt = Round(2.71828);
B1: Byte = High(A);
B2: Byte = Low(A);
C: char = Chr(46);
CОВЕТ
Поведение констант в 32-битовом Delphi отличается от 16-битового Delphi 1.0. В Delphi 1.0 константа рассматривалась как предварительно инициализированная пере- менная, называемая типизированной константой. Начиная с Delphi 2.0, константы стали истинными константами, а для обратной совместимости была введена директива компиля- тора $J. Для совместимости с кодом Delphi 1 этот режим по умолчанию включен, но, чтобы избавиться от устаревших типизированных констант, рекомендуется отключать его (флажок Assignable typed constants (Присваиваемые типизированные константы), расположенный во вкладке Compiler окна Project Options).Если попробовать присвоить константе значение, то компилятор выдаст сооб щение об ошибке, поясняющее, что значение константы не может быть изменено. Исходя из того факта, что константы доступны только для чтения, компилятор Object Pascal оптимизирует использование памяти, располагая константы в неза полненных частях страниц кода. Более подробная информация по этой теме при ведена в предыдущем издании — “Delphi 5. Руководство разработчика, том 1”, в главе 3, “Win32 API”.
НА ЗАМЕТКУ
Object Pascal не имеет препроцессора, как C или C++. Таким образом, в Object Pascal
отсутствует концепция макросов, а значит — и эквивалент директивы препроцессора
#define, используемой в C для описания констант. Хотя язык Object Pascal и позво-
ляет выполнять условную компиляцию с использованием директивы компилятора
$define, но ее нельзя применять для определения констант, как в C. Там, где в языке С применялась директива #define, в языке Object Pascal рекомендуется объявлять константы (const).
Операторы
Оператор — это один или несколько символов кода, с помощью которых выполня ются определенные действия с данными различных типов. Простейшим примером могут служить операторы сложения, вычитания, умножения и деления арифметиче ских типов данных; другим примером может быть оператор для доступа к определен ному элементу массива. В данном разделе рассматриваются операторы Object Pascal и их отличие от операторов Java, C и Visual Basic.
Оператор присвоения
Это один из наиболее часто используемых операторов. Оператор присвоения языка Object Pascal (:=), аналогичный оператору = в языках Java, C и Visual Basic, применяется для присвоения значения переменной. Иногда программисты называют его операто ром возвращения значения (get). Рассмотрим пример оператора присвоения:
Number1 := 5;
Эту строку можно прочитать как “переменная Number получает значение 5” либо как “переменной Number присвоено значение 5”.
Операторы сравнения
Для тех, кто работал с Visual Basic, использование операторов сравнения в Object Pascal не вызовет никаких проблем, так как они идентичны соответствующим опера торам Visual Basic.
Object Pascal использует оператор = для логического сравнения двух выражений или значений. В языках Java и C ему аналогичен оператор ==, пример применения ко торого показан ниже.
if (x == y)На языке Object Pascal этот же оператор будет выглядеть следующим образом:
if x = y
НА ЗАМЕТКУ
Запомните: в Object Pascal оператор = используется только для сравнения. Чтобы присвоить значение, следует воспользоваться оператором :=.
В Delphi оператор “не равно” выглядит так: <>. В языке C ему аналогичен оператор
!=. Вот пример проверки того, что два значения не равны друг другу:
if x <> y thenDoSomething
Логические операторы
Object Pascal использует ключевые слова and и or в качестве логических операторов
“и” и “или” (в языках C и Java для этого применяются соответственно операторы && и
||). В основном эти операторы применяются как элементы оператора if или цикла.
Например:
if (Condition 1) and (Condition 2) then
DoSomething;
while (Condition 1) or (Condition 2) do
DoSomething;
Оператор “не” в Object Pascal выглядит как not (он аналогичен оператору ! в язы ках Java и C). В основном оператор not применяется в составе оператора if; это де монстрирует следующий пример:
if not (condition) then (do something); // Если условие condition
// ложно, то выполнить
// оператор do something
В табл. 2.1 приведен список операторов Object Pascal и соответствующие им опе
раторы языков Java, C и Visual Basic.
Таблица 2.1. Операторы присвоения, сравнения и логические
Оператор
Pascal
Java/C
Visual Basic
Присвоение
:=
=
=
Сравнение
=
==
= или Is*
Неравенство
<>
!=
<>
Меньше, чем
<
<
<
Больше, чем
>
>
>
Меньше или равно
<=
<=
<=
Больше или равно
>=
>=
>=
Окончание табл. 2.1
Оператор
Pascal
Java/C
Visual Basic
Логическое И Логическое ИЛИ
Логическое НЕ
and or
not
&&
||
!
And
Or
Not
* Оператор сравнения Is используется только для объектов, а оператор сравнения = применяется для всех остальных типов данных.
Арифметические операторы
Большинство арифметических операторов Object Pascal должно быть знакомо всем, так как они идентичны операторам, используемым в языках Java, C, и Visual Basic. В табл. 2.2 приведены арифметические операторы Object Pascal и соответст вующие им операторы языков Java, C и Visual Basic.
Таблица 2.2. Арифметические операторы
Оператор
Pascal
Java/C
Visual Basic
Сложение
+
+
+
Вычитание
-
-
-
Умножение
*
*
*
Деление с плавающей точкой
/
/
/
Деление целых чисел
div
/
\
Деление по модулю
mod
%
Mod
Возведение в степень
Отсутствует
Отсутствует
^
Как видно из таблицы, Object Pascal отличается от других языков программиро вания тем, что в нем существуют разные операторы для деления целых чисел и чи сел с плавающей точкой. Оператор div автоматически отсекает остаток при деле нии двух целых выражений.
НА ЗАМЕТКУ
Не забывайте использовать правильный оператор деления для соответствующих ти- пов выражений. Компилятор выдаст сообщение об ошибке при попытке деления двух чисел с плавающей точкой с помощью оператора div или двух целых чисел с помо- щью оператора /, например:
var
i: Integer;
r: Real;
begin
i := 4 / 3; // Эта строка приведет к ошибке компиляции
f := 3.4 div 2.3; // Эта строка тоже приведет к ошибке
end;В большинстве других языков программирования не делается различия между деле- нием целочисленным и делением с плавающей точкой. Как правило, всегда выполня- ется деление с плавающей точкой, а, при необходимости, результат конвертируется в целое число. Но при таком подходе возможно существенное снижение производитель- ности программы. Специализация оператора div языка Pascal несколько выше, а по- тому и выполняется быстрее.
Побитовые операторы
Побитовыми называются операторы, позволяющие работать с отдельными битами заданной переменной. Чаще всего побитовые операторы используются для сдвига би тов влево или вправо, их инверсии, а также побитовых операций “и”, “или” и “исключающее или” (xor) между двумя числами. Операторы сдвига влево и вправо в Object Pascal имеют вид shl и shr соответственно, они аналогичны операторам << и >> в языках Java и C. Запомнить остальные операторы тоже достаточно легко — это not, and, or и xor. В табл. 2.3 приведены побитовые операторы и соответствующие им опе раторы языков C и Visual Basic.
Таблица 2.3. Побитовые операторы
Оператор
Pascal
Java/C
Visual Basic
И
and
&
And
Не
not
~
Not
Или
or
|
Or
Исключающее или
xor
^
Xor
Сдвиг влево
shl
<<
Нет
Сдвиг вправо
shr
>>
Нет
Процедуры инкремента (приращения)
и декремента
Процедуры инкремента и декремента генерируют оптимизированный код для до бавления или вычитания единицы из целой переменной. Object Pascal не предостав ляет таких широких возможностей, как постфиксные и префиксные операторы ++ и
– в языках Java и C. Тем не менее, процедуры Inc() и Dec() обычно компилируются
в одну команду процессора.
Процедуры Inc() и Dec() можно вызывать и с одним, и с двумя параметрами. Ниже приведен пример их вызова с одним параметром.
Inc(variable); Dec(variable);
Эти операторы будут скомпилированы в ассемблерные инструкции add и sub. Ниже приведен пример вызова таких процедур с двумя параметрами. Здесь перемен ная variable увеличивается, а затем уменьшается на 3:Inc(variable, 3); Dec(variable, 3);
В табл. 2.4 приведены данные об операторах инкремента и декремента в разных языках программирования.
НА ЗАМЕТКУ
Если для компилятора установлен режим оптимизации, то процедуры Inc() и Dec()
обычно порождают такой же машинный код, что и выражения variable:=variable +
1. Поэтому для увеличения или уменьшения значения целой переменной можно исполь-
зовать тот вариант записи, который покажется более удобным.
Таблица 2.4. Операторы инкремента и декремента
Operator
Pascal
Java/C
Visual Basic
Инкремент
Декремент
Inc()
Dec()
++
–
Нет
Нет
Операторы присвоения с действием
Весьма удобные операторы присвоения с действием (do and assign operator), присущие языкам Java и C, в языке Object Pascal отсутствуют. Это такие операторы, как присвое ние с суммой += и присвоение с умножением *=. Они выполняют арифметическую операцию (в данном случае сложение и умножение) перед операцией присвоения. В Object Pascal, этот тип операций следует выполнять, используя два разных оператора. Например, следующий код C
x += 5;
на языке Object Pascal выглядит так.
x := x + 5;