Сделай Сам Свою Работу на 5

Оператор 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- 2019 stydopedia.ru Все материалы защищены законодательством РФ.