Пример исполнения алгоритма KVKOR




0) До выполнения программы осуществляется распределение свободного участка памяти под переменные величины, описанные в разделе переменных программы:

  ОП  
X ? под хранение данного типа REAL (6Б)
Y ? под хранение данного типа REAL (6Б)

Рис. 12.6. – Распределение ОП

1) выполняется обращение к процедуре вывода:

WRITELN('Введите число')

Вычисляется фактический параметр-выражение. Получается строка символов. Она выводится на экран. На экране, начиная с текущего положения курсора, появляется сообщение:

Введите число

, и курсор переводится в начало следующей строки экрана дисплея;

2) выполняется обращение к процедуре ввода:

READLN (Х)

Программа ожидает получения информации в виде одного вещественного числа с клавиатуры ПЭВМ. Человек набирает эту информацию, например, -4 и нажимает клавишу ввод (Return или Enter). Значение –4 поступает в память под именем Х. (рис. 12.7).

  ОП  
X -4 под хранение данного типа REAL (6Б)
Y ? под хранение данного типа REAL (6Б)

Рис. 12.7. – Содержимое ОП после ввода

3) начинает выполняться условный оператор:

IF X>=0 THEN

BEGIN

Y:=SQRT(X);

WRITELN('Корень квадратный из ',X,'=',Y)

END

ELSE

WRITELN('Корень из отрицательного ',X,' НЕ СУЩЕСТВУЕТ')

Первым действием вычисляется логическое выражение, стоящее между IF и THEN и являющееся условием X>=0:

-4.0>=0 Получаем ответ FALSE;

4) так как получен ответ FALSE, то оператор по ветви THEN пропускается, и выполняется оператор стоящий по ветви ELSE – обращение к процедуре вывода

WRITELN('Корень из отрицательного ',X,' НЕ СУЩЕСТВУЕТ')

В результате исполнения на экране, начиная с текущего положения курсора, появляется сообщение:

Корень из отрицательного -4.0000000000E+00 НЕ СУЩЕСТВУЕТ

Решение квадратного уравнения
с произвольными вещественными коэффициентами

Классическим примером разветвляющегося алгоритма является решение квадратного уравнения с произвольными коэффициентами a, b и c.

Математическая модель

.

Метод решения

С точки зрения метода решения такое уравнение рассматривается, как квадратное, если первый коэффициент a отличен от нуля. В этом случае вычисляется дискриминант . И, если D>=0, то существуют два корня X1 и Х2, определяемые по формуле , причем они получаются равные, в случае равенства D=0. Если D<0, то решение в области вещественных чисел отсутствует, а существуют только решения в области комплексных чисел, причем действительная часть обоих корней одинаковая , а мнимая отличается только знаком .

Если же первый коэффициент задан равным 0, то квадратное уравнение вырождается в линейное со всеми возможными вариантами решений. При b отличном от 0 имеется единственное решение X=-c/b. При b=0 линейное уравнение вырождается в тождество, которое справедливо только в одном случае, если задано значение с=0. Таким образом, в случае с=0 решением уравнения считается любое существующее вещественное значение, а, если с отлично от 0, то тождество не выполняется, и, значит, решений исходное уравнение не имеет.

Информационная модель

В нашем алгоритме, если учесть, что комплексное число можно представить как пару вещественных чисел, используются только вещественные величины - A, B, С, D, X1, X2, REX, IMX, X.

Таблица 12.3. Информационная модель

Статус Назначение Имя Тип
Вход Коэффициент при х2 A Real
Вход Коэффициент при х B Real
Вход Свободный член C Real
Выход Первый вещественный корень X1 Real
Выход Второй вещественный корень X2 Real
Выход Единственный вещественный корень X Real
Выход Действительная часть комплексных корней REX Real
Выход Мнимая часть комплексных корней IMX Real
Промежуточная Дискриминант D Real

Набор тестов

Таблица 12.4. Набор тестов

№ теста       Ожидаемый результат
A B C
    -3   Два корня X1=2, X2=1
      2.5 Два комплексных корня ReX=-0.5,ImX= 3
      -4 Единственный корень Х=2
        Х – любое действительное число
        Решений нет

Алгоритмическая модель

Последовательность разработки алгоритма проиллюстрирована ниже фрагментами текста программы. Однако приведем и схему алгоритма (рис. 12.8).

Рис. 12.8. – Схема алгоритма решения квадратного уравнения

Программная модель

Вспомним, что программа на Паскале состоит из разделов.

Первый раздел - заголовок текста программы. Назовем ее KVUR:

PROGRAM KVUR;

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

Третий раздел программы - описание используемых меток. Мы знаем, что хорошие (структурированные) программы не должны содержать меток. А мы пишем только хорошие программы – поэтому третий раздел отсутствует.

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

Пятый раздел программы - описание нестандартных типов данных. В информационной модели у нас используется только вещественный тип данных REAL. Он стандартный. Поэтому раздел пять в программе отсутствует.

Шестой - обязательный раздел каждой программы – описание переменных величин. В информационной модели указаны девять вещественных переменных. Опишем их:

VAR A, B, С, D, X1, X2, REX, IMX, X:REAL;

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

  ОП  
