Главная страница

scilab учебник. Учебник Scilab. Учебник Для студентов по дисциплин Базовые средства математических пакетов


Скачать 5.73 Mb.
НазваниеУчебник Для студентов по дисциплин Базовые средства математических пакетов
Анкорscilab учебник
Дата05.05.2022
Размер5.73 Mb.
Формат файлаpdf
Имя файлаУчебник Scilab.pdf
ТипУчебник
#513983
страница17 из 21
1   ...   13   14   15   16   17   18   19   20   21
x_dialog
--> // Пример использования функцийx_dialog
--> y = x_dialog('Введите y = ', '5 ')
Рис. 1.5.4-3 Использованием функций
x_dialog
для ввода данных с клавиатуры
При этом, если функция
input
возвращает значение числового типа, то
x_dialog

строкового. Поэтому при использовании для ввода числовых зна- чений функции
x_dialog
, возвращаемую строку следует преобразовать в число с помощью функции
evstr
. Можно также предложить следующую форму ис- пользования функции
x_dialog
для ввода числовых значений:
Переменная = evstr(x_dialog ('Подсказка', 'Значение'));
В качестве
Значения
может быть использован вектор или матрица. Функ- ция
evstr
распознает символы, используемые при вводе массивов (пробел, за- пятая или точка с запятой). Если ввод строки закончить нажатием клавиши
, то поле ввода очищается, и команда
x_dialog
снова ожидает ввода
Зна-
чений
, и так диалог с пользователем происходит до тех пор, пока не будет нажата кнопка
ОК
(рис.
1.5.4-4)
-->
// Использование функции x_dialog
--> // для ввода значений вектора
-->
--> V = evstr(x_dialog('ВекторV=', ' '))
V =
1. 2. 3. 4. 5. 6.
-->
--> M = evstr(x_dialog('Матрица М=', ' '))
М =
1. 2. 3.
4. 5. 6.
Рис. 1.5.4-4 Использование команды
x_dialog
для ввода вектора и матрицы
Для вывода значения переменной или текста можно использовать функ- цию
disp
, имеющую следующий формат:

177
disp(b),
где
b
– имя переменной или заключенный в кавычки или апострофы текст.
Сделаем несколько замечаний по использованию функции
disp
. Функ- ция
disp
осуществляет вывод значений заданных переменных или заданного текста в Командное окно. Чтобы вывести значения нескольких переменных в одну строку, например, при создании таблиц данных, нужно создать единый объект, который содержал бы все эти значения. Это можно сделать, объединив соответствующие переменные в вектор, пользуясь операциями для создания вектора-строки, например,
x=[x1 x2 ...xn]
. Тогда вывод значений нескольких переменных будет осуществляться в одну строку (
Пример1
, рис. 1.5.4-5).
Другой способ форматированного вывода данных – это использование функции
mprintf
(п. 1.2).
Пример2
, рис. 1.5.4-5 показывает применение функции
mprintf
--> // В
ывод значений нескольких переменных в одну строку
-->
--> // Пример1
--> x1 = -3.14; x2 = -2.5; x3 = 5.6; x4 = -9.33;
--> disp([x1 x2 x3 x4])
-3.14 -2.5 5.6 -9.33
-->
--> // Пример2
--> disp(mprintf('Параметр1 = %g Параметр2 = %g',x1,x2))
Параметр1 = -3.14 Параметр2 = -2.5
Рис. 1.5.4-5 Вывод значений нескольких переменных в одну строку
Если необходимо использовать элементы форматирования, то первый шаг, который нужно сделать – решить, что именно надо отображать. Если это целое число, число с плавающей точкой или строка, то необходимо выбрать соответствующий спецификатор для базового типа формата.
Затем определяется, какой ширины должно быть печатаемое поле в сим- волах. Обычно это определяет самое большое по величине печатаемое число, которое ожидаетcя в результате выполнения программы. Иногда этот размер определяется шириной предоставленного поля в форме или таблице. Элемент ширины необходимо задать так, чтобы он хорошо подходил как к самым боль- шим, так и к самым малым числам. Можно разработать формат для коррект- ного вывода самого большого числа, но если нужно обеспечить заданную точ- ность, то лучше использовать набор условных операторов с разными вариан- тами формата вывода.
Чаще всего применяются элементы форматирования, приведенные на рис. 1.5.4-6.

178
--> // Примеры часто используемых элементов форматирования
-->
--> //
%dуправляющие символы для вывода целого десятичного числа
--> f1 = msprintf('масса: %dграмм ', 2358) масса: 2358 грамм
-->
--> // %
fуправляющие символы для вывода дробного десятичного числа
--> f1 = msprintf('Время: %f секунд', 1.432)
Время: 1.432 секунд
Рис. 1.5.4-6 Примеры часто используемых элементов форматирования
Вывод некоторых символов, таких как, например, –
'
, нужно сопровож- дать слешем \
', а, кроме того, можно добавлять различные управляющие по- следовательности, например,
\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
(«Истина»), то выполняются
Операторы
, составляющие тело структуры

179
if...end
. Оператор
end
указывает на конец перечня
Операторов
Операторы
в списке разделяются запятой или точкой с запятой. Если
ЛогическоеВыражение –
%F
(«Ложь»), то
Операторы
не выполняются. Эта конструкция может быть за- писана как в одну строку (однострочный
if
),
так и в несколько, что соответ- ствует приведенному выше формату оператора.
Ниже приведен пример использования простейшего усеченного разветв- ления (рис. 1.5.4-7.).
--> // Пример усеченного разветвления
-->
--> a = 4;
--> if a> 0 r = sqrt(a); end // Одно строковый if, усеченное разветвление
--> 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
».

