Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

.Алфавитом языка называют набор символов представленный в таблице ASCII кодов загруженный в Оперативку или в ПЗУ, регистр роли не играет.Лексическая структура языка. Символы из алфавита языка



1 ВОПРОС

.Алфавитом языка называют набор символов представленный в таблице ASCII кодов загруженный в Оперативку или в ПЗУ, регистр роли не играет.Лексическая структура языка.
Символы из алфавита языка используются для построения базовых элементов Pascal-программ — лексем.
Лексема — минимальная единица языка, имеющая самостоятельный смысл.
В Turbo Pascal имеются следующие классы лексем:
1. Служебные (зарезервированные) слова.Это ограниченная группа слов, построенных из букв. Каждое служебное слово представляет собой неделимое образование, смысл которого фиксирован в языке. Служебные слова НЕЛЬЗЯ использовать в качестве имен, вводимых программистом (т.е. в качестве идентификаторов переменных, констант и т.д.).
2. Идентификаторы (имена переменных)
3.Специальные символы и метки. (+, -, /, *, …)-простые, составные (< >, >=,< =,:=).
Комментарии. Это пояснительный текст который можно записать в любом месте программы где разрешон пробел. Ограниченный {..}.
директивами компилятора, конструкции, как комментарии, заключаются в фигурные скобки, но они не носят характер пояснений к программе, а являются инструкциями Pascal-компилятору, предписывающими тот или иной режим обработки Pascal-программы.. Начинается с {$< имя директивы и параметра >}
Фрагмент
программы Содержание Примечание
Заголовок Program < имя программы > Необязательный
Раздел 0 описание модулей, библиотек USES Модуль 1, Модуль 2, … Модуль N, Разделы описаний программного блока
Раздел I описание меток LABEL Метка 1, Метка 2,Метка N,
Раздел 2 описание констант CONST < Идентификатор 1 > = < 3начение 1 >;
Раздел 3 описание типов данных TYPE < имя типа 1 > = < значение типа 1 >;
Раздел 4 описание переменных VAR < список 1 идентификаторов переменных >:< тип 1 >;
Раздел 5 PROCEDURE, FUNCTION Описанию подлежат только процедуры и функции, определяемые пользователем.
Раздел 6 BEGIN … END. — тело программы Раздел исполняемых операторов
Раздел описания модулей USES, где за ключевым словом USES указывается список, в котором перечисляются все имена библиотек (модулей) стандартных и пользовательских, к процедурам и функциям которых есть обращение в программе. Если таких обращений нет, то раздел USES не нужен.
Раздел описания меток LABEL,где за ключевым словом LABEL указывается список, в котором перечисляются все имена меток, встречающихся в программе.
Раздел описания констант CONST.Раздел существует, если в алгоритме используется по крайней мере одна константа, то есть величина, не изменяющая своего значения в процессе выполнения программы
Раздел описания типов TYPE.Описания требуют только типы, образованные пользователем.. Примеры описания пользовательских типов:
TYPE
DAY= 1..31; {Интервальный тип}
Matr = ARRAY[1..5,1..8] OF INTEGER; {Перечисляемый тип}
VAR
A, B: DAY; X, Y: Matr; {явное описание типов }
YEAR: 1900.. 2000; LES: (LPT, PRN); {неявное описание типов }
Раздел описания переменных VARЭто обязательный раздел. Любая встречающаяся в программе переменная должна быть описана. В языке нет переменных, объявляемых по умолчанию. Основная цель этого раздела определить количество переменных в программе, какие у них имена (идентификаторы) и данные каких типов хранятся в этих переменных.
Раздел описания процедур и функций.
PROCEDURE < имя процедуры > (< параметры >); {заголовок процедуры}
< разделы описаний > {тело процедуры }
BEGIN< раздел операторов >END;
FUNCTION < имя функции >(< параметры >): < тип результата >; { заголовок }
< разделы описаний > {тело функции}
BEGIN< раздел операторов > END;
Раздел операторов. Это основной раздел, именно в нем в соответствии с предварительным описанием переменных, констант, функций и процедур выполняются действия, позволяющие получать результаты, ради которых программа и писалась.



2 ВОПРОС

Тип — это множество значений + множество операций, которые можно выполнять над этими значениями,.
Функции:Odd(X)-возвращает результат логического типа,succ(x)-(х+1),Pred(x)-(х-1),ord(Х)-аргумент Х,abs(х)-модуль Х,chr(Х)-возвращ. символ ASCII код которого = Х,sqr(Х)-квадрат Х,sqrt(х)- корень из Х,exp(Х)- е в степени Х,sin,cos,ln,arctan,dec(Х,i)-уменьшает х на I,inc(x,i)- увеличивает Х на I
Иерархия типов в языке Паскаль такая:
1. Простые
• Скалярные
o Порядковые-Целые,Логические,Символьные,Перечисляемые,Интервальные
o Вещественные
o Перечисляемые
• Ограниченные
2. Структурированные
o Массивы, Строки, Множества, Записи, Файлы
3. Указатели
4. строки
5. процедурные
Целые типы — множества целых значений (арифметические операции- +, -, *, div, mod, and, or, not, xor.)
имя в памяти ЭВМ Диапазон значений числа
BYTE 1 байт 0.. 255
SHORTINT 1 -128.. 127
WORD 2 0.. 65535
INTEGER 2 -32768.. 32767
LONGINT 4 -2147483648.. 2147483647

 


3 ВОПРОС

Вещественный тип- представляет собой вещественные значения, которые используются в арифметических выражениях и занимают памяти от 4 до 6 байт. Паскаль допускает представление вещественных значений и с плавающей и с фиксированной точкой. На изображение числа отводиться 17 позиций Write (x:m:n)-с фиксированной точкой, где m-общее поле выводимого числа, n-поле дробной части.,x=m*B^n, где m — мантисса, В — основание представления числа с плавающей точкой, n — порядок (целое число).
Функции:abs(х)-модуль Х, chr(Х)-возвращ. символ ASCII код которого = Х, sqr(Х)-квадрат Х, sqrt(х)- корень из Х, exp(Х)- е в степени Х, sin(х), cos(Х)
ln(Х), arctan(Х), Trunc(x)- отбрасывает дробную часть, round(X)- откругляет Х до ближайшего целого
Название типа Длина,байты Мантисса, количество значащих цифр Диапазон десятичного порядка
SINGLE 4 7.. 8 -45.. 38
REAL 6 11.. 12 -39.. 38
DOUBLE 8 15.. 16 -324.. 308
EXTENDED 10 19.. 20 -4951.. 4932
Математический сопроцессор- устройство предназначенное для ускорения математических вычислений с вещественными числами. До $N переключатель между 2 моделями генерации объектного кода обработки чисел с плавающей точкой. Компилятор генерирует код для выполнения всех вещественных вычислений, $N- Вызывая подпрограммы библиотеки, $N+ с использованием математического сопроцессора и дает доступ к типам single, Double,extended, comp.! Без математического сопроцессора, тогда создаем с помощью $E+.
Перед использованием random((10)-5- функция где —5 < 5) в программах рекомендуется сначала запустить генератор псевдослучайных чисел процедурой Randomize. В противном случае при каждом запуске программы будет генерироваться одна и та же последовательность случайных чисел.

4 ВОПРОС

