Самоучитель Matlab
Рис. 3.32. Команды с вызовом функции, содержащей обработку исключительной ситуации
Вот эти команды (жирным шрифтом выделены вводимые пользователем команды):
>>x=-4*pi:0.01:4*pi;
>>y=(1-cos(x))./x;
>>z=0:0.02:4*pi;
>>ShowPlot(x,y)
Выполнение функции завершено! >> ShowPlot(z,y)
Неверно указаны аргументы функции! Выполнение функции завершено!
Первыми тремя командами создаются массивы x, y и z. Массив y создается на основе массива x, и оба они имеют одинаковые размеры, чего не скажешь о массиве z. Поэтому если график функции строится с помощью команды ShowPlot(x,y), результатом является график функции (рис. 3.33).
После создания графика в командном окне выводится сообщение о завершении выполнения функции. Если же попытаться выполнить команду ShowPlot(z,y), возникнет ошибка, поскольку исходные массивы (аргументы функции) имеют разные размеры. В этом случае при вычислении функции ShowPlot() выполняется catch-блок, в результате чего появляется сообщение о неверно указанных аргументах функции. При этом код функции продолжает выполняться, то есть экстренного завершения не происходит. Это важно, и именно это является главной целью всего процесса обработки исключительных ситуаций (ошибок).
Рассмотренная ситуация достаточно проста в том смысле, что можно практически безошибочно предугадать, какого типа ошибка может возникнуть при вычислении функции. На практике это не всегда так и бывает важно знать, что именно, какая причина, лежит в основе исключительной ситуации. Достоверную информацию о произошедшей ошибке содержит объект исключения, который уже упоминался выше. Ниже приведен несколько
136
Глава 3. Элементы программирования
Рис. 3.33. Результат выполнения функции, если ее аргументы указаны корректно
модифицированный программный код функции, которой строится график. В частности, в блоке catch используется объектная переменная ME, которая обозначает создаваемый при возникновении ошибки объект.
function ShowPlot2(x,y) try plot(x,y,'LineWidth',2) grid on
catch ME disp(ME.message)
disp('Неверно указаны аргументы функции!') end
disp('Выполнение функции завершено!') end
На заметку
Объекты и классы – основа концепции любого объектно-ориентированного языка программирования. По большему счету класс – это специальный шаблон, который определяет способ группировки данных и функций для их обработки. Данные называются свойствами класса, а функции – методами класса. Класс – это абстракция. Хорошая аналогия для класса – чертеж автомобиля, например. По этому чертежу можно сделать один автомобиль, два, три и т.д. У каждого автомобиля есть один и тот же набор свойств, как, например, цвет или тип обшивки. Значение
137
Самоучитель Matlab
На заметку
этих свойств у разных автомобилей разное, но набор свойств один и тот же. У автомобилей есть "методы": они могут ехать, сигналить, светить фарами. Если чертеж – это класс, то автомобиль, созданный по чертежу, – экземпляр класса, или объект.
Использованная в приведенном выше коде переменная ME обозначает объект класса MException, то есть объект ошибки. У этого класса, кроме прочего, имеется свойство message, которое содержит текстовое описание произошедшей ошибки. Другими словами, у каждого объекта класса MException есть свойство message, но значение этого поля для каждого объекта разное и зависит от типа возникшей ошибки. Этим свойством мы и воспользовались для вывода информации о том, что же произошло. В частности, чтобы узнать значение свойства message объекта ME, необходимо указать имя объекта (объектной переменой) и, через точку, название свойства, то есть ME.message. Именно эта инструкция указана аргументом функции disp(). На рис. 3.34 показано окно с кодом функции с измененным кодом обработки исключительной ситуации.
Рис. 3.34. Код функции содержит обработку исключительной ситуации с явным обращением к объекту исключения
Результат обработки исключительной ситуации проиллюстрирован на рис. 3.35.
Рис. 3.35. Результат обработки исключительной ситуации
138
Глава 3. Элементы программирования
При попытке выполнить команду ShowPlot2(z,y) в командном окне отображаются три сообщения:
Vectors must be the same lengths. Неверно указаны аргументы функции! Выполнение функции завершено!
Первое из трех сообщений, на английском языке, является следствием выполнения команды ME.message. Оно подтверждает первоначальное предположение о том, что причина ошибки в несоответствии размеров исходных массивов – аргументов функции.
Функции с переменным числом аргументов
Какое глубокое проникновение в суть вещей! Впрочем, принц всегда тонко анализировал самую сложную ситуацию.
К/ф "Клуб самоубийц, или Приключения титулованной особы"
В Matlab существует простой и элегантный способ создания функций, принимающих произвольное количество аргументов. Необходимость в таких функциях на практике достаточно велика. В качестве примера рассмотрим следующую ситуацию. Представим, что необходимо создать функцию пользователя, которая позволяет строить в одном графическом окне графики сразу нескольких функций. Первым аргументом функции передается массив базовых точек для аргумента функций, а каждый следующий аргумент – массив значений функции в базовых точках. Таким образом, количество отображаемых графиков на единицу меньше количества аргументов. Проблема в том, что количество аргументов может меняться от вызова к вызову.
При описании функций с переменным количеством аргументов используется переменная varargin. Далее приведен код функции, в котором использована эта переменная:
function MyPlots(varargin) n=length(varargin);
if n<2
disp('Недостаточное количество аргументов!') else
x=varargin{1};
y=varargin{2};
plot(x,y,'LineWidth',1,'Color','red') grid on
hold on
139
Самоучитель Matlab
colors=['b' 'g' 'r']; for i=3:n y=varargin{i};
plot(x,y,'LineWidth',1+mod(i,2),'Color',colors(mod(i,3)+1)) end
hold off end
end
Переменная varargin указана единственным аргументом функции MyPlots. Первой командой n=length(varargin) в теле функции вычисляется количество аргументов, переданных функции. Это значение записывается в переменную n. Далее с помощью условного оператора проверяется ситуация, когда количество аргументов меньше двух: в этом случае выводится сообщение о том, что функции передано недостаточное количество аргументов. В противном случае выполняютсякоманды,предназначенныедлясозданияграфики.Первыйграфик создается, что называется, в явном виде. Для этого командами x=varargin{1} и y=varargin{2} из списка аргументов varargin считываются первый и второй массивы и записываются соответственно в переменные x и y. Обращаем внимание читателя, что индексация элементов в данном случае выполняется с помощью фигурных скобок. Дело в том, что переменная varargin представляет собой массив ячеек. Массивы ячеек предназначены для хранения элементов разного типа. Доступ к элементам таких массивов осуществляется с помощью фигурных скобок: после имени массива ячеек в фигурных скобках указывается номер элемента (ячейки). Именно такой подход использован в данном случае. Так, первый элемент переменной-массива varargin возвращается инструкцией varargin{1}, второй – инструкцией varargin{2}, и так далее.
На заметку
Некоторую полезную информацию о массивах ячеек читатель может найти в Приложении Б.
Командой plot(x,y,'LineWidth',1,'Color','red') создается первый график. Координатная сетка устанавливается командой grid on. Чтобы следующий график отображался в том же графическом окне, используем команду hold on. Кроме этого, командой colors=['b' 'g' 'r'] создается массив из трех элементов с буквенными значениями (буквы заключаются в одинарные кавычки) для последующего использования в качестве идентификаторов цвета кривых для разных графиков.
Все прочие графики создаются в теле оператора цикла, в котором индексная переменная i пробегает значения от 3 до n (с шагом единица по умолчанию). Командой y=varargin{i} считывается массив значений функции для очередногографика,асамграфиксоздаетсякомандойplot(x,y,'LineWidth',
140