Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
informatika-otvety.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать
  1. Структура программы. Разделы объявления модулей, меток, данных, процедур и функций.

Программа на языке Pascal всегда состоит из двух основных частей: описания последовательности действий, которые необходимо выполнить, и описания данных, с которыми оперируют действия. Действия представляются операторами языка, данные вводятся посредством описаний и определений. Кроме того, программа может быть снабжена заголовком, который задаст имя программы и ее параметры.

Описания данных текстуально предшествуют описанию действий и должны содержать упоминание всех объектов, используемых в действиях (операторах).

Рассмотрим полную структуру программы на языке Паскаль. В общем случае программа состоит из:

 

  • заголовка программы - раздел начинается с ключевого слова program, далее идет название вашей программы.  Например, program Area; - обратите внимание, что любой оператор языка Паскальзаканчивается точкой запятой.  Также распространенной ошибкой является заголовок программы вида: program 1; Имя программы - это пользовательский идентификатор, и он не может начинаться с цифры.

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

  • блок операторов - единственный обязательный блок программы, в нем вы размещайте, те команды которые должны быть выполнены в процессе выполнения программы. Блок операторов начинается с ключевого слова begin и заканчивается end с точкой.

 

 

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

Определение констант задает в программе идентификаторы, являющиеся синонимами (представителями) некоторых значений.

Определение типов предназначено для задания конкретных множеств значений. Указанные множества обозначаются именами (идентификаторами) и в дальнейшем могут служить для описания переменных.

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

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

В авторской версии языка Pascal описания всех перечисленных объектов должны быть сосредоточены в соответствующих разделах, а порядок следования разделов фиксирован. Однако, современные реализации, в частности, Turbo Pascal, не содержат такого ограничения. Иными словами, описания и определения всех объектов в блоке могут следовать в произвольном порядке.

  1. Объявление переменных различных типов.

объявления переменных в языке Delphi:    var имя_переменной : тип_переменной ;     Слово var - ключевое. Именем может быть любой идентификатор, если он не был описан ранее и не является одним из ключевых или зарезервированных слов языка Delphi. Если нужно описать несколько переменных одного типа, то их перечисляют, отделяя запятой:      var A, B, C : Integer;     Если несколько описаний следуют друг за другом, то ключевое слово var повторно можно не указывать: var A, B : Integer;         C, D : String;

  1. Объявление констант различных типов.

const pi=3.1415 ;          ZnakPi : String = 'Это значение числа пи';

  1. Библиотечный модуль пользователя. Структура модуля. Секции модуля, их назначение.

Приложения очень часто используют уже ранее созданные автономные программные блоки (процедуры и функции), созданные или самим программистом, или другими авторами. С целью упорядочиния их расположения при программировании используется модульный принцип построения программы, когда основная программа обращается к процедурам и функциям, которые могут находиться не только в самой основной программе (это не очень приветствуется), но и в автономных отдельно существующих макропрограммных единицах – модулях.

Каждый модуль представлен как минимум одним файлом, носящим имя модуля, – файлом *.pas, в котором хранится создаваемый программистом исходный код. Если модуль является еще и описателем какой-либо формы (модуль формы), то для него автоматически создается еще и файл *.dfm, в котором записаны значения параметров самой формы и компонентов на ней расположенных (кнопки, окна, списки и др.). После компилляции модуля образуется еще один файл - *.dcu, который содержит необходимый для выполнения программы код и именно такой файл требуется для подключения к основной программе, однако такой файл уже непригоден для чтения и редактирования программистом. Так основные стандартные модули со стандартными процедурами и функциями Delphi представлены именно в виде таких файлов. Например, описания компонентов кнопок хранятся в стандартном файле модуля buttons.dcu, который размещен в папке LIB.

Программист может использовать как уже существующие модули (с находящимися в них данными, процедурами и функциями), так и создавать свои собственные модули и помещать в них требуемые процедуры и функции.

Для создания нового модуля (без формы) следует выбрать опцию меню File\New и в открывшемся окне выбрать вариант Unit.

Для сохранения кода модуля в виде файла следует выбрать опцию меню File\Save и в открывшемся окне задать имя файла модуля, которое лучше сделать таким же, как и имя самого модуля.

Для подключения модуля к любой другой программной единице (в том числе и другому модулю) следует в разделе uses указать имя требуемого модуля.

Рассмотрим принцип построения модуля.

Заголовок модуля содержит ключевое слово Unit и имя модуля, совпадающее с именем файла модуля. Каждый модуль может состоять из трех секций: секции Интерфейса (Interface), секции Реализации (Implementation) и необязательной секции Инициализации.

