Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Управление последовательностью исполнения операторов




Скрипт

Режим программирования

Система Matlab создана таким образом, что любые (подчас весьма сложные) расчеты можно выполнять в режиме прямых вычислений, то есть без подготовки программы. Это превращает Matlab в необычайно мощный калькулятор, который способен производить не только обычные для калькуляторов вычисления (например, выполнять арифметические операции и вычислять значения элементарных функций), но и операции с векторами и матрицами, комплексными числами, рядами и полиномами. Можно задать и вывести графики различных функций – от простой синусоиды до сложной трехмерной фигуры. Перечисленные задачи не относятся к разряду сложных. Тем не менее, решать их в режиме прямых вычислений не очень удобно. Часто требуется выполнить подготовительную работу, результаты которой не должны немедленно появляться на экране, но должны быть отображены в последствии. Результирующая картина, например, таблица в командном окне не должна перемежаться командами, вводимыми с клавиатуры. Работа в командном окне в режиме прямых вычислений становится обременительной, когда необходимо выполнять повторение одно и той же вычислительной схемы с небольшой модификацией алгоритма или для различных исходных данных.

В Matlab существует возможность сохранять последовательность команд, вводимых с клавиатуры, в текстовом файле в виде программы, а затем вызывать ее в Command Window и автоматически выполнять, не нажимая на Enter после каждой команды. Такие файлы с программами в Matlab принято называть скриптами (scripts) или сценариями. Скрипт сохраняется на диске в файле с расширением m. M-файлы являются обычными текстовыми файлами, которые создаются с помощью текстового редактора. Система Matlab поддерживает специальный встроенный редактор/отладчик, хотя можно использовать и любой другой текстовый редактор с ASCII-кодами, например, Блокнот. Открыть встроенный редактор можно двумя способами: в главном окне Matlab из меню File выбрать опцию New, а затем M-File или использовать команду редактирования Еdit. В любом случае редактор работает в собственном окне (рис. 3.1).

Рис. 3.1. Окно редактора Matlab

Скрипты являются самым простым типом m-файла – у них нет входных и выходных аргументов (в каком-то смысле сценарий является аналогом главной программы алгоритмических языков). Сценарии оперируют данными из рабочей области Workspace и могут генерировать в нее новые переменные для последующей обработки в этом же файле. Данные, которые используются в сценарии, сохраняются в рабочей области и после завершения данной программы могут быть использованы для дальнейших вычислений. Несколько скриптов могут работать друг за другом, обмениваясь данными через рабочее пространство, ведь оно у них общее.

После создания сценария его надо сохранить в файле на диске. Этот файл может иметь имя, составленное по общим правилам составления идентификаторов Matlab (желательно, чтобы оно не совпало с именами файлов, входящих в стандартную поставку системы Matlab), но расширение имени должно состоять из одной буквы m (например, myScript1.m и т.п.). Сохраненный в m-файле сценарий в любой момент можно выполнить, если набрать в командном окне имя этого файла (без расширения) и нажать клавишу Enter. Запустить скрипт, текст которого открыт в окне редактора, на выполнение можно непосредственно из окна редактора, если нажать клавишу управления F5, или на панели инструментов редактора щелкнуть ЛКМ на пиктограмме Run (выполнить), она же Save and run (сохранить и выполнить). Редактирование текста сценария выполняется по общим правилам работы с текстовыми редакторами Windows.

2. Диалоговый ввод/вывод

В процессе выполнения m-файла пользователь может вывести на экран запрос и ввести соответствующую информацию с клавиатуры; сделать паузу до нажатия клавиши.

Формирование запроса для ввода данных с клавиатуры выполняется функцией input

ИмяПеременной = input(' Текст запроса ')

При выполнении данной операции присваивания в командное окно выводится сообщение Текст запроса и выполнение программы приостанавливается до тех пор, пока пользователь не введет число с клавиатуры и не нажмет на клавишу Enter.