180
-->// Загрузка сценария РИС15408 выполнение функций raz1 и raz2
-->
--> clear
--> exec('РИС15408.sce');
--> a = 4; x = raz1(a) x =
2.
-->
--> a = -4; x = raz2(a)
Подкоренное выражение < 0
Рис. 1.5.4-8 Примеры стандартных разветвлений
Рассмотрим вложенное разветвление на примере программной реали- зации следующего разветвления:












2
max x, y ,
если
xy 0;
t
max x ,sin(y),cos(x) ,
если
xy 2;
x / y;
в
противном случае.
Для того, чтобы полностью отразить структуру сложного разветвления, была разработана функция с именем
raz
, а для того чтобы проверить правиль- ность работы функции, организующей разветвления. В примере произведено трехкратное обращение к функции с исходными данными, соответствующими доступу к каждой ветви разветвления.
На рис.1.5.4-9 приведен текст функции
raz
, реализующей вложенное раз- ветвление, трехкратное обращение к функции
raz
и результаты.

181
--> // Загрузка сценария РИС15409 выполнение функции raz
-->
--> exec('РИС15409.sce');
--> p = raz(-2, 1) // Проверка 1-й ветви разветвления 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:

182
2
y
x, если n
1;
y
x(10
x), если
n
2;
t
y
x Sin(nx), если n
3, 4, 5;
y
1 / (1
x ), в противном случае



 



  


 


На рис. 1.5.4-10приведена функция
multifunc
, реализующая множествен- ное разветвление с использованием оператора
select
, и обращение к ней при исходных данных, позволяющих проверить каждую ветвь разветвления.
--> // Загрузка сценария РИС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 позволяют описывать широкий класс задач: нахождение максимального и минимального значения двух переменных; нахождение максимального и минимального зна- чений нескольких переменных; вычисление значений сложных функций, за- висящих от сложных условий; выбора различных путей вычислительного про- цесса и другие.
Рассмотрим несколько простых примеров, реализующие базовые раз- ветвляющие программные структуры.

183
Реализовать функции, которые присваивают переменной
f
наибольшее из значений двух переменных
x
,
y
(1.5.4-11).
При реализации функции
fmax_a
используется стандартное разветвление, а при реализации функции
fmax_b –
усеченное.
--> // Загрузка сценария РИС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соответствует функции f = min(x,y),
где x и y любые арифметические выражения.
Реализовать функцию, которая вычисляет минимальное значение трех выражений
r=min(a+b,c
2
,
d
)
(рис. 1.5.4-12)
В функции
minХ
выбор наибольшего (наименьшего) из значений пере- менных или выражений числом более двух сводится к последовательному применению усеченных разветвлений. Алгоритм, реализующий эту задачу, от- носится к числу базовых алгоритмов выбора наименьшего из нескольких зна- чений. Основой алгоритма является усеченное разветвление. Здесь первона- чально переменной
R
присваивается значение первого из выражений. Истин- ное значение наименьшего значения определяется путем последовательного сравнения со всеми остальными значениями выражений заданной последова- тельности.

184
--> // Загрузка сценария РИС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
обычно используется для организации вы- числений с заданным числом повторений циклов. Конструкция такого цикла имеет следующий вид:
for vаr= s : d : e
Оператор
1
….
Оператор
n
end
где
s
- начальное значение переменной цикла
var, d
- приращение этой пере- менной и
е
– конечное значение управляющей переменной, при превышении которого цикл завершается. Возможна и запись в виде
s:е
(в этом случае
d=1
).
Список выполняемых в цикле инструкций завершается оператором
end
Рассмотрим пример на рис.
1
.5
.4
-
13
, где при заданных действительных числах
a, b (a
и целом числе
n
, необходимо вычислить выражение
s=

𝐅(𝐢) ∗ 𝐡
𝒏
𝒊=𝟎
, где
b
a
h
n


, если
i
2
a
(i
1 / 2)h
F
,
i
1, 2,..., n.
(1
(i
1 / 2)h)


 




185
--> // Загрузка сценария РИС15413 и выполнение функции summa,
--> // вычисляющее выражения p
-->
--> clear
--> exec('
РИС15413
.sce', 0);
--> a = 4; b=2; n=5;
--> summa(a, b, n)
Ошибка в исходных данных b-->
--> a = 2; b = 4; n = 5;
--> p = summa(a, b, n) p =
-0.6114314
Рис. 1.5.4-13. Вычисление выражения
1
2
n
s
(F
F
...
F )h




Решение задачи требует разработки 2-х функций: функции
slog
, предна- значенной для вычисления
i-го слагаемого и функции
summa
, которая вычисляет заданное выражение
1
2
n
s
(F
F
...
F )h




. Функции
slog
и
summa
помещены в сценарий, сохраненный в файле с именем главной функции
summa
Запуск на выполнение осуществляется из командного окна обращением к функции
summa
. Предварительно переменным
a
,
b
и
n
присваиваются числовые значе- ния. Проверка правильности ввода исходных данных, предусмотрена в функ- ции
summa.
В случае если
b>a
,
происходит вычисление значения
i-
го слагаемого, накапливание суммы и, по окончании цикла, умножение суммы на величину
h
, с
последующим выводом результат в командной строке, иначе в командной строке выводится сообщение «Ошибка в исходных данных
b
».
Необходимо отметить, что наиболее часто оператор цикла
for...end
ис- пользуется при обработке векторов и матриц.

186
В качестве примера использования оператора
for...end
вычислим сумму элементов вектора
х
с использованием функции
1   ...   13   14   15   16   17   18   19   20   21


написать администратору сайта