Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры.doc
Скачиваний:
8
Добавлен:
18.04.2015
Размер:
230.4 Кб
Скачать

Понятие класса

В Паскале имеется четкое разграничение между понятиями объекта и класса. Класс — это тип данных (как Integer или ТМу Record), а объект — конкретный существующий в памяти компьютера экземпляр класса, переменная соответствующего типа. В ранних версиях Паскаля существовала некоторая терминологическая путаница, потому что первая реализация объектного подхода использовала для описания объектного типа данных ключевое слово object, и в то же время объектом назывались экземпляры этого типа. Применять слово object можно и сейчас, однако подобная возможность поддерживается только для совместимости со старыми версиями системы Delphi. Вместо ключевого слова object правильно использовать ключевое слово class. Классы имеют поля (как тип данных record), свойства (напоминающие поля, но имеющие дополнительные описатели, определяющие механизмы записи и считывания данных, что позволяет повысить строгость декларирования внутренней структуры класса) и методы (подпрограммы, которые обрабатывают поля и свойства класса). Когда описывается переменная типа class, для ее полей и свойств в памяти выделяется соответствующий объем (как и для записей), но машинный код, в который транслируются методы класса, наличествует в единственном экземпляре, так как меняться он не может, и хранить несколько одинаковых копий подпрограмм не имеет смысла. Когда объект создается, однократно вызывается специальный метод,

