Алгоритм. Определение. Свойство алгоритма. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Алгоритм. Определение. Свойство алгоритма.



АЛГОРИТМ.ОПРЕДЕЛЕНИЕ.СВОЙСТВО АЛГОРИТМА.

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

ее команды не допускают различных вариантов исполнения;

указания предусмотрены для всех возможных вариантов развития событий.

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

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

Какими свойствами должен обладать алгоритм? Перечислим их:

дискретность -- алгоритм делится на отдельные элементарные шаги;

определенность -- каждая команда однозначно определяет действие исполнителя;

конечность (результативность) -- алгоритм должен завершаться за конечное число шагов.

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

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

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

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

Но процессор не понимает команд языков высокого уровня, поэтому их предварительно нужно "перевести". Для этого служат особые программы -- трансляторы.

 

Системное программное обеспечение

§ операционная система;

§ файловый менеджер;

§ архиватор;

§ перекодировщик;

§ антивирус;

§ другие...

ЯЗЫК ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ. ОСОБЕННОСТИ. ПРИМЕРЫ.

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

Примеры: C, C++, Pascal, Delphi, Visual Basic, Java, Python, PHP, Ruby, Perl

Кроме того, языки делятся еще на интерпретируемые и компилируемые:

§ Компилируемые: C, C++, Паскаль, Delphi

§ Интерпретируемые: Visual Basic, Java, Python, PHP, Ruby, Perl

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

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

Операторы ветвлений

 

Условный оператор

IF <условие> THEN <оператор1> [ELSE <оператор2>]

Условие – значение типа BOOLEAN или логическая операция. Если условие верно, выполняется оператор, или блок операторов, следующий за THEN, в противном случае выполняется блок операторов после ELSE, если он есть.

 

Условия могут быть вложенными и в таком случае, любая встретившаяся часть ELSE соответствует ближайшей к ней "сверху" части THEN.


Пример:
Var
A, B, C, D: Integer;
begin
A:=1;
B:=2;
C:=3;
D:=4;
If A > B Then
If C < D Then
If C < 0 Then
C:=0
{обратите внимание, что перед Else}
{пустой оператор ";"не ставится}
Else
A:=B;
end.
а могло быть и так:
If A > B Then
If C < D Then
If C < 0 Then
C:=0
Else
Else
Else A:=B

Рассмотрим программу, которая вводит произвольное целое число от 0 до 15 и выводит его в шестнадцатеричной системе:


Program Hex;
Var
Ch: Char;
N: Integer;
Begin
Write ('N = ');
Readln(N);
If (N >= 0) And (N <= 15) Then
Begin
If N < 10 Then
Ch:= Chr(Ord('0')+N)
Else
Ch:=Chr(Ord('A')+N-10);
End
Else
Writeln('Ошибка');
End.

 

Операторы повторений

Составной оператор

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

begin
<оператор 1>;
<оператор 2>;
...
<оператор N>
end;

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

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

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

Можно считать, что и само тело программы, т. к. оно заключено в операторные скобки begin и end, тоже является составным оператором.

Условный оператор IF

Оператор IF реализует алгоритмическую конструкцию РАЗВИЛКА и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Существует два варианта оператора:

if S then A
else В; {полная развилка}
и
if S then А; {укороченная развилка}

В этих операторах:
S - некоторое логическое выражение, истинность которого проверяется;
А - оператор, который выполняется, если выражение S истинно;
В - оператор, который выполняется, если выражение S ложно.

Так как условный оператор IF является единым предложением, ни перед then, ни перед else точку с запятой ставить нельзя. Примеры использования оператора:

if X < 0 then X:= -Y;
if X < 1.5 then Z:= X + Y
else Z:= 1.5;

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

program EXAMPLE5;
var X: Integer;
begin
Write('Введите целое число: ');
ReadLn(X);
if (X > 31) and (X < 256) then
WriteLn('Соответствующий символ - ', Chr(X))
else
WriteLn('Такого символа НЕТ')
end.

Условный оператор CASE