Литерный тип.
Литерный тип (символьный) char - определяется множеством значений кодовой таблицы компьютера, для размещения в памяти требуется 1 байт.
ASCII: стандартный американский код, используемый для обмена информацией,диапазон от 0 до 255.0 – 31 заняты под коды управления устройствами (монитор, принтер и др.) 32 до 127- Общая часть, Множество цифр и букв упорядочено в соответствии с кодом литер от 32 до 255, и связно, '0' < '1' < '2' <... < '9’;128 — 255, кодировка ГОСТа для подключения кириллицы.
Расширенный код – записывает в буфер клавиатуры, из которого выбирается процедурами ввода. Отводится 2 байта. Клавиатура курсора-функциональная клавиша или комбинация клавиш, то в первый байт =0, а второй = расширенному коду, если ASCII то код символа записывается в первый байт.
Функции:chr(x)-преобразует значение Х типа Byte в символ и возвращает значение символа.Ord(ch)-преобразет символ (ch) в его код типа Byte и возвращает значение кода. ord('A')=65, Pred(ch)-возвращает предыдущий символ,succ(6)- >7,возвращает следующий символ; upcase(‘p’)- >P.

2 ВОПРОС

. Булевский тип.- это перечисляемый тип содержащий 2 значения FAlSE(0) и TRUE(1).Занимает 1 байт.
логические операции: дизъюнкция (˅) OR, конъюнкция (˄) AND, исключающее ИЛИ (), отрицание () NOT, а также отношения <, >, < =, >=, < >, =.
Стандартные булевские функции:odd(x) = true, если x нечетный (x целый тип);eoln(x) = true, если встретился конец строки текстового файла x;
eof(x) = true, если встретился конец файла x.

6 ВОПРОС

. Выражения.-в алгоритмическом языке состоит из элементов конструкции символов, оно задает правила вычислений некого значения.
приоритет операций:
1. унарная операция not, унарный минус -, взятие адреса @
2. операции типа умножения * / div mod and shl shr
3. операции типа сложения + - or xor
4. операции отношения = < > < > < = >= in {}
Оператор присваивания — заменяет значения переменной идентификатор которой стоит в левой части на значение в правой части.x:=2; < Идентификатор >:= < Выражение >;

7 ВОПРОС

. Ввод информации с клавиатуры. Процедуры read и readln. Функции eof и eoln.
Ввод данных в языке программирования Паскаль обеспечивается процедурами read и readln. Ввод данных осуществляется либо с клавиатуры, либо из файла. Когда данные вводятся в память, то надо к ним в дальнейшем как-то обращаться, и знать, где они там лежат. Поэтому, когда в программе на Pascal используется процедура READ(X1, Х2, ХЗ, …), или READLN(X1, Х2, ХЗ, …), где X1, Х2, ХЗ,… — идентификаторы скалярных переменных. то в качестве фактического параметра (аргумента) ей передается имя переменной, которая будет связана с вводимыми данными. В процедуры ввода можно передавать не один фактический параметр, а множество. Отличие оператора READLN от READ заключается в том, что после считывания последнего в списке X1 Х2, ХЗ,… значения данные для следующего оператора READLN будут считываться с начала новой строки. То есть, если список ввода X1, Х2, ХЗ,… оператора READLN меньше чем число набранных в одну строку через пробел чисел, то оставшиеся в строке числа будут проигнорированы. Оператор READ сохранит оставшиеся числа для дальнейшего ввода. Оператор READLN без параметров вызывает приостановление программы до момента нажатия клавиши Enter.
Описание функции Eoln: eoln(x) = true, если встретился конец строки текстового файла x;
Функция Eof возвращает true, если позиция курсора находится в конце файла открытого с помощью Reset.
Функция Eoln используется процедурой Read, чтобы знать, когда был достигнут конец текущей строки. Необходимо только при чтении символьных данных — чтение числовых данных обрабатывает конец строки как незаполненное пространство, и перескакивает мимо этого при поиске следующего числа.

8 ВОПРОС

.. Вывод информации на экран. Процедура write и writeln. Правила их использования. Форматный вывод.
Вывод числовых данных, символов, строк и булевских значений на экран дисплея осуществляется с помощью операторов вызова стандартных процедур: WRITE(X1, Х2, ХЗ, …), или WRITELN(X1, Х2, ХЗ, …).
Отличие этих операторов состоит в том, что WRITELN после распечатки списка выражений XI, Х2, ХЗ,… автоматически переводит курсор в начало следующей строки, а после выполнения оператора WRITE курсор остается за последним символом, выведенным на экран.
Оператор WRITELN с пустым списком выводимых данных выводит строку пробелов. Управление форматом выводимых данных осуществляется непосредственно в операторе вывода. Для этого используется запись элемента из списка {Xi} в виде — X [: В [: С ]], где X — выражение, идентификатор переменной или константа, В — ширина поля для вывода данного X, С — точность (только для типа REAL). Точность представления определяет количество цифр после точки (дробная часть числа). Если указанная ширина поля оказывается 'слишком большой', то
значение данного выводится со стоящими впереди пробелами. Если указанная ширина ноля 'мала', то в строке вывода для значения этого данного добавляются (автоматически) необходимые позиции. Параметры формата (ширина поля B и точность С) могут быть константой, переменной или выражением целого типа. Если указать только число знакомест без фиксирования дробной части, то вывод будет в экспоненциальной форме.

 

9 ВОПРОС

Программирование ветвлений на Паскале
Program BID1;
var А, В, С: real;
begin readln(А, В);
if A >B. then C:=A
else C:=B;
writeln(С)
end.
Var R,A,C:real; z:char;
Begin
Writeln(‘vvedite A znak C’);
Readln(a,z,c);
Case z of
‘+’: R:=A+C;
‘-‘: R:=A-C;
End;
Writeln (‘R=’,R);
End.
Если вычислительный процесс зависит от определенных условий и реализуется по одному из нескольких заранее предусмотренных направлений, он называется разветвляющимся вычислительным процессом, а каждое из этих направлений — ветвью вычислений. Для выбора ветви вычислений в Паскале используются операторы if < логическое выражение > then BEGIN{Начало составного оператора} < Оператор n >END;{Конец составного оператора} else < оператор2 >.Составной оператор используется в тех конструкциях, где по синтаксису языка должен быть только один оператор, а для решения задачи требуется более одного.
Логические операции
var А,В,С,D: real;
begin readln(А,В,С);
if (A >=B) and (A >=C) then D:=A;
if (B >=A) and (B >=C) then D:=B;
if (C >=A) and (C >=B) then D:=C;
writeln(D)
end. Здесь использованы три последовательных неполных ветвления. А условия ветвлений представляют собой сложные логические выражения, включающие логическую операцию and (И). and — И (конъюнкция), or — ИЛИ (дизъюнкция), not — НЕ (отрицание).
CASE, который является обобщением оператора IF и позволяет сделать выбор из произвольного числа имеющихся вариантов.
CASE < Выражение-селектор > OF
< Список i >: < Оператор i >
END;
В этой конструкции < Выражение селектор > может быть любого перечисляемого типа: стандартного (INTEGER, BOOLEAN, CHAR и т.д.) или пользовательского. < Список i > представляет собой подмножество значений, разделенных через запятую, выражения-селектора при которых следует выполнить < оператор i >.
Оператор безусловного перехода GOTO < Метка >, где метка это идентификатор, описанный в разделе LABEL. Метка ставится перед оператором, на выполнение которого нужно передать управление и отделяется от него двоеточием. Использование оператора GOTO в Паскале сильно ограничено и не рекомендуется. Переходы рекомендуется осуществлять внутри одного уровня или при выходе на более высокий уровень.