называемый конструктором. В нем выполняются различные действия по начальной инициализации полей объекта. Когда объект уничтожается (например, он был описан внутри процедуры как локальная переменная и удаляется из памяти при ее завершении), вызывается другой метод — деструктор, который выполняет различные дополнительные действия по освобождению памяти, если это необходимо. Явно вызывать конструктор и деструктор из программного кода нельзя. Это происходит только автоматически. Переменная, описанная как класс, фактически является указателем на экземпляр класса. Это сделано для повышения эффективности работы с ним. Однако при использовании таких переменных применять операции работы с указателями (", @) не надо. Достаточно обычного обращения к ним как к обычным переменным, а к членам класса — как к полям записи, через точку.

Наследование

Чтобы наиболее эффективно повторно использовать ранее созданные классы, одного сочетания данных и методов в единой структуре недостаточно. Например, автомобиль может быть легковым и грузовым, и соответствующие классы будут иметь как общие поля и методы, так и отличия (например, дополнительное свойство «грузовой кузов* и связанный с ним метод «разгрузить»). Однако полностью заново определять новый тип данных, если требуется изменить или добавить несколько новых свойств к старому типу, нерационально. Это плохо еще и потому, что если в метод, имеющийся в обоих классах, потребуется внести исправления, то их придется делать дважды, в двух одинаковых копиях подпрограмм. Чтобы избежать ненужной работы, в объектном программировании был введен принцип наследования свойств и методов. Программисту достаточно описать один базовый класс (например, «автомобиль*), а классы «легковой автомобиль» и «грузовой автомобиль* основывать на этом базовом классе. При этом будут наследоваться все поля, свойства и методы базового (или родительского) класса, а дополнительно описывать их не требуется. Цепочки наследования могут быть неограниченной длины. Так, у класса «грузовой автомобиль» могут быть классы-наследники (или дочерние классы) «МАЗ» и «КАМАЗ», обладающие дополнительными специфическими свойствами и методами (это классы, а не объекты; объектом будет конкретный грузовик МАЗ, а не марка этого автомобиля), у класса «кнопка* наследники — «графическая кнопка», «круглая кнопка» и так далее. При этом различные методы для каждого из наследников разрешается переопределять. Например, метод «двигаться» для классов «МАЗ» и «КАМАЗ» будет, хоть и немного, но отличаться: по-разному расходуется горючее (снижается значение соответствующего свойства), по-разному набирается скорость и так далее.

Полиморфизм

Когда будет происходить обращение к переменной, относящейся к классу «КАМАЗ», и вызов унаследованного метода «двигаться», программе придется решить, какой конкретно метод надо вызвать: метод класса «автомобиль», «грузовой автомобиль» или «КАМАЗ». В соответствии с принципом полиморфизма решение принимается в зависимости от типа переменной, вызывающей этот метод. То есть, если переменная описана как относящаяся к типу «КАМАЗ*, будет вызван метод «двигаться», определенный именно для КАМАЗа.

Инкапсуляция

Инкапсуляция позволяет разграничить доступ разработчиков к различным полям и свойствам класса, примерно так, как это сделано в модулях Delphi, когда из других модулей видима только интерфейсная часть. Точно так же и внутри классов некоторые поля и методы можно сделать свободно доступными для использования {видимыми) в любом месте программы, а другие поля и методы сделать доступными только внутри текущего модуля и собственных методов класса. Это позволяет скрыть внутри описания различные характеристики и возможности класса, чтобы сосредоточить

внимание разработчиков, повторно использующих этот класс, на его важнейших свойствах. Кроме того, желательно не допускать бесконтрольного изменения значений свойств, так как это может привести к нарушению запланированной и сбалансированной взаимосвязи между этими свойствами. Например, нельзя бездумно изменить значение свойства «текущая скорость», просто записав в него новое число. Надо вызвать соответствующий метод, который учтет изменение потребления бензина и выполнит ряд дополнительных действий. Хорошим стилем программирования считается недоступность всех полей и свойств объекта для прямого изменения. Вместо этого создаются методы, позволяющие получить значение поля и занести в него новое значение. Сами поля помещаются в скрытую часть класса.

№31 Текстовые файлы. Процедуры и функции обработки текстовых файлов.

Текстовый файл – это последовательность символьных строк, переменной длинны. Всякая строка завершается маркером конца строки. Всякий текстовый файл завершается маркером конца файла. Такие файлы можно обрабатывать только последовательно. Один и тот же текстовый файл не может быть открыт для ввода и вывода данных. Файловая переменная такого файла имеет тип Text File или Text для работы с текстовыми файлами используются следующие процедуры:

Procedure AssignFile(f,File Name); Связывает файловую переменную f с дисковым файлом File Name

Procedure Rewrite(f);Создает новый файл и открывает его для записи(вывода). Если файл существует, то он уничтожается и создается как новый

Procedure Reset(f); Открывает существующий файл для чтения. При его отсутствии возникает ошибка ввода(вывода)

Procedure Read(f,v1[,v2,…,vn]); Читает данные из файла и заносит их в переменные v1,v2,…,vn

Procedure Write(f,v1[,v2,…,vn]); Записывает данные из переменных v1,v2,…,vn в файл

Procedure Close File(f); Закрывает файл

Function Eof(f):boolean; Возвращает True, если достигнут конец файла.

Procedure Append (f:Text File);Открывает существующий файл для добавления строк в конец файла. При отсутствии файла возникает ошибка ввода/вывода.

Procedure Readln (f:Text File[v1,v2,…vn]);Читает данные из файла целыми строками и заносит их в переменные v1,v2,…vn. Если список переменных пуст, то происходит перемещение указателя на следующую строку.

Procedure Vriteln (f:Text File[v1,v2,…vn]);Записывает данные в файл целыми строками из переменных v1,v2,…vn. Если список переменных пуст, то происходит вставка в файл пустой строки.

№28 Операторы прерывания циклов Break, Continue, Exit, Abort. Примеры использования.

В некоторых случаях желательно прервать повторение цикла, проанализировав какие-то условия в нутрии его. Это может потребоваться в тех случаях, когда проверки условия окончание цикла грамматически требуют многоэтапного сравнения и сопутствие каких-то данных.

Оператор Break. Этот оператор прерывает выполнение тела любого цикла и передает управление следующему за циклом оператору. Цикл считается выполненным.Пример:

S:=0;

i:=0;

Repeat

Inc(i);

S:=S+z[i];

If(s>14) then Break;

Until(i=44)

Оператор Continue. Он прерывает выполнение итерации(текущего выполнения тела цикла) и передает управление на следующую итерацию. Также он может быть размещен в теле цикла. При его выполнении, не зависимо от того где он расположен, управление сразу передается в начало цикла для выполнения следующего шага. Пример:

S:=0;

i:=0;

Repeat

Inc(i);

S:=S+z[i];

If(s>20) then Continue;

If(s>14) then Break;

Until(i=44)

Оператор Exit. Он, в отличие от Break, прерывает не только выполнение цикла, но и процедуру или функцию, в которой находится этот цикл.

Оператор Abort. Прерывать выполнение цикла заодно и блока, в котором он расположен, можно инсценировав какое-то исключение. Наиболее часто в этих целях используется оператор Abort. Он генерирует «молчаливое» исключение(сообщение об ошибке нет). «Молчаливое» исключение предназначено для намеренного прерывания вычислений и быстрого выхода из глубоко вложенных процедур и функций. Пример: If(условие) then Abort;

№40 Множество. Описание типа и описание переменной типа множество. Примеры.

Множество — это группа элементов, которая ассоциируется с ее именем и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Один и тот же элемент не может входить в множество более одного раза. Как частный случай, множество может быть пустым. Множество определяется перечислением его элементов, заключенным.в прямоугольные скобки. Такая форма определения называется конструктором множества. Например, если множество возможных единичных символов, которые могут быть получены в ответ на вопрос программы «Yes/No», содержит символы «у», «Y», «п» и «N», то это множество можно описать таким конструктором:

[‘y’,’Y’,’n’,’N’]

Для определения, принадлежит ли переменная множеству, служит операция in. В предыдущем примере проверить, дал ли пользователь один из допустимых ответов, можно оператором:

if (Key in ['у' , 'У,'n' , 'N’ ] )

then <оператор, выполняемый при допустимом ответе>

Множества могут содержать не только отдельные значения, но и ограниченные типы. Например, если вы хотите контролировать символы, вводимые пользователем При вводе целого положительного или отрицательного числа, вы можете определить множество ['0'..'9', '+', '-'] и использовать его, например, при обработке события On Key Press какого-то окна редактирования:

if not(Key in ['0'-.'9' , ' + ', '-'] ) then Key := #0;

Подобный оператор не позволяет пользователю ввести какие-то символы, отличные от имеющихся в множестве.

В приведенных операторах множество заранее не объявлялось в виде типа. Но если, например, в приложении в ряде мест надо проводить проверки, аналогичные приведенным выше, то целесообразнее объявить переменную или типизированную константу типа множества или тип множества и несколько переменных этого типа. Объявление типа множества делается в форме set of <Базовый тип> Приведем примеры,

Объявление глобальной переменной с инициализацией:

var К: set of Char=['0'..'9' , '+' , '-'];

if (Key in К) then ...

Объявление типизированной константы:

const К: set of Char=['0'..'9’, '+' , '-'];

Объявление типа множества и переменных этого типа:

type TDigit = set of '0'..'9' ;

var D1, D2: TDigit;

D1 := [ ' 0 ', ' 1' ] ;

D2 : = [' 2 ' . .’9'] ;

Помимо операции in для множеств определен еще ряд операций: объединение, пересечение, операции отношения и ряд других.

№29 Исключения и их обработка. Операторы Try – Except – End, On – Do, Try – Finally – End. Примеры использования.

При работе программы могут возникать различного рода ошибки: переполнение, деление на ноль, попытка открыть не существующий файл и так далее. При возникновении таких исключительных ситуаций программа генерирует так называемые исключения и выполнение дальнейших вычислений в данном блоке прекращается. Исключение- это объект специального вида характеризующий возникшую в программе исключительную ситуацию. Исключение может содержать в виде параметров некоторую уточняющую информацию. Для обработки исключений используются следующие конструкции: Try – Except – End, On – Do, Try – Finally – End.

Оператор Try – Except – End. Это новейшее средство языка Delphi используется для предотвращения исключительных ситуаций, которые могут возникать при выполнении программы. К их числу относятся: сбои в работе аппаратуры, ошибки вычисления, / 0 и так далее. Синтаксис:

Try

<операторы, способные создать ИС>

Except

<операторы, обрабатывающие генерированные ИС>

End;

Оператор работает следующим образом. Выполнение начинается с операторов расположенных в блоке Try-Except. Если в каком-то операторе возникает ИС, то она подавляется. Затем выполняется все операторы, расположенные в блоке Except-End.В результате предотвращается аварийное прерывание программы. Пример:

i:=0;

n:=8;

Try

i:=n div i:

n:=i+9;

Except

Show Message (‘Ошибка деления на ноль в операторе i:=n/i’)

End;

Результатом выполнения данного блока операторов будет появляется на экране форма с сообщением «деление …..» После оттого программа продолжит работу с оператором следующим за словом End, а не с оператором n:= i+9.

Оператор On-Do. При возникновении ИС язык Delphi позволяет не только предотвратить прерывание программы, но и определить, какого именно вида была ИС. Для этого в блоке Except-End можно использовать оператор On-Do. Пример:

n:=8;

Try

i:=StrToInt(Edit1.Text);

k:=n div i;

n:=i+9;

Except

On EConvertError do Show Message (‘Ввели не целое число’);

On EdivByZero do ShowMessage(‘Деление на ноль’);

End;

Оператор Try – Finally – End. Блок Try – Finally – End также используется для предотвращения ИС, которые могут возникнуть при выполнении программы. В отличии от блока Try – Except – End блок Try – Finally – End используется для освобождения ресурсов памяти, закрытия файлов и программ в случае возникновения ИС. Синтаксис:

Try

<операторы, способные создать ИС>

Finally

<операторы, выполняемые в любом случае (например, освобождения ресурсов памяти)>

End;

Блок Try – Finally – End работает следующим образом. Выполнение начинается с операторов блока Try – Finally, которые в правильно написанной программе должны содержать операторы выделения ресурсов памяти. Если в каком-либо операторе возникает ИС, то управление сразу передается к операторам блока Finally – End, где производится освобождение памяти, закрытие файлов и программ. В результате, с одной стороны, предотвращается аварийное прерывание программы и, во вторых, корректно освобождается ранее зарезервированная память, выполняется ряд других необходимых операций. Блок Finally – End выполняется всегда вне зависимости от того, была или не была сгенерирована ИС. Пример:

i:=0;

n:=8;

Try

GetMen (p,8000); {выделение памяти}

i:=n div i;

n:=i+9;

Finally

FreeMen (p,8000); {освобождение памяти}

END;

№33 Файлы без типа. Процедуры и функции обработки файлов без типа.

Нетипизированные файлы — это двоичные файлы, которые могут содержать самые различные данные в виде последовательности байтов. Программист при чтении этих данных сам должен разбираться, какие байты к чему относятся. Тип файловой переменной нетипизированного файла объявляется следующим образом:

var <иыя файловой переменной>; file;

Открытие не типизированных фалов осуществляется теми же процедурами Reset и Rewrite, но их синтаксис несколько отличен от аналогичных процедур для других видов файлов:

procedure Reset: (var P: File; Recsize: Word) ;

procedure Rewrite(var F: File; Recsize: Word) ;

В этих процедурах Recsize — необязательный параметр, который указывает размер одной записи в файле (одного элемента файла) в байтах. Если параметр Recsize не задан, то размер одной записи предполагается равным 128 байтам. Вместо процедур записи и чтения Read и Write в нетипизированных файлах имеются процедуры BIockBead и BlochWrite, объявленные следующим образом:

procedure BlockWrite(var fr File; var Buf; Count: Word;

[var Result : Word]) ;

procedure BlockReadjvar F; File; var Buf ; Count: Word;

[var Result: Word]);

В этих процедурах Buf — любая переменная, содержимое которой записывается в файл или в которую читаются записи из файла. Count — выражение типа Word, определяющее число записываемых или читаемых записей. В необязательный параметр Result заносится число реально записанных или прочитанных записей. Это число может быть меньше или равно числу, указанному как Count. Недостаточное значение Result при чтении может, например, свидетельствовать, что конец файла достигнут ранее, чем прочиталось заданное число записей. А при записи это может означать, например, что диск переполнился.

№33 Файлы без типа. Процедуры и функции обработки файлов без типа.

Нетипизированные файлы — это двоичные файлы, которые могут содержать самые различные данные в виде последовательности байтов. Программист при чтении этих данных сам должен разбираться, какие байты к чему относятся. Тип файловой переменной нетипизированного файла объявляется следующим образом:

var <иыя файловой переменной>; file;

Открытие не типизированных фалов осуществляется теми же процедурами Reset и Rewrite, но их синтаксис несколько отличен от аналогичных процедур для других видов файлов:

procedure Reset: (var P: File; Recsize: Word) ;

procedure Rewrite(var F: File; Recsize: Word) ;

В этих процедурах Recsize — необязательный параметр, который указывает размер одной записи в файле (одного элемента файла) в байтах. Если параметр Recsize не задан, то размер одной записи предполагается равным 128 байтам. Вместо процедур записи и чтения Read и Write в нетипизированных файлах имеются процедуры BIockBead и BlochWrite, объявленные следующим образом:

procedure BlockWrite(var fr File; var Buf; Count: Word;

[var Result : Word]) ;

procedure BlockReadjvar F; File; var Buf ; Count: Word;

[var Result: Word]);

В этих процедурах Buf — любая переменная, содержимое которой записывается в файл или в которую читаются записи из файла. Count — выражение типа Word, определяющее число записываемых или читаемых записей. В необязательный параметр Result заносится число реально записанных или прочитанных записей. Это число может быть меньше или равно числу, указанному как Count. Недостаточное значение Result при чтении может, например, свидетельствовать, что конец файла достигнут ранее, чем прочиталось заданное число записей. А при записи это может означать, например, что диск переполнился.

№17Операторы цикла с параметром For-To, For-Downto. Синтаксис и семантика (порядок выполнения) операторов. Заголовок, тело цикла, счетчик. Примеры.

Оператор For обеспечивает циклическое повторение некоторого оператора (в частности составного оператора) заданное число раз. Повторяющий оператор называется телом цикла. Повторение цикла определяется некоторой управляющей переменной (счетчик), которая увеличивает или уменьшает на единицу при каждом выполнении тела цикла. Повторение завершается, когда управляющая переменная достигает конечного значения. Оператор For записывается:

For <счетчик>:=<начальное значение> to <конечное значение> do <оператор>; или

For <счетчик>:=<начальное значение> downto <конечное значение> do <оператор>;

Здесь конструкция For … do называется заголовком цикла, а <оператор> телом цикла, <счетчик> управляющей переменной порядкового типа, в начале выполнения оператора For ей присваивается начальное значение. После каждого очередного выполнения тела цикла ее значение увеличивается (где to) на единицу, когда значение управляющей переменной достигает конечного значения, тело цикла выполняется в последний раз, после чего управление передается оператору, следующему за структурой for. <начальное значение> и <конечное значение> являются выражения совместимые по типу с управляющей переменной. Если заданное начальное и конечное значение равны, то тело цикла выполняется только один раз. Если в форме с to начальное больше конечного значения или в форме с downto начальное меньше конечного значения, то тело цикла не выполняется ни разу. Внутри цикла значение управляющей переменной может использоваться в выражениях, однако, нельзя изменять ее значение.

Примеры:

1)…

S:=0;

For i:=1 to 10 do s:p=s+i;

2)…

S:=0

For i:=10 downto 1 do s:=s+1;

№21 Одномерные динамические массивы. Описание и использование. Обращение к элементам массива. Стандартные функции обработки массивов. Примеры.

Динамические массивы отличаются от обычных статических массивов тем, что в них не объявляется заранее длинна - число элементов. Поэтому динамические массивы удобно использовать в приложениях, где объем обрабатываемых массивов заранее не известен и определяется в процессе выполнения в зависимости от действий пользователя или объема перерабатываемой информации. Объявление динамического массива содержит только его имя и тип элементов- один из базовых типов. Синтаксис объявления: <имя>:array of <базовый тип>. При объявлении динамического массива в памяти под него не отводится место. Прежде, чем использовать массив, надо задать его размер процедурой SetLength. В качестве аргументов в нее передаются имя массива и целое значение, характеризующее число элементов. Например: SetLength(А,10); выделяет для массива А место впамяти под 10 элементов и задает нулевые значения всех элементов. Индексы динамических массивов всегда целые числа, начинающиеся с 0. (от А[0] до A[9] в примере) Повторное применение SetLength к уже существующему в памяти массиву изменяет его размер. Если новое значение размера больше предыдущего, то все значения элементов сохраняются и просто в конце добавляются новые нулевые элементы. Если же новый размер меньше предыдущего, то массив усекается, и в нем отсекаются значения первых элементов (т.е. остаются). Если динамический массив уже размещен в памяти, к переменной этого массива можно применять стандартные для массивов функции:

Length – длинна – число элементов массива

Highнаибольшее значение индекса

Lowнаименьшее значение индекса

Очевидно, что всегда High= Length – 1 и Low всегда 0. Если массив имеет нулевую длину, то High возвращает -1, т.е. при этом получается, что High<Low. Удалить из памяти динамический массив можно одним из следующих способов: присвоить ему значение nil, использовать функцию Finalize или установить нулевую длину. Пример: A:=nil; Finalize(A); SetLength(А,0);

№16 Условный оператор If. Синтаксис оператора и семантика (порядок работы) оператора. Примеры. Оператор выбора Case. Синтаксис оператора и семантика (порядок выполнения) оператора. Примеры.

Оператор if предназначен для выполнения тех или иных действий в зависимости от истинности или ложности некоторого условия. Условие задается выражением, имеющим результат булева типа. Оператор имеет две формы: if...then и if...then...else. Форма if..-then имеет вид:

if <условие> then <оператор>;

Если условие возвращает true, то указанный в конструкции if оператор выполняется. В противном случае управление сразу передается оператору, следующему за конструкцией if. Например, в результате выполнения операторов

С :=А;

if В > A then С := В;

переменная С станет равна максимальному из чисел А и В, поскольку оператор С:= В будет выполнен только при В > А.

Форма конструкция if...then...else имеет вид:

if <условие> then <оператор!> else <оператор2>;

Если условие возвращает true, то выполняется первый из указанных операторов, в противном случае выполняется второй оператор. Обратите внимание, что в конце первого оператора перед ключевым словом else точка с запятой не ставится. Приведем примеры.

if J = О

then

ShowMesssge('Деление на нуль' )

else

Result := I/J;

В качестве и первого, и второго оператора могут, конечно, использоваться и составные операторы:

if J = О

then begin

ShowMessage('Деление на нуль') ;

Result := 0;

end

else

Result := I/J;

Опять обратите внимание, что перед else точка с запятой не ставится. При вложенных конструкциях if могут возникнуть неоднозначности в понимании того, к какой из вложенных конструкций if относится элемент else. Компилятор всегда считает, что else относится к последней из конструкций if, в которой не было раздела else. Например, в конструкции.

if <условие!> then if <условие2> then <оператор!>

else <оператор2>;

else будет отнесено компилятором ко второй конструкции if, т.е. <оператор2> будет выполняться в случае, если первое условие истинно, а второе ложно. Иначе говоря, вся конструкция будет прочитана как

if <условие!>

then begin

if <условие2> then <оператор1> else <оператор2>

end;

Если же вы хотите отнести else к первому if, это надо записать в явном виде с помощью операторных скобок begin...end:

then begin

if <условие2> then <оператор1>

end

else <оператор2>;

Оператор case позволяет провести анализ значения некоторого выражения и в зависимости от его значения выполнять те или иные действия. В общем случае формат записи оператора case следующий:

case <выражение> of

<список значений 1>: <оператор 1>;

«список значений п>; <оператор п>;

f 1 ЧР

<оператор>

end;

В этой конструкции выражение должно иметь порядковый тип. Поэтому, например, нельзя использовать выражения, возвращающие действительные числа или строки. Списки значений могут содержать одно или несколько разделенных запятыми возможных значений константных выражений. После списка ставится двоеточие «:», а затем пишется оператор (может писаться составной оператор), который должен выполняться, если выражение приняло одно из перечисленных в списке значений. После выполнения этого оператора работа структуры case завершается и управление передается следующему за этой конструкцией оператору. Обратите внимание на это обстоятельство, поскольку в некоторых языках, например, в С, case выполняется иначе и после выполнения оператора соответствующего раздела структуры case продолжается выполнение последующих операторов, если только не использован оператор break языка С. В Object Pascal иначе: операторы всех последующих разделов не выполняются.

Если значение выражения не соответствует ни одному из перечисленных во всех списках, то выполняется оператор, следующий после ключевого слова else. Впрочем, раздел else не обязательно должен включаться в структуру case. В этом случае, если в списках не нашлось соответствующего значения выражения, то ни один оператор не будет выполнен. Списки могут содержать константы и константные выражения, которые совместимы по типу с объявленным выражением и которые компилятор может вычислить заранее, до выполнения программы. Допустимо использование ограниченных типов. Недопустимо использование переменных и многих функций. В списках не допускается повторение одних и тех же значений, поскольку в этом случае выбор был бы неоднозначным. Приведенный ниже пример анализирует переменную Key типа Char, содержащую символ, введенный пользователем в ответ на некоторый вопрос. При положительном ответе вызывается процедура FYes, при отрицательном — FNo, при иных ответах отображается сообщение об ошибке.

Case Key of

‘y’,’Y’ :FYes;

‘n’,’N’ :FNo;

Else

ShowMessage(‘Ошибочный ответ’);

End;

Приведем другой пример, использующий, в частности, ограниченные типы в списках и целую переменную I:

case I of

1..5 : Caption := 'Low';

6. . 9 : Caption : = ' High ' ;

0,10..99: Caption : = 'Out of range';