A ? под хранение данного типа REAL (6Б)
B ? под хранение данного типа REAL (6Б)
C ? под хранение данного типа REAL (6Б)
D ? под хранение данного типа REAL (6Б)
X1 ? под хранение данного типа REAL (6Б)
X2 ? под хранение данного типа REAL (6Б)
REX ? под хранение данного типа REAL (6Б)
IMX ? под хранение данного типа REAL (6Б)
X ? под хранение данного типа REAL (6Б)

Рис. 12.9. – Распределение ОП

Седьмой раздел программы - описание (тексты) собственных процедур и функций. С такими типами текстов мы не знакомы, поэтому этот раздел в нашей программе отсутствует.

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

BEGIN

{Ввод исходной информации}

{Расчет по математической модели с выводом результатов}

END.

Перейдем к реализации каждого пункта плана.

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

WRITELN('Введите коэффициенты кв. уравнения A, B и С')

Непосредственный ввод информации осуществляется с помощью обращения к стандартной процедуре ввода READLN с фактическими параметрами - именами вводимых переменных:

READLN (A, B, С)

Второй пункт плана реализует выбранный метод решения, поставленной задачи в виде математической модели. В зависимости от значения первого коэффициента A (A равно 0 или нет), мы должны либо решать чисто квадратное уравнение, либо исследовать линейное уравнение. Эти действия записываются условным оператором, в котором в качестве

- условия используется логическое выражение A<>0;

- оператора по ветви then - действия обеспечивающие решения чисто квадратного уравнения;

- оператора по ветви else - действия обеспечивающие исследование линейного уравнения:

IF A<>0 THEN

{решение чисто квадратного уравнения}

ELSE

{исследование линейного уравнения}

Рассмотрим процесс решения чисто квадратного уравнения. Здесь необходимо вычислить дискриминант (оператор присваивания D:=SQR(B)-4*A*С). А затем проанализировать его (выяснить положительный он или нет), и, в зависимости от результата анализа, вычислить и вывести либо два вещественных корня, либо вычислить и вывести действительную и мнимую части двух комплексных корней. Эта последовательность действий реализуется с помощью условного оператора, в котором в качестве

- - условия используется логическое выражение D>=0;

- - оператора по ветви then - составной оператор, обеспечивающий вычисление двух вещественных корней (два оператора присваивания X1:=(-B+SQRT(D))/(2*A); X2:=(-B-SQRT(D))/(2*A)) и вывод полученных результатов (оператор обращения к процедуре вывода WRITELN('Два вещественных корня X1=', X1, ' X2=',X2));

- - оператора по ветви else - составной оператор, обеспечивающий вычисление вещественной и мнимой частей двух комплексных корней (два оператора присваивания REX:=-B/(2*A); IMX:=SQRT(-D) /(2*A)) и вывод полученных результатов (оператор обращения к процедуре вывода WRITELN('Два комплексных корня X1=', REX, ' +i',IMX,' X2=', REX, ' -i',IMX)).

Все действия процесса решения чисто квадратного уравнения записываются в виде составного оператора

BEGIN

D:=SQR(B)-4*A*С;

IF D>=0 THEN

BEGIN

X1:=(-B+SQRT(D))/(2*A);

X2:=(-B-SQRT(D))/(2*A));

WRITELN('Два вещественных корня X1=', X1, ' X2=',X2)

END

ELSE

BEGIN

REX:=-B/(2*A);

IMX:=SQRT(-D)/(2*A);

WRITELN('Два комплексных корня X1=', REX, ' +i', IMX,

' X2=', REX, ' -i', IMX)

END

END

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

IF B<>0 THEN

BEGIN

X:=-С/B;

WRITELN('Один корень Х=',X)

END

ELSE

{анализ на тождество}

Анализ на тождество реализуется также с помощью условного оператора:

IF С=0 THEN

WRITELN ('Х - любое')

ELSE

WRITELN ('Решений нет')

Теперь весь алгоритм в целом:

PROGRAM KVUR;

{Назначение: решение квадратного уравнения с произвольными вещественными коэффициентами }

VAR A, B, C,{коэффициенты квадратного уравнения}

D {дискриминант квадратного уравнения},

X1, X2,{два вещественных корня}

REX, IMX,{действительная и мнимая части комплексных корней}

X {один вещественный корень линейного уравнения}: REAL;

BEGIN

 

{Ввод исходной информации}

WRITELN('Введите коэффициенты кв.уравнения A, B и С');

READLN (A, B, C);

 

{Расчет по математической модели с выводом результатов}

IF A<>0 THEN

{решение чисто квадратного уравнения}

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 BEGIN

REX:=-B/(2*A);

IMX:=SQRT(-D)/(2*A);

WRITELN('Два комплексных корня X1=', REX, ' +i', IMX,

' X2=', REX, ' -i', IMX)

END

END

ELSE

{исследование линейного уравнения}

IF B<>0 THEN BEGIN

X:=-C/B;

WRITELN('Один корень Х=',X)

END

ELSE

{анализ на тождество}

IF С=0 THEN

WRITELN ('Х - любое')

ELSE

WRITELN ('Решений нет')

 

END.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: