Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 1 семестр.doc
Скачиваний:
26
Добавлен:
10.06.2015
Размер:
1.26 Mб
Скачать

2.1. Линейные процессы вычислений

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

Операторы ввода (чтения)

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

READ(X1, Х2, ХЗ, ...), или READLN(X1, Х2, ХЗ, ...),

где X1, Х2, ХЗ,... — идентификаторы скалярных переменных. Данные, соответствующие переменным X1, Х2, ХЗ, вводятся с клавиатуры и разделяются либо пробелом, либо Enter. После ввода последнего данного всегда нажимается клавиша Enter.

Отличие оператора READLN от READ заключается в том, что после считывания последнего в списке X1 Х2, ХЗ,... значения данные для следующего оператора READLN будут считываться с начала новой строки. То есть, если список ввода X1, Х2, ХЗ,... оператора READLN меньше чем число набранных в одну строку через пробел чисел, то оставшиеся в строке числа будут проигнорированы. Оператор READ сохранит оставшиеся числа для дальнейшего ввода. Вводимые данные должны строго соответствовать типам переменных, описанных в разделе VAR, в противном случае будут возникать сообщения об ошибках ввода.

Оператор READLN без параметров вызывает приостановление программы до момента нажатия клавиши Enter.

Операторы вывода (записи)

Вывод числовых данных, символов, строк и булевских значений на экран дисплея осуществляется с помощью операторов вызова стандартных процедур: WRITE(X1, Х2, ХЗ, ...), или WRITELN(X1, Х2, ХЗ, ...).

Отличие этих операторов состоит в том, что WRITELN после распечатки списка выражений XI, Х2, ХЗ,... автоматически переводит курсор в начало следующей строки, а после выполнения оператора WRITE курсор остается за последним символом, выведенным на экран.

Оператор WRITELN с пустым списком выводимых данных выводит строку пробелов. Управление форматом выводимых данных осуществляется непосредственно в операторе вывода. Для этого используется запись элемента из списка {Xi} в виде — X [: В [: С ]], где X — выражение, идентификатор переменной или константа, В – ширина поля для вывода данного X, С – точность (только для типа REAL). Точность представления определяет количество цифр после точки (дробная часть числа). Если указанная ширина поля оказывается 'слишком большой', то значение данного выводится со стоящими впереди пробелами. Если указанная ширина ноля 'мала', то в строке вывода для значения этого данного добавляются (автоматически) необходимые позиции. Параметры формата (ширина поля B и точность С) могут быть константой, переменной или выражением целого типа.

Пример 2.

Описать формат вывода арифметического выражения X, численное значение которого |X|< 1000, с точностью до пяти знаков после десятичной точки.

Решением этой задачи является оператор: WRITELN( X : 10 : 5 ). На рисунке 1 показана схема формата Х:10:5.

Цифра 10 определяет ширину поля, то есть общее количество литер, отведенное для отображения вещественного числа вместе со знаком и десятичной точкой. Цифра 5 – точность - указывает количество цифр мантиссы. В этом примере результат вычисленияX выводится на экран дисплея в форме вещественного числа с фиксированной точкой.

Если задать формат в виде Х:8, то вещественное число будет представлено в формате с плавающей точкой и будет включать для своего представления восемь литер. Ограничение ширины поля скажется на разрядности мантиссы. Для вывода целой части X можно форматировать — Х:5:0. В этом случае 'точность' равна 0 и десятичная точка не отображается на экране. Дробная часть вещественного числа округляется с указанной точностью, а не отбрасывается.

Таблица 15. Примеры форматов вещественных чисел

X

Тип

Формат

Результат

Примечание

12.336

REAL

X:5:2

12.34

Формат вещественного числа с фиксированной точкой

12.334

REAL

X:5:2

12.33

-12.339

REAL

X:6:2

-12.34

-0.0123

REAL

X:6:3

-0.012

12.334

REAL

X:5:0

12

Округление вещественного числа до целого числа с помощью формата

12.534

REAL

X:5:0

13

-12.534

REAL

X:5:0

-13

-123.456

REAL

X:10

1.235E+02

Формат вещественного числа с плавающей точкой

-12.3456

REAL

X:8

-1.2E+01

12.3456

REAL

X:8

1.2E+01

0.012

REAL

X:11

1.2000E-02

0.0156

REAL

X

1.5600000000E+02

Бесформатный вывод вещественного числа

12.3456

REAL

X

-1.2345600000E+01

Оператор присваивания

Вычисления в большинстве случаев реализуются с помощью оператора присваивания, который имеет формат:

<Идентификатор> := <Выражение>;

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

Арифметические выражения используют арифметические операции: *, /, DIV, MOD, AND, OR, +, - . Операнды имеют тип REAL или INTEGER.

Пример арифметического выражения:

X := (1 - В)*ЕХР(-0.5*А)/(1 - А).

Список встроенных арифметических функций, наиболее часто используемых в программах на Паскале, приведен в таблице 8. Последовательность выполнения операции в выражении определяется их приоритетом. В первую очередь делаются операции умножения и деления (*, /), а в последнюю — сложения и вычитания (+, -) слева направо. Приоритетность арифметических операций:

  1. Вычисления в круглых скобках;

  2. Вычисления значений функции;

  3. Унарные операции (NOT, унарный +, унарный -);

  4. Арифметические операции 1 уровня (*, /, div, mod, and, shl, shr);

  5. Арифметические операции 2 уровня (+, -, or, xor);

  6. Операции отношения (=, <, >, <>, >=, <=, in);

В языке существуют ограничения на преобразование типов данных путем присваивания. Переменной А типа REAL можно присвоить значение переменной В типа INTEGER ==> А := В. Однако обратное присвоение В := А вызовет прерывание по причине несоответствия типов.

Для этого случая предусмотрены функции преобразования типов TRUNC(A) или ROUND(A), то есть используется присвоение вида В := TRUNC(A) или В := ROUND(A).

Примеры линейных программ

Пример 3. Рассчитать площадь шара в кв. см. Радиус шара ввести с клавиатуры в миллиметрах.

PROGRAM PR3; {Программа вычисляет площадь поверхности шара}

VAR PL: REAL; { PL - площадь шара}

R: INTEGER; { R - радиус }

BEGIN

WRITELN('Введите радиус шара, мм');

READLN(R);

PL:=4*PI*SQR(R)/100;

WRITELN('Площадь шара =', PL:8:1, 'кв. см')

END.

Пример 4. Осуществить расчеты по формуле:

,

где φ=arctg(b/a), ψ=arctg(d/c), c=n*a, d=m*b.

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

Математическая величина, выражение

Идентификатор переменной в программе

α

ALPHA

β

BETA

φ

FI

ψ

PS I

α + φ + 15°

AF

β + ψ + 75°

BP

SQAB

SQCD

Программирование линейных вычислительных процессов очень похоже на вычисления по формулам, которые математик осуществляет на бумаге. Алгоритмтаких вычислений, как правило, не составляется в виде блок-схем. Наиболее удобной формой представления такого алгоритма является формульно-словесный способ, при котором действия пронумерованы пунктами 1, 2,3 и т.д. Каждое действие поясняется словами, формулами и расчетами.

Алгоритм решения этой задачи описан формульно-словесным способом:

1. Ввод с клавиатуры параметров А, В, М, N, ALPHA, BETA.

2. Вычисление аргументов тригонометрических функций по формулам:

где AF и BP промежуточные рабочие переменные, которые в исходной формуле встречаются по два раза в числителе и знаменателе. Следует отметить, что аргументы встроенных функций Sin и Cos в Паскале должны задаваться в радианах. В исходной формуле подразумевается, что углы α, β, φ, ψ измеряются в радианах. Поэтому углы 15° и 75° градусов подлежат пересчету в радианы, что и сделано в приведенных выше формулах для расчета AF и BP.

3. Последовательное вычисление величин С, D, FI, PSI по формулам:

C = n*a, D = m*b, FI = arctg(b/a), PSI = arctg(d/c).

4. Нахождение значений промежуточных переменных SQAB и SQCD по формулам:

,

5. Вычисление Y по упрощенной формуле за счет уже выполненных в предыдущих пунктах алгоритма расчетов.

6. Последним пунктом этого алгоритма является вывод найденного значения Y на экран монитора.

PROGRAM PR4;

VAR

ALPHA, BETA, FI, PSI, SQAB, SQCD, AF, BP, А, В, C, D, N, M, Y: REAL;

BEGIN

WRITELN('Введите значения А, В, M, N');

READLN(A, В, M, N);

WRITELN('Введите значения АЛЬФА, БЕТТА');

READLN(ALPHA, BETA);

С := N*A;

D := M*B;

FI := ARCTAN(B/A);

PSI := ARCTAN(D/C);

AF := ALPHA + FI + 15*PI/180;

BP = BETA + PSI + 75*PI/180;

SQAB := SQRT(A*A + B*B);

SQCD := SQRT(C*C + D*D);

Y:=ARCTAN((0.5*SQAB*SIN(AF)+SQCD*SIN(BP))/(SQAB*COS(AF) + SQCD*COS(BP)));

WRITELN('Y =', Y:7:3)

END.

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

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

2. Учитывая последовательный принцип выполнения операторов в программе – друг за другом по мере их написания – необходимо установить порядок расчета формул. Основное требование состоит в том, чтобы при расчете формулы все переменные и параметры были ранее вычислены или введены с клавиатуры. Если формулы можно упростить путем алгебраических преобразований, то это нужно сделать до начала программирования.

3. Все математические величины нужно разбить на две группы: константы и переменные. Константы следует определить в разделе CONST программы, а переменные — в разделе VAR.

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

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

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

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

Пример 5. Осуществить расчеты по формуле:

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

Исходная формула

Формула для программирования

Текст программы

, Z>0

EXP(LN(Z)/N)

Zn+l, Z>0

EXP((N+1)*LN(Z))

LogN|X +11

LN(ABS(X+1))/LN(N)

PROGRAM PR5;

VAR

X, Y: REAL;

N: INTEGER;

BEGIN

WRITELN('Введите значения X, N');

READLN(X, N);

Y := EXP(LN(ABS(EXP((N+1)*LN(X)) + LN(ABS(X+1))/LN(N)))/N);

WRITELN( Y = ', Y:8:4)

END.