Секция Интерфейса (Interface) предназначена для объявления глобальных данных (типов, констант, переменных), а также процедур и функций, которые будут доступны (видимы) для тех модулей, из которых происходит вызов нашего модуля. Процедуры и функции в этой секции только объявляются (со всеми своими параметрами), но не раскрывается их содержимое (это будет в следующей секции).

Секция Реализации (Implementation) позволяет подключить другие требующиеся для выполнения процедур и функций модули. В этой секции описываются данные (типы, константы и переменные), предназначенные для использования только в рамках данного модуля и недоступные (невидимые) для вызывающих модулей (локальные данные), а также приводится текст процедур и функций, объявленных в секции Интерфейса.

Секция Инициализации не имеет своего ключевого слова и начинается со слова Begin, а завершается словом End. Код, записанный между этими программными скобками, предназначен для исполнения при первом же вызове (из какого-либо модуля). Если необходимости в этом нет, то данная секция может отсутствовать.

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

Unit <имя модуля>;

Interface {Секция Интерфейса}

Procedure Integral1(a,b : real; var c : real);

Procedure Summa(d,e : real; var f : real);

Function Integral2(ff,dd : real) : real;

Implementation {Секция Реализации}

Uses <имена подключаемых модулей>

Procedure Integral1(a,b : real; var c : real);

Begin

Текст процедуры

End;

Procedure Summa(d,e : real; var f : real);

Begin

Текст процедуры

End;

Function Integral2(ff,dd : real) : real;

Begin

Текст функции

End;

Begin {Секция Инициализации}

Текст секции Инициализации

End.

  1. Операторы присваивания, безусловного перехода и вызова процедур.

Оператор присваивания  Оператор присваивания (:=) вычисляет выражение, заданное в его правой части, и присваивает результат переменной, идентификатор которой расположен в левой части. Например:

X := 4; Y := 6; Z := (X + Y) / 2;

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

В общем случае для числовых типов данных действует следующее правило: выражение с более узким диапазоном возможных значений можно присвоить переменной с более широким диапазоном значений. Например, выражение с типом данных Byte можно присвоить переменной с типом данных Integer, а выражение с типом данных Integer можно присвоить переменной с типом данных Real. В таких случаях преобразование данных из одного представления в другое выполняется автоматически:

var B: Byte; I: Integer; R: Real; begin B := 255; I := B + 1; // I = 256 R := I + 0.1; // R = 256.1 I := R; // Ошибка! Типы данных несовместимы по присваиванию end.

Исключение составляет случай, когда выражение принадлежит 32-разрядному целочисленному типу данных (например, Integer), а переменная - 64-разрядному целочисленному типу данных Int64. Для того, чтобы на 32-разрядных процессорах семейства x86 вычисление выражения происходило правильно, необходимо выполнить явное преобразование одного из операндов выражения к типу данных Int64. Следующий пример поясняет сказанное:

var I: Integer; J: Int64; begin I := MaxInt; // I = 2147483647 (максимальное целое) J := I + 1; // J = -2147483648 (неправильно: ошибка переполнения!) J := Int64(I) + 1; // J = 2147483648 (правильно: вычисления в формате Int64) end.

Оператор безусловного перехода  Среди операторов языка Delphi существует один редкий оператор, о котором авторы сперва хотели умолчать, но так и не решились. Это оператор безусловного перехода goto ("перейти к"). Он задумывался для того случая, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой, оператор.

Метка - это именованная точка в программе, в которую можно передать управление. Перед употреблением метка должна быть описана. Раздел описания меток начинается зарезервированным словом label, за которым следуют имена меток, разделенные запятыми. За последним именем ставится точка с запятой. Типичный пример описания меток:

label Label1, Label2;

В разделе операторов метка записывается с двоеточием. Переход на метку выполняется с помощью зарезервированного слова goto, за которым следует имя метки:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

label M1, M2;

begin M1: Write('Желаем успеха '); goto M2; Write('А этого сообщения вы никогда не увидите!'); M2: goto M1; Writeln('в освоении среды Delphi!'); Writeln('Press Enter to exit...'); Readln; end.

Эта программа будет выполняться бесконечно, причем второй оператор Write не выполнится ни разу!

Внимание! В соответствии с правилами структурного программирования следует избегать применения оператора goto, поскольку оно усложняет понимание логики программы. Оператор goto использовался на заре программирования, когда выразительные возможности языков были скудными. В языке Delphi без него можно успешно обойтись, применяя условные операторы, операторы повтора, процедуры Break и Continue, операторы обработки исключений 

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

