Оператор if / elseif / else
Если программа должна выполнять разные действия в зависимости от определенных условий, используется оператор if, который аналогичен одноименным операторам из других языков программирования. Синтаксис оператора if описывается следующим образом:
if условие 1
последовательность команд 1
elseif условие 2
последовательность команд 2
elseif условие 3
последовательность команд 3
.
.
.
else
последовательность команд N
end
Сначала проверяется на истинность условие 1, если оно окажется истинным, то будет выполняться последовательность команд 1, если условие 1 не выполняется, начинается проверка ветвей elseif. Сначала проверяется условие 2, если оно истинно, то будет выполняться последовательность команд 2, если ложно, то проверяется условие 3, если оно окажется истинным, то будет выполняться последовательность команд 3 и т. д. до последнего оператора elseif, количество которых не ограничено. Если ни одно из условий не оказалось истинным, выполняется последовательность команд после оператора else.
В этом операторе ветви elseif и else являются не обязательными и могут отсутствовать.
В качестве примера рассмотрим задачу, когда дана одномерная матрица foo, необходимо сформировать матрицу result таким образом, что i-ый элемент матрицы result должен быть равен 1, если i-й элемент матрицы foo больше 0, должен быть равен -1, если i-й элемент матрицы foo меньше 0, и должен быть равен 0, если i-й элемент матрицы foo равен 0. Скрипт для решения данной задачи может выглядеть следующим образом:
% Удалить все переменные
clear;
% Исходная матрица, в зависимости от элементов которой
% будем формировать результат
foo = [1 5 -10 0 -2 3];
% Матрица, куда будет сохранен результат (начальная инициализация нулями)
result = zeros (1, length (foo));
% Переменная index будет принимать значения от 1 до 6
% (для данного размера матрицы foo)
for index = 1:length(foo)
% Проверка каждого элемента матрицы foo на знак
if foo(index) > 0
result(index) = 1;
elseif foo (index) < 0
result(index) = -1;
else
result(index) = 0;
end
end
% Вывод исходной матрицы и результата
foo
result
Результат выполнения этого скрипта выглядит следующим образом:
foo =
1 5 -10 0 -2 3
result =
1 1 -1 0 -1 1
Строго говоря, в данном примере строка создания результирующей матрицы result = zeros (1, length (foo)); не обязательна, так как на каждой итерации во время выполнения операций присваивания (result(index) = ...) размер матрицы result будет увеличиваться таким образом, чтобы в ней существовал элемент с номером index, однако это ведет к дополнительным расходам времени на перераспределение памяти, поэтому, если известен размер результирующей матрицы, желательно ее создать заранее с нужным размером.
Так как еще до выполнения цикла for мы создали матрицу result и заполнили ее нулями (с помощью функции zeros), то ветвь else в операторе if является не обязательной, так как в случае пропуска строки result(index) = 0;, элемент с индексом index все равно окажется равным 0. Поэтому скрипт можно сократить (что нельзя было бы сделать, если бы мы пропустили начальную инициализацию матрицы result с помощью функции zeros):
% Удалить все переменные
clear;
% Исходная матрица, в зависимости от элементов которой
% будем формировать результат
foo = [1 5 -10 0 -2 3];
% Матрица, куда будет сохранен результат (начальная инициализация нулями)
result = zeros (1, length (foo));
% Переменная index будет принимать значения от 1 до 6
% (для данного размера матрицы foo)
for index = 1:length(foo)
% Проверка каждого элемента матрицы foo на знак
if foo(index) > 0
result(index) = 1;
elseif foo (index) < 0
result(index) = -1;
end
end
% Вывод исходной матрицы и результата
foo
result
Результат выполнения этого скрипта по сравнению с предыдущим не изменится.
Оператор while
Кроме оператора for для организации циклов, в MATLAB содержится также оператор while, который работает аналогично одноименным операторам в таких языках программирования как Pascal, C и др. Синтаксис оператора while выглядит следующим образом:
while условие
операторы
end
Цикл с телом, содержащим операторы, выполняется до тех пор, пока условие после ключевого слова while истинно.
Например, следующий скрипт на каждой итерации цикла просит пользователя ввести число, а затем выводит квадрат введенного числа. Если пользователь вводит пустую строку, то цикл прерывается.
clear
% Переменная, которая хранит значение, введенное пользователем
input_prev = 0;
% Пока пользователь не введет пустую строку, цикл выполняется
while ~isempty (input_prev)
% Просим пользователя ввести число
input_prev = input ('Введите число или нажмите Enter для выхода: ', ...
's');
% Преобразовываем строку, введенную пользователем, в число
number = str2double (input_prev);
% Если число преобразовано удачно, выведем квадрат этого числа
if ~isnan(number)
result_str = sprintf ('Квадрат введенного числа равен %f\n', ...
number ^ 2);
disp (result_str);
end
end
В приведенном выше примере используется функция isnan, которая возвращает 1, если в качестве аргумента ей передано значение NaN, и 0 в противном случае.
Операторы break / continue
В теле циклов for и while можно использовать такие управляющие конструкции, как break и continue.
Оператор break прерывает выполнение цикла.
Оператор continue прерывает выполнение текущей итерации цикла и указывает интерпретатору перейти к следующей итерации.
Перепишем пример из предыдущего размера таким образом, чтобы в нем использовались операторы break и continue.
% Демонстрация операторов break и continue
clear
% "Бесконечный" цикл, который будет прерываться с помощью оператора break
while 1
% Просим пользователя ввести число
user_input = input ('Введите число или нажмите Enter для выхода: ', ...
's');
% Если пользователь ввел пустую строку, завершаем цикл
if isempty (user_input)
break
end
% Преобразовываем строку, введенную пользователем, в число
number = str2double (user_input);
% Если пользователь ввел число с ошибкой, проигнорируем ввод
if isnan(number)
continue
end
% Выведем квадрат этого числа
result_str = sprintf ('Квадрат введенного числа равен %f\n', ...
number ^ 2);
disp (result_str);
end
Результат выполнения этого скрипта может выглядеть следующим образом:
Введите число или нажмите Enter для выхода: 4
Квадрат введенного числа равен 16.000000
Введите число или нажмите Enter для выхода: 2.5
Квадрат введенного числа равен 6.250000
Введите число или нажмите Enter для выхода: абырвалг
Введите число или нажмите Enter для выхода: 16
Квадрат введенного числа равен 256.000000
Введите число или нажмите Enter для выхода:
>>
В этом примере используется прием, который называется «бесконечный цикл». Дело в том, что условие оператора while всегда истинно (не равно 0), поэтому, если этот цикл не прервать изнутри оператором break, то он никогда не завершится. Такой прием нужно использовать с осторожностью, так как в данном случае из объявления цикла не видно, при каких условиях он выполняется, и для понимания этого нужно прочитать все тело цикла.
Аналогично операторы break и continue работают внутри оператора for.
Оператор switch
Оператор switch можно рассматривать, как более удобный вариант if / elseif / else для множественного выбора.
Синтаксис оператора switch выглядит следующим образом:
switch выражение
case значение_1
операторы_1
case значение_2
операторы_2
...
otherwise
операторы_N
end
Оператор switch работает следующим образом: значение выражения после ключевого слова switch последовательно сравнивается со значениями, перечисленными после операторов case. Если какое-то из значений после ключевого слова case совпадает со значением выражения после ключевого слова switch, то выполняются соответствующие операторы. Если значение выражения после ключевого слова switch не совпадает ни с одним из значений после ключевого слова case, то выполняются операторы после ключевого слова otherwise. Ветвь otherwise является не обязательной.
Следующий скрипт запрашивает у пользователя число, а затем спрашивает, что с этим числом делать и в зависимости от выбора пользователя, производит соответствующее действие над введенным числом.
% Демонстрация оператора switch
clear
% "Бесконечный" цикл, который будет прерываться с помощью оператора break
while 1
% Просим пользователя ввести число
user_input = input ('Введите число или нажмите Enter для выхода: ', ...
's');
% Если пользователь ввел пустую строку, завершаем цикл
if isempty (user_input)
break
end
% Преобразовываем введенную строку в число
user_number = str2double (user_input);
% Если пользователь ввел не число, запрашиваем ввод еще раз
if isnan (user_number)
continue
end
% Пункты меню для отображения
menu = ['Выберите действие: \n', ...
'1 - Возведение в квадрат\n', ...
'2 - Умножение на -1\n', ...
'3 - Взятие обратной величины\n', ...
'0 - Выход\n', ...
': '];
% Выводим меню и ожидаем ввод пользователя
user_action = input (menu, 's');
% Получаем результат в зависимости от выбора пользователя
switch user_action
case '0'
break
case '1'
result_str = sprintf ('Квадрат введенного числа равен %e\n', ...
user_number ^ 2);
case '2'
result_str = sprintf ('Результат умножения на -1 равен %e\n', ...
user_number * -1);
case '3'
result_str = sprintf ('Обратная величина равна %e\n', ...
1.0 / user_number);
otherwise
continue
end
% Вывод результата
disp (result_str);
end
Пример работы данного скрипта может выглядеть следующим образом:
Введите число или нажмите Enter для выхода: 1.23
Выберите действие:
1 - Возведение в квадрат
2 - Умножение на -1
3 - Взятие обратной величины
0 - Выход
: 1
Квадрат введенного числа равен 1.512900e+000
Введите число или нажмите Enter для выхода: -2
Выберите действие:
1 - Возведение в квадрат
2 - Умножение на -1
3 - Взятие обратной величины
0 - Выход
: 2
Результат умножения на -1 равен 2.000000e+000
Введите число или нажмите Enter для выхода: 5.2
Выберите действие:
1 - Возведение в квадрат
2 - Умножение на -1
3 - Взятие обратной величины
0 - Выход
: 3
Обратная величина равна 1.923077e-001
Введите число или нажмите Enter для выхода: qwerty
Введите число или нажмите Enter для выхода: 123
Выберите действие:
1 - Возведение в квадрат
2 - Умножение на -1
3 - Взятие обратной величины
0 - Выход
: 0
Создание функций
До сих пор в примерах использовались только стандартные функции, такие как sin, plot, input и т. п., но язык MATLAB позволяет создавать собственные функции, которые с точки зрения их использования ничем не отличаются от стандартных.
Функции используются для структурирования программы и выделения участков кода, которые могут быть использованы повторно. Также благодаря выделению части кода в функции повышается читаемость программы.
Каждая функция, создаваемая пользователем, должна располагаться в отдельном файле с именем, совпадающим с именем функции и с расширением .m. Первая строка файла должна описывать синтаксис новой функции. Затем могут располагаться необязательные комментарии, описывающие созданную функцию.
Для примера создадим функцию для расчета факториала числа. Так как в MATLAB уже есть функция factorial, поэтому новая функция будет называться myfactorial. В реальных, не демонстрационных, программах по возможности нужно пользоваться стандартными функциями. Чтобы создать функцию myfactorial, нужно создать файл myfactorial.m со следующим содержимым:
function result = myfactorial (n)
%myfactorial Функция возвращает факториал числа n
% В реальных программах лучше использовать встроенную функцию factorial,
% myfactorial сделан для демонстрации создания функций
result = 1;
for index = 2:n
result = result * index;
end
end
Строго говоря, функцию myfactorial можно записать более компактно, используя встроенную функцию prod, перемножающую элементы матрицы, но для демонстрации расчет факториала расписан по шагам.
В первой строке файла с функцией описывается синтаксис функции myfactorial. Здесь function – ключевое слово, обозначающее, что далее будет идти описание функции. Слева от знака «=» располагается одно или несколько значений, которые возвращает функция. В данном случае функция возвращает только одно значение (переменная с именем result), если же функция возвращает несколько значений, то они должны быть перечислены в виде матрицы, что будет продемонстрировано ниже.
Функция myfactorial принимает один параметр n (подразумевается, что n – целое число, для упрощения в тексте функции не будем проверять это предположение).
Для того чтобы скрипты могли использовать новую функцию, файл myfactorial.m должен располагаться в той же папке, что и скрипт, который будет вызывать эту функцию. Теперь мы можем создать отдельный файл скрипта (например, файл test_myfactorial.m), который будет использовать функцию myfactorial. При этом важно, чтобы в качестве рабочей папки (рабочей директории) была установлена папка со скриптами test_myfactorial.m и myfactorial.m. Например, содержимое этого файла может быть следующим (скрипт выводит факториал чисел от 0 до 10):
clear;
for number=0:10
current_str = sprintf ('Факториал числа %d равен %d', ...
number, myfactorial (number) );
disp (current_str);
end
Результат работы этого скрипта выглядит следующим образом (результат будет выведен в окно «Command Window»):
Факториал числа 0 равен 1
Факториал числа 1 равен 1
Факториал числа 2 равен 2
Факториал числа 3 равен 6
Факториал числа 4 равен 24
Факториал числа 5 равен 120
Факториал числа 6 равен 720
Факториал числа 7 равен 5040
Факториал числа 8 равен 40320
Факториал числа 9 равен 362880
Факториал числа 10 равен 3628800
Функции могут не принимать никакие параметры, а также не возвращать значений. Если функция не принимает параметров, то после имени создаваемой функции можно ничего не указывать или указывать пустые скобки. Если функция не возвращает значений, то в объявлении функции имя функции следует сразу за ключевым словом function. В качестве примера приведем функцию square_10, которая выводит квадраты чисел от 0 до 10.
function square_10
for number = 0: 10
current_str = sprintf ('Квадрат числа %d равен %d', ...
number, number ^ 2);
disp (current_str);
end
end
Если вызвать эту функцию с помощью команды square_10 или square_10, то в окно «Command Window» будут выведены следующие строки:
>> square_10
Квадрат числа 0 равен 0
Квадрат числа 1 равен 1
Квадрат числа 2 равен 4
Квадрат числа 3 равен 9
Квадрат числа 4 равен 16
Квадрат числа 5 равен 25
Квадрат числа 6 равен 36
Квадрат числа 7 равен 49
Квадрат числа 8 равен 64
Квадрат числа 9 равен 81
Квадрат числа 10 равен 100
Функция может возвращать несколько значений, в этом случае синтаксис объявления функции выглядит следующим образом:
function [result1, result2, ...] = myfunction (param1, param2, ...)
...
end
Кроме того, в MATLAB есть возможность создавать функции, которые принимают не фиксированное число параметров (как, например, функции printf и fprintf), но этот аспект в данном пособии не рассматривается.
Раздел 2. Краткие теоретические сведения и задания
Тема 1. Векторный анализ
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2025 stydopedia.ru Все материалы защищены законодательством РФ.
|