8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 127 128 129 130 131 132 133 ... 365

уШ = x(i)/x(i + 1). Очевидно, что задача может быть решена при помощи цикла for. Но если один из элементов исходного вектора равен нулю, то при делении получится inf и последующие вычисления могут оказаться бесполезны. Предотвратить подобную ситуацию можно досрочным выходом из цикла, если текущее значение x(i) равно нулю. Следующий фрагмент программы демонстрирует использование оператора break для прерывания цикла (листинг 7.17).

.......• - • мня- •-«***«ле • •*« -.......•........................................ • — » •..........-----.- —........•- •................. ..................1

\ Листинг 7.17. Прерывание чикла оператором break

у = zeros(length(х) - 1) for i = 1:length(x) - 1

if x(i) == 0 break

end

y(i) = x(i + l)/x(i);

end

При выполнении условия x(i> == о оператор break заканчивает цикл и происходит выполнение операторов, которые расположены в строках, следующих за end. Оператор break можно использовать и с циклом while. В случае вложенных циклов break осуществляет выход из внутреннего цикла.

Примечание J

Грамотным условием проверки вещественного числа на ноль является условие малости его абсолютной величины, поскольку "величина" машинного нуля (т. е. интервал вещественных чисел эквивалентных машинному нулю) существенно больше минимального расстояния между компьютерными числами. Функция realmin дает минимальное вещественное положительное число, которое представляется в компьютере с предусмотренным количеством значащих цифр.

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

Inf.

Внутри цикла может возникнуть ситуация, при которой выполнение оставшейся части операторов не требуется, а сразу следует перейти к новому шагу цикла. В этом случае оказывается удобным оператор continue, который хоть и не является незаменимым, но позволяет обойтись без разветвленной структуры if-elseif-else, что делает текст программы более понятным.


Обработка исключительных ситуаций

Хорошо написанная программа предотвращает ошибочные действия, которые приводят к досрочному ее завершению. К немедленному прерыванию работы файл-функции приводит, например, неверный ее вызов пользователем. В приведенных выше примерах (см. листинги 7.10, 7.13—7.15) мы контролировали возможные ошибки в интерфейсе и прекращали работу файл-функции, выводя информацию о допустимом ее использовании.

Следующий источник ошибок— сам алгоритм. Часть некорректных математических операций в MATLAB, в отличие от многих языков программирования, не приводит к останову выполнения программы. При делении на ноль получается бесконечность (inf), деление нуля па ноль приводит к Ыаы, сумма бесконечности и числа имеет результатом бесконечность. Однако попытка считывания информации из несуществующего файла при помощи load, обращение к несуществующей переменной или функции, несовпадение размеров массивов в операторе присваивания обязательно прервут работу программы.

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

; Листинг 7.18. Фрагмент программы обработки данных из файла

А = load(my.dat1); pie (А)

X = [12-1 -2]; X = Х.л2

Если MATLAB обнаруживает файл my.dal в путях поиска и считывает данные из него, то фрагмент программы из листинга 7.18 работает успешно (схема поиска файлов, которую применяет MATLAB, описана в paid. "Установка путей"главы 5; работа с текстовыми файлами подробнее разбирается в главе 8).

Однако если файл найти не удалось, или при чтении из него возникли ошибки, то MATLAB выведет сообщение в командное окно и закончит выполнение программы. Выходом из подобных ситуаций является конструкция try. . .catch, позволяющая обойти исключительные ситуации, которые


Error using ==> load

Unable to read file my.dat: file does not exist.

приводят к ошибке, и предпринять некоторые действия в случае их возникновения. Схема использования try.. .catch выглядит следующим образом:

try

% операторы, выполнение которых % может привести к ошибке catch

% операторы, которые следует выполнить % при возникновении ошибки в блоке % между try и catch

end

Фрагмент программы, приведенный в листинге 7.18, лучше оформить с использованием try... catch так, как это сделано в листинге 7.19.

.-----------~............................................----------..........................................„......„,.....,„..., -------------

Листинг 7.19. Обработка ошибки при чтении данных из файла

try

А = load(my.dat); pie(А) ratch

disp{ не могу найти файл my.dat )

end

X = [1,- 2; -1; -2]; X = Х.л2

Теперь при отсутствии нужного файла my.dat программа выдаст сообщение об этом и продолжит работу:

» не могу найти файл my.dat

X =

14 14

в качестве аргумента функции disp разумно использовать функцию last err, возвращающую системное сообщение об ошибке. Замените в листинге 7.19 Строку dispCne могу найти файл my.dat) на строку

disp (lasterr) н выполните файл-программу — в командное окно выводится диагностическое сообщение о возникшей ошибке:



0 ... 127 128 129 130 131 132 133 ... 365