Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЯП (Кузьмин) ч.2_new (Паскаль).docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3.97 Mб
Скачать

10. Вычисление по формулам.

Часто при программировании вычислений, которые записываются в математической форме, возникают некоторые сложности. Некоторые из этих сложностей мы и рассмотрим.

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

Левая часть

Правая часть

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

:= :=

l-value

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

Const Var

A=2; B: byte;

begin

B:=2;

end.

А - имя константы, 2 - это его значение. На этапе компиляции имя константы будет заменено на ее значение так, что к моменту выполнения в программе от имени А не останется и следа.

Имя B является синонимом начала адреса этой области памяти, выделенной компилятором для переменной B, 2 - значение, размещаемое при выполнении оператора присваивания по адресу переменной B.

Read(A);

A:=B;

Нельзя писать в программах:

Write(A);

B:=А;

Read(В);

Можно писать в программах:

Выполнение оператора присваивания подчиняется следующим правилам:

В:=В+А

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

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

Для примера : пусть В равно 2; А равно 3; надо вычислить В:=В+А;

10.2 Характер использования переменных в математике и в программах.

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

Поэтому в программах вместо

c := a + b;

можно писать

a := a + b;

если значение переменной a дальше хранить не нужно.

10.3 Бесконечности

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

Поэтому

- перед выполнением деления надо проверить знаменатель на ноль

- вычисление n! при n=100 скорее всего вызовет переполнение разрядной сетки для целочисленной переменной n.

10.4 Нестандартные операции

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

ctg(x) --- 1/tg(x)

ax --- как? ----------a = elna -- ax = (elna)x = elna*x = exp(ln(a)*x). Эта формула может без ошибок применяться не во всех ситуациях:

  1. a>0, x>0 – приведенная формула соответствует (применима) только (к) этой ситуации

  2. a>0, x<0 необдуманное применение формулы в этих ситуациях приведет к ошибке

  3. a<0, x>0 (при x<0 ax ≡ 1/ax, при a<0 логарифм от a не определен)

  4. a<0, x<0

Если x > 0 и x - целое, то для вычисления ax можно поступить так:

var

s: longint; //результат ax

a: integer;

x: word;

i: word; //счетчик циклов

begin

s := 1; //инициализация результата ax

for i := 1 to x do

s := s*a;

......... a*a*a*a...*a

x раз

10.5 Индексы в математике и в программах.

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

  1. для обозначения номеров элементов вектора:

Х1 Х2 Х3

Если вектор имеет имя Х, то под одним именем объединяются несколько значений

вектор с именем Х (на Паскале Var

x: array[1..10] of integer;

begin

Х1 - 1-й элемент вектора X x[1] := 5;

  1. для обозначения номеров элементов последовательности промежуточных значений некоторой переменной. Например, пусть S1,S2,S3 промежуточные стадии переменной S (в которой в конце концов мы должны получить сумму элементов вектора Х)

n

S= Xi

i=1

S1=X1

S2=S1+X2

S3=S2+X3

………….

  1. когда индексы используются для комментария. Так в формуле для вычисления скорости

V := V0 + at

индекс 0 при переменной V0 означает общепринятое обозначение начального значения скорости. В этом смысле ноль является комментарием (символом начального значения).

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

1) S = Xi

В данном случае если вспомнить правило выполнения оператора присваивания, то можно переписать выражение без лишних индексов, например, S2:=S1+X2 --> значение S1 нам дальше не потребуется --> S:=S+X2

Таким образом, надо будет заменить

S1=X1---------> S = X1

S2=S1+X2----> S = S + X2

S3=S2+X3----> S = S + X3

………….

Замечание: Индексы Х нужно использовать только если x – именно вектор. Если же Х1, Х2, ... – это разные значения одной и той же переменной (последовательности), то индексы у Х можно так же убрать, но на каждом шаге надо выполнять не одно, а два действия:

а) получение нового значения Х ------------- Х := Х + h; или Readln(x);

б) S := S + X

2) В случае использования индексов в качестве комментариев, их так же можно исключить благодаря дискретному характеру вычислений (в пределах одного и того же шага выполнения программы никогда V0 и V встретиться не могут, т.е. Vконечное и Vначальное – это разные значения одной и той же переменной V) можно заменить:

V=V0+AT V=V+AT

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