Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Управляющие структуры if, for, while, switch



 

До сих пор наши программы, как сценарии, так и функции представляли собой последовательно, одна за другой выполняющиеся инструкции. И в жизни, и в программировании постоянно возникают ситуации, когда приходится корректировать свои действия в зависимости от тех или иных событий и их результатов. Так, если, сев в троллейбус, вы обнаружите в нем кондуктора, за проезд придется заплатить, если нет – можно проехать зайцем (пример устарел, по крайней мере для Москвы). В последнем случае опять возникают различные альтернативы: появится контролер или нет, кто из вас сильнее и т.п.

Но вернемся к нашим программам. Попробуем составить программу решения квадратного уравнения . С первой попытки у меня получился такой М-файл

 

% Решение квадратного уравнения

function res = sqeq(a,b,c)

d = b^2 - 4*a*c;

res(1) = (-b-sqrt(d))/(2*a);

res(2) = (-b+sqrt(d))/(2*a);

 

Пробую решить с помощью этой программы уравнение .

 

>> sqeq(1,-3,2)

ans =

1 2

 

Правильно? Вроде бы да. Но давайте теперь попробуем решить другое уравнение:

 

>> sqeq(0,2,4)

Warning: Divide by zero.

> In sqeq at 4

Warning: Divide by zero.

> In sqeq at 5

ans =

-Inf NaN

 

Что же получается? Уравнение очевидно имеет корень , но MATLAB вместо того, чтобы выдать этот очевидный ответ, разразился шестиэтажной фразой. MATLAB, конечно, ни в чем не виноват. Это мы составили программу не лучшим образом, не предусмотрев в нем обработку нетривиальной ситуации ( ). С помощью оператора if (условного оператора) можно легко модифицировать нашу функцию sqeq следующим образом:

function res = sqeq2(a,b,c)

% решение квадратного уравнения

if a==0

res = -c/b;

else

d = b^2 - 4*a*c;

res(1) = (b-sqrt(d)) / (2*a);

res(2) = (b+sqrt(d)) / (2*a);

end % if a==0

 

Как нетрудно догадаться, в случае, если а=0, вычисляется единственный корень уравнения, в противном случае решается квадратное уравнение.

 

>> sqeq2(0,2,4)

ans =

-2

 

Конструкция if в общем случае имеет вид:

 

if условие-1

группа операторов

elseif условие-2

группа операторов

else

группа операторов

end

 

Условие представляет собой логическое выражение, для написания которого в MATLAB’е предусмотрен обычный для большинства языков программирования ассортимент операций сравнения и логических операций. Полный их перечень можно найти в HELP’е, а в данном пособии ограничимся использованием следующих операций сравнения:

= = - равно

> - больше

< - меньше

и логическими операциями:

& - логическое И

| - логическое ИЛИ

Если в приведенном шаблоне выполняется первое условие, то исполняется первая группа операторов; если первое условие не выполняется, но выполняется второе – исполняется вторая группа операторов; наконец, если не выполняется ни одно из условий – исполняется последняя группа операторов, следующая за else.

В приведенном примере функции следует обратить внимание на то, как записывается оператор if. Ключевые слова if, else и end, огранивающие группы операторов написаны на одном уровне, а сами группы операторов сдвинуты по отношению к ним на несколько пробелов. Такая запись не обязательна, но позволяет наглядно показать структуру оператора, выделить группы операторов. Подобные мелочи гораздо важнее, чем это может показаться на первый взгляд. Наглядность, читаемость текста программы значительно упрощают как ее написание, так и последующую отладку. Подобные общепринятые приемы выработаны практикой многих программистов в течение десятилетий, и поэтому, не стоит ими пренебрегать [2].

 

Конструкция for также должна быть хорошо известна тем, кто знаком хотя бы с одним языком программирования. В наиболее простом варианте в MATLAB’е эта конструкция имеет вид:

 

for параметр-цикла = начальное-значение : конечное значение

тело-цикла

end

Цикл for применяется, когда требуется выполнить группу операторов заранее известное количество раз. Для MATLAB’а в этом цикле характерно использование двоеточия (:) при указании границ цикла, а также использование зарезервированного слова end в качестве ограничителя цикла.

Пример. Функция, вычисляющая скалярное произведение двух векторов

 

