Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базовые средства матпакета Scilab

.pdf
Скачиваний:
55
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать

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

управляющие последовательности, например,

\n – перевод строки

(Приложение

1.2,

табл.1.2.4-5).

 

 

 

Разветвляющиеся программные структуры

К разветвляющимся программным структурам относятся оператор if и операторы множественного выбора select.

Условный оператор if…end в общем виде имеет следующую структуру:

if ЛогическоеВыражение1 then Операторы1

elseif ЛогическоеВыражение2 then Операторы2

else

Операторыn end

Правила записи логических выражений описаны в п. 1.2.3.

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

Эта структура допускает несколько частных вариантов. Простейший –

усеченное разветвление, имеет следующий вид:

If ЛогическоеВыражение Операторы

end

Напомним, что если ЛогическоеВыражение принимает значение %T («Истина»), то выполняются Операторы, составляющие тело структуры if...end. Оператор end указывает на конец перечня Операторов. Операторы в списке разделяются запятой или точкой с запятой. Если ЛогическоеВыражение – %F («Ложь»), то Операторы не выполняются. Эта конструкция может быть записана как в одну строку (однострочный if), так и в несколько, что соответствует приведенному выше формату оператора.

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

--> // Пример усеченного разветвления

-->

-->a = 4;

-->ifa> 0 r = sqrt(a); end // Одно строковыйif, усеченное разветвление

161

--> r r = 2.

Рис. 1.5.4-7 Пример усеченного разветвления

Эта конструкция оператора if довольно часто используется при написании программ, однако не всегда удобна, поскольку имеет только одну выполняемую ветвь разветвления. Так, в примере, показанном на рис.1.5.4-7, выполняется следующее: если значение aположительно, то корень вычисляется, а если значение aне положительно, то вычисление корня не происходит, но программа не выдает сообщения об этой ситуации. Для того, чтобы отслеживать ситуации по обеим ветвям разветвления, нежно использовать другую конструкцию оператора if.

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

If ЛогическоеВыражение Операторы1

else

Операторы2 end

Здесь, если ЛогическоеВыражение истинно выполняются Операторы1, в

противном случае выполняются Операторы2.

Пример, в котором выполняется стандартное разветвление, приведен на рис.1.5.4-8. Здесь использованы две функции raz1 и raz2, первая из которых реализует стандартное разветвление, выполненное в одну строку, а вторая – в несколько строк и при этом реализуют одинаковые действия. При а=4 выводится значение х=2, а при x=-4 – сообщение: «Подкоренное выражение < 0».

162

-->// Загрузка сценария РИС15408 выполнение функцийraz1 и raz2

--> -->clear

--> exec('РИС15408.sce'); --> a = 4; x = raz1(a)

x = 2.

-->

-->a = -4; x = raz2(a)

Подкоренное выражение < 0

Рис. 1.5.4-8 Примеры стандартных разветвлений

Рассмотрим вложенное разветвление на примере программной реализации следующего разветвления:

max x, y ,

если

xy 0;

 

 

 

 

 

 

 

 

2

 

 

 

 

t max x

,sin(y),cos(x) ,

если

xy 2;

 

 

 

в

противном

случае.

 

x / y;

 

 

 

 

 

 

 

 

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

На рис.1.5.4-9 приведен текст функции raz, реализующей вложенное разветвление, трехкратное обращение к функции raz и результаты.

-

-> // Загрузка сценария РИС15409 выполнение функции raz

-->

--> exec('РИС15409.sce');

-->p =raz(-2, 1) // Проверка 1-й ветви разветвления

163

p

=

 

 

 

 

1.

 

 

 

-->

 

 

 

 

-->p =

raz(3, 1)

// Проверка 2-й ветви разветвления

-->p=9

 

 

 

p

=

 

 

 

 

9.

 

 

 

-->

 

 

 

 

-->p =

raz(1, 1)// Проверка 3-й ветви

разветвления

p

=

 

 

 

 

1.

 

 

 

 

 

Рис.1.5.4-9 Примеры, реализующие вложенное разветвление

 

Оператор

множественного

выбора select используется для

осуществления множественного выбора:

select Переменная caseЗначение1 then Операторы1 caseЗначение2 then операторы2

elseОператоры end

Если Переменная заголовка select имеет значение какого-либо Значение..., то выполняется соответствующий ему блок операторов case, в противном случае – список операторов, записанных после else. То есть при выполнении блока case исполняются те Операторы…, для которых Значение совпадает со значением Переменной.

Поясним использование оператора select следующим примером вычисления значения t:

 

y

 

x, если

n 1;

 

 

 

 

 

x(10 x), если

n 2;

t

y

 

y

 

x Sin(nx), если

n 3, 4,5;

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

1 / (1 x ), в противном случае

 

y

На рис. 1.5.4-10приведена функция multifunc, реализующая множественное разветвление с использованием оператора select, и обращение к ней при исходных данных, позволяющих проверить каждую ветвь разветвления.

164

 

 

 

 

-->

// Загрузка сценария РИС15410 и выполнение функции multifunc,

--> // реализующей множественное разветвление

 

-->

 

 

 

-->clear

 

 

--> exec('РИС15410.sce');

 

 

--> r = multifunc(5, 1)

// Проверка 1-ой ветви

разветвления

r

=

 

 

 

5.

 

 

--> r = multifunc(5, 2)

// Проверка 2-ой ветви

разветвления

r

=

 

 

 

25.

 

 

--> r = multifunc(5, -1)

// Проверка 3-ей ветви

разветвления

r

=

 

 

 

0.0384615

 

 

--> r = multifunc(5, 6)

//Проверка 4-ой ветви

разветвления

r

=

 

 

 

0.027027

 

 