else

Caption : = " ;

end;

№12 Понятие выражения. Операторы и операнды. Операторы языка Delphi. Приоритет операторов. Примеры.

Выражение состоит из операндов и операторов. Операторы находятся между операндами и обозначают действия, которые выполняются над операндами. В качестве операндов выражения можно использовать: переменную, константу, функцию или другое выражение. Основные алгебраические операторы: сложение(+), вычитание(-), умножение(*), деление(/), деление нацело(div), вычисление остатка от деления(mod). При записи выражений между операндом и оператором, за исключением операторов DIV и MOD, пробел можно не ставить. Результат применения операторов +, -, * и / очевиден. Оператор DIV позволяет получить целую часть результата деления одного числа на другое. Например, значение выражения is DIV 7 равно 2. Оператор MOD, деление по модулю, позволяет получить остаток от деления одного числа на другое. Например, значение выражения 15 MOD 7 равно 1. В простейшем случае выражение может представлять собой константу или переменную. Примеры выражений:

123

0.001

i+1

А + В/С

Summa*0.75

(В1+ВЗ+ВЗ)/3

Cena MOD 100

При вычислении значений выражений следует учитывать, что операторы имеют разный приоритет. Так у операторов *, /, DIV, MOD более высокий приоритет, чем у операторов + и -. Приоритет операторов влияет на порядок их выполнения. При вычислении значения выражения в первую очередь выполняются операторы с более высоким приоритетом. Если приоритет операторов в выражении одинаковый, то сначала выполняется тот оператор, который находится левее. Для задания нужного порядка выполнения операций в выражении можно использовать скобки, например:

(г1+г2+гЗ)/(г1*г2*гЗ)

Выражение, заключенное в скобки, трактуется как один операнд. Это означает, что операции над операндами в скобках будут выполняться в обычном порядке, но раньше, чем операции над операндами, находящимися за скобками. При записи выражений, содержащих скобки, должна соблюдаться парность скобок, т. е. число открывающих скобок должно быть равно числу закрывающих скобок. Нарушение парности скобок — наиболее распространенная ошибка при записи выражений.

№37 Возможные ошибки при разработке программы. Отладка и тестирование программы. Требования к тестовым данным.

Успешное завершение процесса компиляции не означает, что в программе нет ошибок. Убедиться, что программа работает правильно можно только в процессе проверки ее работоспособности, который называется

тестирование. Обычно программа редко сразу начинает работать так, как надо, или работает правильно только на некотором ограниченном наборе исходных данных. Это свидетельствует о том, что в программе есть алгоритмические

ошибки. Процесс поиска и устранение ошибок называется отладкой. Ошибки, которые могут быть в программе, принято делить на три группы: синтаксические; ошибки времени выполнения; алгоритмические. Синтаксические ошибки, их также называют ошибками времени компиляции (Compile-time error), наиболее легко устранимы. Их обнаруживает компилятор, а программисту остается только внести изменения в текст программы и выполнить повторную компиляцию. Ошибки времени выполнения, в Delphi они называются исключениями (exception), тоже, как правило, легко устранимы. Они обычно проявляются уже при первых запусках программы и во время тестирования. При возникновении ошибки в программе, запущенной из Delphi, среда разработки прерывает работу программы, о чем свидетельствует заключенное в скобки слово Stopped в заголовке главного окна Delphi, и на экране появляется диалоговое окно, которое содержит сообщение об ошибке и информацию о типе (классе) ошибки. После возникновения ошибки программист может либо прервать выполнение программы, для этого надо из меню Run выбрать команду Program Reset, либо продолжить ее выполнение, например, по шагам (для этого из меню Run надо выбрать команду Step), наблюдая результат выполнения каждой инструкции. Если программа запушена из Windows, то при возникновении ошибки на экране также появляется сообщение об ошибке, но тип ошибки (исключения) в сообщении не указывается. После щелчка на кнопке ОК программа, в которой проявилась ошибка, продолжает (если сможет) работу. С алгоритмическими ошибками дело обстоит иначе. Компиляция программы, в которой есть алгоритмическая ошибка, завершается успешно. При пробных запусках программа ведет себя нормально, однако при анализе результата выясняется, что он неверный. Для того чтобы устранить алгоритмическую ошибку, приходится анализировать алгоритм, вручную "прокручивать" его выполнение. Требования к тестовым данным.