С помощью этого оператора можно выбрать вариант из любого количества вариантов. Структура этого оператора в Turbo Pascal:

case S of
C1:Instruction1;
C2:Instruction2;
CN: InstructionN;
else Instruction
end;

В этой структуре:

S - выражение порядкового типа, значение которого вычисляется;

C1, C2,..., CN - константы, с которыми сравнивается значение выражения S;

Instruction1, Instruction2,..., InstructionN - операторы, из которых выполняется ТОТ, с константой которого совпадает значение выражения S;

Instruction - оператор, который выполняется, если значение выражения S не совпадает ни с одной из констант С1,..., CN.

Ветвь оператора else является необязательной. Если она отсутствует и значение выражения S не совпадет ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие от оператора IF перед словом else точку с запятой можно ставить.

Если для нескольких констант нужно выполнять один и тот же оператор, их можно перечислить через запятую (или даже указать диапазон, если возможно), сопроводив их одним оператором.

Пример.

case I of
0, 2, 4, 6, 8: WriteLnC'Четная цифра');
1, 3, 5, 7, 9: WriteLn('Нечетная цифра');
10..100: WriteLn('Число от 10 до 100');
else
WriteLn('Отрицательное число или больше 100')
end;

Пример использования оператора CASE приведен также в п. 16.3.21.

Оператор цикла REPEAT

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

repeat
Instruction1;
Instruction2;
...
InstructionN
until S;

В этой структуре:

Instruction1, Instruction2,..., InstructionN - выполняемые операторы, составляющие тело цикла;

S - логическое выражение, истинность которого проверяется в конце каждой итерации.

Так как слова repeat и until являются своеобразными операторными скобками, точку с запятой перед словом until ставить не обязательно.

Пример. Усовершенствованная программа, вычисляющая сумму двух чисел (см. пример п. 2).

program EXAMPLE6;
var
X, Y, Sum: Real;
Ch: Char;
begin
repeat {начало цикла}
Write(' Введите числа Х и Y ');
ReadLn(X, Y);
Sum:= X + Y;
WriteLn(' Сумма чисел X и Y равна ',Sum);
Write('Завершить программу? ');
ReadLn(Ch);
until (UpCase(Ch) = 'Y') or (Ch = 'д') or (Ch = 'Д')
{UpCase - получение заглавной буквы}
end.

 

Оператор цикла WHILE

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

while S do
Instruction;

В этой структуре:

S - логическое выражение, истинность которого проверяется в начале каждой итерации;

Instruction - выполняемый оператор цикла.

Пример. Найти все делители целого положительного числа (кроме 1 и самого числа).

program EXAMPLE7;
var
X: Integer;
Half: Integer;
Divider: Integer;
i: Integer;
begin
repeat
Write('Введите число больше нуля: ');
ReadLn(X);
if X <= 0 then
WriteLn('Неправильный ввод')
until X > 0;
Half:= X div 2;
Divider:= 2;
I:= 0;
while Divider <= Half do
begin
if X mod Divider = 0 then
begin
Inc(i); {увеличение счетчика на единицу}
WriteLn(i, ' -й делитель равен: ', Divider)
end;
Inc(Divider) {увеличение делителя на единицу}
end;
if i = 0 then
WriteLn('Делителей нет');
WriteLn('Конец решения')
End.

Оператор цикла FOR

Оператор цикла FOR организует выполнение одного оператора заранее известное число раз. Существует два варианта оператора:

For Param:=Start to Finish do Instruction;
For Param:=Start downto Finish do Instruction;

В этих операторах:

Param - параметр цикла, являющийся переменной порядкового типа;

Start - выражение, определяющее начальное значение параметра цикла;

Finish - выражение, определяющее конечное значение параметра цикла;

Instruction - выполняемый оператор.

Start и Finish должны быть совместимы для присваивания с параметром цикла (см. п. 9.3).

