
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);Перед использованием формальных параметров необходимо выполнить их приведение к какому-либо типу. Использование бестиповых параметров дает большую гибкость программе, но ответственность за их корректное применение возлагается на программиста.