Рис. 1.5.4-10 Обращения к функции multifunc

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

Рассмотрим несколько простых примеров, реализующие базовые разветвляющие программные структуры.

Реализовать функции, которые присваивают переменной f наибольшее из значений двух переменных x, y (1.5.4-11).

При реализации функции fmax_a используется стандартное разветвление, а при реализации функции fmax_b–усеченное.

165

--> // Загрузка сценария РИС15411и выполнение функцийfmax_a и fmax_b --> // реализующих нахождение max из 2-х переменных

--> -->clear

--> exec('РИС15411.sce', 0); --> r = fmax_a(10, 3)

r = 10.

--> r=fmax_b(10,3)

r=

10.

Рис. 1.5.4-11 Нахождение максимума двух переменных, реализованное с помощью стандартной и усеченной разветвляющихся структур

Обратите внимание, что:

Ifx>ythenf = xelsef = yсоответствует функции f = max(x,y), Ifx<ythenf = xelsef = yсоответствует функции f = min(x,y),

где x и y любые арифметические выражения.

Реализовать функцию, которая вычисляет минимальное значение трех

выражений r=min(a+b,c2, d )(рис. 1.5.4-12).

В функции minХ выбор наибольшего (наименьшего) из значений переменных или выражений числом более двух сводится к последовательному применению усеченных разветвлений. Алгоритм, реализующий эту задачу, относится к числу базовых алгоритмов выбора наименьшего из нескольких значений. Основой алгоритма является усеченное разветвление. Здесь первоначально переменной R присваивается значение первого из выражений. Истинное значение наименьшего значения определяется путем последовательного сравнения со всеми остальными значениями выражений заданной последовательности.

166

--> // Загрузка сценария РИС15412и выполнение функций minx

--> -->clear

--> a = 1; b = 5; c = 10; d = 1; --> exec('РИС15412.sce');

-->R = minx(a, b, c, d) // Использование функции пользователя minX

R = 1.

Рис. 1.5.4-12 Реализация вычисления минимум из элементов массива

Регулярные циклические структуры и оператор for

Оператор цикла for...end обычно используется для организации вычислений с заданным числом повторений циклов. Конструкция такого цикла имеет следующий вид:

forvаr= s : d : e

Оператор1

….

Операторn end

где s - начальное значение переменной цикла var, d - приращение этой переменной и е – конечное значение управляющей переменной, при превышении которого цикл завершается. Возможна и запись в виде s:е (в этом случае d=1). Список выполняемых в цикле инструкций завершается оператором end.

Рассмотрим пример на рис.1.5.4-13, где при заданных действительных числах a, b (a<b),и целом числе n, необходимо вычислить выражение

s== ( ) , где

h

n

a

,

если

F

 

 

a (i 1 / 2)h

,

i 1, 2,..., n.

 

2

i

 

 

(1

 

 

 

 

 

 

(i 1 / 2)h)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

167

--> // Загрузка сценария РИС15413 и выполнение функции summa, --> // вычисляющее выражения p

--> -->clear

-->exec('РИС15413.sce', 0); --> a = 4; b=2; n=5;

--> summa(a, b, n)

Ошибка в исходных данных b<a -->

--> a = 2; b = 4; n = 5; --> p = summa(a, b, n)

p = -0.6114314

Рис. 1.5.4-13. Вычисление выражения

s (F

F

... F )h

1

2

n

Решение задачи требует разработки 2-х функций: функции slog, предназначенной для вычисления i-го слагаемого и функции summa, которая вычисляет заданное выражение s (F1 F2 ... Fn)h. Функции slog и summa помещены в сценарий, сохраненный в файле с именем главной функции summa. Запуск на выполнение осуществляется из командного окна обращением к функции summa. Предварительно переменным a, bи n присваиваются числовые значения. Проверка правильности ввода исходных данных, предусмотрена в функции summa. В случае если b>a, происходит вычисление значения i-го слагаемого, накапливание суммы и, по окончании цикла, умножение суммы на величину h, с последующим выводом результат в командной строке, иначе в командной строке выводится сообщение «Ошибка в исходных данных b<a».

168

Необходимо отметить, что наиболее часто оператор цикла for...end используется при обработке векторов и матриц.

В качестве примера использования оператора for...end вычислим сумму элементов векторах с использованием функции summaи входными параметрами, которые служат вектор xи число элементов n.Значение элементов вектора определены в командном окне (рис. 1.5.4-14).

-->// Загрузка сценария РИС15414и выполнение функцииsumma

--> -->clear

--> exec('РИС15414.scе');

--> x = [1 2 3 4 5]; n = length(x);

-->s = summa(x, n) // Обращение к функции пользователя summa

s

=

 

 

15.

 

-->

 

 

--> s = sum(x)

// Проверка с использованием встроенной функции sum

s

=

 

 

15.

 

Рис. 1.5.4-14 Функция summa, вычисляющей сумму элементов массива, и обращения к функции summa и встроенной функции sum

Количество элементов массива х определяется функцией length. Кроме обращения к функции summaв командном окне предусмотрена проверка результата вычислений с использованием встроенной функции sum(x).

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

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

169

-->// Загрузка сценария РИС15415 и выполнение функции vzikl

--> -->clear

--> a = [1,2,3;4,5,6;7,8,9]; n = 3; --> exec('РИС15415.sce');

-->

--> s=vzikl(a) s =

45.

Рис. 1.5.4-15 Использование вложенных циклов для вычисления суммы элементов двумерного массива

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

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

Рассмотрим пример реализации функции, которая вычисляет y(x)=sin(x) при значениях x, изменяющихся на отрезке [a;b] с шагом h(рис.1.5.4-16).

--> // Загрузка сценария РИС15416 и выполнение функции ziklh

170