Цикл действует таким образом. Сначала вычисляются и запоминаются начальное - Start и конечное - Finish значения параметра цикла. Далее параметру цикла Param присваивается начальное значение Start. Затем значение параметра цикла сравнивается со значением Finish. Далее, пока параметр цикла меньше или равен конечному значению (в первом варианте оператора) или больше или равен конечному значению (во втором варианте), выполняется очередная итерация цикла; в противном случае происходит выход из цикла. Выполнение очередной итерации включает в себя сначала выполнение оператора Instruction, а затем присваивание параметру цикла следующего большего значения (в первом варианте оператора) или следующего меньшего значения (во втором варианте).

Естественно, что, если в первом варианте значение Start больше Finish или во втором варианте меньше Finish, оператор не выполняется ни разу.

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

Пример. Вывести на экран буквы от Z до A.

program EXAMPLE8;
var i: Char;
begin
for i: = 'Z' downto 'A' do
Write(i);
WriteLn
end.

Пример. Вычислить 101 значение sin x с заданным шагом и вывести первое отрицательное значение синуса.

program EXAMPLE9;
label l;
var Si: array[0..100] of Real; {массив вещественных чисел}
Step: Real;
X: Real;
i: Integer;
begin
Write('Введите шаг вычисления: ');
ReadLn(Step);
X:= 0; {начальный аргумент}
for i:= 0 to 100 do
begin
Si[I]:=Sin(X);
X:= X + Step
end;
for i:=0 to 100 do
if Si[I] < 0 then
begin
WriteLn('Первое отрицательное значение синуса: ', Si[I], ' Номер элемента: ', i);
goto 1;
end;
WriteLn('Нет отрицательного значения');
1:
end.

End

End.

Интересно, что в качестве оператора, который выполняется по выполнению или невыполнению условия, может выступать условный же оператор. В этом случае говорят о вложенности условных операторов. Я настоятельно рекомендую при решении такого рода задач составлять блок-схему алгоритма в тетради. Только потом, при составлении программы, вам остается лишь аккуратно прописывать сначала всю Then- часть, а затем переходить к Else- части. Обычно при записи условных операторов на языке Паскаль (особенно при множественных ветвлениях) команды записывают уступом вправо и вниз. Это повышает наглядность, и, поверьте, снижает потери времени на отладку.

Для иллюстрации решим еще одну задачу: "решить уравнение вида A*x^2 + B*x + C = 0". Прошу не путать с квадратным уравнением, для которого нам было известно, что коэффициент А не равен нулю. Здесь же коэффициенты могут быть любыми числами. Исходя из элементарных математических рассуждений, получаем следующий алгоритм:

 

Program Sq2;
Var A, B, C, D, X, X1, X2: Real;
Begin

Writeln ('Введите коэффициенты уравнения (A, B, C) ');
If A=0 Then
If B=0 Then

If C=0 Then Writeln('X - любое число')
Else Writeln('Корней нет! ')

Else Begin X:=-C/B; Writeln('X=',X:8:3) End
Else
Begin

D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else
Begin

X1:=(-B+SQRT(D))/2/A;
X2:=(-B-SQRT(D))/2/A;
Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)

End

End

End.

 

Пример программы с использованием Case of

Program dni_nedeli;
Var n: byte;
Begin
Readln(n);
Case n of
1: writeln(‘понедельник ’);
2: writeln(‘вторник ’);
3: writeln(‘среда ’);
4: writeln(‘четверг ’);
5: writeln(‘пятница ’);
6: writeln(‘суббота ’);
7: writeln(‘воскресенье’);
else writeln(‘дня недели с номером’, n,’нет’);
end;
end.

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

Любому из операторов списка выбора может предшествовать не одна, а несколько констант выбора, разделенных запятыми. Например, следующая программа при вводе одного из символов ‘ y’ или ‘ Y’ выведет на экран «Да», а при вводе ‘ n’ или ‘ N’ – слово «Нет».

Пример программы с использованием Case of с несколькими переменными

Var ch: char;
Begin
Readln(ch);
Case ch of
N, n: writeln(‘Да ’);
Y, y: writeln(‘Нет ’);
End;
End.

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

BEGIN