10 ВОПРОС

Цикл
В программировании блоки кода, которые требуется повторять не единожды, оборачиваются в специальные конструкции — циклы. У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину (True, не ноль). После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.
Если число повторений заранее не известно и решение о завершении цикла
принимается на основе анализа некоторого условия, то такой повторяющийся вычислительный процесс называется итерационным циклом.
Часто цикл for называют циклом со счетчиком. Этот цикл используется, когда количество повторений может быть вычислено заранее.
for счетчик:=значение to —downto конечное_значение do
тело_цикла;
Счетчик — это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления)..
var i, n: integer;
begin
write ('Количество знаков: ');
readln (n);
for i:= 1 to n do
write ('(*) ');
readln; end.
11 ВОПРОС

Операторы while и repeat. Итерационные
Цикл с предусловием WHILE < Логическое выражение, или переменная > DO < Оператор >;Оператор перед каждым выполнением цикла анализируется логическое выражение или переменная. При значении TRUE выполняется оператор, составляющий тело цикла. При значении FALSEуправление передается следующему за циклом оператору. Если условие ложно с самого начала, то оператор не выполняется ни разу.
var i, n: integer;
begin
write ('Количество знаков: ');
readln (n);
i:= 1;
while i < = n do begin
write ('(*) ');
i:= i + 1
end;
readln
end.
Цикл с постусловием REPEAT< Оператор К >UNTIL < Условие >;В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false — его повторение.
var i, n: integer;
begin
write ('Количество знаков: ');
readln (n);
i:= 1;
repeat
write ('(*) ');
i:= i + 1
until i > n;
readln
end.

12 ВОПРОС

оператор цикла по возрастающим.Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу

13 ВОПРОС

Вложенные циклы
Существует возможность организовать цикл внутри тела другого цикла. Такой цикл будет называться вложенным циклом. Вложенный цикл по отношению к циклу в тело которого он вложен будет именоваться внутренним циклом, и наоборот цикл в теле которого существует вложенный цикл будет именоваться внешним по отношению к вложенному. Количество уровней вложенности, как правило, не ограничивается.
Полное число исполнений тела внутреннего цикла не превышает произведения числа итераций внутреннего и всех внешних циклов. Например взяв три вложенных друг в друга цикла, каждый по 10 итераций, получим 10 исполнений тела для внешнего цикла, 100 для цикла второго уровня и 1000 в самом внутреннем цикле.
VAR c,c1:char;
Begin
For c:=’a’ to ‘z’ do
Begin For c1:=’a’ to c do Write(c1);end;
End.
Внутренний цикл должен находиться полностью во внешнем, параметры должны быть различны, из внутреннего цикла можно в любом месте выйти во внешний а из внешнего войти во внутренний можно только через заголовок.

14 ВОПРОС

Break Exit, Halt.
Break (процедура)-Немедленно выходит из ближайшего цикла,не дожидаясь условия выхода.
Это напоминает оператор goto, переходящий по метке, находящейся сразу после окончания оператора цикла.
uses Crt;
var
S: String;
begin
while True do
begin
ReadLn(S);
if S = '' then
Break;
WriteLn(S);
end;
end.
Процедура Continue приводит к выполнению следующей итерации самого внутреннего оператора См. также:
uses Crt;
{ под Windows используйте модуль WinCrt }
Var I: Integer;Name: string[79];F: file;
begin
for I:= 1 to ParamCount do
begin
Name:= ParamStr(I);
Assign(F, Name);{$I-}
Reset(F, 1){$I+}
if IOResult < > 0 then
begin
Writeln('Файл не найден: ', Name);
Continue;
end;
Writeln(Name,': ', FileSize(F), ' байт');
Close(F);
end;
end.
Процедура Halt-Останавливает выполнение программы и возвращается в операционную систему.
Procedure Halt [ (Exitcode: Word) ];
Где: Exitcode — необязательный параметр,
который определяет код завершения вашей
программы.
Uses WinCrt;
Begin
If 1 = 1 Then
Begin
If 2 = 2 Then
Begin
If 3 = 3 Then
Begin
Halt(1); { Останавливаемся прямо здесь! }
End;
End;
End;
WriteLn('Это не будет напечатано…;-)');
End.
Процедура EXIT использовать для досрочного выхода из подпрограммы.
Пример. Функция, определяющая первое отрицательное число в массиве.
function Minus(var Massiv; N: Integer): Real;
{Massiv — параметр без типа}
type
Т = array [1..1000] of Real;
var
i: Integer;
begin
Minus:= 0;
for i:= 1 to N do
if T(Massiv)[i] < 0 then {преобразование типа}
begin
Minus:= T(Massiv)[i];
Exit {досрочный выход из функции}
end
end;

15 ВОПРОС

перечисляемый тип
В программу можно ввести и переменные какого-либо типа, не совпадающие ни с одним из стандартных. Такой тип задается перечислением значений, которые может принимать переменная. Общий вид описания нестандартного типа:type nm = (word1, word2, …, wordN);здесь nm – идентификатор типа (произвольный), word1, word2… - конкретные значения, которые может принимать переменная типа nm. Эти значения считаются упорядоченными, т.е. описание типа одновременно вводит упорядочениеword1 < word2 < wordN. Значения типа считаются пронумерованными.Данные указанных типов можно использовать в операторах FORи CASE, в функциях SUCC, PREDи ORD.Допустимо использовать отношения для сравнения переменных, выражений или констант одного перечисляемого типа.Для заданного года вычислить количество дней.
TYPE MONTH- (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT,NOV, DEC); {Пользовательский перечисляемый тип данных}
VAR S, YEAR: INTEGER;MEC: MONTH;
BEGIN
WRITELN ('введите год ‘);
READ (YEAR);
S:= 0;
FOR MEC:= JAN TO DEC { Просмотр всех месяцев по порядку}
DO CASE MEC OF
APR, JUN, SEP, NOV: S:= S+30; { Список месяцев, содержащих 30 дней}
FEB: IF (YEAR MOD 4 = 0) AND (YEAR MOD 100 < > 0) OR (YEAR MOD 400 = 0)
THENS:= S+29{Апрель, високосный год}
ELSE{IF} S:= S+28; { Апрель, не високосный год }
ELSE {CASE}S:=S+31
END; {CASE}
WRITELN('число дней:', S)
END.

16 ВОПРОС

ограниченный тип, функции low,high
Функция Low (Х) возвращает минимальное значение переменной х. Тот же результат достигается, если задать в качестве параметра имя типа.Функция High соответсвенно возвращает максимальное значение типа или переменной.
Для переменной скалярного типа можно указать некоторое подмножество значений, которые может принимать данная переменная.
Общий вид: a:min..max;,здесь a – переменная, min – левая граница, max – правая граница подмножества (диапазона). Границы диапазона разделяются двумя точками.Тип min и max задает множество, определяющее основной тип переменной a (базовый тип). О переменной, описанной таким образом, говорят, что она имеет интервальный тип.Примеры задания интервальных типов:
TYPE
DAY= (SU, МО, TU, WE, ТН, FR, SA);
WORK_DAY= МО.. FR;{ Интервальный пользовательский тип}
YEAR= 1900.. 2000;{ Интервальные типы}
LAT_ALFABETH= 'А'.. 'Z';{Стандартные типы}
17 ВОПРОС Типизированные константы
Описываются в разделе констант: < идентификатор >: < тип > = < значение > В ходе выполнения программы можно присваивать другие значения. При повторном входе в блок (процедуру или функцию), в котором объявлена типизированная константа, переинициализации не происходит и она сохраняет то значение, которое имела при выходе из блока. Могут быть любого типа, кроме файлов. Нельзя так же объявить типизированную константу-запись, если хотя бы одно её поле файлового типа. Нельзя использовать в качестве значения при объявлении других констант или границ типа-диапазона.
1. Типизированные константы простых типов и типа String:
Type Colors = (White, Red, Black);
Const {Правильные объявления} Cyrrcol: Colrs = Red; Name: String = 'Ку-Ку';
2. Типизированные константы-массивы
В качестве начального значения используется список констант, отделённых друг от друга запятыми, список заключается в круглые скобки:
Type Colors = (White, Red, Black);
Const
Colstr: Arrray [Colors] Of String [5] = ('White', 'Red', 'Black');
При объявлении массива символов можно использовать то обстоятельство, что все символьные массивы и строки в Турбо- Паскале хранятся в упакованном формате,.поэтому в качестве значения массива-константы типа Char допускается указывать символьную строку: Const Digit: Array [0..9] Of Char = ('0','1','2','3','4','5','6','7','8','9'); При объявлении многомерных — множество констант, соответствующее каждому измерению заключается в дополнительные круглые скобки и отделяется от соседей множества запятыми.
Множество констант с максимальной глубиной вложения связывается с изменением самого правого индекса массива.
Пример — вывести на экран три строки с монотонно увеличивающимися целыми числами:
Var I, J, K, L: Integer;
Const Matr: Array [1..3, 1..5] Of Byte = ((0, 1, 2, 3, 4), (5, 6, 7, 8, 9), (10, 11, 12, 13, 14)); Количество переменных в списке констант должно строго соответствовать объявленной длине массива по каждому измерению.
3. Типизированные константы-записи. < идентификатор >:< тип > = (< список значений полей >) < тип > - предварительно объявленный тип записи. < список значений полей > - список из последовательностей следующего вида: имя поля, двоеточие и константа; элементы списка отделятся друг от друга точкой с запятой.
Type
Point = Record X,Y: Real; End;
Vect = Array [0..1] Of Point;
Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Date = Record D: 1..31; M: Month; Y: 1900..1999;End;
Const Orign: Point = (X: 0; Y: -1); Line: Vector = ((X: -3,1; Y: 1,5), (X: 5,9; Y: 3,0)); Someday: Date = (D: 16; M: Mar; Y: 1989);
Для записей с вариантными полями указывается только один из возможных вариантов констант:
4. Типизированные константы множества.
Значение типизированной константы множества задаётся в виде правильного конструктора множества:
Type
Days = Set Of 1..31;
Dige = Set Of '0'..'9'
Const
Workdays: Days = [1..5, 8..12, 15..19, 22..26, 29, 30];
Evendigits: Dige = ['0', '2', '4', '6', '8'];
5. Типизированные константы указатели.
Единственным значением типизированной константы указателя может быть только Nil:
Const
Pr: ^Real = Nil;
P: POINTER = Nil;
18 ВОПРОС Одномерные массивы, ввод/вывод.
Массив представляет собой последовательность ячеек памяти, в которых хранятся однотипные данные. Обращение к конкретной ячейке происходит по ее индексу (номеру) в массиве. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Действия в программе над массивом осуществляются путем использования имени переменной, связанной с областью данных, отведенной под массив.A: ARRAY[M.. N] OF< тип >;где M- нижняя, a N —верхняя границы индексов
Var ch: array[1..11] of char;h: char; i: integer;
begin
for i:= 1 to 11 do read (ch[i]); for i:= 1 to 11 do write (ch[i]:3);readln end.
Программа для вывода ввода одномерного массива.
for i:=1 to N do
begin write ('введите a[', i, ']=');read (a[i]); end;
for i:=1 to N do write(a[i]:4);

19 ВОПРОС
Режимы компиляции, или иначе — режимы совместимости, в Free Pascal определяют, каким диалектом языка Pascal вы хотите воспользоваться. Режим определяет возможные конструкции языка, некоторые типы данных и системные модули подгружаемые по умолчанию.
Режим компиляции выставляется при помощи ключа командной строки -S или непосредственно в модуле при помощи директивы {$MODE xxx}.
состоянии $R+:
-Все индексы массивов и строк проверяются на принадлежность допустимым пределам;
-Все присваивания скалярным и поддиапазонным переменным проверяются на принадлежность заданным диапазонам;
Если проверка принадлежности диапазону не выдерживается, то программа завершается и выводится сообщение об ошибке времени выполнения.
$R+ не влияет на процедуры Inc и Dec. Включение проверки диапазона замедляет вашу программу и делает ее больше. Используйте эту опцию при отладке, затем выключите ее, если уверены, что в вашей программе нет ошибок.
Если пользователю необходимо начать отладку с определенного места программы, он может выполнить программу до этого места, а затем остановиться. Для этого, загрузите нужный раздел исходного модуля в редактор и передвиньте курсор на строку, где Вы желаете остановиться. Затем можно поступить двумя способами:
• - Выбрать команду Run/Goto Cursor (или нажать клавишу F4), которая будет выполнять программу пользователя до достижения строки, помеченной курсором, а затем останавить работу программы.
• - Задать на указанной строке точку прерывания (выбрать команду Debug/Toggle Breakpoint или нажать на Ctrl-F8), затем выполнить программу (выполнить команду Run/Run или нажать Ctrl-F9); остановка будет происходить каждый раз при достижении заданной строки. Вы можете задать несколько точек прерывания, в этом случае программа будет делать остановку всякий раз при достижении какой-либо из этих точек.

 

20 ВОПРОС Двумерные массивы Паскаля —трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов). Положение элементов в двумерных массивах Паскаля описывается двумя индексами. Их можно представить в виде прямоугольной таблицы или матрицы. matrix= array[1..5, 1..10] of < тип элементов >;
Обращение к элементам двумерного массива имеет вид: M [ i, j ]. Это означает, что мы хотим получить элемент, расположенный в i —й строке и j —м столбце. Все, что было сказано об основных действиях с одномерными массивами, справедливо и для матриц. Единственное действие над матрицами целиком — это присваивание. то в ходе выполнения программы можно присвоить матрице a значение матрицы b (a:= b). Все остальные действия выполняются поэлементно, при этом над элементами можно выполнять все допустимые операции, которые определены для типа данных элементов массива. Это означает, что если массив состоит из целых чисел, то над его элементами можно выполнять операции, определенные для целых чисел, если же массив состоит из символов, то к ним применимы операции, определенные для работы с символами.
Ввод-вывод двумерного массива Паскаля
Для последовательного ввода элементов одномерного массива мы использовали цикл for, в котором изменяли значение индекса с 1-го до последнего, положение элемента в двумерном массиве Паскаля определяется двумя индексами.
type matrix= array [1..n, 1..m] of integer;
var a,: matrix; i, j: integer; { индексы массива}
begin значит последовательно изменять номер строки с 1-й до последней и в каждой строке перебирать элементы столбцов с 1-го до последнего/два цикла for, причем один из них будет вложен в другой.:
for i:=1 to n do {цикл для перебора всех строк}
for j:=1 to m do {перебор всех элементов строки по столбцам}
readln (a [ i, j ]); {ввод с клавиатуры элемента, стоящего в i —й строке и j —м столбце}
Вывод элементов двумерного массива осуществляется последовательно,, т.к. в памяти ЭВМ элементы массива располагаются в последовательных ячейках. необходимо напечатать элементы каждой строки и каждого столбца.
for i:=1 to n do {цикл для перебора всех строк}
begin
for j:=1 to m do {перебор всех элементов строки по столбцам}
write (a [ i, j ]:4); {печать элементов, стоящих в i —й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 4 позиции}
writeln; {прежде, чем сменить номер строки в матрице, нужно перевести курсор на начало новой экранной строки}
end;

 


21 ВОПРОС Строки. Строковый тип данных
Строкой в Паскале называется последовательность из определенного количества символов. Количество символов последовательности называется длиной строки.
var s: string[n];
var s: string;
n — максимально возможная длина строки — целое число в диапазоне 1..255. Если этот параметр опущен, то по умолчанию он принимается равным 255.Пустой символ обозначается двумя подряд стоящими апострофами. i-й символ переменной st записывается как st[i]. Например, если st — это 'Строка', то st[1] - это 'С', st[2] - это 'т', st[3] - 'р' операция слияния (конкантенации), обозначаемая знаком +. Кроме слияния над строками определены операции сравнения <, >,=,< >,< =, >=.
Процедуры и функции для работы со строками
Length(s:string):integer Функция возвращает в качестве результата значение текущей длины строки-параметра; n:= length('Pascal'); {n будет равно 6}
Concat(s1,[s2,…,sn]:string):string Функция выполняет слияние строк-параметров, которых может быть произвольное количество.
Copy(s:string; index:integer; count:integer):string Функция возвращает подстроку, выделенную из исходной строки s, длиной count символов, начиная с символа под номером index.
s:= 'Система Turbo Pascal';
s2:= copy(s, 1, 7); {s2 будет равно 'Система'}
s3:= copy(s, 9, 5); {s3 будет равно 'Turbo'}
Delete(var s:string; index,count:integer) Процедура удаляет из строки-параметра s подстроку длиной count символов, начиная с символа под номером index.
s:= 'Система Turbo Pascal';
delete(s,8,6); {s будет равно 'Система Pascal'}
Insert(source:string; var s:string;index:integer) Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.
s:= 'Система Pascal';
insert('Turbo ',s,9); {s будет равно 'Система Turbo Pascal'}
POS(St2, St1); Функция производит поиск в строке st1 подстроки st2.
s:= 'Система Turbo Pascal';
x1:= pos('Pascal', s); {x1 будет равно 15}
x2:= pos('Basic', s); {x2 будет равно 0}
Str(X: арифметическое выражение; var st: string) Процедура преобразует численное выражение X в его строковое представление и помещает результат в st. STR(:-12:4, St); {'-12'}
Val(st: string; x: числовая переменная; var code: integer) Процедура преобразует строковую запись числа, содержащуюся в st, в числовое представление,
Chr(n: byte): char Функция возвращает символ по коду, равному значению выражения n.
Ord(ch: char): byte; В данном случае функция возвращает код символа ch.
UpCase(c: char): char; Если c — строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву.
22 ВОПРОС Запись — конечное упорядоченное множество полей, характеризующихся различным типом данных. Запись представляет собой совокупность ограниченного числа логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа.
type TRec = Record {Описание записи}
FIO: String[20]; TEL: String[7]
end;
var rec: TRec;
program primer 2;
type anketa=record
fio: string[45]; curs: 1..5; grupp: string[3]
end;
var student: array [1..100] of anketa; I: integer;
begin {последовательно вводим каждую запись}
for I:=1 to 100 do
begin
writeln (‘введите сведения о’, I, ‘-м студенте’);
writeln (‘введите фамилию, имя и отчество’);
readln (student[I].fio);
writeln (‘введите курс’);
readln(student[I].curs);
writeln (‘введите группу’);
readln (student[I].grupp);
end;
writeln (‘ввод закончен’);
writeln; {просматриваем массив записей и выбираем только студентов 2-го курса }
for I:=1 to 100 do
if student[I].curs=2 then
writeln(‘ фамилия студента: ’, student[I].fio);
end.
Операции над записями
Важнейшей операцией для записи является операция доступа к выбранному полю записи — операция квалификации. Практически во всех языках программирования обозначение этой операции имеет вид:
< имя переменной-записи >.< имя поля >
with rec do begin
FIO:='Иванов А. А.';TEL:='2223322';
end; Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:
with rec do оператор;Здесь rec — имя записи, оператор — оператор, простой или составной. Оператор представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. алгоритмическая конструкция =следующей: rec.FIO:='Иванов А. А.';

23 ВОПРОС Записи с вариантами
Type v = record
a: type1b: type2
case n: typen of
c1:(t11: type11;t12: type12; …);end;
var z: v;Здесь z — переменная типа v; n — переменная, называемая переключателем; typen — тип переменной n.
Замечания:-Любая запись (record) может иметь только одну вариантную часть (case).-Вариантная часть должна помещаться после постоянной части.
-Среди идентификаторов полей не должно быть одинаковых.
Пример. Пусть необходимо собрать следующие сведения о сотрудниках института: фамилию, дату рождения и, если есть семья, то фамилию и дату рождения супруги (супруга).Эта информация может быть описана, например, записью person. Пусть переменная типа kind может иметь одно из значений ("женат", "холост").
kind = (married, single);
person = record
name: string; {name —;строка символов}
datebirth: date; {запись, содержащая дату рождения}
case yesno: kind of {yesno — переключатель типа kind, который может принимать одно из двух значений: married либо single}
married: (name1: string; date1: date); {name1- строка символов, содержащая фамилию супруга(и); date1 — запись, содержащая дату рождения;}
single: (){пустое поле}end.

24 ВОПРОС

Множества, действия с множествами.
Множество в памяти хранится как массив битов, в котором каждый бит указывает является ли элемент принадлежащим объявленному множеству или нет. Максимальное число элементов множества 256, а данные типа множество могут занимать не более 32 байт.
Пример. Пусть в вашем распоряжении имеется множество из трех монет разного достоинства: 1 р, 5 р, 10 р. Из этих монет можно составить следующие подмножества
{1};{5};{10};{1, 5};{1, 10};{5, 10};{1, 5, 10};{ }
Эти подмножества и будут принадлежать некоторому множеству, тип которого назовем sum. Сами элементы (монеты), из которых составляется подмножество, пусть принадлежат некоторому базовому типу, который назовем monet.
type
monet = (m1, m5, m10); { Базовый тип задается диапазоном или перечислением.}
sum = set of monet;
type a = set of tc;здесь a — идентификатор типа (произвольный); tc — тип компонент множества называемый базовым типом, используя переменные типа set, можно работать с битовой информацией.В качестве базового типа может использоваться любой простой тип, кроме real. Если задача требует использования множества, состоящего из большого числа элементов, то его можно представить как массив множеств, состоящих из допустимого числа элементов.
Операции над множествами:
К переменным типа set применимы следующие операции: =, < >, >=, < =, in, +, -, *.
Операции = и < > используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов. Пустое множество [ ] содержится во всех множествах, т.е. всегда [ ] < = [b] дает true.
Операция in используется для установления наличия определенного элемента в величине типа set. Так, если x есть элемент множества b, то (x in b) дает true. Общий вид: x in a;здесь x – величина базового типа, a – величина типа set.
К переменным типа set, относящимся к одному и тому же конкретному типу, применимы операции:
объединение a + b представляет собой объединение множества элементов, входящих в a и b. [1, 3] + [1, 4] = [1, 3, 4];
пересечение a * b – пересечение множества элементов a и b (только те, которые есть в обоих множествах). [1, 3] * [1, 4] = [1];
дополнение a – b – множество элементов, которые есть в a, но отсутствуют в b. [1, 3] - [1, 4] = [3].

25 ВОПРОС

Необходимые процедуры и функции для работы с графикой собраны стандартном модуле - Graph.
Program Primer1;
Uses
Graph;{Подключение модуля библиотеки графических процедур}
Var
GraphDriver,
GraphMode: integer;
Begin
GraphDriver:= detect; {автоопределение типа драйвера }
InitGraph(GraphDriver, GraphMode, путь к BGI);
{Инициализация графического режима}
...
СloseGraph;{Закрытие графического режима}
End.
Граф. Примитивов setcolor, setbkcolor,putpixel(x,y,цвет)

26 ВОПРОС

.Рисование графических фигур
Процедура Circle (x, y: integer; r: word) вычерчивает окружность радиуса r с центром в точке с координатами (x, y).
Arc (x, y, ugol_ begin, ugol_ end, r: integer) вычерчивает дугу окружности радиуса r с центром в точке с координатами (x, y). Параметры ugol_ begin и ugol_ end задают угловые координаты начала и конца дуги. Отсчет углов ведется против часовой стрелки. Значения угловых координат задается в градусах.
Процедура Rectangle (x1, y1, x2, y2: integer) вычерчивает контур прямоугольника. Параметры x1, y1 задают положение левого верхнего угла, x2, y2 – правого нижнего.

28 ВОПРОС

29 ВОПРОС Procedure DrawPoly(N: Word; var Points)
Здесь N — количество точек излома, включая обе крайние точки; Points — переменная типа PointType, содержащая координаты точек излома.
Координаты точек излома задаются парой значений типа Word: первое определяет горизонтальную, второе — вертикальную координаты. Для них можно использовать следующий определенный в модуле тип:

 


30 ВОПРОС

ImageSize (x1, y1, x2, y2: integer): word,которая возвращает размер фрагмента в байтах.
Фрагмент удобно хранить в области динамической памяти, которую необходимо выделить. Это делается процедурой (не из модуля Graph):
GetMem (var p: pointer; size: word).Сохранение области фрагмента в памяти выполняется процедурой:
GetImage (x1, y1, x2, y2: integer; var: BitMap), которая сохраняет в переменной BitMap изображение области экрана.
Вернуть из памяти на экран фрагмент можно процедурой: PutImage (x, y: integer; var: BitMap; Mode: word), где х, у — координаты начала вывода фрагмента. Параметр Mode определяет стиль заполнения области экран
program pr;
uses graph,crt;
var Gd,Gm,size,i: integer;
p: pointer;
begin
Gd:=detect;
initGraph(Gd,Gm,'');
cleardevice;
setcolor(green);
Rectangle(100,100,200,200);{вывод первого — зеленого — прямоугольника}
setcolor(red);
Rectangle(300,100,400,200);{вывод второго — красного — прямоугольника}
{в качестве фрагмента возьмем второй прямоугольник}
{вычисляем объем памяти для образа фрагмента:}
size:=imagesize(300,100,400,200);
GetMem(p,size); {выделяем size байт памяти в Heap}
GetImage(300,100,400,200,p^); {сохраняем образ}
{образ находится в Heap и будет там до тех пор,
пока память не освободится с помощью Dispose(p)}
readln;
cleardevice; {очистка экрана}
{на основе образа р строим три прямоугольника красного цвета}
for i:=1 to 3 do
PutImage(100+i*100,100,p^,NormalPut);
readln;
Dispose(p);{уничтожение образа в Неар}
closegraph;
end.

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

31 ВОПРОС Протабулировать Функцию. Задача табулирования функции предполагает получение таблицы значений функции при изменении аргумента с фиксированным шагом. В качестве исходной информации должны быть заданы: Х0, Хn — начало и конец промежутка табулирования, при этом (Х0< Хn); n – число шагов разбиения промежутка [Х0, Xn]; F(X) – описание табулируемой функции.При составлении алгоритма предполагается, что X – текущее значение аргумента; h – шаг изменения аргумента (иногда его называют шагом табуляции функции); i – текущий номер точки, в которой вычисляются функция (i = 0.. n).Количество интервалов n, шаг табуляции h и величины Х0, Хn связаны между собой формулой:
Табулировать функцию F(X) в N равноотстоящих точках, заданную на промежутке [Х0, Xn], где

PROGRAM PR17;
VAR I, N: INTEGER; X, Y: REAL;H, X0, XN: REAL;
BEGIN
WRITELN('ВВЕДИТЕ X0, XN, N');
READLN(X0, XN, N);
H:= (XN - X0)/N;
FOR I:=0 TO N DO BEGIN
Y:= SIN(X+1)*EXP(2-X*X);
X:= X0 + I * H;
WRITELN (X:4:1,",Y:9:6)
END; END.

32 ВОПРОС. Вычисление суммы бесконечного ряда
Даны числа X и EPS >0 вычислить сумму ряда с заданной точностью указать кол-во учтенных слагаемых.
Элемент накапливается в сумму до тех пор, пока модуль очередного слагаемого не будет меньше EPS.
А^k=A^(k-1)*R
Var x,Eps:real; a,s:real;{текущее значение, сумма }k:word; {номер слагаемого} R:real; {коэф. В рекурентной формуле}
Begin
Writeln(‘введите x и Eps’);
Readln(x,Eps);
K:=0; s:=0; a:=x; {слагаемое при к=0}
While Abs(a) >=Eps do
Begin
S:=S+a; inc(k); R:=Sqr(x)*(2*k-1)/(k*(2*k+1);
end;
Writeln(‘Сумма ’,s,’Количество учтенных слагаемых’,k);
Readln;
End.

35. Функция — подпрограмма, предназначенная для реализации функциональной зависимости, результатом которой является скалярное значение или значение типа string. Вызов < переменная >:=< имя функции > (< список формальных параметров >);
function имя функции (формальные параметры):тип результата;
раздел описаний функции
begin исполняемая часть функции end
33 ВОПРОС

Процедуры и функции. Их описания и вызов.
Часто в задаче требуется повторить определенную последовательность операторов в разных частях программы. Для того, чтобы описывать эту последовательность один раз, а применять многократно, в языках программирования применяются подпрограммы. Подпрограмма — автономная часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. Cуществует два вида подпрограмм: процедура (PROCEDURE) и функция (FUNCTION)
Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове — фактическими.
procedure имя процедуры (формальные параметры);
раздел описаний процедуры
begin
исполняемая часть процедуры
end;
При вызове процедур и функций необходимо соблюдать следующие правила:
- количество фактических параметров должно совпадать с количеством формальных;
- соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
34 ВОПРОС Параметры-значения(фактические переменные)
При вызове процедур и функций формальным параметрам-значениям выделяется новое место в памяти и присваиваются значения фактических параметров. При этом на месте фактических параметров могут стоять выражения. Совместимость типов определяется возможностями присваивания. После выполнения подпрограммы место формальных параметров освобождается. Изменение формальных параметров не сказывается на значении фактических. Procedure MyProc1(par1,par2: type1; par3,par4: type2);
Параметры-переменные
При вызове процедур и функций формальные параметры-переменные занимают то же самое место в памяти, что и соответствующие им фактические параметры. Таким образом, дополнительное место в памяти не выделяется и изменения формального параметра приводят к изменениям фактического. Параметры-переменные, как правило, используются для передачи результатов из процедур в вызывающий алгоритм. Фактические параметры были переменными, причем в точности того же типа, что и формальные параметры. При описании перед параметрами-переменными должно присутствовать слово var. Procedure MyProc2(var par1,par2: type1; var par3,par4: type2);
Параметр-константа не копируется во временную область памяти, что сокращает затраты времени на вызов подпрограммы, однако любые его изменения в теле подпрограммы невозможны — за этим строго следит компилятор. Procedure MyProc3(const par1,par2: type1; const par3,par4: type2);
Возможность создания процедур и функций с параметрами, не имеющими типа. Бестиповые параметры могут быть параметрами-переменными и параметрами-константами, так как передаются только по адресу.Procedure MyProc(var par1,par2; const par3,par4);Перед использованием формальных параметров необходимо выполнить их приведение к какому-либо типу. Использование бестиповых параметров дает большую гибкость программе, но ответственность за их корректное применение возлагается на программиста.

35 ВОПРОС

Локальные и глобальные идентификаторы Использование процедур и функций в Паскале тесно связано с некоторыми особенностями работы с идентификаторами (именами) в программе. В частности, не все имена всегда доступны для использования. Доступ к идентификатору в конкретный момент времени определяется тем, в каком блоке он описан.
Имена, описанные в заголовке или разделе описаний процедуры или функции называют локальными для этого блока. Имена, описанные в блоке, соответствующем всей программе, называют глобальными. Следует помнить, что формальные параметры процедур и функций всегда являются локальными переменными для соответствующих блоков.
Основные правила работы с глобальными и локальными именами:
-Локальные имена доступны (считаются известными, «видимыми») только внутри того блока, где они описаны. Сам этот блок, и все другие, вложенные в него, называют областью видимости для этих локальных имен.
-Имена, описанные в одном блоке, могут совпадать с именами из других, как содержащих данный блок, так и вложенных в него. Это объясняется тем, что переменные, описанные в разных блоках (даже если они имеют одинаковые имена), хранятся в разных областях оперативной памяти.
-Глобальные имена хранятся в области памяти, называемой сегментом данных (статическим сегментом) программы. Они создаются на этапе компиляции и действительны на все время работы программы. В отличие от них, локальные переменные хранятся в специальной области памяти, которая называется стек. Они являются временными, так как создаются в момент входа в подпрограмму и уничтожаются при выходе из нее.
Рекомендуется все имена, которые имеют в подпрограммах чисто внутреннее, вспомогательное назначение, делать локальными. Это предохраняет от изменений глобальных объекты с такими же именами.
Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове — фактическими.
При вызове процедур и функций необходимо соблюдать следующие правила:
- количество фактических параметров должно совпадать с количеством формальных;
- соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу
36 ВОПРОС

Процедурные типы — это нововведение фирмы Borland (в стандартном Паскале таких типов нет). Основное назначение этих типов — дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок процедур, в котором опускается ее имя, например:
Type Proc = Procedure (a, b, с: real; Var d: real); Proc2 = Procedure (var a, b);
Var р1: Proc; ар: array [1..N] of Proc2;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы. В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре как параметры-значения, так и параметры-переменные.
Процедурная переменная занимает в памяти 4 байта (2 слова). В первом хранится смещение, во втором — сегмент (т.е. указатель на код подпрограммы).

II часть

1 ВОПРОС.

Безтиповые, Var Ident, где Ident — идентификатор формального параметра. Фактический параметр, соответствующий формальному нетипизированному, должен представлять собой переменную любого типа (но не выражение).Единственным способом использования таких параметров является "наделение" их определённым типом. Существуют два способа:
1)Применить операцию приведения типа.
2) Описать в подпрограмме локальную переменную определённого типа с совмещением её в памяти с нетипизированным параметром.
2 ВОПРОС.

К открытому формальному параметру-массиву можно обращаться только по элементам. Присваивания элементам формального открытого массива-константы не допускаются, а присваивания элементам формального открытого массива, являющегося параметром-значением, не влияют на фактический параметр. Для открытых массивов-значений компилятор создает в кадре стека процедуры или функции локальную копию фактического параметра. Таким образом, при передаче в качестве открытых параметров-значений больших массивов следует учитывать возможное переполнение стека. При применении к открытому параметру-массиву стандартная функция Low возвращает 0, стандартная функция High возвращает индекс последнего элемента в фактическом параметре-массиве, а функция SizeOf возвращает размер фактического параметра-массива.
Процедура Clear в следующем примере присваивает каждому элементу массива вещественных значений ноль
procedure Clear(var A: array of Real); {А открытым параметром-массивом}
var I: Word;
begin for I:= 0 to High(A) do A[I]:= 0; end;

 

3 ВОПРОС