% Скалярное произведение векторов

function res = scpr (n,a,b)

% n - размерность векторов

% a(n), b(n) - вектора-сомножители

res = 0;

for i=1:n

res = res + a(i)*b(i);

end

 

Здесь используется стандартный прием накопления суммы. Пример работы этой программы:

 

>> a = [1 2 3];

>> b = [-1 0 1];

>> scpr(3,a,b)

ans =

 

В MATLAB’е есть возможность использовать шаг изменения параметра, отличный от единицы и даже использования в качестве параметра цикла векторов и матриц. Однако эти изощренные возможности, описанные в HELP’е, здесь использоваться не будут.

 

Цикл while используется, когда количество повторений цикла заранее неизвестно. Окончания цикла определяется проверкой некоторого условия.

 

while условие

тело-цикла

end

 

Пример. Функция, суммирующая элементы вектора до тех пор, пока не встретит первый неположительный элемент

 

function res=sumpos(n,v)

% Суммирование элементов вектора, до первого неположительного элемента

% n - размерность вектора

% v(n) - вектор

res = 0;

i = 0;

 

while v(i+1)>0 & i<n

i = i+1;

res = res + v(i);

end % while

 

В заключение рассмотрим оператор switch выбора одного варианта из нескольких:

 

switch выражение

case константа-1

операторы

case константа-2

операторы

...

otherwise,

операторы

end

 

При выполнении этого оператора сначала вычисляется выражение после слова switch. Затем полученное значение сравнивается с константами, стоящими после слов case. Если, например значение выражения совпадает со второй константой, то выполняется группа операторов после строчки case константа-2. Если же значение выражения не совпадает ни с одной из констант, выполняются операторы, следующие после слова otherwise.

Вообще-то в операторе switch крайней необходимости нет, ‑ то же самое легко можно записать с помощью сложного оператора if. Однако этот оператор в программе выглядит обычно более наглядно и понятно.

 

Задание

В соответствии с назначенным вариантом написать m-функцию, выполняющую заданные вычисления. Придумать 3 набора входных данных для тестирования функции и написать m-файл – сценарий, обращающийся к функции и выдающий результаты, получаемые при ее вызове. В одном из наборов данных предусмотреть ситуацию, в которой требуемый результат не может быть получен (если такая ситуация в принципе возможна). Размерности матриц и векторов должны быть не менее 5.

 

1. Определить номер столбца матрицы, имеющего максимальную сумму элементов. Если таких столбцов несколько, то выбирается столбец с наибольшим номером. Выходные параметры – вычисленный номер столбца и столбец, имеющий этот номер.

2. Найти среднее арифметическое положительных элементов матрицы и номер строки, содержащей элемент, ближайший к этому среднему значению. Выходные параметры – вычисленное среднее значение, номер строки и строка, имеющая этот номер.

3. Вычислить количество отрицательных, положительных и нулевых элементов в матрице. Выходные параметры – три вычисленных значения, а также вектор-столбец, содержащий все отрицательные элементы, и вектор-столбец, содержащий все положительные элементы. Элементы должны располагаться в столбцах в том порядке, как они встречаются при проходе матрицы по строкам.

4. Вычислить количество и среднее арифметическое элементов матрицы, значения которых лежат в интервале [a, b]. Выходные параметры – вычисленное количество, среднее значение и вектор-строка, содержащая все элементы, удовлетворяющие указанному условию, в порядке, как они встречаются при построчном проходе матрицы.

5. Определить число элементов матрицы, превышающее среднее арифметическое всех элементов. Выходные параметры – вычисленное среднее арифметическое, число удовлетворяющих условию элементов и вектор-столбец, содержащий значения этих элементов в порядке, как они встречаются при построчном проходе матрицы.

6. Для каждой строки матрицы вычислить сумму элементов, имеющих дробную часть, и количество таких элементов. Выходные параметры – вектор-столбец, содержащий вычисленные суммы, и вектор-столбец из количеств элементов с дробной частью.

7. Определить номер строки матрицы, имеющей максимальную сумму четных элементов. Выходные параметры – вычисленный номер строки и вектор-строка, представляющая собой соответствующую строку матрицы.