I:=2;

K:=I/5;

END;

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

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

ОПЕРАТОР ЦИКЛА С ЗАДАННЫМ ЧИСЛОМ ПОВТОРЕНИЯ.БЛОК-СХЕМА.СИНТАКСИС НА ЯЗЫКЕ ПАСКАЛЬ.

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

Первая форма последовательно наращивает счетчик:
for<переменная порядкового типа>:=<начальное значение> to <конечное значение> do <оператор>

Вторая форма последовательно уменьшает счетчик:
for<переменная порядковоготипа>:=<начальное значение> downto <конечное значение> do <оператор>

Оператор for с последовательным увеличением счетчика

Пример 6.1.
Вывод на экран квадратов чисел от 1 до 10

Program Test1;
var N: integer;
begin
for N:=l to 10 do { Переменная N будет меняться от 1 до 10 с шагом 1 }
writeln(sqr(N)); { Эта строка - тело цикла. Оно выполняется 10 раз }
readln
end.

Поясним пример 6.1.
Переменная N является счетчиком цикла. Счетчик цикла всегда должен иметь порядковый тип (то есть он не может иметь тип real). В операторе for указаны его начальное и конечное значения. Начальное значение не обязательно равно 1!
При первом выполнении тела цикла N = 1, при втором — N = 2, и т. д. При последнем выполнении тела цикла N = 10. Каждый раз перед выполнением тела цикла текущее значение N сравнивается с конечным. После каждого выполнения тела цикла переменная N увеличивается на 1.

Рис. 6.1. Блок-схема организации цикла в примере 6.1

Как только N превысит конечное значение, выполнение цикла прекращается. Считается, что после окончания цикла переменная цикла не определена (то есть в разных реализациях языка Паскаль она может принимать разные значения). Иными словами, неправильно считать, что после окончания цикла переменная-счетчик цикла имеет какое-то определенное значение.
Крайне не рекомендуется внутри цикла самостоятельно менять счетчик цикла, особенно в сторону уменьшения. Это может привести к «зацикливанию» программы (бесконечному повторению тела цикла).

 

Оператор for с последовательным уменьшением счетчика

Счетчик может изменяться с шагом -1.
Это вторая форма оператора for (for... downto... do).

Пример 6.2.
Вывод на экран кубов чисел от 11 до 5

Program Test2;
var
N: integer;
begin
forN:=11downto 5do { Счетчик N изменяется с шагом -1 }
write(N*N*N:5); { Эта строка - тело цикла; оно выполняется 8 раз, так как N изменяется от 11 до 5 с шагом -1 }
writeln; { Этот оператор нужен, чтобы закончить вывод чисел в одну строку }
readln
end.

Простые типы данных

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

   

 

Идентификатор Длина (байт) Диапазон значений Операции
Целые типы
integer   -32768..32767 +, -, /, *, Div, Mod, >=, <=, =, <>, <, >
byte   0..255 +, -, /, *, Div, Mod, >=, <=, =, <>, <, >
word   0..65535 +, -, /, *, Div, Mod, >=, <=, =, <>, <, >
shortint   -128..127 +, -, /, *, Div, Mod, >=, <=, =, <>, <, >
longint   -2147483648..2147483647 +, -, /, *, Div, Mod, >=, <=, =, <>, <, >
Вещественные типы
real   2,9x10-39 - 1,7x1038 +, -, /, *, >=, <=, =, <>, <, >
single   1,5x10-45 - 3,4x1038 +, -, /, *, >=, <=, =, <>, <, >
double   5x10-324 - 1,7x10308 +, -, /, *, >=, <=, =, <>, <, >
extended   3,4x10-4932 - 1,1x104932 +, -, /, *, >=, <=, =, <>, <, >
Логический тип
boolean   true, false Not, And, Or, Xor, >=, <=, =, <>, <, >
Символьный тип
char   все символы кода ASCII +, >=, <=, =, <>, <, >

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

 

Порядковые типы, выделяемые из группы простых типов, характеризуются следующими свойствами:

  • все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;
  • к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе;
  • к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;
  • к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа.

