Помимо программ с линейной структурой, инструкции которых исполняются строго по порядку, существует множество программ, структура которых нелинейна. При этом ветви программ могут выполняться в зависимости от определенных условий, иногда с конечным числом повторений — циклов, иногда в виде циклов, завершаемых при выполнении заданного условия. Практически любая серьезная программа имеет нелинейную структуру. Для создания таких программ необходимы специальные управляющие структуры. Они имеются в любом языке программирования, и в частности в MATLAB.
Диалоговый ввод
Приведем простой пример диалоговой программы, которую легко поймут приверженцы доброго старого Бейсика:
% Вычисление длины окружности с диалоговым вводом радиуса
r=0;
while r>=0,
r=input('Введите радиус окружностиr=');
if r>=0 disp(' Длина окружности l='); disp(2*pi*r), end
end
Эта программа служит для многократного вычисления длины окружности по вводимому пользователем значению радиуса г. Обратите внимание на то, что здесь мы впервые показываем пример организации простейшего диалога. Он реализован с помощью команды input: MnputCВведите радиус окружности r='):
При выполнении этой команды вначале выводится запрос в виде строки, затем происходит остановка работы программы и ожидается ввод значения радиуса г (в общем случае числа). Ввод, как обычно, подтверждается нажатием клавиши Enter, после чего введенное число присваивается переменной г. Следующая строка
if r>=0 disp(' Длина окружности l = '); disp(2*pi*r);end
с помощью команды disp при r>=0 выводит надпись «Длина окружности 1=» и вычисленное значение длины окружности. Она представляет собой одну из наиболее простых управляющих структур типа if...end. В данном случае она нужна для остановки вычислений, если вводится отрицательное значение г (прием, который любят начинающие программисты).
Приведенные строки включены в управляющую структуру while...end. Это необходимо для циклического повторения вычислений с вводом значений r. Пока r>=0. цикл повторяется. Но стоит задать r<0, вычисление длины окружности перестает выполняться, а цикл завершается.
Если данная программа записана в виде m-файла circ.m, то работа с ней будет выглядеть следующим образом:
» circ
Введите радиус окружности R=1
Длина окружности l=
6.2832
Введите радиус окружности R=2
Длина окружности l=
12.5664
Введите радиус окружности R=-1
»
Итак, на примере даже простой программы мы видим пользу применения управляющих структур типа if...end и whi1e...end, а также функций диалогового ввода input('String') и вывода disp. Обратите внимание на завершение работы программы при вводе любого отрицательного числа для радиуса окружности.
Функция Input может использоваться и для ввода произвольных строковых выражений. При этом она задается в следующем виде:
input('Комментарий'. V)
При выполнении этой функции она останавливает вычисления и ожидает ввода строкового комментария. После ввода возвращается набранная строка. Это иллюстрирует следующий пример:
» S=input('Введите выражение ','s') Введите выражение (Вводим) 2*sin(l)
S =
2*sin(l)
» eval(S)
ans =
1.6829
Обратите внимание на то, что функция eval позволяет вычислить выражение, заданное (полученное от функции input) в символьном виде. Вообще говоря, возможность ввода любого символьного выражения в сочетании с присущими языку программирования MATLAB управляющими структурами открывает путь к созданию диалоговых программ любой сложности [ Нужно проявлять большую осторожность при применении eval и input, так как программы с их с использованием не всегда возможно компилировать. Впрочем, р-коды таких программ можно использовать с сервером run-time. — Примеч. ред. ].
Условный оператор
Условный оператор if в общем виде записывается следующим образом:
if Условие
Инструкции_1
elself Условие
Инструкции_2
else
Инструкции_3
end
Эта конструкция допускает несколько частных вариантов. В простейшем, типа! f...end: if Условие Инструкции end
Пока Условие возвращает логическое значение 1 (то есть «истина»), выполняются Инструкции, составляющие тело структуры if...end. При этом оператор end указывает на конец перечня инструкций. Инструкции в списке разделяются оператором , (запятая) или ; (точка с запятой). Если Условие не выполняется (дает логическое значение 0, «ложь»), то Инструкции также не выполняются.
Еще одна конструкция
if Условие
Инструкции_1
else
Инструкции_2
end
выполняет Инструкции_1, если выполняется Условие, или Инструкции_2 в противном случае.
Условия записываются в виде:
Выражение_1 Оператор_отношения Выражение_2,
причем в качестве Операторов_отношения используются следующие операторы: ==, <, >, <=, >= или ~=. Все эти операторы представляют собой пары символов без пробелов между ними.
Мы уже неоднократно показывали применение этой общеизвестной управляющей структуры в программных модулях. Читателю предлагается опробовать собственные варианты программ с условным оператором.
Циклы типа for...end
Циклы типа for...end обычно используются для организации вычислений с заданным числом повторяющихся циклов. Конструкция такого цикла имеет следующий вид:
for vаг=Выражение. Инструкция. .... Инструкция end
Выражение чаще всего записывается в виде s:d:e, где s — начальное значение переменной цикла var, d — приращение этой переменной и е — конечное значение управляющей переменной, при достижении которого цикл завершается. Возможна и запись в виде s :е (в этом случае d=l). Список выполняемых в цикле инструкций завершается оператором end.
Следующие примеры поясняют применение цикла для получения квадратов значений переменной цикла:
» for 1=1:5 i^2. end;
ans =
ans =
ans =
ans =
ans =
» for x=0:.25:1 Х ^ 2, end:
ans =
ans =
0.0625
ans =
0.2500
ans =
0.5625
ans =
Оператор continue передает управление в следующую итерацию цикла, пропуская операторы, которые записаны за ним, причем во вложенном цикле он передает управление на следующую итерацию основного цикла. Оператор break может использоваться для досрочного прерывания выполнения цикла. Как только он встречается в программе, цикл прерывается. Возможны вложенные циклы, например:
for i=1:3
for j=l:3
A(1.j)=i+j;
end
end
В результате выполнения этого цикла (файл for2.m) формируется матрица А:
» for2
» А
А =
2 3 4
3 4 5
4 5 6
»
Следует отметить, что формирование матриц с помощью оператора : (двоеточие) обычно занимает намного меньше времени, чем с помощью цикла. Однако применение цикла нередко оказывается более наглядным и понятным. MATLAB допускает использование в качестве переменной цикла массива А размера тхп. При этом цикл выполняется столько раз, сколько столбцов в массиве А, и на каждом шаге переменная var представляет собой вектор, соответствующий текущему столбцу массива А:
» А=[1 2 3:4 5 6]
А =
1 2 3
4 5 6
» for var=A; var, end
var =
var =
var=
Циклы типа while...end
Цикл типа while выполняется до тех пор, пока выполняется Условие:
while Условие Инструкции end
Пример применения цикла while уже приводился. Досрочное завершение циклов реализуется с помощью операторов break или continue.
Конструкция переключателя
Для осуществления множественного выбора (или ветвления) используется конструкция с переключателем типа switch:
switch switch_Bыражение
case саsе_Выражение
Список_инструкций
case {саsе_Выражение1, Саsе_выражение2, саsе_ВыражениеЗ....}
Список_инструкций
otherwise. Список_инструкций end
Если выражение после заголовка switch имеет значение одного из выражений са5е_Выражение..., то выполняется блок операторов case, в противном случае — список инструкций после оператора otherwise. При выполнении блока case исполняются те списки инструкций, для которых сазе_Выражение совпадает со switch_Bbipa-жением. Обратите внимание на то, что сазе_Выражение может быть числом, константой, переменной, вектором ячеек или даже строчной переменной. В последнем случае оператор case истинен, если функция strcmp (значение, выражение) возвращает логическое значение «истине».
Поясним применение оператора switch на примере m-файла swl.m:
switch van
case {1,2,3}
dispCПервый квартал')
case {4,5,6}
disp('Второй квартал')
case {7,8,9}
d.isp( 'Третий квартал')
case {10.11,12}
dispC Четвертый квартал')
otherwise
disp('Ошибка в задании')
end
Эта программа в ответ на значения переменной van — номера месяца — вычисляет, к какому кварталу относится заданный месяц, и выводит соответствующее сообщение:
» var=2;
» swl
Первый квартал
» var=4;swl
Второй квартал
» var=7:swl
Третий квартал
» var=12;swl
Четвертый квартал
» var=-l;swl
Ошибка в задании
Конструкция try...catch...end
В MATLAB 6 введена новая конструкция блока вывода ошибок try...catch...end:
try.
Список инструкций
Список инструкций catch.
Список инструкций
...
Список инструкций
end
Эта конструкция выполняет все списки инструкций. Если в каком-то списке до оператора catch появляется ошибка, то выводится сообщение об ошибке, но системная переменная последней ошибки lasterr не меняется. В сообщениях после catch сообщения об ошибке не выводятся.
В следующем примере задано появление ошибки (переменная ааа не определена), после чего выполняется блок try...catch...end:
ааа
??? Undefined function or variable 'ааа'.
try
2+3:
3+4:
2/0: catch
4+5: end:
Warning: Divide by zero.
»lasterr ans = Undefined function or variable 'aaa'.
Обратите внимание, что в конце блока команда lasterr выводит ее начальное значение. А в другом примере ошибка задана в блоке try...catch...end уже после оператора catch:
» try
2+3:
3+4;
4+5: catch
5/0:
end:
» lasterr
ans = Undefined function or variable 'aaa'.
Как нетрудно заметить, на этот раз ошибка в вычислении 5/0 не выводится, а значение lasterr осталось тем, что было изначально.
Создание паузы в вычислениях
Для остановки программы используется оператор pause. Он используется в следующих формах:
· pause — останавливает вычисления до нажатия любой клавиши;
· pause(N) — останавливает вычисления на N секунд;
· pause on — включает режим отработки пауз;
· pause off — выключает режим отработки пауз.
Следующий пример поясняет применение команды pause:
for i=1:20;
х =rand(1,40);
у =rand(1,40);
z = sin(x.*y);
tri = delaunay(x.y);
trisurf(tri,x,y,z)
paused);
end
Команда paused) здесь обеспечивает показ 20 рисунков — построений трехмерных поверхностей из треугольных окрашенных областей со случайными параметрами.