8. Определить среднее арифметическое элементов матрицы, имеющих нечетное значение. Выходные параметры – вычисленное значение и вектор-строка, содержащая нечетные элементы в порядке, как они встречаются при построчном проходе матрицы.

9. Определить сумму положительных элементов матрицы, лежащих ниже главной диагонали. Выходные параметры – вычисленная сумма и вектор-столбец, составленный из элементов, удовлетворяющих указанному условию, в порядке, как они встречаются при построчном проходе матрицы.

10. Записать индексы отрицательных элементов матрицы в двумерный массив (первый столбец – номера строк, второй – номера столбцов). Выходные параметры – указанный двумерный массив, а также вектор-столбец из отрицательных элементов. Элементы и индексы перечисляются в порядке, как они встречаются при построчном проходе матрицы.

11. Определить значения индексов максимального отрицательного элемента матрицы. Выходные параметры – значения индексов, а также вектор-строка и вектор-столбец, представляющие собой строку и столбец матрицы, на пересечении которых находится указанный элемент.

12. Сформировать матрицу, в которой заменены нулями отрицательные элементы исходной заданной матрицы. Выходные параметры – сформированная матрица и вектор-строка, содержащая выброшенные отрицательные элементы, расположенные в порядке, как они встречаются при построчном проходе матрицы.

13. Определить значения индексов элемента матрицы, имеющего максимальную дробную часть. Выходные параметры – значения индексов, а также вектор-строка и вектор-столбец, представляющие собой строку и столбец матрицы, на пересечении которых находится указанный элемент.

14. Вычислить суммы четных элементов главной и побочной диагоналей матрицы. Выходные параметры – значения указанных сумм, а также вектор-строки, содержащие элементы главной и побочной диагоналей.

15. Найти в матрице строку с минимальной суммой четных элементов. Если таких строк несколько, то выбрать строку с наибольшим номером. Строки, не содержащие четных элементов, не рассматриваются. Выходные параметры – номер найденной строки и вектор-строка, содержащая элементы этой строки.

16. Определить значения индексов элемента матрицы, имеющего минимальную дробную часть. Выходные параметры – значения индексов, а также вектор-строка и вектор-столбец, представляющие собой строку и столбец матрицы, на пересечении которых находится указанный элемент.

17. Сформировать матрицу, в которой заменены нулями положительные элементы исходной заданной матрицы. Выходные параметры – сформированная матрица и вектор-строка, содержащая выброшенные положительные элементы, расположенные в порядке, как они встречаются при построчном проходе матрицы.

18. Определить значения индексов минимального положительного элемента матрицы. Выходные параметры – значения индексов, а также вектор-строка и вектор-столбец, представляющие собой строку и столбец матрицы, на пересечении которых находится указанный элемент.

20. Записать индексы положительных элементов матрицы в двумерный массив (первый столбец – номера строк, второй – номера столбцов). Выходные параметры – указанный двумерный массив, а также вектор-столбец из положительных элементов. Элементы и индексы перечисляются в порядке, как они встречаются при построчном проходе матрицы.

21. Определить сумму отрицательных элементов матрицы, лежащих выше главной диагонали. Выходные параметры – вычисленная сумма и вектор-столбец, составленный из элементов, удовлетворяющих указанному условию, в порядке, как они встречаются при построчном проходе матрицы.

22. Определить среднее арифметическое элементов матрицы, имеющих четное значение. Выходные параметры – вычисленное значение и вектор-строка, содержащая четные элементы в порядке, как они встречаются при проходе матрицы по столбцам.

23. Определить номер строки матрицы, имеющей минимальную сумму нечетных элементов. Выходные параметры – вычисленный номер строки и вектор-строка, представляющая собой соответствующую строку матрицы.

24. Найти среднее арифметическое отрицательных элементов матрицы и номер строки, содержащей элемент, ближайший к этому среднему значению. Выходные параметры – вычисленное среднее значение, номер строки и строка, имеющая этот номер.

25. Определить номер строки матрицы, имеющей минимальную сумму элементов. Если таких столбцов несколько, то выбирается столбец с наибольшим номером. Выходные параметры – вычисленный номер столбца и столбец, имеющий этот номер.

 

 




©2015 studenchik.ru Все права принадлежат авторам размещенных материалов.