В языке Паскаль введены понятия эквивалентности и совместимости типов. Два типа Т1 и Т2 являются эквивалентными (идентичными), если выполняется одно из двух условий:

  • Т1 и Т2 представляют собой одно и то же имя типа;
  • тип Т2 описан с использованием типа Т1 с помощью равенства или последовательности равенств. Например:
· type· T1 = Integer;· T2 = T1;· T3 = T2;

Менее строгие ограничения накладываются на совместимость типов. Так, типы являются совместимыми, если:

  • они эквивалентны;
  • являются оба либо целыми, либо действительными;
  • один тип - интервальный, другой - его базовый;
  • оба интервальные с общим базовым;
  • один тип - строковый, другой - символьный.

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

Имя_Типа(переменная или значение)

Напрмер, Integer('Z') представляет собой значение кода символа 'Z' в двухбайтном представлении целого числа, а Byte(534) даст значение 22, поскольку целое число 534 имеет тип Word и занимает два байта, а тип Byte занимает один байт, и в процессе приведения старший байт будет отброшен.

 

ПОРЯДКОВЫЕ ТИПЫ ДАННЫХ.ФУНКЦИИ, ОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ ПАСКАЛЬ ДЛЯ ПОРЯДКОВЫХ ТИПОВ ДАННЫХ.

Порядковые типы данных

Среди базовых типов данных особо выделяются порядковые типы. Такое название можно обосновать двояко:

  1. Каждому элементу порядкового типа может быть сопоставлен уникальный (порядковый) номер. Нумерация значений начинается с нуля. Исключение - типы данныхshortint, integer и longint. Их нумерация совпадает со значениями элементов.
  2. Кроме того, на элементах любого порядкового типа определен порядок (в математическом смысле этого слова), который напрямую зависит от нумерации. Таким образом, для любых двух элементов порядкового типа можно точно сказать, который из них меньше, а который - больше 2).

Пример переменных с булевым значением

X:=true;
y:=5>3

Логические выражения

Логические выражения (условия) – это выражения, которые могут принимать лишь одно из двух значений: true (истина) или false (ложь). Для построения логических выражений используются операции отношения, которые обозначаются знаками: = (отношение на равенство), <> (отношение на неравенство), < (отношение меньше), > (отношение больше), <= (отношение меньше или равно), >= (отношение больше или равно).

Сложные условия составляются из простых с помощью логических операций: and (логическое «И»), or (логическое «ИЛИ») и not (логическое «НЕ»). При составлении сложных условий операнды логического выражения берутся в скобки (это важно!).

Пример логических выражений:

5>3;
2<=6;
(x<2)and(x>=0)
2*x+5<>0

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

 

СИМВОЛЬНЫЙ ТИП ДАННЫХ.СРАВНЕНИЕ ВЕЛИЧИН СИМВОЛЬНОГО ТИПА.

Ип данных CHAR

Каждая переменная символьного типа может принимать значение только одного символа. Все символы упорядочены в соответствии с принятым в ЭВМ коде (например ASCII). При этом порядковый но­мер символов называется кодом (например, код латинского символа 'А ' равен 65; символа '3' равен 51).
Для символьных данных не определены никакие арифметические операции, но они могут сравниваться по своим кодам, участвовать в чтении, печати, операторах присваивания. Существуют две стандартные функции преобразования:
1) ORD (C) принимает значение кода символа С;
2) значение функции CHR(I) является символ с кодом Например:ORD('А ')=65
CHR(ORD(C))=C; CHR (65) = A;
Строка - это последовательность символов. Строку можно представить как массив, элементы которого имеют тип CHАR. Например:
BUK: array[1..17] of char;
Массив BUK-массив символов, который содержит 17 символов. Если символов меньше, то строка дополняется пробелами справа. В про­тивном случае возникает ошибка несоответствия типов. Так как массивы символов являются обычными массивами с элементами типа CHAR, они обладают всеми свойствами массивов.