Writeln('Hello!'); // Вызов стандартной процедуры вывода данных MyProc; // Вызов процедуры, определенной программистом

  1. Условные переходы. Два варианта операторов условного перехода «if».

Оператор ветвления if  Оператор ветвления if - одно из самых популярных средств, изменяющих естественный порядок выполнения операторов программы. Вот его общий вид:

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

Условие - это выражение булевского типа, оно может быть простым или сложным. Сложные условия образуются с помощью логических операций и операций отношения. Обратите внимание, что перед словом else точка с запятой не ставится.

Логика работы оператора if очевидна: выполнить оператор 1, если условие истинно, и оператор 2, если условие ложно. Поясним сказанное на примере:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var A, B, C: Integer;

begin A := 2; B := 8; if A > B then C := A else C := B; Writeln('C=', C); Writeln('Press Enter to exit...'); Readln; end.

В данном случае значение выражения А > В ложно, следовательно на экране появится сообщение C=8.

У оператора if существует и другая форма, в которой else отсутствует:  if <условие> then <оператор>;

Логика работы этого оператора if еще проще: выполнить оператор, если условие истинно, и пропустить оператор, если оно ложно. Поясним сказанное на примере:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var A, B, C: Integer;

begin A := 2; B := 8; C := 0; if A > B then C := A + B; Writeln('C=', C); Writeln('Press Enter to exit...'); Readln; end.

В результате на экране появится сообщение С=0, поскольку выражение А > В ложно и присваивание С := А + В пропускается.

Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов. При вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует. Например:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var A: Integer;

begin Readln(A); if A >= 0 then if A <= 100 then Writeln('A попадает в диапазон 0 - 100.') else Writeln('A больше 100.') else Writeln('A меньше 0.'); Writeln('Press Enter to exit...'); Readln; end.

Конструкций со степенью вложенности более 2-3 лучше избегать из-за сложности их анализа при отладке программ

  1. Условные операторы. Особенности оператора «Case».

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

case <переключатель> of <список ?1 значений переключателя>: <оператор 1>; <список ?2 значений переключателя>: <оператор 2>; ... <список ?N значений переключателя>: <оператор N>; else <оператор N+1> end;

Оператор case вычисляет значение переключателя (который может быть задан выражением), затем последовательно просматривает списки его допустимых значений в поисках вычисленного значения и, если это значение найдено, выполняет соответствующий ему оператор. Если переключатель не попадает ни в один из списков, выполняется оператор, стоящий за словом else. Если часть else отсутствует, управление передается следующему за словом end оператору.

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

Список значений переключателя может состоять из произвольного количества констант и диапазонов, отделенных друг от друга запятыми. Границы диапазонов записываются двумя константами через разграничитель в виде двух точек (..). Все значения переключателя должны быть уникальными, а диапазоны не должны пересекаться, иначе компилятор сообщит об ошибке. Тип значений должен быть совместим с типом переключателя. Например:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var Day: 1..31;

begin Readln(Day); case Day of 20..31: Writeln('День попадает в диапазон 20 - 31.'); 1, 5..10: Writeln('День попадает в диапазон 1, 5 - 10.'); else Writeln('День не попадает в заданные диапазоны.'); end; Writeln('Press Enter to exit...'); Readln; end.

Если значения переключателя записаны в возрастающем порядке, то поиск требуемого оператора выполняется значительно быстрее, так как в этом случае компилятор строит оптимизированный код. Учитывая сказанное, перепишем предыдущий пример:

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var Day: 1..31;

begin Readln(Day); case Day of 1, 5..10: Writeln('День попадает в диапазон 1, 5 - 10.'); 20..31: Writeln('День попадает в диапазон 20 - 31.'); else Writeln('День не попадает в заданные диапазоны.'); end; Writeln('Press Enter to exit...'); Readln; end.

  1. Операторы повтора. Сравнительный анализ трех типов операторов повтора.

Операторы повтора - циклы  Алгоритм решения многих задач требует многократного повторения одних и тех же действий. При этом суть действий остается прежней, но меняются данные. С помощью рассмотренных выше операторов трудно представить в компактном виде подобные действия в программе. Для многократного (циклического) выполнения одних и тех же действий предназначены операторы повтора (циклы). К ним относятся операторы for, while и repeat. Все они используются для организации циклов разного вида.

Любой оператор повтора состоит из условия повтора и повторяемого оператора (тела цикла). Тело цикла представляет собой простой или структурный оператор. Оно выполняется столько раз, сколько предписывает условие повтора. Различие среди операторов повтора связано с различными способами записи условия повтора.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]