scilab учебник. Учебник Scilab. Учебник Для студентов по дисциплин Базовые средства математических пакетов
Скачать 5.73 Mb.
|
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 где 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 ис- пользуется при обработке векторов и матриц. |