Пример: Из набора 10 любых символов напечатать только заглавные английские буквы и их коды.

program lr1;
type sl =array [1..10] of char;
var s: sl; {описание массива символов}
i: integer;
begin
writeln ('введите 10 символов'):
for i:=1 to 10 do readln (s[i]); {ввод массива}
for i:=1 to 10 do
if (s[i]>=’A’) and (s[i]<= ‘Z’) then
writeln (‘Символ:’, s[i], ‘ его код =’, ord (s[i]);
readln;
end.

Тип данных STRING

В Турбо Паскале предусмотрен тип данных STRING. Переменная типа STRING может принимать значения переменной длины. Максимально возможная длина переменной 255 символов. Например:
str: STRING[200];
ow: STRING[10];
В скобках указывается максимальная длина для данной переменной. Для ввода значений типа STRING необходимо использовать READLN, а не READ. За один раз может быть введена только одна строка. Две строки можно сравнивать, используя операции отношения (сначала сравниваются самые левые символы, если они равны, то сравниваются следующие). Для работы с переменными типа STRING используют следующие стандартные процедуры и функции:

1) Функция LENGTH
C:=LENGTH(str); Переменной С будет присвоено целое значение, показывающее количествo символов в строковой переменной str.

2) Функция СОNCAТ - сцепление строк в порядке их перечисления.
str:=CONCAT(st1,st2,...,stN);str-переменная типа STRING, состоящая из строк st1,...,stN.

3) Функция POS
P:=POS (st1, st2); Р-целое число, показывающее номер позиции, с которой начина­ется строка st1 в строкe st2.

4) Функция COPY
S1:=COPY(str, I, J); Sl-символьная подстрока, выделенная из строки str с позиции I, длиной J символов.

5) Процедура DELETE(Str, I, J);
Из строки str удаляется J символов, начиная с I позиции.

6) Процедура INSERT(Str1, Str2, I);
Строка Str1 вставляется с I позиции в строку Str2.

7) Процедура STR (V, S1);
Числовое значение переменной V преобразуется в строку символов и записывается в строку S1.

8) Процедура VAL (S1, V, C);

Строковое выражение S1 преобразуется в величину целочислен­ного или вещественного типа и записывается в переменной V. Если при этом ошибок не обнаруживается, то С будет равно 0. В противном случае значение С будет равно номеру позиции пер­вого ошибочного символа и V будет неопределено. Строка S1 не должна содержать незначащих пробелов, перемен­ная V может быть целой или вещественной, а переменная С - только целой.


Пример: Подсчитать количество слов во введенной с клавиатуры строке.

program lr2;
var
s: string[30];
kol, i, n: integer;
begin
writeln ('введите строку'); readln (s);
kol:=0; {счетчик количества слов}
n:= length(s); {определяем длину введенного текста}
s:= concat(' ',s); {добавляем пробел к первому слову}
for i:=1 to n do
if (copy (s,i,1)=' ') and (copy (s,i+1,1)<>' ')
then kol:= kol+1;{подсчет количества слов}
writeln (s,' количество слов= ', kol);
readln;
end.

 

 

ПЕРЕЧИСЛЯЕМЫЕ ТИПЫ ДАННЫХ.СПОСОБЫ ОПИСАНИЯ.

Перечисляемый тип данных

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

Программист объединяет в одну группу в соответствии с каким-либо признаком всю совокупность значений, составляющих перечисляемый тип. Например, перечисляемый тип Rainbow (РАДУГА) объединяет скалярные значения RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET (КРАСНЫЙ, ОРАНЖЕВЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, СИНИЙ, ФИОЛЕТОВЫЙ). Перечисляемый тип Traffic_Light (СВЕТОФОР) объединяет скалярные значения RED, YELLOW, GREEN (КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ).

Перечисляемый тип описывается в разделе описания типов, например:

type

Rainbow = (RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET);

Каждое значение является константой своего типа и может принадлежать только одному из перечисляемых типов, заданных в программе. Например, перечисляемый тип Traffic_Light не может быть определен в одной программе с типом Rainbow, так как оба типа содержат одинаковые константы.