Открытые строковые параметры могут описываться двумя способами:
- с помощью идентификатора OpenString; описывается в модуле System, не является зарезервированным словом
- с помощью ключевого слова string в состоянии {$P+}.
Для открытого строкового параметра фактический параметр может быть переменной любого строкового типа. В процедуре или функции максимальная длина формального параметра будет тем же, что у фактического параметра.
Открытые строковые параметры ведут себя также как параметры-переменные строкового типа, их нельзя передавать как обычные переменные другим процедурам или функциям., но их можно снова передать как открытые строковые параметры.
S- открытый строковый параметр процедуры AssignStr - это открытый строковый параметр: procedure AssignStr(var S: OpenString; begin S:= '0123456789ABCDEF';end;
Var S1: string[10]; Begin AssignStr(S1); { S1:= '0123456789' } при присваивании параметра S строка усекается, максимальная длина S1 равна 10.
При применении к открытому строковому параметру стандартная функция Low возвращает 0, стандартная функция High возвращает описанную максимальную длину фактического параметра, а функция SizeOf возвращает размер фактического параметра.
Значения и параметры-константы, описанные с использованием OpenString или ключевого слова string в состоянии{$P+}, не являются открытыми строковыми параметрами. Они ведут себя были описаны с максимальной длиной строкового типа 255, а функция Hingh для таких параметров всегда возвращает 255.

4 ВОПРОС.

Функциональный определяется как заголовок процедуры и функции со списком формальных параметров, но без имени.После объявления функционального типа его можно использовать для описания формальных параметров — имен процедур и функций.тКроме того, необходимо написать те реальные процедуры или функции, имена которых будут передаваться как фактические параметры. Эти процедуры и функции должны компилироваться в режиме дальней адресации с ключом {$F+}.универсальная процедура печати значения для любых функций при х изменяющимся от А до Б с шагом h
Type Fan=function (x:real):real; {P+}end;
Function F1(x:real):real; Far;{компиляция в режиме дальнего вызова} Begin F1:=sinx*cosx;end;
Function F2(x:real):real; Far;{компиляция в режиме дальнего вызова} Begin F1:=sqr(sqr(x))+sqr(x); end; {P-}
Procedure TAB (F:fan; A,B,H:real);Var x:real; I,n:word; Begin n:=round((B-A)/H);x:=A; For i:=0 to n do begin writeln(x:12,F(x):14); x:=x+h; end; end;
Begin tab(f1,0,1,0,1); tab(F2,5,7,0,1); end.

5 ВОПРОС.

В теле подпрограммы доступны все объекты, описанные в объемлющем блоке, в том числе и имя самой подпрограммы. Подпрограммы, вызывающие сами себя, называются рекурсивными. Пример: алгоритм вычисления факториала: N! = (N-1)!*N
Fuction Fact(N: Word): LongInt;
Begin If N = 1 then
Fact:= 1
else
Fact:= N * Fact(N-1);
End;
Необходимо только помнить, что каждый очередной рекурсивный вызов приводит к образованию новой копии локальных объектов подпрограммы и все эти копии, соответствующие цепочке активизированных и незавершенных рекурсивных вызовов существуют независимо друг от друга.
Локальное распределение памяти подразумевает, что место для переменных и объектов выделяется на стеке программы.
Стек представляет собой рабочую область памяти, резервируемую программой при ее загрузке.
Любая память, необходимая программе для хранения локальных переменных, для вызовов функций и т. д. берется из стека. Она выделяется по мере необходимости и освобождается, когда надобность в ней отпадает; обычно этот процесс связан с выполнением тела функции или другого локального блока кода. При входе в функцию происходит выделение памяти для всех ее локальных переменных, а завершение ее работы приводит к автоматическому освобождению выделенной памяти. Причем дописывание информации в стек происходит при каждом рекуррентном вызове, поэтому нужно следить за глубиной рекурсии, иначе слишком длинная, или бесконечная рекурсия забьет все стековое пространство и программа не сможет выполняться дальше, произойдет ошибка времени исполнения. Максимальный объём стековой памяти в Турбо-Паскале — 1 сегмент (65520 байт). Можно устанавливать размер стека и контроль за переполнением стека — $M и $S (компилятор может включить в программу код, следящий за переполнением стека и выдающий вовремя сообщение о переполнении стека, вместо зависания программы, обычно этот ключ установлен по умолчанию).

6 ВОПРОС.

Синтаксические анализаторы. Элементы металингвистических формул. Формы Бэкуса-Наура
Синтаксический анализатор (синтаксический разборщик) - это часть компилятора, которая отвечает за выявление и проверку синтаксических конструкций входного языка. В задачу синтаксического анализатора входит:
• найти и выделить синтаксические конструкции в тексте исходной программы;
• установить тип и проверить правильность каждой синтаксической конструкции;
• представить синтаксические конструкции в виде, удобном для дальнейшей генерации текста результирующей программы.
Цепочки языка могут содержать метасимволы, имеющие особое назначение. Метаязык. Предложенный Бэкусом и Науром использует следующие обозначения: Символ "::=" отделяет левую часть правила от правой9 читается: "определяется как")
Нетерминалы (синтаксическая категория) обозначаются произвольной символьной строкой. Заключается в угловые скобки "< и >"
Терминалы — это символы, используемые в описываемом языке, правило может определять порождение нескольких альтернативных цепочек, отделяемых друг от друга символом вертикальной черты "|"
< простое-выражение >::= < целое без знака >
(< простое-выражение > < знак > < простое выражение >)
< целое- без- знака >::= < цифра >
< цифра > < целое-без-знака >
< Знак операции >::={+,-.*./}

 

7 ВОПРОС.

. Модуль(unit) в системе Турбо Паскаль-автономно компилируемая именованная программная еденица, не выполняющаяся самостоятельно.
Для использования модуля в вызывающей программе необходимо указать его имя в uses-части.
Отличия модуля unit от процедуры:
• Модуль может включать более одной процедуры;
• Модуль может включать не только процедуры.
Поэтому модуль не вызывается как процедура, а подключается, объединяясь с вызывающей программой. Таким образом, модуль в системе турбо-паскаль — средство более мощное, чем механизм внешних процедур. Код модуля размещается в отдельном сегменте и за счет этого возможно уменьшение размера программ. Основным принципом модульного программирования является принцип "разделяй и властвуй". Модульное программирование — это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определенным правилам.
Структура Заголовок, размер интерфейса, раздел реализации, раздел инициализации,
Unit < имя_модуля >; имя должно совпадать с именем файла.
interface < интерфейсная часть >;В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны быть доступны основной программе. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок.
implementation < исполняемая часть >;и содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты — вспомогательные типы, константы, переменные и блоки, а также метки.
begin < инициирующая часть >; В инициирующей части размещаются исполняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы В инициирующую часть можно включать вспомогательные операции, подготавливающие программу к работе, например, операции подготовки файлов assign,reset,rewrite.
end.
unit Compl;
interface
type complex=record re,im:real; end;
procedure readc(var c:complex);
procedure AddC (x, y: complex; var z: complex); procedure SubC (x, y: complex; var z: complex);
///implementation procedure readc; begin writeln(‘Введите действительные и мнимые части’); readln(Re,Im); end;
Procedure ADDc;; begin z.re:= x.re + y.re; z.im:= x.im + y.im; end; {AddC}
procedure SubC; begin z.re:= x.re — y.re; z.im:= x.im — y.im; end; {SubC}
end. Модуль должен храниться в одноименном файле TPU,pas файле;
Uses complexn; {подключение осуществляется директивой Uses}
Var a,b,c: coplex;
begin b.re:= 1; b.im:= 2; AddC(a, b, c); Writeln (‘ сложение:’, c.re: 5:1, c.im: 5:1, ‘i’); SubC (a, b, c); Writeln (‘ вычитание:’, c.re: 5:1, c.im: 5:1, ‘i’);
begin
Assign(F, TILE1.DAT)
end.

9 ВОПРОС

Компиляция модулей. Схема поиска. TPU файла компилятором. Утилита TPU MOVER.EXE. три режима компиляции: COMPILE, MAKE, BUILD. Режимы отличаются способом связи компилируемого модуля или основной программы с другими модулями, объявленными в предложении USES.
При компиляции модуля или основной программы в режиме COMPILE все, упоминаемые в предложении USES модули, должны быть предварительно откомпилированы, и результаты компиляции должны быть помещены в одноименные файлы с расширением TPU (от англ. Turbo Pascal Unit). Файл с расширением TPU создается автоматически при компиляции модуля Паскаля.
В режиме MAKE компилятор проверяет наличие TPU —файлов для каждого объявленного модуля. Если какой-либо файл не найден, система ищет одноименный файл с расширением PAS, т.е. файл с исходным текстом модуля Паскаля. Если таковой файл найден, система приступает к его компиляции.В этом режиме система следит за возможными изменениями исходного текста любого используемого модуля. Программист избавляется от необходимости следить за соответствием TPU —файлов их исходному тексту, т.к. система делает это автоматически.
В режиме BUILD с


Дата добавления: 2015-08-29; просмотров: 23 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Список тестовых вопросов с ответами Форма 21 | Министерство образования Пермского края

mybiblioteka.su - 2015-2024 год. (0.031 сек.)