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

1 Программирование.

1.1 Структура программы в Турбо Паскале

Программа в Турбо Паскале состоит из двух частей: заголовка и блока (тело программы). Заголовок отделяется от блока точкой с запятой. За блоком ставится точка, что является признаком конца программы.

Заголовок начинается со служебного слова Program <Имя программы>. В нутрии тела программы могут быть объявлены объекты, имена которых не могут совпадать с именем программы. Строки программы должны выделять некоторые смысловые фрагменты. Пробел используется как обязательный разделитель. Каждая строка самостоятельная и в конце неё ставиться точка с запятой.

Слова Program, Begin , End - обязательно используются в программах.

Тело программы в Турбо Паскале состоит из 7 разделов

1. Раздел объявления модулей;

2. Раздел описания меток;

3. Раздел определения констант;

4. Раздел определения типов;

5. Раздел описания переменных;

6. Раздел описания процедур и функций;

7. Раздел операторов.

Таким образом, тело программы состоит из двух частей:

- Декларативная часть - здесь происходит описание обрабатываемых данных.

- Исполнимая часть - здесь происходит описание алгоритмических действий над данными.

В декларативной части расположены первые 6 разделов. В исполнимой части присутствует только раздел операторов. Раздел операторов обязательно должен присутствовать в любой программе. В декларативной части разделы могут писаться в любом порядке за исключением модулей, который пишется сразу после заголовка.

Рассмотрим разделы:

1. Раздел обьявления модулей.

Uses <список имен модулей через запятую>

Например: Uses Crt, Graph.

Данный раздел подключает к программе системные модули из библиотек.

2. Раздел описания меток.

Любой оператор в программе может быть помечен меткой.

<метка>:<оператор>;

Все метки должны быть различны. Оператор должен быть помечен не более оного раза. В качестве меток обычно используют числа от 0- 999. Все метки должны быть предварительно описаны.

Label<Список меток через запятую>;

3. Раздел определения констант.

Константа имеет имя и определенное значение, которое остается постоянным во время работы программы.

Const <имя>=<значение>;

Например:

Const C1=17;

C2=3.14;

C3=’A’;

C4=False;

4. Раздел определения типов.

В Паскале существуют стандартные типы, которые описывать не надо (они считаются уже описанными: integer, real, char, boolean и т.д.). В Паскале есть возможность создать свой новый тип данных.

Type<имя>=<определение>;

Различают такие типы данных:

Integer - целочисленные данные;

Real - это вещественные (действительные числа);

Char - это символьный тип;

String - строковый тип;

Boolean - логический тип.

5. Раздел описания переменных.

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

Var <список имен переменных>:<тип переменной>;

Пример:

Var I, j, r: integer;

X, h, sum: real;

D, 1, r: string;

6. Раздел описания процедур и функций.

Раздел процедур и функций не начинается каким-то специальным служебным словом - начало данного раздела легко определяется по служебным словам procedure or function.

Procedure<имя процедуры>(<список формальных параметров>);

Function<имя функции>(<список формальных параметров >):<тип результата>;

7. Раздел операторов.

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

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

begin

Оператор 1;

Оператор 2;

……………

Оператор N;

end.

2.2 Операторы ввода-вывода

Ввод данных с клавиатуры выполняется оператором Read (список переменных через запятую). При выполнении этого оператора программа останавливается и ждет, пока нужное количество чисел не будет введено с клавиатуры. Вводимые числа разделяют пробелом или нажатием клавиши Enter. Readln - ввод данных осуществляется с использованием клавиши Enter.

Вывод данных на экран осуществляется оператором Write(выражение). В качестве выражения может быть предложение, записанное в апострофах или конкретное значение переменной или сама переменная.

Пусть х:Real

Write(x:5:2)

Write(x:m:n)

m - Общее количества знаков, отведенное под выводимое число.

n - Количество знаков после запятой.

Любое сообщение, выводимое на экран можно сдвинуть:

Write (‘сообщение’:N);

Ввод данных можно комментировать:

Write(‘Ответ’,х:5:3,’км.ч.’);

Ответ: 10.135 км.ч.

Writeln - после ввода всех значений переводит курсор в начало следующей строки.

Пустой оператор Readln - ожидает нажатия клавиши Enter перед словом End. Пустой оператор Writeln - вставляет, пустую строку.

2.3 Разветвляющиеся структуры

В Турбо Паскаль включены два условных оператора if и case. If - условный оператор, case - оператор выбора.

Условный оператор if позволяет выполнять или попускать операторы программы, в зависимости от некоторого условия. Оператор if может быть записан в полной и неполной формах.

Неполная форма условного оператора:

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

Если после слова then стоит несколько операторов, то к ним необходимо применить составной оператор Begin…End. Оператор выполняется если условие истинно.

Полная форма условного оператора:

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

В качестве условия применяются знаки сравнения.

Например: If x<>0 then z:=y/x else Writeln(‘На ноль делить нельзя’);

Перед else точка с запятой не ставится. Составной оператор нужен, когда надо пропустить или выполнить несколько операторов подряд.

Сложное условие состовляется из простых при помощи логических операций. (and - и, or - или, not - логическое отрицание).

If (a>0) and (a<=1) then

if (x=0) or (abs(x)<5) then

Оператор выбора Case является обобщением оператора if. Он дает возможность выполнить одно из нескольких действий.

Case <ключ выбора> of <список выбора>

Else <оператор> end;

В качестве ключа выбора можно использовать переменную целого или символьного типа.

2.4 Циклические структуры

В языке Турбо Паскаль имеются три оператора с помощью которых можно запрограммировать повторяющиеся фрагменты программ.

Оператор цикла с предусловием

While<условие> do <оператор>

Если после do стоит несколько операторов, то нужно поставить составной оператор Begin…End.

Цикл While является самой универсальной циклической конструкцией, с помощью которой можно записать любое циклическое действие. Оператор позволяет многократно выполнять одни и те же действия в зависимости от условия. Условие может принимать два значения True и Falsh.

Схема работы цикла While:

При входе в цикл проверяется условие, если оно ложно (-), то тело цикла не выполняется и управление передается оператору стоящему непосредственно за телом цикла. Если же условие истинно (+), то происходит однократное выполнение тела цикла. После этого управление переходит на проверку условия, где снова поверятся это условие и т.д.

Оператор цикла с последующим условием.

Repeat<оператор> Until <условие>

В отличие от цикла While цикл Repeat не требует использования составного оператора Begin…End, когда в его теле находится более одного оператора. Данный оператор не совсем универсален т.к. его условие располагается в конце тела цикла и операторы тела всегда будут выполнятся, как минимум один раз, поэтому он не пригоден для записи цикла, в которых может возникнуть ситуация, когда тело цикла не должно выполнятся ни разу.

Схема работы цикла Repeat:

Прямо противоположна циклу While, т.е. цикл продолжается пока условие ложно и заканчивается когда условие становится истинным. В цикле Repeat это условие выполняется как условие выхода из цикла.

Оператор цикла со счетчиком.

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

Параметр цикла (счетчик) увеличивается на единицу от начального значения n до конечного значения m, при каждом новом значении исполняется оператор внутри цикла.

Вложенные циклы

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

2.5 Процедуры и функции

Процедурой в Турбо Паскале называется оформленный фрагмент программы, имеющий собственное имя.

Procedure<имя>(список формальных параметров: тип)

<Раздел описаний>

begin

<Раздел операторов>

End;

Схема взаимодействия основной программы и процедуры

Все данные, описанные в разделе описания процедуры, называются локальными переменными по отношению к основной программе. Данные, описанные вне процедуры, называются глобальными. Допускается использование процедуры без параметров, описанные в основной программе.

Procedure ALRHA(x:Integer, y:Real, z:Char)

Любой из формальных параметров может быть либо параметром значения, либо параметром переменной, либо параметром константы const.

Пример: Procedure M(x,y:Real, b:Integer)

Procedure N(Var x,y:Real)

Procedure P(Const a:String)

Вызов процедуры осуществляется по имени с указанием фактических параметров. Между фактическими и формальными параметрами должно быть соответствие по каличеству, по типу, по порядку следования.

Описание функций происходит до исполняемой части и является маленькой программой внутри большой.

Function<имя>(<список формальных параметров>: тип):<тип результата>

<раздел описания>

Begin

<тело>

End.

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

Вызов функции осуществляется следующим образом: Переменной присваивается имя функции с указанием фактических параметров.

2.6 Массивы одномерные

2.7Массивы двумерные

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

С понятием «массив» приходится встречаться при решении научно-технических, экономических задач обработки большого количества однотипных значений.

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

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

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

Индексы представляют собой выражения простого типа. Доступ к каждому отдельному элементу осуществляется обращением к имени массива с указанием индекса нужного элемента:

<имя массива>[<индекс>].

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

Type <имя нового типа данных>=array[<тип индекса>] of <тип компонентов>;

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

Var <имя массива>: array [<тип индекса>] of <тип компонентов>;

Чаще всего в качестве типа индекса используется интервальный целый тип.

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

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

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

Алгоритм решения задач с использованием массивов:

-Описание массива;

-Заполнение массива;

-Вывод (распечатка) массива;

-Выполнение условий задачи;

-Вывод результата.

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

Var a: array [1..10] of array [1.. 20] of real;

Var a: array [1..10, 1..20] of real;

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

Только для инициализации двумерного массива используется вложенный цикл for.

Например, For i:= 1 to 10 do

For j:= 1 to 20 do

A[i, j] := 0;

При организации вложенных (сложных) циклов необходимо учитывать:

·Все правила, присущие простому циклу, должны соблюдаться.

·Имена параметров для циклов, вложенных один в другой, должны быть различными.

·Внутренний цикл должен полностью входить в тело внешнего цикла. Пересечение циклов недопустимо.

2.8 Строковый тип данных

Строки занимают промежуточное положение между простыми и структурированными типами данных. После этого утверждения резонно возникает вопрос: почему строки нельзя отнести к простым или структурированным типам данных?

Ответ на первую часть вопроса: Строка – это последовательность символов, иными словами структура, состоящая из элементов простого типа.

Теперь вернемся ко второй части вопроса: Во-первых, строковый тип в ТР относится к стандартным типам данных, а ни один из структурированных типов стандартным не является. Во-вторых, над строками применимы некоторые действия, допустимые для данных простых типов и не применимые к структурированным. Например, Строку можно ввести с клавиатуры или вывести на экран, воспользовавшись стандартными Read(x) и Write(x) соответственно, где х – строковая переменная. Также допустимо сравнивать целые строки. Однако эти действия невозможны с данными структурированных типов – массивами или записями.

Строка – это последовательность символов кодовой таблицы персонального компьютера.

При использовании в выражениях, строка записывается в виде ограниченной апострофами последовательности символов. Пример: ‘Кузьмич’; ’Введите значение А’; ’123’; и т. д.

Количество символов в строке (длина строки) может динамически изменяться от 0 до 255.

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

Если это значение не указывается, то по умолчанию длина строки равна 255 байт.

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

type <имя типа> = String[макс. дина строки];

var <идентификатор, …> : <имя типа>;

var <идентификатор, …> : String[макс. дина строки];

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

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

Действия со строками:

Операция объединения (или сцепления, или конкатенации) «+»

При ее выполнении начало строки, идущей после знака «+», присоединяется к концу строки, указанной до этого знака. При этом если длина объединенной строки превысит максимальную длину, допустимую для получившейся строки, «лишние» символы будут отброшены.

Операции отношения (+, <>, >, <, >=, <=) проводят сравнение двух строковых операндов и имеют приоритет более низкий, чем операции сцепления, если они присутствуют, и лишь потом реализуются операции отношения.

Сравнение строк приводится слева направо до первого несовпадающего символа, и та сторона считается большей, в которой несовпадающий символ имеет больший код. Результат выполнения операций отношения всегда имеет тип Boolean (True – правда, False – ложь).

Буквы закодированы по алфавиту, отдельно – строчные и отдельно – прописные. Равны лишь абсолютно идентичные строки.

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

Подпрограммы, предназначенные для работы со строками, содержатся в модуле System.

Функция Length(St: String): Integer;

Возвращает (вычисляет) текущую длину строки St (фактическое число символов) St – строковое выражение.

Функция Pos(Str1, Str2: String): Byte;

Ищет подстроку в строке.

Str1 – искомая строка;

Str2 – строка, в которой производится поиск.

Результат равен номеру той позиции, где находится первый символ подстроки Str1. Если в Str2 подстроки Str1 нет, то результат равен 0.

Если имеется несколько подстрок, то результат относится к первой.

Функция Copy(St: String, Index, N: Integer): String;

Выделяет из St подстроку, длиной N символов, начиная с позиции Index.

Если Index > Length(St) => результатом будет пробел; если Index > 255 , то возникнет ошибка при выполнении.

Функция Concat(S1, S2 … Sn): String;

S1 … Sn – объединяемые строки.

Выполняет сцепление (объединение) нескольких строк, в том порядке, в котором они указаны в списке параметров.

Функция UpCase(Ch: Char): Char;

Преобразует строчные буквы в прописные. Обрабатывает буквы только латинского алфавита. Если параметр Ch не принадлежит диапазону ‘a’ … ‘z’, то функция оставляет значение параметра без изменений.

Процедура Val(s; Var V; Var code: Integer);

Преобразует строковые значения в величину целочисленную или вещественного типа.

S – строка цифр.

V – возвращаемая переменная типа Real или Integer.

Code – номер позиции в строке, в которой при преобразовании произошла ошибка; если ошибки не было, параметр Code возвращает 0.

Если параметр V имеет целочисленное значение, параметр S представляет собой просто строку цифр. Если параметр V имеет вещественное значение, параметр S представляет собой строку цифр с десятичной точкой.

Процедура Str(x: Size: Dec; Var St: String);

Преобразует числовое значение в строку цифр.

X – преобразуемое число;

S – возвращаемая строка.

Size и Dec – необязательные параметры, представляющие собой спецификатор ширины поля и спецификатор числа знаков после десятичной точки. Эти параметры имеют тот же смысл, что и аналогичные параметры процедуры Write.

Процедура Insert(St1: String; Var St2: String; Index: Integer);

Вставляет подстроку St1 в строку St2 начиная с позиции, заданной Index.

St1 – вставляемая подстрока;

St2 – строка, содержащая подстроку;

Index – позиция в строке St2, куда вставляется подстрока St1.

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

Процедура Delete(Var St: String; Index: Integer; Count: Integer);

Удаляет подстроку из строки.

St – строка, из которой удаляется подстрока;

Index – номер позиции в строке, с которой начинается удаляемая подстрока.

Count – число символов в удаляемой подстроке.

2.9 Множественный тип данных

Под множеством понимают ограниченный, неупорядоченный набор различных элементов одного типа.

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

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

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

Множественный тип описывается с помощью служебных слов Set of, например: type M= Set of B;

Здесь М - множественный тип, В - базовый тип.

Пример описания переменной множественного типа:

type

M= Set of 'A'..'D';

var

MS: M;

Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных: var C : Set of 0..7;

Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми, например: ['A', 'C'] [0, 2, 7] [3, 7, 11..14].

Константа вида [] означает пустое подмножество.

К переменным и константам множественного типа применимы операции присваивания(:=), объединения(+), пересечения(*) и вычитания(-):

['A','B'] + ['A','D'] даст ['A','B','D']

['A'] * ['A','B','C'] даст ['A']

['A','B','C'] - ['A','B'] даст ['C'].

Результат выполнения этих операций есть величина множественного типа.

К множественным величинам применимы операции: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например:

['A','B'] = ['A','C'] даст FALSE

['A','B'] <> ['A','C'] даст TRUE

['B'] <= ['B','C'] даст TRUE

['C','D'] >= ['A'] даст FALSE.

Кроме этих операций для работы с величинами множественного типа в языке ПАСКАЛЬ используется операция in проверяющая принадлежность элемента базового типа, стоящего слева от знака операции, множеству, стоящему справа от знака операции. Результат выполнения этой операции - булевский. Операция проверки принадлежности элемента множеству часто используется вместо операций отношения, например:

A in ['A', 'B'] даст TRUE,

2 in [1, 3, 6] даст FALSE.

2.10 Структурированный тип данных – записи

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

При решении научно-технических и экономических задач обработки совокупности больших объемов значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что каждый элемент массива должен иметь один и тот же тип данных. В работе «Поиск в массиве по критерию» мы использовали процедуру Val. Мы все элементы массива объявляли типа String (строка), а затем, с помощью процедуры Val, значение возраста учащихся из типа String преобразовывали в величину целочисленного типа (Integer). Решение задачи получилось громоздким, затрачивалось время на преобразование типа.

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

Итак, реальные данные об объектах часто описываются величинами разных типов. Например, товар на складе описывается следующими величинами: наименование, количество, цена, наличие сертификата качества и т. д. В этом примере наименование – величина типа String, количество – Integer цена – Real,, наличие сертификата качества можно описать величиной типа Boolean.

Для записи комбинации объектов разных типов в Паскале применяется комбинированный тип данных запись.

Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов.

В отличие от массива, запись может содержать элементы, принадлежащие разным типам.

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

Итак: Элементы, образующие запись, называются полями.

Формат записи:

Type <имя типа> = Record

<идентификатор поля 1>: <тип компонента>;

<идентификатор поля N>: <тип компонента>;

end;

var <идентификатор, …>: <имя типа>;

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

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

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

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

Для решения этой проблемы в языке Паскаль предназначен оператор With(в переводе «с»):

With <переменная типа запись> do <оператор>

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

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