Основные операторы m-языка
Помимо программ с линейной структурой, инструкции которых исполняются строго по порядку, существует множество программ, структура которых нелинейна. При этом ветви программ могут выполняться в зависимости от определенных условий, иногда с конечным числом повторений - циклов, иногда в виде циклов, завершаемых при выполнении заданного условия. Практически любая серьезная программа имеет нелинейную структуру. Для создания таких программ необходимы специальные управляющие структуры. Они имеются в любом языке программирования, и в частности в MatLab.
Операторы ввода/вывода.Приведем простой пример диалоговой программы.
Пример_3_4_11 |
% Вычисление длины окружности с диалоговым вводом радиуса r=0; while r>=0, r=input('Введите радиус окружности r='); if r>=0 disp(' Длинаокружности l='); disp(2*pi*r), end end |
Эта программа служит для многократного вычисления длины окружности по вводимому пользователем значению радиуса r. Обратите внимание на то, что здесь мы впервые показываем пример организации простейшего диалога. Он реализован с помощью команды input:
input(`'Введите радиус окружности r=');
При выполнении этой команды вначале выводится запрос в виде строки, затем происходит остановка работы программы и ожидается ввод значения радиуса r (в общем случае числа). Ввод, как обычно, подтверждается нажатием клавиши <Enter>, после чего введенное число присваивается переменной r. Следующая строка
if r>=0 disp(' Длина окружности l = '); disp(2*pi*r);end
с помощью команды disp при r>=0 выводит надпись «Длина окружности 1=» и вычисленное значение длины окружности. Она представляет собой одну из наиболее простых управляющих структур типа if...end. В данном случае она нужна для остановки вычислений, если вводится отрицательное значение г (прием, который любят начинающие программисты).
Приведенные строки включены в управляющую структуру while...end. Это необходимо для циклического повторения вычислений с вводом значений r. Пока r>=0. цикл повторяется. Но стоит задать r<0, вычисление длины окружности перестает выполняться, а цикл завершается.
Если данная программа записана в виде m-файлаПример_3_4_1, то работа с ней будет выглядеть следующим образом:
Пример3.4-11 |
Введите радиус окружности R=1 Длина окружности l= 6.2832 Введите радиус окружности R=2 Длина окружности l= 12.5664 Введите радиус окружности R=-1 » |
Функция inputможет использоваться и для ввода произвольных строковых выражений. При этом она задается в следующем виде:
input('Комментарий', V)
При выполнении этой функции она останавливает вычисления и ожидает ввода строкового комментария. После ввода возвращается набранная строка. Это иллюстрирует следующий пример:
Пример3.4-12 |
» S=input('Введите выражение ','s') Введите выражение (Вводим) 2*sin(l) S = 2*sin(l) » eval(S) ans = 1.6829 >> |
Обратите внимание на то, что функция eval позволяет вычислить выражение, заданное в символьном виде.
Условный оператор.Условный оператор ifв общем виде записывается следующим образом:
ifУсловие1
Инструкции_1
еlselfУсловие2
Инструкции_2
Else
Инструкции_3
Еnd
Эта конструкция допускает несколько частных вариантов. В простейшем
ifУсловие
Инструкции
End
Пока Условиевозвращает логическое значение 1 (то есть «истина»), выполняются Инструкции, составляющие тело структуры if...end. При этом оператор end указывает на конец перечня инструкций. Инструкции в списке разделяются оператором, (запятая) или ; (точка с запятой). Если Условиене выполняется (дает логическое значение 0, «ложь»), то Инструкции также не выполняются.
Еще одна конструкция
ifУсловие
Инструкции_1
Else
Инструкции_2
End
выполняет Инструкции_1, если выполняется Условие, или Инструкции_2 в противном случае.
Условия записываются в виде:
Выражение_1 Оператор_отношения Выражение_2,
причем в качестве Операторов_отношения используются следующие операторы: ==, <, >, <=, >= или ~=.
Оператор цикла –for...end.Оператор цикла типа for...end обычно используются для организации вычислений с заданным числом повторяющихся циклов. Конструкция такого цикла имеет следующий вид:
forvаг=s:d:e
Инструкция
….
Инструкция
End
где s— начальное значение переменной цикла var, d— приращение этой переменной и е- конечное значение управляющей переменной, при достижении которого цикл завершается. Возможна и запись в виде s:е (в этом случае d=l). Список выполняемых в цикле инструкций завершается оператором end.
Следующие примеры поясняют применение цикла для получения квадратов значений переменной цикла:
Пример3.4. -13 |
» 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 может использоваться для досрочного прерывания выполнения цикла. Как только он встречается в программе, цикл прерывается. Возможны вложенные циклы, например:
Пример_3_4_14 |
% for i=1:3 for j=l:3 A(i.j)=i+j; end end |
В результате выполнения этого цикла (файл Пример_3_5_4.m) формируется матрицаА:
Пример3.4-14 |
>> Пример4-3-12 %%% >>А А = 2 3 4 3 4 5 4 5 6 >> |
Следует отметить, что формирование матриц с помощью оператора: (двоеточие) обычно занимает намного меньше времени, чем с помощью цикла. Однако применение цикла нередко оказывается более наглядным и понятным. MatLab допускает использование в качестве переменной цикла массиваА размера тхп. При этом цикл выполняется столько раз, сколько столбцов в массиве А, и на каждом шаге переменная varпредставляет собой вектор, соответствующий текущему столбцу массива А:
Пример3.4-15 |
» А=[1 2 3:4 5 6] А = 1 2 3 4 5 6 » for var=A; var, end var = 1 4 var = 2 5 var= 3 6 >> |
Оператор цикла - while...end.Оператор цикл типа while выполняется до тех пор, пока выполняется Условие:
whileУсловие
Инструкции
End
Пример_3_4_16 |
% % x=[-1:0.01:1]; y=exp(x); plot(x,y) gridon title('Экспоненциальная функция') |
Пример 3_4_16 |
%При вызове quadeq из командной строки используйте квадратные скобки для указания %переменных, в которые будут занесены значения корней: >> [r1,r2]=quadeq(1,3,2) r1 = -1 r2 = -2 >> |
Досрочное завершение циклов реализуется с помощью операторов break или continue.
Оператор множественного выбора - switch.Для осуществления множественного выбора (или ветвления) используется конструкция с переключателем типа switch:
switchswitch_Bыражение
caseсаsе_Выражение
Список_инструкций
case {саsе_Выражение1,
саsе_выражение2, саsе_ВыражениеЗ....}
Список_инструкций
otherwise.Список_инструкцийend
Если выражение после заголовка switch имеет значение одного из выражений саsе_Выражение..., то выполняется блок операторов case, в противном случае — список инструкций после оператора otherwise. При выполнении блока case исполняются те списки инструкций, для которых саsе_Выражение совпадает со switch_Bыpaжением. Обратите внимание на то, что саsе_Выражение может быть числом, константой, переменной, вектором ячеек или даже строчной переменной. В последнем случае оператор case истинен, если функция strcmp(значение, выражение) возвращает логическое значение «истинa».
Поясним применение оператора switchна примере m-файлаПример_3_4_5_7.m:
Пример_3_4-17 |
%Пример 5-3.4-7 switchvan case {1,2,3} disp('Первыйквартал') case {4,5,6} disp('Второйквартал') case {7,8,9} disp('Третий квартал') case {10.11,12} disp('Четвертый квартал') otherwise disp('Ошибкавзадании') end |
Эта программа в ответ на значения переменной van– номера месяца – вычисляет, к какому кварталу относится заданный месяц, и выводит соответствующее сообщение:
Пример3.4-17 |
>>var=2; swl Первый квартал >>var=4;swl Второй квартал >>var=7:swl Третий квартал >>var=12;swl Четвертый квартал >var=-l;swl Ошибка в задании >> |
Для остановки программы используется оператор pause. Он используется в следующих формах:
· pause— останавливает вычисления до нажатия любой клавиши;
· pause(N) — останавливает вычисления на N секунд;
· pauseon— включает режим отработки пауз;
· pauseoff — выключает режим отработки пауз.
Следующий пример поясняет применение команды pause:
Пример_3_4-18 |
%Пример 5.3.4-9 fori=1:20; х =rand(1,40); у =rand(1,40); z = sin(x.*y); tri = delaunay(x.y); trisurf(tri,x,y,z) pause; end |
Команда pause обеспечивает показ 20 рисунков - построений трехмерных поверхностей из треугольных окрашенных областей со случайными параметрами.