Описание переменных, принадлежащих к скалярным типам, которые объявлены в разделе описания типов, производится с помощью имен типов. Например:

type Traffic_Light= (RED, YELLOW, GREEN);var Section: Traffic_Light;

Это означает, что переменная Section может принимать значения RED, YELLOW или GREEN.

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

var Section: (RED, YELLOW, GREEN);

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

К переменным перечисляемого типа может быть применим оператор присваивания:

Section:= YELLOW;

Упорядоченная последовательность значений, составляющих перечисляемый тип, автоматически нумеруется, начиная с нуля и далее через единицу. Отсюда следует, что к перечисляемым переменным и константам могут быть применены операции отношения и стандартные функции Pred, Succ, Ord.

 

ТИП-ДИАПАЗОН.СПОСОБЫ ОПИСАНИЯ.

 

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

Тип-диапазон задается границами своих значений внутри базового типа:

<мин.знач.>.. <макс.знач.>

Где: <мин.знач.> - минимальное значение типа-диапазона; <макс.знач.> - максимальное его значение.

Примеры:

type Workdays = Mon.. Fri; Index = 0.. 63; Letter = 'A'.. 'Z'; Natural = 0.. MaxInt; Positive = 1.. MaxInt;

Тип-диапазон необязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной. При объявлении типа-диапазона нужно руководствоваться следующими правилами:

§ два символа.. рассматриваются как один символ, поэтому между ними недопустимы пробелы;

§ левая граница диапазона не должна превышать его правую границу.

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

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

§ high(x) – возвращает максимальное значение типа-диапазона, к которому принадлежит переменная x;

§ low(x) – возвращает минимальное значение типа-диапазона, к которому принадлежит переменная x;

 

ВЕЩЕСТВЕННЫЕ ТИПЫ ДАННЫХ.АРИФМЕТИЧЕСКИЕ ФУНКЦИИ ЯЗЫКА ПАСКАЛЬ,РЕЗУЛЬТАТ КОТОРЫЙ ВЕЩЕСТВЕННОЕ ЧИСЛО.

Вещественные типы

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

Тип Длина, байт К-во зн. цифр Диапазон
REAL   11..12
SINGLE   7..8
DOUBLE   15..16
EXTENDED   19..20
COMP   19..20

Над данными вещественного типа определены следующие операции:
- арифметические: +, -, /, *
- соотношения: =, <>, <, >, <=, >=
Набор встроенных математических функций применимых к данными вещественного типа приведен в табл. 4.
Таблица 4

Обращение Назначение Пример
sin(x) Возвращает синус, угол в радианах  
cos(x) Возвращает синус, угол в радианах  
arctan(x) Возвращает арктангенс  
abs(x) Возвращает абсолютную величину  
sqr(x) Возвращает квадрат  
exp(x) Возвращает экспоненту  
ln(x) Возвращает логарифм натуральный  
trunc(x) Отбрасывает дробную часть trunc(5.6)=5
round(x) Округляет до ближайшего целого round(5.6)=6
frac(x) Выделяет дробную часть frac(10.1)=0.1
int(x) Выделяет целую часть int(10.1)=10.0
random Датчик случайных чисел (ДСЧ) 0 <n?1  
random(x) Датчик случайных чисел (ДСЧ) 0 <n?x  
randomize Инициализация ДСЧ  

 

ТИП ДАННЫХ СТРОКА.ОПИСАНИЕ.ПРОЦЕДУРЫ И ФУНКЦИИ ОБРАБОТКИ СТРОК В ЯЗЫКЕ ПАСКАЛЬ.

Строка (string) - это последовательность литер. Литерные строки уже использовались нами в качестве аргументов операторa write при изучении темы "Ввод-вывод". Теперь познакомимся с ними подробнее.

Тип данных (string) определяет строки с максимальной длиной 255 символов. Переменная этого типа может принимать значения переменной длины.

Н



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 228; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.166.214 (0.154 с.)