Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
АЛГОРИТМЫ. ВИДЫ АЛГОРИТМОВ.
В инженерной практике постоянно встречаются задачи, которые не могут быть решены «с ходу». Требуется осмысление задачи, выбор адекватного подхода, разработка некоей структуры решения. Собственно эта структура решения, т.е. план, и есть алгоритм.
Алгоритм точно определенное правило действий (программа), для которого задано указание, как и в какой последовательности это правило необходимо применять к исходным данным задачи, чтобы получить ее решение.
Основные характеристики алгоритма:
Существует несколько базовых алгоритмических конструкций, из которых могут быть построены алгоритмы любой сложности:
Описать алгоритм можно одним из способов:
……
+ +
Алгоритмический язык формальный язык записи алгоритмов для их реализации на ЭВМ, публикации или формального анализа. Он определяется заданием алфавита (т.е. словаря исходных символов),
точным описанием его синтаксиса (грамматики)
и семантики.
Правила преобразования информации в различных алгоритмических языках весьма разнообразны и качественно различны. Но в каждом языке должны быть средства для задания операторов, осуществляющих переработку информации, и операторов перехода (распознавателей), определяющих порядок выполнения этих операторов. Операторы, в свою очередь, могут обозначать последовательности других более элементарных операций.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ.
DELPHI ЯЗЫК ВЫСОКОГО УРОВНЯ.
«Мозгом» компьютера является процессор. Эта небольшая электронная схема выполняет все вычисления и обработку информации. У каждого типа процессоров свой состав регистров (ячеек памяти), и у каждого регистра свое назначение.
Состав регистров и их назначение называются архитектурой процессора. Чем сложнее процессор, тем сложнее его архитектура.
Для каждого процессора существует своя система команд документ, в котором описано, какая команда что выполняет, каким кодом она записывается и как ее следует использовать. Эти команды элементарны: переслать число из одного регистра в другой, включить определенный бит в определенном случае и т.п.
Языки программирования, использующие такие команды, называют языками низкого уровня. В них одна команда языка соответствует одной команде процессора. Примером языка низкого уровня является Ассемблер. Программы, написанные на Ассемблере, работают очень быстро, но для их правильного составления нужно хорошо знать архитектуру процессора.
Для удобства пользователей компьютеров были разработаны так называемые языки высокого уровня. В них команды звучат привычнее и приближены к формулам. Но для выполнения такой команды требуется несколько команд процессора.
Тексты программ становятся компактнее и понятнее, однако возникает необходимость в другой программе трансляторе, которая переведет составленный текст на машинный язык.
Есть два вида таких программ компиляторы и интерпретаторы.
Паскаль был разработан в 1970 году Никлаусом Виртом как язык для обучения студентов программированию. Но быстро обнаружилась чрезвычайная эффективность языка в самых разнообразных приложениях. Паскаль позволяет писать программы, легко читаемые даже новичком, и содержит в себе все элементы, необходимые для соблюдения хорошего строгого стиля программирования, упрощающего разработку сложных программ. Язык Паскаль стандартизован во многих странах. В 1983 году был принят международный стандарт.
Сейчас существуют многочисленные реализации языка практически для всех машинных архитектур; разработаны десятки диалектов и проблемно-ориентированных расширений языка Паскаль.
Система программирования Турбо Паскаль появилась в середине 80-х г.г. и завоевала высокую популярность в классе систем программирования на ПК. Она состоит из языка программирования Паскаль и разработанного фирмой Borland программного окружения, предоставляющего сервисные услуги:
Текст программы представляет собой последовательность строк, состоящих из символов, образующих алфавит языка. Строки завершаются специальными управляющими символами, не входящими в алфавит (#10, #13). Максимальная длина строки 126 символов.
Алфавит языка включает:
Из символов алфавита языка строятся базовые элементы программы :
СТРУКТУРА ПРОГРАММЫ.
DELPHI является алгоритмическим языком. В соответствии с этим программа всегда состоит из двух частей описания последовательности действий, которые нужно выполнить, и описания данных, над которыми производятся эти действия. Действия представляются операторами языка.
Данные вводятся посредством описаний и определений.
Текстуально описание данных должно предшествовать описанию действий и содержать упоминание всех объектов, используемых в действиях.
В общем виде программа на Паскале состоит из разделов:
Uses
Список используемых библиотек (модулей);
Label
Список меток;
Const
Определение констант; данных
Type
Описание типов;
Var
Описание переменных;
Определение используемых процедур;
Определение используемых функций;
Begin
. . . . .
Основной блок программы описание
. . . . .
End.
Кроме конструкций языка, программа может содержать комментарии и ключи компиляции.
Комментарий любой текст в любом месте программы, заключенный в фигурные скобки {} или в круглые скобки со звездочкой (* *). Комментарий не изменяет смысл программы и на выполнение не влияет, используется для пояснения текста программы.
Ключи компиляции (директивы компилятору) тоже заключаются в фигурные скобки, но являются инструкциями компилятору, предписывающими тот или иной режим обработки программы. Состоит из знака $, стоящей за ним буквы, определяющей конкретный режим, и знаков + или -, указывающих включить или выключить данный режим.
СИСТЕМА ТИПОВ ЯЗЫКА.
ТП является языком с сильной системой типизации. Это означает, что все данные, обрабатываемые программой, должны принадлежать к какому-либо заранее известному типу.
Под типом понимается множество значений, которое может принимать переменная, и совокупность действий, которые можно выполнять с этими значениями.
С точки зрения внутреннего распределения памяти, задавая тип переменной, мы тем самым однозначно определяем размер памяти, выделяемый под переменную.
Такой подход (когда тип переменной задается при ее описании и не может быть изменен, а переменная может участвовать только в операциях, допустимых ее типом) способствует большей аккуратности и ответственности при составлении программ, делает их поддающимися автоматической проверке на корректность при компиляции, и в конечном итоге приводит к более высокой надежности создаваемых программ.
В языке предопределено достаточное количество типов данных, и имеются возможности для объявления новых типов (пользовательских).
Иерархическая структура типов
СКАЛЯРНЫЕ ТИПЫ.
Это базовые (простые) типы языка. Они распадаются на 4 группы:
Целые типы. имеется пять целых типов, которые отличаются форматами и диапазонами допустимых значений.
Тип переменной |
Описание |
Размер памяти |
Диапазон |
Пример |
Неотрицательные целые числа |
byte |
1 байт |
0 … 255 |
16; 124 |
word |
2 байта |
0 … 65535 |
12363 |
|
Положительные и отрицательные целые числа |
shortint |
1 байт |
-128 .. 127 |
25; -99, 111 |
integer |
2 байта |
-32768..32767 |
-6956 |
|
longint |
4 байта |
-231 … 231-1 |
2147483647 |
Для целочисленных переменных, кроме рассмотренных выше, определены следующие арифметические функции, результат которых тоже целое число:
ABS (N) абсолютная величина N;
A DIV B целая часть от деления A на B;
A MOD B остаток от деления A на B;
*, , + умножение, вычитание, сложение;
SQR (N) квадрат числа N;
SQRT(N) корень квадратный из N;
ODD (N) проверка N на четность.
Заметим, что при выполнении обычного деления / для целых чисел всегда получается вещественный результат ( тип REAL).
Операции сложения и вычитания могут использоваться как унарные (для одного операнда). При изменении знака числа, например, можно записать:
а := а;
Рассмотрим подробнее операции DIV, MOD. При делении с точностью до целых чисел получается два результата частное и остаток. Операция DIV обозначает целочисленное деление. Знак результата берется по обычным правилам, а полученный остаток игнорируется.
Пример 1:
23 DIV 5 = 4;
2 DIV 6 = 0;
(13) DIV 5 = 3;
(13) DIV (5) = 3.
Операция MOD дает остаток при делении двух целых чисел.
Пример 2:
23 MOD 5 = 3;
2 MOD 6 = 2;
(13) MOD 5 = 3;
(13) MOD (5) = 2;
8 MOD 2 = 0.
Операции *, DIV, MOD одинаковый более высокий ранг, а операции + и также имеют одинаковый, но более низкий ранг.
Чаще всего целые числа используются в простых арифметических выражениях и выступают в программах в качестве различных счетчиков и значений индексов.
Вещественные типы определено пять стандартных вещественных типов, которые, как и целые типы данных, отличаются форматами и диапазонами допустимых значений.
Описание |
Диапазон |
Число значащих цифр |
Объем памяти, б |
real |
2.9*1039…1.7*10+38 |
1112 |
6 |
single |
1.5*1045…3.4*10+38 |
78 |
4 |
double |
5.0*10324…1.7*10+308 |
1516 |
8 |
extended |
3.4*104932…1.1 *10+4932 |
1920 |
8 |
comp |
9.2*10+18…9.2*10+18 |
1920 |
8 |
Comp хотя и считается вещественным типом, но содержит только целые числа из весьма значительного диапазона, которые представляются в вычислениях как вещественные с нулевой мантиссой.
Наиболее распространенная форма типов вещественных чисел это тип real.
Результат работы функций сложения, вычитания, деления, умножения, возведения в квадрат вещественных чисел дает вещественное число. Кроме этого используются следующие функции, результат которых вещественное число:
ABS(X) абсолютное значение X;
ARCTAN(X) арктангенс X;
COS(X) косинус X;
SIN(X) синус X;
LN(X) натуральный логарифм X при этом должно выполняться X >0;
SQR(X) квадрат X;
SQRT(X) корень квадратный из X, при этом должно выполняться X >= 0;
EXP(X) еX ;
FRAC(X) дробная часть X;
INT(X) целая часть X;
PI значение PI = 3.141592653589793238;
TRUNC (X) получение целой части вещественного числа X;
ROUND (X) округление вещественного числа X.
Форма представления вещественных чисел может быть в двух форматах:
1) с плавающей точкой;
2) с фиксированной точкой.
Точка является в языке разделителем целой и дробной частей.
Формат представления с плавающей точкой это форма записи числа, которая характеризирует его порядок. Это форма вида:
[Sign1]<N1>.<N2> e Sign2<N3>,
Логический тип. Значением логического типа boolean является множество из двух упорядоченных элементов FALSE и TRUE. Переменным логического типа могут присваиваться только эти два значения. Про их значения известно, что:
TRUE > FALSE,
SUCC(FALSE) = TRUE,
ORD(FALSE) = 0,
ORD(TRUE) = 1,
PRED(TRUE) = FALSE.
На этом множестве определены одна унарная (один аргумент) и три логические бинарные операции (два аргумента):
NOT (отрицание изменяет значение на противоположное);
AND (конъюнкция истина только тогда, когда обе переменные истинны);
OR ( дизъюнкция истина только тогда, когда один из операндов истинен);
XOR (исключение истина только тогда, когда обе переменные различны).
Работа этих операций для двух переменных представлена в следующей таблице:
a |
not a |
a |
b |
a and b |
a or b |
a xor b |
|
True |
False |
True |
True |
True |
True |
False |
|
False |
True |
True |
False |
False |
True |
True |
|
False |
True |
False |
True |
True |
|||
False |
False |
False |
False |
False |
При записи условий используются следующие отношения между величинами: =, <>, >, <, <=, >=, in (принадлежность элемента множеству).
Подвыражение, содержащие операции отношение, заключаются в круглые скобки. Операции сравнения дают результат булевского (логического) типа, поэтому его можно присваивать булевской переменной. Например:
с := a > b.
Такой оператор присваивания называется логическим.
Символьный тип. Значением символьного типа сhar (1 байт памяти) может быть один из 255 упорядоченных элементов множества всех символов, представленных кодами ЭВМ таблицы ASCII (American Standard Code for Information Interchange американский стандартный код для обмена информацией).
Символы записываются в одинарных кавычках. Например, a, @, 1, а при выводе символов на экран апострофы не изображаются.
Допускается использование записи символа через его внутренний код, который записывается после символа #. Внутренний код это порядковый номер символа в таблице кодов.
Например:
a соответствует записи #97;
z соответствует записи #90.
Допустима операция сложения (сцепления) символов знак «+», но типом результата уже не будет тип char, результат будет иметь структурированный тип string. Символы можно сравнивать друг с другом, результат будет иметь логический тип. При сравнении считается, что символы равны, если равны их ASCII-коды, и один код больше другого, если его код больше. Таким образом, операций над значениями символьного типа, которые давали бы значение этого же типа, нет. Например:
a > A, так как 97 > 65 (a = #97, A = #65).
К символьным значениям можно применять стандартные функции (в скобках указан аргумент функции и через двоеточие тип аргумента):
CHR (x:byte) :char возвращает символ ASCII-кода;
ORD (c:char) : byte возвращает ASCII-код символа;
PRED (c:char) : char выдает предшествующий с символ;
SUCC (c:char) : char выдает последующий за с символ.
Не определены значения SUCC(#255) и PRED(#0).
Перечисляемые типы
Задаются непосредственно перечислением всех значений, которые может принимать переменная данного типа. Отдельные значения указываются через запятую, а весь список заключается в круглые скобки.
Например,
Type
Color = (red, yellow, green, black);
Animals = (cat, dog, horse) ;
Days = (Monday, Sunday, Tuesday, Friday);
Поскольку перечисляемый тип это тип данных, при котором количество всех возможных значений конечно, значит типы целые, символьный, логический тоже можно считать перечисляемыми.
Любой перечисляемый тип упорядочен и имеет внутреннюю нумерацию: 1-й элемент имеет №0, 2-й - №1 и т.д. Номер каждого элемента можно получить функцией:ORD (x) : longint.
Переменные перечисляемого типа можно сравнивать: больше та переменная, у которой больше порядковый номер.
Для переменных этого типа можно использовать функции SUCC(x) и PRED(x). Например: DEC (5) = 4; PRED (b) = a. Не определены значения SUCC (последний элемент перечисления) и PRED (1-й элемент перечисления).
Ограниченный тип (диапазон)
Содержит значения только из ограниченного поддиапазона некоторого базового типа (любой целочисленный тип, тип char, и любой из введенных программистом перечисляемых типов). Для задания этого типа надо указать границы, сначала меньшую, потом большую, между ними разделитель 2 точки:
Type
Digits = 1..8;
Symbols = b..m.
Ограниченный тип наследует все свойства (допустимые операции) базового типа.
Перечислимые и ограниченные типы повышают наглядность программы и позволяют более надежно контролировать выходы значений за пределы заданного диапазона, как при трансляции, так и при выполнении программы.
ОПИСАНИЕ ПЕРЕМЕННЫХ.
Переменные вводятся в программу для хранения и передачи данных внутри нее. Любая используемая переменная должна быть определена, причем ее описание должно предшествовать ее использованию. Описание начинается со служебного слова var. За ним следует список идентификаторов переменных с указанием их типов, разделенных двоеточием.
Пример: var
A:integer; {стандартный тип}
S:char; {стандартный тип }
Flag: boolean; {стандартный тип }
Sinus:real; {стандартный тип }
Index: 0..5; {тип диапазон}
Semafor: (red, green); {перечислением}
X,y,z: real; {неск. пер-х одного типа можно объединять}
2.ОПИСАНИЕ КОНСТАНТ.
Константы это объекты, которые при выполнении программы не меняют своего значения. Описание начинается со служебного слова const, за которым следует список идентификаторов констант и их значений через знак равенства «=».
Пример:
Const
Min = 10;
Max = 1000;
Center = (max-min) div 2; {расширение ТП можно использовать
константные выражения}
Message = Out of memory;
Тип не указывается. Он однозначно определяется по конкретному значению каждой константы.
Использование в программе идентификаторов констант вместо записи конкретных значений считается хорошим стилем программирования, т.к. делает программу более “читабельной” и способствует лучшему ее пониманию. И, кроме того, проще редактировать программу, поменяв один раз какое-то значение в разделе описаний, чем отслеживать это значение по ходу программы и менять несколько раз.
Типизированные константы.
Занимают промежуточное положение между переменными и константами:
Т.о., название “константа” довольно условное.
Пример:
Const
Pi: real = 3.14;
Diapazon: 0..100 = 1;
Title: string = Name;
Нужно помнить, что типизированные константы не взаимозаменяемы с обычными константами. Их нельзя использовать в константных выражениях:
Const
Min : integer = 0;
Max: integer = 99;
Var
M: array[min..max] of byte; {некорректно!}
В подобных случаях следует помнить, что типизированная константа фактически является переменной с заданным начальным значением.
Для типизированных констант регулярных типов в качестве начального значения нужно задать список всех элементов массива через запятую, заключенный в круглые скобки.
Type
Mas=array[1..5]of real;
Const
M:mas = (2.8, 3.2, 4.5, -3.4, -0.9);
ВЫРАЖЕНИЯ.
Выражение представляет собой формальное правило для вычисления некоторого (нового) значения. Понятие выражения присутствует практически в любом достаточно развитом языке программирования, а синтаксические правила для их построения очень похожи в различных языках.
В самом общем виде выражения строятся из операндов, знаков операций и круглых скобок.
Операнды “элементарные” значения. Ими могут быть переменные, элементы массивов, поля записей и т.д.
Операции определяют действия, которые надо выполнить над операндами. Операции в ТП подразделяются на арифметические, отношения, логические, строковые и др. Соответственно выражения называются арифметическими, отношения, логическими, строковыми и др. в зависимости от того, какого типа операнды и операции в них используются.
Операции обозначаются:
Операции бывают:
Арифметические операции выполняют арифметические действия над значениями операндов целочисленных и вещественных типов:
Операции отношения выполняют сравнение двух операндов и определяют истинно значение выражения или ложно. Результат имеет булевский тип (true или false): <, >, <=, >=, <>, =, in. Сравнивать можно совместимые простые значения, указатели, символы, строки. Замечание: формально х 2.23 * х / 2.23, но из-за ошибок округления в вещественном типе левая и правая части будут отличаться; т.е. при сравнении вещественных значений нельзя быть уверенным в его корректности.
Логические операции результат true или false: not, or, and, xor. ТП поддерживает 2 различные модели генерации кода для операций and и or: полное вычисление и вычисление по короткой схеме (частичное). Полное каждый член логического выражения, построенного с помощью операций and и or, всегда будет вычисляться, даже если результат всего выражения уже известен. Частичное вычисление прекращается, как только результат всего выражения становится очевиден. Во многих случаях эта модель удобна, т.к. обеспечивает минимальное время выполнения и, как правило, минимальный объем кода. Такое вычисление делает возможными такие конструкции, которые в противном случае были бы недопустимыми. Пример: if (x<>0) and (2/x >N) then… Здесь: если результат первого вычисления будет false, то вычисление второго выражения не выполняется (а если бы попыталось выполниться, то возникла бы ошибка). Полная схема необходима лишь тогда, когда один или более операндов в выражении логические функции с побочными эффектами, которые изменяют смысл программы. Схема вычисления задается с помощью ключа компилятора $B в меню Option/Compiler. {$B+} полная схема, {$B-} короткая схема.
Задачи: установить, истинны или ложны следующие условия:
Not ((6<4) and (4>8)) {true}
(a<=a+1) or (12-3>0) {true}
((2<=2) and (3>=3)) or (15>25) {true}
Операция взятия адреса @ - унарная операция, создает указатель на переменную.
Выполнение операций происходит с учетом их приоритетов. Чем выше приоритет, тем раньше выполняется операция:
Если необходимо изменить порядок действий, который определен приоритетами, то нужно использовать круглые скобки ( ).
В выражениях можно использовать готовые функции и процедуры ТП:
Вызов функции |
Тип аргумента |
Тип значения |
Назначение функции |
Abs(x) |
Целый/веществен. |
Как у аргумента |
Абсолютное знач. х |
Pi |
- |
Вещественный |
. Генерирует число с точностью, зависящей от наличия сопроцессора и содержит 10-14 знаков после «,». Может использоваться в вычислениях как константа, но не может быть подставлена в вычислимые константы раздела Const |
Sin(x) |
Вещественный |
Вещественный |
Sin x радиан |
Cos(x) |
Вещественный |
Вещественный |
Cos x радиан |
Arctan(x) |
Вещественный |
Вещественный |
Arctg x радиан. Возвращает главное значение (от до ) |
Sqrt(x) |
Целый/веществен. |
Вещественный |
, х>0 |
Sqr(x) |
Целый/веществен. |
Как у аргумента |
X2 |
Exp(x) |
Вещественный |
Вещественный |
ex |
Ln(x) |
Вещественный |
Вещественный |
Ln x, x>0 |
Trunc(x) |
Вещественный |
Longint |
Целая часть х |
Frac(x) |
Вещественный |
Вещественный |
Дробная часть х |
Int(x) |
Вещественный |
Вещественный |
Целая часть значения х. Записывает целое число в вещественном формате (для совместимости в операторах присваивания) (после « . » - нули) |
Round(x) |
Вещественный |
Longint |
Округление х до ближайшего целого |
Odd(x) |
Целый |
Логический |
True если х нечетное |
Random |
- |
Вещественный |
Случайное число (0..1) |
Random(x) |
Word |
Word |
Случайное число (0..х) |
Остальные математические функции надо выражать через стандартные (используя справочник по математике).
logab= ln(b)/ln(a)
Задача: записать выражение по правилам ТП:
inc(var x : целое) увеличивает значение х на 1
dec(var x : целое) уменьшает значение х на 1
inc(var x : целое; N: целое) увеличивает значение х на N
dec(var x : целое; N: целое) уменьшает значение х на N
Оптимизируют операции сложения и вычитания. При компиляции inc(i) дает более эффективный код, чем традиционное i:=i+1 (выигрыш до 30%).
Операторы это синтаксические конструкции, предназначенные для записи алгоритмических действий по преобразованию данных, а также для задания порядка выполнения других действий.
В ТП есть:
Простые операторы.
Пример: flag:= false;
Ch:=h;
Sum:= x+y;
R:= (x+z)/(2+z*10) 0.5;
Задачи:
Temp:=x;
X:=z;
z:=y;
y:=temp;
X:=2;
X:=x+x;
X:=x-1; {3}
A:=5; a:=a+b;
B:=3; b:=a-b;
a:=a-b;
Применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой оператор. Метка может содержать как цифровые, так и буквенные символы: goto 99; goto EndBlock;
! Старайтесь не использовать goto в своих программах. Применение безусловных передач управления подвергается серьезной критике и считается теоретически избыточным, т.к. получаются малопонятные и трудно модифицируемые программы, которые вызывают большие сложности при отладке и сопровождении.
Задачи:
2 3 4 5
6
Какие значения придаст переменным х и у пара операторов:
Read(x); readln(x);
Read(y); read(y);
Write(x1,x2); writeln(x1);
Write(x3,x4); writeln(x2,x3);
Writeln(x4);
Можно использовать writeln без списка вывода курсор переместится в начало следующей строки.
Составные операторы.-
Конструкции, построенные из других операторов по строго определенным правилам. Делятся на 3 группы: составные, условные, повтора.
Пример: begin begin
A:=11; z:=x;
B:=a*a; x:=y;
Write(b); y:=z;
End; end;
Составной оператор применяется в тех случаях, когда синтаксис языка Паскаль допускает использование только одного оператора, в то время как по логике программы надо выполнить некоторую последовательность действий.
If <условие> then <оператор 1>
Else <оператор 2>; (1)
If <условие> then <оператор>; (2)
Условие это выражение булевского типа. Если значение выражения истинно, выполняется оператор 1, если ложно оператор 2 (для (1)). Для (2): если условие истинно, то выполняется <оператор>, если ложно оператор, следующий за оператором If.
Пример:
If x>y then max:=x
Else max:=y;
If x=100 then write(код правильный)
Else
Begin
Write(ошибка в коде!);
Halt(1);
End;
Допускается вложенность условных операторов.
Задачи:
If a>b Then
If a>c then max:=a
Else max:=c
Else
If b>c then max:=b
Else max:=c;
If odd(x) then writeln(0)
Else writeln(1); или ((x mod 2) <> 0)
Readln(a,b);
If a>b then write (b, ,a)
Else write (a, ,b);
Readln(a,b);
If a>b then begin
Temp:=a;
A:=b;
B:=temp
End;
Writeln(a, ,b);
Const a=3; b=5; c=-4;
Var d:real; x1,x2:real;
Begin
D:=sqr(b)-4*a*c;
If d>0 then
Begin
X1:=(-b+sqrt(d))/2*a;
X2:= (-b-sqrt(d))/2*a;
Writeln(x1=, x1, x2=, x2);
End
Else writeln (нет действительных корней!);
End.
Case <выражение-селектор> of
< набор значений 1>:<оператор 1>;
< набор значений 2>:<оператор 2>;
. . . . .
< набор значений N>:< оператор N>
else < оператор >
end;
Пример:
Case Color of
Red : x:=y+2;
Yellow: x:=y-2;
Green : x:=y;
End;
Сначала вычисляется текущее значение переменной Color. Затем это значение сравнивается с константами, записанными перед операторами. При совпадении значения переменной и одной из констант выбора будет выполнен оператор, «помеченный» данной константой. Если значение переменной Color не совпадет ни с одной константой, то данный оператор не выполнит никаких действий.
Кроме одиночных констант могут использоваться списки или диапазоны значений: Пример: Case Sw of
1..3 : proc1;
4,5,8 : proc2;
6,9..12 : proc3
else proc4
end;
Операторы безусловного выхода из программы.
ТП обладает средствами безусловного выхода из программных блоков. Это очень удобно, т.к. позволяет завершить программу или процедуру без предварительных переходов по меткам. К таким операторам завершения относятся вызовы системных процедур Halt и Exit.
Exit завершает работу своего программного блока. Вызов Exit в процедуре означает завершение ее работы и возврат в основную программу. Вызов в основной программе означает завершение программы.
Halt(n) независимо от того, где она находится, ее выполнение завершает работу программы с кодом завершения n. Этот код впоследствии может быть проанализирован, в частности, командой If ErrorLevel… в среде MS DOS. Значение ErrorLevel после остановки программы будет равно значению n. N=0 соответствует нормальному коду завершения.
Лекция №3
Операторы цикла
Циклы это повторяющееся выполнение одних и тех же операторов. Существует 3 стандартных способа организации циклических вычислений.
Цикл с предусловием.
While <выражение> do <оператор>;
Перед каждым очередным выполнением оператора производится проверка значения булевского выражения, которое служит критерием повторения. Если это выражение имеет значение True тело цикла выполняется. Затем снова вычисляется выражение условия. Если результат равен False происходит выход из цикла и переход к первому после While оператору. Если выражение с самого начала было ложно, то цикл не выполнится ни разу.
Пример: 1) While E>0.05 do begin
S:=a*b;
E:=p-s;
A:=a+0.5;
B:=b+0.5;
End;
Следует помнить:
. . . . .
a:=5;
While a>0 do x:=x+2*x;
. . . . .
Цикл с постусловием.
<оператор>;
. . . . . . . тело цикла
<оператор>
Until <условие>;
В случае цикла с постусловием вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат булевского выражения False, то тело цикла выполняется еще раз. Если результат True происходит выход из цикла. Здесь тоже тело цикла должно влиять на значение условия, иначе цикл будет выполняться бесконечно. Заметьте, что этот цикл выполнится хотя бы раз, т.к. условие стоит после тела.
Пример: Repeat
K:=i mod j ;
I:=j ;
J:=k;
Until j=0;
Язык Pascal (Паскаль) был разработан швейцарским профессором Николаусом Виртом в конце 60-х начале 70-х годов прошлого века и назван в честь выдающегося французского математика и философа Блеза Паскаля. Первоначально этот язык был создан для обучения программированию. Однако, благодаря заложенным в нем большим возможностям структурного программирования, он стал широко применяться в различных областях: науке, технике, экономике, при создании информационных систем и т.д. В настоящее время язык Pascal это один из необходимых элементов обучения программированию. Существует много версий языка. В настоящее время наиболее популярна версия Turbo Pascal 7.0.
Текст программы на языке Pascal представляет собой последовательность строк, состоящих из символов, образующих алфавит языка. Строки завершаются специальными управляющими символами, не входящими в алфавит (#10, #13). Максимальная длина строки 126 символов.
Алфавит языка включает:
Из символов алфавита языка строятся базовые элементы программы:
{ }или (* *) скобки комментария;
[ ] выделение индексов массива и элементов массива;
( ) выделение списков параметров, алгебраические скобки;
апостроф;
: отделение переменной или типизированной константы от типа;
; разделение операторов и объявлений;
= отделение идентификатора типа от описания типа или типизированной константы от значения;
, разделение элементов списка;
.. разделение границ диапазона;
. конец программы, отделение целой части от дробной, разделение полей записи;
$ знак шестнадцатеричного числа или директивы компилятору;
# признак кода числа.
Разделителями в программе служат пробелы, любые управляющие символы и комментарии.
Комментарий любой текст в любом месте программы, заключенный в фигурные скобки {} или в круглые скобки со звездочкой (* *). Комментарий не изменяет смысл программы и на выполнение не влияет, используется для пояснения текста программы.
Некоторые символы, например &, %, буквы русского алфавита можно использовать только в символьных строках и комментариях.
Комментарий, в котором вслед за скобкой следует знак $, является директивой компилятору.
Директивы компилятору (ключи компиляции) тоже заключаются в фигурные скобки, но являются инструкциями компилятору, предписывающими тот или иной режим обработки программы. Директива компилятору состоит из знака $ и стоящей за ним буквы, определяющей конкретный режим, а также знаков + или , которые указывают включить или выключить данный режим.
Программа на языке Pascal всегда состоит из двух частей:
1. Описания данных, над которыми производятся действия. Описание данных должно предшествовать описанию действий и содержать упоминание всех объектов, используемых в действиях.
2. Описания последовательности действий, которые нужно выполнить. Действия представляются операторами языка.
В общем виде программа может содержать следующие разделы, каждый из которых, кроме последнего, завершается точкой с запятой:
Program имя программы;
Uses
Список используемых библиотек (модулей);
Label
Список меток;
Const описание
Определение констант; данных
Type
Описание типов;
Var
Описание переменных;
Определение используемых процедур;
Определение используемых функций;
Begin
. . . . .
Основной блок программы описание
. . . . . действий (обязательная часть)
End.
Кроме конструкций языка, программа может содержать комментарии и ключи компиляции.
Заголовок программы. Заголовок программы необязателен и игнорируется компилятором. Если заголовок присутствует, то он состоит из зарезервированного слова и имени программы.
Например: Program Summa_1;.
Раздел Uses служит для подключения как библиотечных модулей, так и модулей пользователя. Имена модулей последовательно перечисляются в виде списка. Например: Uses Сrt, Modul1, Modul2;.
Порядок размещения последующих разделов части описания произвольный, можно создавать сразу несколько одинаковых разделов.
Раздел описания меток Label содержит список меток, используемых в программе. Обычно программе в качестве меток можно использовать целые числа и короткие идентификаторы, например, 12, М12. Сама метка ставится в тексте программы перед оператором и отделяется от него двоеточием.
Раздел объявления констант Const вводится для того, чтобы задать начальные значения переменным или предписать некоторым константам идентификаторы. Например:
Const
А = 12.3;
Str = asd;
Раздел объявления типов Type используется тогда, когда пользователь хочет создать свои пользовательские типы. Стандартные типы данных языка не требуют объявления. Например:
Type
YEAR = 2000…2009;
Day = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday);
Раздел объявления переменных Var содержит список переменных с объявлением их типов. Например:
Var
a, b, c : integer;
d, f : real;
e : string;
Раздел объявления функций и процедур содержит описания всех используемых функций и процедур пользователя.
Основной блок программы (тело программы) обязателен. Он заключается в операторные скобки Begin End с точкой. Тело программы содержит набор операторов, которые определяют действия программы.
Использование различных типов данных имеют огромное значение при программировании, т.к. определяют способы и алгоритмы обработки этих данных. Pascal является языком с сильной системой типизации. Это означает, что все данные, обрабатываемые программой, должны принадлежать к какому-либо заранее известному типу. Тип переменной задается при ее описании и не может быть изменен, а переменная может участвовать только в операциях, допустимых ее типом. С точки зрения внутреннего распределения памяти, задание типа переменной однозначно определяет размер памяти, выделяемый под переменную.
Можно выделить следующие группы типов:
При программировании можно использовать как стандартные типы данных так имеется возможность и для создания и объявления новых типов (пользовательских).
3.1. Простые типы
Скалярные типы
Это базовые типы языка. Они распадаются на 4 группы:
целые типы;
вещественные типы;
символьные тип;
логические тип.
Целые типы. В Pascal имеется пять целых типов, которые отличаются форматами и диапазонами допустимых значений.
Тип переменной |
Описание |
Размер памяти |
Диапазон |
Пример |
Неотрицательные целые числа |
byte |
1 байт |
0 … 255 |
16; 124 |
word |
2 байта |
0 … 65535 |
12363 |
|
Положительные и отрицательные целые числа |
shortint |
1 байт |
-128 .. 127 |
25; -99, 111 |
integer |
2 байта |
-32768..32767 |
-6956 |
|
longint |
4 байта |
-231 … 231-1 |
2147483647 |
Для целочисленных переменных, кроме рассмотренных выше, определены следующие арифметические функции, результат которых тоже целое число:
ABS (N) абсолютная величина N;
A DIV B целая часть от деления A на B;
A MOD B остаток от деления A на B;
*, , + умножение, вычитание, сложение;
SQR (N) квадрат числа N;
SQRT(N) корень квадратный из N;
ODD (N) проверка N на четность.
Заметим, что при выполнении обычного деления / для целых чисел всегда получается вещественный результат ( тип REAL).Операции сложения и вычитания могут использоваться как унарные (для одного операнда). При изменении знака числа, например, можно записать:
а := а;
Рассмотрим подробнее операции DIV, MOD. При делении с точностью до целых чисел получается два результата частное и остаток. Операция DIV обозначает целочисленное деление. Знак результата берется по обычным правилам, а полученный остаток игнорируется.
Пример 1:
23 DIV 5 = 4;
2 DIV 6 = 0;
(13) DIV 5 = 3;
(13) DIV (5) = 3.
Операция MOD дает остаток при делении двух целых чисел.
Пример 2:
23 MOD 5 = 3;
2 MOD 6 = 2;
(13) MOD 5 = 3;
(13) MOD (5) = 2;
8 MOD 2 = 0.
Операции *, DIV, MOD одинаковый более высокий ранг, а операции + и также имеют одинаковый, но более низкий ранг.
Чаще всего целые числа используются в простых арифметических выражениях и выступают в программах в качестве различных счетчиков и значений индексов.
Вещественные типы. В языке Pascal определено пять стандартных вещественных типов, которые, как и целые типы данных, отличаются форматами и диапазонами допустимых значений.
Описание |
Диапазон |
Число значащих цифр |
Объем памяти, б |
real |
2.9*1039…1.7*10+38 |
1112 |
6 |
single |
1.5*1045…3.4*10+38 |
78 |
4 |
double |
5.0*10324…1.7*10+308 |
1516 |
8 |
extended |
3.4*104932…1.1 *10+4932 |
1920 |
8 |
comp |
9.2*10+18…9.2*10+18 |
1920 |
8 |
Comp хотя и считается вещественным типом, но содержит только целые числа из весьма значительного диапазона, которые представляются в вычислениях как вещественные с нулевой мантиссой.
Наиболее распространенная форма типов вещественных чисел это тип real.
Результат работы функций сложения, вычитания, деления, умножения, возведения в квадрат вещественных чисел дает вещественное число. Кроме этого используются следующие функции, результат которых вещественное число:
ABS(X) абсолютное значение X;
ARCTAN(X) арктангенс X;
COS(X) косинус X;
SIN(X) синус X;
LN(X) натуральный логарифм X при этом должно выполняться X >0;
SQR(X) квадрат X;
SQRT(X) корень квадратный из X, при этом должно выполняться X >= 0;
EXP(X) еX ;
FRAC(X) дробная часть X;
INT(X) целая часть X;
PI значение PI = 3.141592653589793238;
TRUNC (X) получение целой части вещественного числа X;
ROUND (X) округление вещественного числа X.
Форма представления вещественных чисел может быть в двух форматах:
1) с плавающей точкой;
2) с фиксированной точкой.
Точка является в языке разделителем целой и дробной частей.
Формат представления с плавающей точкой это форма записи числа, которая характеризирует его порядок. Это форма вида:
[Sign1]<N1>.<N2> e Sign2<N3>,
где:
Sign1 знак числа;
Sign2 знак числа степени;
<N1> цифры целой части числа;
<N2> цифры мантиссы числа;
<N3> порядок числа (степень десяти);
e знак формы представления.
Например,
-1.0e-4,
2.02e3.
Формат представления с фиксированной точкой это форма записи вида:
Sign<N1>.<N2>,
где
Sign знак числа;
<N1> цифры целой части числа;
<N2> мантисса числа.
Например,
.17,
0.01,
+324.0.
Логический тип. Значением логического типа boolean является множество из двух упорядоченных элементов FALSE и TRUE. Переменным логического типа могут присваиваться только эти два значения. Про их значения известно, что:
TRUE > FALSE,
SUCC(FALSE) = TRUE,
ORD(FALSE) = 0,
ORD(TRUE) = 1,
PRED(TRUE) = FALSE.
На этом множестве определены одна унарная (один аргумент) и три логические бинарные операции (два аргумента):
NOT (отрицание изменяет значение на противоположное);
AND (конъюнкция истина только тогда, когда обе переменные истинны);
OR ( дизъюнкция истина только тогда, когда один из операндов истинен);
XOR (исключение истина только тогда, когда обе переменные различны).
Работа этих операций для двух переменных представлена в следующей таблице:
a |
not a |
a |
b |
a and b |
a or b |
a xor b |
|
True |
False |
True |
True |
True |
True |
False |
|
False |
True |
True |
False |
False |
True |
True |
|
False |
True |
False |
True |
True |
|||
False |
False |
False |
False |
False |
При записи условий используются следующие отношения между величинами: =, <>, >, <, <=, >=, in (принадлежность элемента множеству). Подвыражение, содержащие операции отношение, заключаются в круглые скобки. Операции сравнения дают результат булевского (логического) типа, поэтому его можно присваивать булевской переменной. Например:
с := a > b.
Такой оператор присваивания называется логическим.
Символьный тип. Значением символьного типа сhar (1 байт памяти) может быть один из 255 упорядоченных элементов множества всех символов, представленных кодами ЭВМ таблицы ASCII (American Standard Code for Information Interchange американский стандартный код для обмена информацией).
Символы записываются в одинарных кавычках. Например, a, @, 1, а при выводе символов на экран апострофы не изображаются.
Допускается использование записи символа через его внутренний код, который записывается после символа #. Внутренний код это порядковый номер символа в таблице кодов.
Например:
a соответствует записи #97;
z соответствует записи #90.
Допустима операция сложения (сцепления) символов знак «+», но типом результата уже не будет тип char, результат будет иметь структурированный тип string. Символы можно сравнивать друг с другом, результат будет иметь логический тип. При сравнении считается, что символы равны, если равны их ASCII-коды, и один код больше другого, если его код больше. Таким образом, операций над значениями символьного типа, которые давали бы значение этого же типа, нет. Например:
a > A, так как 97 > 65 (a = #97, A = #65).
К символьным значениям можно применять стандартные функции (в скобках указан аргумент функции и через двоеточие тип аргумента):
CHR (x:byte) :char возвращает символ ASCII-кода;
ORD (c:char) : byte возвращает ASCII-код символа;
PRED (c:char) : char выдает предшествующий с символ;
SUCC (c:char) : char выдает последующий за с символ.
Не определены значения SUCC(#255) и PRED(#0).
Перечисляемые типы
Задаются непосредственно перечислением всех значений, которые может принимать переменная данного типа. Отдельные значения указываются через запятую, а весь список заключается в круглые скобки.
Например,
Type
Color = (red, yellow, green, black);
Animals = (cat, dog, horse) ;
Days = (Monday, Sunday, Tuesday, Friday);
Поскольку перечисляемый тип это тип данных, при котором количество всех возможных значений конечно, значит типы целые, символьный, логический тоже можно считать перечисляемыми.
Любой перечисляемый тип упорядочен и имеет внутреннюю нумерацию: 1-й элемент имеет №0, 2-й - №1 и т.д. Номер каждого элемента можно получить функцией:ORD (x) : longint.
Переменные перечисляемого типа можно сравнивать: больше та переменная, у которой больше порядковый номер.
Для переменных этого типа можно использовать функции SUCC(x) и PRED(x). Например: DEC (5) = 4; PRED (b) = a. Не определены значения SUCC (последний элемент перечисления) и PRED (1-й элемент перечисления).
Ограниченный тип (диапазон)
Содержит значения только из ограниченного поддиапазона некоторого базового типа (любой целочисленный тип, тип char, и любой из введенных программистом перечисляемых типов). Для задания этого типа надо указать границы, сначала меньшую, потом большую, между ними разделитель 2 точки:
Type
Digits = 1..8;
Symbols = b..m.
Ограниченный тип наследует все свойства (допустимые операции) базового типа.
Перечислимые и ограниченные типы повышают наглядность программы и позволяют более надежно контролировать выходы значений за пределы заданного диапазона, как при трансляции, так и при выполнении программы.
3.2. Структурированные типы
В языке используются следующие структурированные типы:
массив;
запись;
множество;
файл.
В предыдущих разделах формат с плавающей запятой.