Вычитание, умножение, деление, div, mod.
Определены также операции отношения: равно, не равно, меньше, больше, меньше или равно, больше или равно.
При обращении к стандартным функциям необходимо записать имя функции, а в скоб-ках указать аргумент. Перечень стандартных функций, типы аргументов и функций приведе-ны в таблице 2.1.
Таблица.2.1 Стандартные функции в ПАСКАЛЕ
МАТЕМАТИЧЕСКАЯ ЗАПИСЬ | ЗАПИСЬ ФУНКЦИИ НА РАСКАЛЕ | ТИП АРГУМЕНТА | ТИП РЕЗУЛЬТАТА |
sin x | SIN(X) | REAL | REAL |
cos x | COS (X) | REAL | REAL |
ln x | LN(X) | REAL | REAL |
x | SQRT(X) | REAL | REAL |
arctg x | ARCTAN(X) | REAL | REAL |
ex | EXP(X) | REAL | REAL |
x2 | SQR(X) | REAL | REAL |
|x| | ABS(X) | INTEGER, REAL | INTEGER, REAL |
TRUNC(X) | INTEGER, REAL | INTEGER |
Определены стандартные функции преобразования значений типа в значения целого типа:
TRUNС(X) - вырабатывает целый результат путем отбрасывания дробной части аргу-мента;
ROUND(X) - вырабатывает целый результат путем округления до ближайшего целого. Пример, если Х = 21.53, то TRUNС(X) = 21, ROUND(X) = 22;
если Х = -2.7, то TRUNС(X) = - 2, ROUND(X) = -3.
Значениями “с имвольного типа “ являются элементы конечного и упорядоченного на-бора знаков. Существуют две стандартные, обратные по отношению друг к другу функции, называемые функциями преобразования:
ORD(X) - дает порядковый номер символа Х в упорядоченном множестве символов. Порядковые номера следуют по возрастанию без пропусков. При конкретной реализа-
ции языка использование функции позволяет получить, например: ORD(‘: ‘) = 58,
ORD(‘ 5 ‘) = 53, ORD(0) = 240, ORD(9) = 249,
Функция CHR(I) - дает символ, стоящий под номером I в упорядоченном множестве символов.
Например: CHR(66) = ‘ B ‘,CHR(57) = ‘ 9 ‘. Очевидно, что CHR(ORD(S)) = S и ORD(CHR(I)) = I.
Над переменными символьного типа определены операции отношения. Пусть С1 и С2 -переменные символьного типа. Отношение C1<C2 истинно тогда и только тогда, когда ORD(C1) < ORD(C2).
К аргументам символьного типа применимы также стандартные функции: PRED(S) и SUCC(S). Функция PRED(S) дает предыдущий символ, а функция SUCC(S) - следующий.
Например: PRED(‘ B ‘) = ‘ A ‘, а SUCC(‘ 9 ‘) = ‘: ‘. Справедливы равенства:
PRED(S) = CHR(ORD(S) - 1) и SUCC(S) = CHR(ORD(S) + 1).
Переменные “ булевского типа “ могут принимать одно из двух значений: TRUE (исти-на) или FALSE (ложь). Над ними определены три логические операции:
NOT (отрицание - НЕ), AND (конъюнкция - И), OR (дизъюнкция - ИЛИ).
Логические операции OR или AND выполняются над двумя величинами, а операция NOT -над одной.
Логическое сложение дает истинный результат, если хотя бы одна из логических вели-чин (А или В) имеет истинное значение. Если обе величины (А или В) имеют ложное значе-ние, то и результат операции будет ложным.
Логическое умножение дает истинный результат только в том случае, если обе величи-ны (А или В) истинны. Если хотя бы одна величина (А или В) ложна, то результат также бу-дет ложным.
Логическое отрицание дает ложный результат, если величина имеет истинное значе-ние, и наоборот.
Результаты операций над логическими данными сведены в таблицу 2.3.
Константы символьного типа записываются литерами, заключенными в кавычки (апо-строфы). Символ апострофа записывается двойными кавычками.
Пример записи констант: ‘ B ‘ ‘D ‘ ‘6 ‘
Логические данные и операции над ними имеют важное значение в информатике, так как позволяют внести в расчеты элементы человеческой логики. В информатике принято
Истина, 0 - ложь.
Значение FALSE и TRUE можно рассматривать как упорядоченное множество, состоя-щее из двух элементов. Целый, символьный, булевский типы называются так же дискретны-ми типами, поэтому над ними разрешены операции отношений:
ORD(FALSE) = 0; ORD(TRUE) = 1; SUCC(FALSE)= TRUE; PRED(TRUE) = FALSE.
Константы не изменяют своего значения в процессе выполнения программы. Она мо-жет быть задана явно своим значением или обозначена именем.
Константы бывают целые, действительные, логические, символьные, строковые.
Таблица 2.2
Типы аргументов и функций стандартных функций в ПАСКАЛЕ
Обращение | Выполняемые функции | Тип | |
аргумента | функции | ||
ABS(X) SQR(X) | |x| x2 | REAL или INTEGER | REAL или INTEGER |
SIN(X) COS(X) EXP(X) LN(X) SQRT(X) ARCTAN(X) | sin(x) cos(x) ex Ln(x) x arctg x | REAL или INTEGER | REAL |
TRUNC(X) ROUND(X) | Выделение целой части числа Округление числа | REAL | INTEGER |
PRED(X) SUCC(X) | Нахождение: предыдущего элемента последующего элемента | INTEGER или CHAR или BOOLEAN | INTEGER или CHAR или BOOLEAN |
ORD(X) | Определение порядкового номера сим-вола Х в наборе символов | CHAR или BOOLEAN | INTEGER |
CHR(I) | Определение символа из набора сим-волов по порядковому номеру i | INTEGER | CHAR |
ODD(X) | Определение нечетности числа | INTEGER | BOOLEAN |
Таблица 2.3
Таблица истинности
A | B | NOT A | A OR B | A AND B |
TRUE | TRUE | FALSE | TRUE | TRUE |
TRUE | FALSE | FALSE | TRUE | FALSE |
FALSE | TRUE | TRUE | TRUE | FALSE |
FALSE | FALSE | TRUE | FALSE | FALSE |
Константы целого и действительного типов являются числами. Они могут иметь по-ложительный или отрицательный знак и записываются числами или именами соответствую-щего типа.
Константы логического типа имеют одно из двух значений - TRUE (истинно) или FALSE (ложно),
Текстовые к онстанты (строки) записываются последовательностью символов (тек-стом), заключенной в кавычки. Имеющиеся в тексте кавычки дублируются. Разрешается ис-пользование последовательности символов, заключенных в апострофы, длиной не более 256 знаков (в зависимости от версии языка ПАСКАЛЬ).
Комментарий служит для пояснения программы или отдельных частей. Наличие ком-ментариев делает программу более понятной и удобной для чтения. Комментарий языка
ПАСКАЛЬ - это последовательность символов, ограниченных слева парой символов (* и справа парой символов * ). Вместо круглых скобок допускается {..}.
(*................*) - для комментария в несколько строк;
{...................} - для комментария, записанного сразу после оператора. Например. (* Определение площади фигуры *)
или { Координаты точки }.
Конструкция языка, задающая порядок выполнения действий над элементами данных называется выражением.
Выражение состоит из операндов - величин и выражений, над которыми производится операция.
Операции определяют действия, которые надо выполнить над операндами.
Операции бывают унарными и бинарными. В первом случае операции относятся к од-ному операнду и всегда записываются перед ними, во втором - операция выражает отноше-ния между двумя операндами и записывается между ними.
Например:
- А - унарная, А + В - бинарная.
В качестве операндов могут быть константы, переменные, функции. Порядок выполне-ния операций определяется скобками, а при их отсутствии - согласно старшинству (приори-тету) операций. Скобки заменяют приоритет.
Операции одного приоритета выполняются последовательно слева направо. Примеры записи выражений:
Запись на языке ПАСКАЛЬ и Математическая запись
0.5+А P-T/A-B
( 1,25*SIN(X)+P)/(SQRT(A+B)/X)
а+0,5 р − Т
|
|
a + b
x
С учетом старшинства операций и скобок при одних и тех же значениях операндов ре-зультаты выражения получаются различными.
Выражение 7-2*3 имеет значение 1, а выражение (7-2)*3 - значение 15. Выражение 16/4*2 имеет значение 8, а не 2 так как операции деления и умножения - одного приоритета и выполняются по порядку следования слева направо.
Типы результатов выражений в зависимости от типов операндов и выполняемых опе-раций представлены в таблице 2.4.
Функция ORD(x) -функция для дискретных типов, следовательно для нее определены операции отношений. Так как все символы упорядочены, то для символов x 1 и x 2 справедливо выражение отношения ORD (x 1)< ORD (x 2).
Отношение означает, что порядковый номер символа x 1 меньше, чем x 2. Поэтому ре-зультат выполнения операции отношение имеет тип BOOLEAN.
Отношение ORD (‘ 3 ‘) > ORD (‘6 ‘) имеет результат FALSE, так как цифра 3 располо-жена раньше цифры 6, а следовательно, порядковые номера в отношении записываются как 243>246.
С помощью оператора описываются действия над данными, выполняемые для реализа-ции алгоритма решения задачи. По функциональному назначению операторы языка можно подразделить на группы: присваивания, ввода - вывода, управления, определения функций и процедур (подпрограмм).
Оператор присваивания предназначен для вычисления нового значения некоторой пе-ременной, а также для определения значения, возвращаемого функцией. При выполнения
оператора присваивания вычисляется выражение стоящее в правой части, и его значение присваивается переменной в левой части.
Таблица 2.4 Результаты операций
Операция | Знак операции | Тип | |
операндов | результат | ||
Сложение | + | REAL или INTEGER | INTEGER, если оба операнда INTEGER, и REAL в противном случае |
Умножение | * | ||
Вычитание | - | ||
Деление | / | REAL или INTEGER | REAL |
Деление с отбрасы-ванием остатка | DIV | INTEGER | INTEGER |
Вычитание остатка при делении чисел | MOD | ||
Отрицание | NOT | BOOLEAN | BOOLEAN |
Дизъюнкция | OR | ||
Конъюнкция | AND | ||
Сравнение: на равенство на неравенство | = <> | Любой тип переменных и констант | BOOLEAN |
Сравнение: больше меньше больше или равно меньше или равно | > < >= <= | Любой скалярный тип | BOOLEAN |
При этом тип выражения должен соответствовать типу переменной. Для стандартных типов это означает, что типы должны совпадать. Кроме того, допускается присваивание пе-ременной вещественного типа значение выражения целого типа.
Общая форма записи оператора V:=А,
где V - имя переменной;:= -знак присвоения;
А - выражение. Например: Т:= 567.78
Присвоение же переменной целого типа выражению вещественного типа запре-щено.
Для преобразования значений типа в значение целого типа предназначены функции TRUNC(X) и ROUND(X).
Операторы ввода - вывода позволяют вводить в основную память исходные данные и на устройствах вывода информации получать результаты вычислений.
Операторы управления организуют управление последовательностью выполнения опе-раторов программы.
Операторы вызова функций и процедур дают возможность разбивать программу на части, определять и именовать их.
По своему составу различают операторы двух типов: простые и структурные.
Простым считается оператор, который не содержит других операторов. К простым опе-раторам относятся операторы присваивания, перехода, процедуры.
Структурным считается оператор, содержащий в качестве компоненты один или не-сколько операторов. К структурным операторам относятся операторы условные, выбора, цикла, составные.
Составной оператор представляет собой последовательность операторов, заключенную в ключевые слова BEGIN и END. В этой конструкции служебные слова BEGIN и END назы-ваются операторными скобками. Слово BEGIN выполняет роль открывающейся скобки, слово END - роль закрывающейся скобки. Составной оператор представляется как единый оператор. Его можно вставить в любое место программы, где допускается один оператор.
Любой из операторов составного оператора, в свою очередь, также может быть состав-ным.
Следует обратить внимание, что после BEGIN и END не ставится точка с запятой; она ставится между операторами.
Форма записи данного оператора: BEGIN
оператор 1; оператор 2;.................... оператор n-1; оператор n
END;
Пустой оператор - это оператор, не выполняющий никакого действия. Пустому опера-тору соответствует отсутствие записи на том месте, где по правилам должен быть какой-нибудь оператор. После него можно ставить символ точки с запятой, например:
A:= B; R:=2 ;;
K:=7.2;
Здесь третий оператор является пустым.
Составной и пустой операторы нередко применяются в условных операторах. Программа на Паскале состоит из трех частей: заголовок программы, раздел описаний и
раздел операторов. Структура программы представлена на рис. 2.1. PROGRAM < имя>;
раздел описаний
BEGIN
раздел операторов
END.
Рис. 2.1. Структура программы на языке Паскаль
Заголовок содержит служебное слово PROGRAM, имя программы, задаваемое пользо-вателем-программистом, и при необходимости, в круглых скобках имена стандартных про-цедур для связи программы с внешними устройствами ввода-вывода ЭВМ. Заканчивается заголовок символом “; “ (точка с запятой).
Раздел описаний предназначен для объявления всех встречающихся в программе дан-ных и их характеристик (имена данных, их тип, возможные значения и др.). Этот раздел со-стоит из следующих разделов:
объявление меток;
объявление констант; объявление типов;
объявление переменных;
объявление процедур и функций.
Разделы должны располагаться в строго названном порядке. Объявление процедур и функций является одним разделом. Следует заметить, что не все перечисленные разделы обязательны в каждой программе. После каждого описания ставится символ “; “.
Структура программы
PROGRAM < имя>; LABEL (раздел меток); CONST (раздел констант); TYPE (раздел типов);
VAR (раздел переменных);
PROCEDURE, FUNCTION (раздел процедур и функций); BEGIN
оператор 1; оператор 2; оператор 3;.................... оператор n-1; оператор n
END.
Раздел операторов заключается в операторные скобки вида BEGIN и END, при этом после END ставится точка. В разделе операторов записывается последовательность испол-няемых операторов. Каждый оператор выражает действие, которое необходимо выполнить. Исполняемые операторы отделяются друг от друга символом “; “. Сама же программа запи-сывается в свободной форме, операторы не привязаны к определенной позиции строки в от-личие от многих других языков программирования.
В одной строке можно указывать несколько описаний или операторов. Допускается пе-ренос с одной строки на другую частей описаний или операторов (но не разрешается разде-лять слова, константы и составные символы). В то же время рекомендуется программу запи-сывать в такой форме, чтобы ее можно было легко читает и понимать. Для этого широко ис-пользуются пробелы, пустые строки и комментарии. Рекомендуется смысловые части выде-лять одинаковыми отступами от начала строки. Так, для выделения заголовка программы, раздела описаний и раздела операторов удобно записывать слова PROGPAM, BEGIN, END с одной позиции строки. По отношению к ним соответствующие описания или операторы сдвигаются вправо. Желательно сдвиг делать на одинаковое число позиций от края или по отношению к предыдущему сдвигу.
Все операции ввода/вывода основаны на работе с последовательными файлами. Мы рассмотрим четыре процедуры ввода/вывода: READ, READLN, WRITE, WRITELN, исполь-зующие стандартные файлы ввода/вывода. Стандартный файл ввода имеет имя INPUT, вы-вода - имя OUTPUT. Эти имена передаются в виде параметров в заголовке программы. Как правило, программа без вывода не бывает, поэтому простейшая конструкция заголовка про-граммы имеет вид
PROGRAM <имя>;
Ввод в языке ПАСКАЛЬ может быть только бесформатный. Можно вводить данные только целого, и символьного типов. Ввод переменных логического типа не допускается.
Типы вводимых переменных должны соответствовать типам вводимых значений. Про-бел воспринимается как литера. Поэтому после считывания последней литеры в строке сле-дующая литера является недоступной. Попытка прочитать литеру приводит к чтению пробе-ла.
Для задания переменным их числовых значений можно использовать оператор при-сваивания, например:
А:=9; В:= -6.789;
Однако в данном случае программа становится не универсальной, так как выполняется только при этих значениях переменных. Поэтому в разделе переменных описываются пере-менные А, В, С, а в разделе операторов им присваиваются соответствующие значения. Для выполнения программы при различных значениях переменной предназначен оператор ввода READ.
Как только во время выполнения программы встречается оператор READ, ЭВМ оста-навливается и ожидает ввода. Когда значения переменных введены, процесс выполнения программы продолжается. Оператор ввода имеет вид:
READ (a1, а2,...., аn);
где a1, а2,...., аn - переменные, которым последовательно присваиваются вводимые зна-чения.
Числовые значения водятся через пробел, признаком окончания ввода является нажа-тие клавиши Enter. Обратите внимание: числовые значения вводятся после набора на экране дисплея всей программы и после запуска ее на выполнение.
Пусть переменным А, В, С необходимо присвоить значения в процессе выполнения программы: А=4, В=14, С=24.6. Оператор ввода примет вид
READ(А, В, С);
а числовые значения можно ввести следующим образом: 4 14 24,6 Enter.
Оператор READ (a1, а2,...., аn); обеспечивает выбор данных в результате которой имена переменных a1, а2,...., аn получают соответствующее значение.
Если вновь повторить запуск программы, то можно ввести любые другие значения, на-пример: 15 -1.45 -2,6 Enter.
Переменные получат значение А=15, В=-1.45, С=-2.6, при которых будет выполняться программа. Ни один оператор программы в этом случае не изменяется.
Если переменная описана как действительная (REAL), а ее значение является целым числом, то можно вводить число как целое и как действительное. Машина сама преобразует целое число в действительное.
Пробелы перед числом и между числами игнорируются, поэтому их можно ставить в любом количестве.
Допускается использование оператора ввода без параметров READLN.
Оператор READLN (a1, а2,...., аn); обеспечивает выборку данных из стандартного файла INPUT, что после окончания выборки последней переменной осуществляет переход к началу новой строки файла.
При вводе значений переменного целого и действительного типов READ и READLN пропускает пробелы между значениями, а оператор READLN обеспечивает пропуск одной строки в стандартном файле INPUT и переход к началу новой строки.
Различают различные методы организации ввода чисел: - с использованием одного оператора READ READ(A,B,C);
числа вводятся через пробел;
- с использованием нескольких оператора READ READ(A);
READ(B); READ(C);
каждое число вводится индивидуально; - комбинированно
READ(A,B); READ(C); READLN(A,B); READLN(C);
Ввод чисел целых и вещественных типов осуществляется одинаково.
Можно выводить данные всех четырех стандартных типов (для булевого типа выводит-ся константа TRUE или FALSE).
Для вывода данных из памяти ЭВМ на экран дисплея предназначен оператор вывода WRITE. Форма записи оператора
WRITE (b1, b2,.., bn);
где - b1, b2,.., bn - имена переменных, подлежащие выводу могут быть либо переменны-ми, либо строкой символов, заключенной в апострофы.
Например, оператор
WRITE (‘ Значение В = ‘, В);
на экран дисплея выводит строку Значение В =
а затем значение переменной В.
Если поясняющий текст не давать, то пользователь зачастую забывает, значения каких переменных нужно вводить или выводить. Особенно это сказывается при выполнении боль-ших программ с большим количеством операторов ввода и вывода.
Оператор WRITE(b1, b2,.., bn); выполняет вывод значений, соответствующие именам b1, b2,.., bn в стандартный выходной файл. Выводимые значения размещаются на одной строке.
Часто используется оператор вывода без параметров WRITELN
осуществляющий переход на новую строку экрана дисплея или принтера. Последующий оператор вывода с параметрами будет выводить данные на новую стро-
ку экрана.
Оператор WRITELN(b1, b2,.., bn); выполняет вывод значений, соответствующий, b1, b2,.., bn в стандартный файл и после вывода последнего осуществляет переход к новой строке файла.
Оператор WRITELN; обеспечивает пропуск строки в файле и переход к началу сле-дующей строки.
Имена переменных, записанные в операторе вывода, могут принадлежать целому, дей-ствительному, символьному или логическому типу.
Форма представления выводимых переменных определяется типом переменных: значение величин целого типа выводится в обычной форме;
значение величин действительного типа - в виде нормализованного числа действи-тельного типа с порядком;
значение логического типа - в виде логических значений TRUE или FALSE; значение символьных переменных - в виде соответствующих символов.
Если в операторе вывода указывается общее число позиций (w) и не указывается коли-чество позиций после запятой (d), то число выводится в экспоненциальной форме с шириной поля (w).
Пример:
WRITE(А); Выводится число 6.0Е+02. WRITE(А:8); Выводится число 600. WRITELN(A:m:n); Выводится число 7.12.
где m - поля, отводимые под запись значения, включая десятичную точку и знак числа;
n - часть поля, отводимое под дробную часть числа.
Если при выводе символьного типа в явном виде не указывается количество позиций, под каждый символ отводится одна позиция.
Пример:
WRITELN(' s1= ',s1:5,' s2 = ',s2);
При выводе числа с фиксированной точкой указывается ширина поля, отводимая под все значения и дробную часть числа.
При выводе нескольких значений на каждой строке для наглядности задаются необхо-димым количеством пробелов. Для этого записывают оператор в виде:
WRITE(' ':g);
где g - константа целого типа, указывающая число пробелов.
При выводе значений булевого типа выводится TRUE или FALSE. Пример:
WRITE(A < B:7); Напечатает в отведенных семи позициях слово TRUE, если A<B, или FALSE - в противном случае.
Для ввода в разделе CONST задаются соответствующие значения. При этом тип кон-стант автоматически определяется по содержанию правой части.
Например, фрагмент программы:
CONST A=35; X= 9,79; F= - 8.003; Р=234; BEGIN
Y:= A*X+(F*A)/P;.....
END;
Именованным константам А, X, F присваивает вещественный тип, а константе с име-нем Р - целый.
Однако такой способ заданий значений исходных данных не всегда удобен, так как фактически позволяет производить вычисления только для одного набора параметров.
Изменять значения констант в программе нельзя.
Если в разделе переменных описываются переменные A, X, F, P, а в разделе операторов им присваиваются соответствующие значения:
var
A,X,F,P,Y: real; begin
A:=2.5; X:=7.3; F:=-17.5; P:=544.8; Y:=A*X*X+F/P-X;
...... end.
В этом случае возможности варьирования значениями параметров расширяются, так как в программе можно организовать их изменение, однако набор параметров будет статиче-ским.
Ввод может быть только бесформатным. Можно вводить данные только вещественно-го целого, и символьного типов. Данные набираются на дисплее, при этом разделителем ме-жду числами служит пробел или ENTER. Разделитель между символами, между числом и символом не нужен.
2.1. Алгоритмизация задач
Процесс подготовки и решения задач на ЭВМ является пока достаточно сложным и трудоемким, требующим выполнения целого ряда этапов.
Такими этапами являются: 1. Постановка задачи.
2. Математическая формулировка задачи. 3. Выбор численного метода решения.
4. Разработка алгоритма решения задачи. 5. Написание программы.
6. Ввод и отладка программы.
7. Ввод исходных данных (решение контрольного примера). 8. Решение однотипных задач.
Данная последовательность характерна для решения каждой задачи. Однако в процессе подготовки задачи каждый этап может иметь более или менее выраженный характер. Вы-полнение этапов в процессе подготовки задачи носит характер последовательного прибли-жения, так как уточнение задачи на последующем этапе приводит к необходимости возврата к предыдущему и повторному выполнению последующих этапов.
Рассмотрим подробнее выполнение работ на каждом этапе в процессе подготовки зада-чи к решению.
Постановка задачи. Определяет цель решения задачи, раскрывает ее содержание. Зада-ча формулируется на уровне профессиональных понятий, должна быть корректной и понят-ной исполнителю (пользователю). Ошибка в постановке задачи, обнаруженная на после-дующих этапах, приведет к тому, что работа по подготовке задачи к решению должна на-чаться с самого начала.
Математическая формулировка задачи. Осуществляет формализацию задачи путем описания ее с помощью формул, определяет перечень исходных данных и получаемых ре-зультатов, начальные условия, точность вычисления. По существу разрабатывается матема-тическая модель решаемой задачи.
Выбор численного метода решения. В ряде случаев одна и та же задача может быть решена с помощью различных численных методов. Выбор метода должен определяться мно-гими факторами, основными из которых являются точность результатов решения, время ре-шения на ЭВМ и объем оперативной памяти. В каждом конкретном случае в качестве крите-рия для выбора численного метода принимают какой-либо из указанных критериев или не-который интегральный критерий.
В простых задачах данный этап может отсутствовать, так как сам численный метод оп-ределен математической формулировкой задачи. Например, вычисление площади треуголь-ника по формуле Герона, корней квадратного уравнения и т.д.
Разработка алгоритма решения задачи. На данном этапе устанавливается необходи-мая логическая последовательность вычислений с учетом выбранного численного метода решения и других действий, с помощью которых будут получены результаты. Алгоритм - некоторая конечная последовательность предписаний (правил), определяющая процесс пре-образования исходных и промежуточных данных в результат решения задачи. Схема алго-ритма представляет собой последовательность блоков, предписывающих выполнение опре-деленных действия, и связи между ними.
2.2. Виды и свойства алгоритма
При разработке алгоритма решения задачи математическая формулировка задачи явля-ется основой для определения последовательности действий, приводящих к получению ис-комого результата.
Разрабатываемый алгоритм должен обладать следующими свойствами: массовостью, позволяющей решать не одну задачу, а целый класс задач;
детерминированностью, однозначно определяющей выполняемые действия (промежу-точные и окончательные результаты разных пользователей будут одинаковыми при одинако-вых исходных данных);
результативностью, позволяющей получить результат после конечного числа шагов. Различают следующие типы алгоритмов:
- линейные;
- разветвляющиеся; - циклические.
Алгоритм линейной структуры - алгоритм, в котором все действия выполняются по-следовательно друг за другом. Такой порядок выполнения действия называется естествен-ным. На практике редко удается представить схему алгоритма решения задачи в виде линей-ной структуры, так как задачи содержат различные условия или требуют многократного по-вторения вычислений.
Алгоритм разветвляющейся структуры - алгоритм, в котором в зависимости от вы-полнения некоторого логического условия вычислительный процесс должен идти по одной или другой ветви. В общем случае количество ветвей в алгоритме разветвляющейся структу-ры может быть больше двух.
Алгоритм циклической структуры - алгоритм, содержащий многократно выполняемые участки вычислительного процесса, называемые циклами. Использование циклов позволяет существенно сократить схему алгоритма. Различают циклы с заданным и неизвестным чис-лом повторений, характеризующиеся последовательным приближением к исходному значе-нию с заданной точностью.
Алгоритм со структурой вложенных циклов - алгоритм, содержащий цикл, внутри ко-торого размещены один или несколько других циклов.
Цикл, охватывающий внутренние циклы, называется внешним. Правила организации как внешнего, так и внутренних циклов те же, как и для обычного цикла. Параметры этих циклов изменяются не одновременно, т.е. при одном значении параметра внешнего цикла параметр внутреннего цикла принимает по очереди все значения.
Существует 3 способа представления алгоритмов: а) словесный;
б) операторный; в) графический.
Графическая запись алгоритма должна выполняться в соответствии со стандартами. Схема алгоритма представляет собой последовательность блоков, предписывающих
выполнение определенных действий, и связи между ними.
Выделение составных частей алгоритма должно определяться внутренней логикой процесса вычислений.
Схема алгоритма может выполняться с разной степенью детализации. Схема, в которой определены ввод и вывод информации и учитываются особенности языка программирова-ния, называется схемой программы.
Написание программы осуществляется по разработанному алгоритму с помощью языка программирования. Программа представляет собой последовательность операторов языка, записанную в соответствии со схемой программы.
Ввод программы и исходных данных выполняется с помощью клавиатуры.
Отладка программ. представляет собой процесс обнаружения и устранения синтакси-ческих и логических ошибок.
Синтаксические ошибки, связанные с неправильной записью конструкции языка, выяв-ляются самой ЭВМ. Логические ошибки появляются в результате нарушения последователь-ности вычислений и отсутствия необходимых данных для ЭВМ. Для выявления логических ошибок используют контрольные вычисления, выполненные другими средствами и метода-ми.
После отладки программы и проверки ее на тестовых данных дополнительные операто-ры, введенные для отладки, исключаются из программы.
Рассмотрим пример составления алгоритма.
Задача. Определить площадь треугольника по длине сторон.
1. Математическая формулировка задачи. Для определения площади треугольника воспользуемся формулой Герона
s = p ∗(p − a)∗(p − b)∗(p − c)),
где a, b, c - длины сторон;
p=(a+b+c)/2 - полупериметр треугольника,
2. Алгоритм решения задачи.
Ввод исходных данных a,b, c. Вычисление р.
Вычисление s.
Вывод результата s. 3. Блок-схема программы.
начало
ввод данных
вычисление Р
вычисление S
вывод результата конец
Рис. 2.2. Блок-схема примера.
В приведенной программе сначала вычисляются значения полупериметра р, а затем значение s, при вычислении которого используется р. Это позволяет избежать повторения вычисления одной и той же величины, а следовательно, уменьшить время вычисления зада-чи. На блок-схеме блоки расположены в той последовательности, в которой они должны вы-полняться. Любая перестановка блоков приведет к невозможности решения задачи.
4. Определение переменных участвующих в решении задачи. Исходные данные: a, b, c - стороны треугольника, см (REAL); Промежуточные данные:
p- полупериметр треугольника (REAL); Выходные данные:
s - площадь треугольника (REAL). 5. Листинг программы: PROGRAM PR1;
VAR
a, b, c, p, s: REAL; BEGIN
WRITE(‘Введите a,b,c в см’); READLN(a,b,c);
p:=(a+b+c)/2;
s:=SQRT(p*(p-a)*(p-b)*(p-c));
WRITELN (‘ Площадь S= ’, s:8:3,‘ кв. см‘); END.
2.3. Стандартные функции
При составлении программы часто используются стандартные функции. Рассмотрим их использование.
Пример1. Даны числа х и a. Определить стандартные функции. PROGRAM PR2;
VAR X,A,Y1,Y2,Y3,Y4,Y5,Y6:REAL;
BEGIN
WRITE(‘ Введите Х и А’): READLN(X,A); Y1:=COS(X); Y2:=SIN(X);
Y3:=Y2/Y1; Y4:=EXP(X); Y5:=LN(X); Y6:=EXP(X*LN(A));
WRITELN(‘ Ответ cos(x) = ‘,Y1:8:3,’ радиан’); WRITELN(‘ Ответ sin(x) = ‘,Y2:8:3,’ радиан’); WRITELN(‘ Ответ tg(x) = ‘,Y3:8:3,’ радиан’); WRITELN(‘ Ответ еx = ‘,Y4:8:3);
WRITELN(‘ Ответ Ln(x) = ‘, Y5:8:3); WRITELN(‘ Ответ ax = ‘,Y6:8:3); END.
Пример2. Дано: а и b - два неотрицательных числа и b ≠ 0. Определить частное и оста-ток, возникающий при делении а на b с остатком.
17 div 3 = 5, 8 div 2 = 4, 1 div 5 = 0,
17 mod 3 = 2, 8 mod 2 = 0, 1 mod 5 = 1.
Пример 3. Дано действительное число А. Определить - число А четное или нечетное. Воспользуемся стандартной функцией ODD, возвращающей значение логического типа
TRUE или FALSE.
PROGRAM PR16; VAR
а: INTEGER; c:boolean;
BEGIN
WRITE(‘Введите число А ‘); READLN(a);
c:=odd(а); WRITELN(с);
END.
2.4. Трассировка программы
Отображение (на бумаге или на экране) того, что происходит при выполнении каждого оператора, называется трассировкой программы.
Трассировку программы удобно выполнять в таблице трассировки. Структура таблицы:
в первой колонке записываются номера строк, соответствующие операторам, и именно в том порядке, в каком они выполняются;
во второй колонке записываются входы и выходы в различные части программы, помет-ки о выполняемых операторах. Эти сведения называются информацией об управлении.
каждая их остальных колонок соответствует переменной программы и используется для прослеживания значений этой переменной.
Программа на Паскале, которая вычисляет сумму двух целых чисел и выводит ее на экран.
1. Program summa; 2. var a,b,c: integer; 3. begin
4. read (a,b); 5. c:=a+b; 6. write (c); 7. end.
Нумерация строк программы приведена только для трассировки.
Таблица трассировки программы summa. Входные данные а=4, b=17.
Строка | Ход выполнения | a | b | c |
вход в summa | ? | ? | ? | |
вывод: 21 | ||||
выход из summa |
При входе в программу - строка 3 (begin) переменные уже созданы, но еще не приобре-ли своих значений - еще не определены, этот факт отражается в таблице трассировки вопро-сительными знаками в соответствующих колонках. Выполнение оператора ввода read (a,b) в строке 4 привело к тому, что переменные a и b приобрели соответственно значения 4 и 17, а выполнение <