Функция возвращает введённое с клавиатуры числовое значение и размещает его в переменной, имя которой указано слева от оператора присваивания

>> x = input('Задайте значение аргумента ')

Задайте значение аргумента 7.5

x =

7.5000

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

>> f=50;

>> w = input('Задайте частоту в рад/с ')

Задайте частоту в рад/с 2*pi*f

w =

314.1593

Можно вводить и матрицы

>> coord = input('Задайте координаты точки ')

Задайте координаты точки [2.5 -3]

coord =

2.5000 -3.0000

или

>> A = input('Задайте матрицу 4 на 4 ')

Задайте матрицу 4 на 4 [11 12; 21 22]

 

A =

11 12

21 22

Функция input может возвращать не только числовые значения, но и строковое выражение, вводимое пользователем. Для ввода строки символов в список параметров функции вторым входным аргументом необходимо указать 's'. На запрос input следует ввести строку текста, не заключая ее в апострофы. Например

>> file_name = input('Укажите имя файла: ','s')

Укажите имя файла: data.txt

file_name =

data.txt

Переменная file_name становится строкой из восьми символов.

Если в списке параметров функции input не указать 's', то строковое значение необходимо вводить в апострофах

>> symbol = input('Введите символ: ');

Введите символ: 'W'

symbol=

W

Для выдачи результата на экран используется функция disp, предназначенная для вывода значений в командное окно Matlab. С ее помощью можно выводить числовые, символьные (текст) и логические значения, задавая их константами, именами переменных или выражениями соответствующего типа. По-умолчанию функция работает только с одним входным параметром и каждый disp начинает вывод значений с новой строки. Если одним disp необходимо вывести несколько значений в одной строке, то их следует конкатенировать (сцепить) в единый вектор (подобную "хитрость" мы уже применяли при использовании функции size для работы с матрицами). Внимание: сцеплять разрешено только однотипные данные! В связи с этим полезными бывают функции преобразования типа (табл. 3.1). Имена функций преобразования построены по схеме

исходный_тип to тип_результата

(вместо to используется 2).

 

 

Таблица 3.1

Функция Описание Пример использования
num2str Преобразование числового значения в строковое >> stroka=['2+3=' num2str(2+3)] stroka = 2+3=5
str2num Преобразование строкового значения в числовое >> s=['1.5' '-2j'] >> number=str2num(str) number = 1.5000 - 2.0000i

 

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

pause

останавливает выполнение программы до тех, пока не будет нажата какая-нибудь клавиша. Чтобы реализовать паузу в n секунд, необходимо выполнить

pause(n).

 

 

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

· оператор условия if, в сочетании с оператором else и elseif выполняет группу операторов в соответствии с некоторыми логическими условиями;

· оператор переключения switch, в сочетании с операторами case и otherwise выполняет различные группы операторов в зависимости от значения некоторого логического условия;

· оператор цикла while выполняет группу операторов заранее неизвестное число раз, в соответствии с некоторым логическим условием завершения;

· оператор цикла for выполняет группу операторов заранее известное число раз.

Все операторы управления включают оператор end, чтобы указать конец блока, в котором действует этот оператор управления. Рассмотрим эти операторы более подробно.

3.1. Оператор условия if

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

Во-первых,

if условие

операторы

end

Эта форма соответствует блок-схеме, представленной на рис. 3.2, а. Оператор условия if... end вычисляет результат проверки некоторого выражения условие и выполняет или не выполняет соответствующую группу инструкций операторы в зависимости от значения этого результата. Если условие истинно, то Matlab выполнит все операторы, стоящие между if и end, а затем продолжит выполнение программы со строки после end. Если условие ложно, то Matlab пропустит все операторы между if и end и продолжит выполнение со строки после end.

 

На рис. 3.3 приведено окно редактора, в котором размещен текст программы, проверяющей, является ли значение переменной х, вводимое с клавиатуры, целым числом.

 

Рис. 3.3. Окно редактора с текстом скрипта

Скрипт сохранен в файле Simple.m на диске D в каталоге MATLAB701 в папке work. При запуске скритпа на выполнение на экран в рабочем окне Matlab будет выдано приглашение

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

Если ввести 7, то результатом работы программы будет

7 - целое число

Если же ввести 7.2, то на экран ничего не выведется.

Во-вторых, можно использовать более развернутый вариант развилки

if услови е

операторы1

else..

оператры2

end

В этой форме имеется дополнительное ветвление внутри тела оператора if (рис. 3.2, б). Оператор else не содержит условия. Последовательность инструкций операторы2, связанная с ним, выполняются, если выражение условие оператора if ложно. На основе такой формы оператора if предыдущая задача решается более красиво.

x=input('Введите число ');

if fix(x)==x

disp([num2str(x) ' - целое число'])

else

disp([num2str(x) ' - не целое число'])

end

В-третьих, самая общая конструкция развилки

if условие1

операторы1

elseif условие2

операторы2

else

операторы3

end

в которой оператор elseif содержит условие2, которое вычисляется, если предшествующее условие1 оператора if ложно. Здесь один оператор if встроен (вложен) в else ветку другого оператора if (рис. 3.2, в). Инструкции операторы2, связанные с оператором elseif, выполняются, если условие2 истинно, иначе выполняются операторы3 else ветки. В следующем фрагменте программы проверяется, является ли символ, введенный с клавиатуры, прописной или строчной латинской буквой:

sym=input('Введите символ ','s');

if sym>='A' & sym<='Z'

disp([sym ' - прописная латинская буква'])

elseif sym>='a' & sym<='z'

disp([sym ' - строчная латинская буква'])

else

disp([sym ' - не латинская буква'])

end

Примечание: поскольку sym – символьная переменная, то в disp нет необходимости в преобразовании типа конкатенируемых значений.

Оператор elseif может многократно использоваться внутри оператора условия if. Возможен вариант вложенного оператора if без последней ветки else

if условие1

операторы1

elseif условие2

операторы2

end

Какая бы из форм развилки не применялась, в любом случае область действия условного оператора начинается ключевым словом if, а заканчивается ключевым словом end. Под условием понимается произвольное выражение, истинность или ложность которого понимается как отличие от нуля или равенство нулю соответственно. Чаще всего для построения выражения условие используют операции сравнения и логические операции. Следует отметить особенности построения развилок, связанные с тотальным использованием массивов в языке программирования системы Matlab. Массивы можно использовать в выражениях, входящих в условие. В этом случае, истинность условия наступает, когда истинны (не равны нулю) все элементы массива. Если хоть один элемент такого массива будет равен нулю, то условие считается ложным. Ложность будет иметь место и при использовании пустых массивов. Приведём простейший пример, иллюстрирующий работу условного оператора с условием-массивом.

a = [ 1 2; 4 0 ];

if a

b = 1;

else

b = 2;

В результате выполнения этого фрагмента переменная b получит значение, равное 2, так как матрица a содержит один нулевой элемент, и всё условие считается ложным. Запись if a по своему действию полностью эквивалентна записи if a~=0 или записи if all(a(:)).

 

3.2. Оператор переключения

Синтаксис оператора следующий:

switch выражение

case значение1

операторы1

case значение2

операторы2

otherwise

операторы3

end

Оператор выполняет ветвления, в зависимости от значения некоторого выражения выражение. Вычисляемое выражение может быть скаляром или строкой. Количество ветвей case произвольное. Каждая ветвь состоит из слова case, за которым на одной строке следует возможное значение выражения. Последующие строки ветви содержат операторы, которые выполняются для данного значения выражения. Данная ветвь case продолжается до тех пор, пока не встретится следующий оператор case или оператор otherwise. Ветвь otherwise содержит операторы, которые выполняются, если значение выражение оказалось не обработанным ни одной из ветвей case. Блок переключателя завершается оператором end.

Пример

sym=input('введите символ ', 's');

 

switch sym

case '!'

disp(' это восклицательный знак')

case '?'

disp('это вопросительный знак')

case '.'

disp('это точка')

case ','

disp('это запятая')

otherwise

disp('это не "!", "?" не "." и не ","')

end

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

Оператор switch работает следующим образом: вычисляется выражение; полученное значение последовательно сверху вниз сравнивается со значениями ветвей case; если для какой-то j -й ветви case указанное в ней значениеj равно выражение, то выполняются операторыj; если выражение не совпало ни с одним из значениеj, то выполняются операторы otherwise-ветви. Оtherwise-ветвь переключателя может отсутствовать. Тогда при несовпадении значения выражения ни с одним из значениеj никакие специальные действия выполняться не будут. Оператор switch может использовать множественное значение в ветви case, если значение для этой ветви записано в виде массива ячеек (в фигурных скобках). Например

switch var

case 1

disp('1')

case {2, 3, 4}

disp('2 или 3 или 4')

case 5

disp('5')

otherwise

disp('не от 1 до 5')

end

3.3. Оператор цикла с определенным числом повторений

Синтаксис оператора следующий:

for ПараметрЦикла = НачЗнач: Приращение: КонЗнач

операторы

end

При работе цикла ПарметрЦикла (счетчик) пробегает все возможные значения из диапазона от НачЗнач до КонЗнач с шагом Приращение. При каждом проходе по циклу выполняются операторы, составляющие тело цикла. По умолчанию Приращение равно 1. Можно задавать любое приращение, в том числе и отрицательное. Для положительных значений выполнение цикла завершается, когда значение параметра цикла превышает КонЗнач; для отрицательных приращений выполнение завершается, когда значение становится меньше чем КонЗнач.

Пример. Числа Фибоначчи определяются формулами . Напечатать K первых чисел Фибоначчи.

K=input('Задайте количество чисел Фибоначчи ');

disp([num2str(K) ' первых чисел Фибоначчи: '])

switch K

case 1

disp(1)

case 2

disp([1; 1])

otherwise

FibPred=1;

FibTek=1;

disp([1; 1])

for n=3:K

FibSled =FibTek + FibPred;

disp(FibSled)

FibPred=FibTek;

FibTek=FibSled;

end

end

При задании значения K = 6 получим следующий результат:

 

 

6 первых чисел Фибоначчи:

Один или несколько операторов for могут быть вложены друг в друга. В качестве переменной цикла for могут использоваться и массивы.

A=[2 3;-4 5; 12 0]

S=0;

for i = A

S=S+i;

end

disp('S=')

disp(S)

Переменная цикла i определяется как вектор A(:, k). Для первого шага цикла k равно 1 (перебираются все строки первого столбца матрицы); для второго – 2, и так далее, пока k не достигнет значения n. То есть цикл выполняется столько раз, сколько столбцов в матрице A. Для каждого шага i – это вектор, содержащий один из столбцов массива A. В результате работы этой программы сформируется вектор-столбец S из трех чисел – построчных сумм элементов матрицы А

A =

2 3

-4 5

12 0

S=

3.4. Оператор цикла с неопределенным числом повторений

Синтаксис оператора

while выражение

операторы

end

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

Пример, вычислить машинную точность, т.е. погрешность операций над числами с плавающей точкой – наименьшее число, которое различает машина (машинный эпсилон). Для сравнения напечатать значение стандартной константы Matlab eps = 2-52.

e = 1;

while 1 + e ˜= 1,

e = e/2;

end;

disp(['машинный eps = ', num2str(2*e)])

disp(['стандартное значение eps = ', num2str(eps)])

Значение переменной е шаг за шагом уменьшается в два раза до тех пор, пока машина не станет воспринимать ее ненулевое значение, как ноль. В результате получим (в формате long)

машинный eps = 2.220446049250313e-016

Стандартное значение eps = 2.220446049250313e-016

 




Поделиться с друзьями:


Дата добавления: 2014-11-08; Просмотров: 937; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.105 сек.