Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПР_КТіООР.doc
Скачиваний:
38
Добавлен:
11.05.2015
Размер:
9.89 Mб
Скачать

Практична робота №6 Написання програм з використанням циклічних операторів

Мета: Ознайомлення з циклічними операторами системи MATLAB

Теоретичні питання

Управління потоками

MATLAB має вісім видів структур управління потоками:

  • оператор if;

  • оператор switch;

  • цикли for;

  • цикли while;

  • оператор break;

  • оператор continue;

  • try…catch;

  • return.

Усі конструкції програм, засновані на логічних умовах, використовують команду end для вказівки кінця відповідного блоку.

for. Цикл for повторює групу операторів фіксовану, наперед визначену кількість разів. Ключове слово end обкреслює тіло циклу.

for index = start: increment: end

statements

end

де index - є змінюваним цілочисельним індексом з початковим і кінцевим значеннями start і end і приростом increment. За умовчанням, приріст дорівнює 1, але ви можете задати будь-який приріст, включаючи і негативний. При позитивних індексах, виконання припиняється коли значення індексу перевищує кінцеве значення end; при негативних приростах виконання припиняється коли індекс стає менше кінцевого значення.

for n = 3:32

r(n)= rank(magic(n));

end

r

Крапка з комою після виразу в тілі циклу запобігає повторенням виводу результатів на екран, а r після циклу виводить остаточний результат.

Хорошим стилем є відступи при використанні циклів для кращого читання, особливо, коли вони вкладені.

for i = 1:m

for j = 1:n

H(ij)= 1/(i+j);

end

end

Використання як індексів масивів. Індекси команди for можуть бути масивом значень. Наприклад, розглянемо масив А розмірністю m х n . Вираз

for i = A

statements

end

прирівнює індекс і вектору A(:, k). При першій ітерації значення k дорівнює 1; при другій ітерації k дорівнює 2, і так до тих пір, поки k не стане рівним n. Іншими словами, цикл повторюється n разів, де n - число стовпців в A. При цьому, при кожній ітерації індекс i являється вектором, що містить один із стовпців матриці A.

while. Цикл while повторює групу операторів певну кількість разів, поки виконується логічна умова. Ключове слово end обкреслює використовувані оператори.

while expression

statements

end

Якщо логічний вираз expression має матричний вигляд, то для продовження виконання циклу усі його елементи мають бути істинними, тобто дорівнювати логічній одиниці. Щоб привести матричну умову до скалярної, слід скористатися функціями all і any. Наприклад, наступний цикл знаходить перше ціле число n, для якого факторіал n! є 100-значным числом

n = 1;

while prod(1: n) < 1e100

n = n + 1;

end

Для виходу з циклу while у будь-який момент треба застосувати в тілі циклу команду break. При цьому, природно, слід сформувати відповідну логічну умову виходу з циклу.

Нижче приведена повна програма, що ілюструє роботу операторів while, if, else і end, яка використовує метод ділення відрізка навпіл для знаходження нулів полінома.

а = 0; fa = -Inf;

b = 3; fb = Inf;

while b-a > eps*b

x = (a+b)/2;

fx = x^3-2*x-5;

if sign(fx)== sign(fa)

а = x; fa = fx;

else

b = x; fb = fx;

end

end

x

Результатом буде корінь полінома x3 -2x-5

x =

2.09455148154233

Для оператора while вірні ті ж застереження щодо матричного порівняння, що і для оператора if, що обговорювалися раніше.

continue. Команда continue передає управління наступній ітерації в циклах for або while, що призводить до перескакування через оператори, що залишилися, в тілі циклу. У разі вкладених циклів, команда continue передає управління до наступної ітерації зовнішніх по відношенню до цього циклу команд for або while, тобто пропускаються тільки оператори цього внутрішнього циклу, що залишилися. Для застосування цієї команди треба сформувати відповідну логічну умову.

break. Оператор break дозволяє достроково виходити з циклів for або while. У вкладених циклах break здійснює вихід тільки з самого внутрішнього циклу.

Нижче представлений покращений варіант попереднього прикладу. Чому використовування оператора break в даному випадку зручне?

а = 0; fa = -Inf;

b = 3; fb = Inf;

while b-a > eps*b

x = (a+b)/2;

fx = x^3-2*x-5;

if fx ==0

break

elseif sign(fx)== sign(fa)

а = x; fa = fx;

else

b = x; fb = fx;

end

end

x

try…catch. Загальна форма послідовності команд try…catch має вигляд

try

statement

...,

statement

catch

statement

...,

statement

end

У цій послідовності виконуються оператори між командами try і catch до тих пір, поки не відбувайся яка-небудь помилка обчислень. Тоді управління передається («перехоплюється») послідовністю операторів між командами catch і end. Для того, щоб розпізнати причину, що привела до помилки, можна скористатися командою lasterr (остання помилка). Якщо помилка трапляється між командами catch і end, то MATLAB завершує обчислення, якщо тільки між попередніми командами catch і end не встановлена інша послідовність команд try…catch.

return. Команда return припиняє виконання поточної послідовності команд і повертає управління в викликаючу функцію (тобто "батьківську" функцію, з якої була викликана поточна функція) або ж повертає управління до клавіатури. Команда return так-же призводить до закінчення режиму keyboard (остання команда, коли зустрічається в тілі програми, передає управління клавіатурі; вона часто використовується при відладці програми). За звичайних умов роботи викликана функція передає управління у викликаючу функцію коли перша виконана повністю, тобто до кінця. Команда return може бути включена в тіло функції, що викликається, для того, щоб припинити її виконання при виконанні певних умов.

Підфункції. М-функції можуть містити коди більш ніж однієї функції. Перша функція у файлі є головною функцією (primary function), яка має ім'я самого М-файлу. Додаткові функції в межах цього файлу є підфункціями (subfunctions), які «видимі» (тобто можуть бути викликані) тільки для головної функції або інших підфункцій того ж файлу. Кожна підфункція починається зі своєї лінії визначення. Усі Підфункції слідують безпосередньо один за одним. Порядок розташування різних підфункцій не має ніякого значення, при цьому головна функція має бути обов'язково записана першою. Наприклад

function [avg, med] = newstats(u) % Головна функція

% NEWSTATS Знаходить середнє

% значення і медіану за допомогою

% внутрішніх підфункцій

n = length(u);

avg = mean(u, n);

med = median(u, n);

function a = mean(v, n) % Підфункція

% Знаходить середнє значення

a = sum(v)/n;

function m = median(v, n) % Підфункція

% Знаходить медіану.

w = sort(v);

if rem(n, 2) == 1

m = w((n+1)/2);

else

m = (w(n/2)+w(n/2+1))/2;

end

Підфункції mean і median обчислюють середнє значення і медіану вхідних даних. Головна функція newstats знаходить довжину вхідного вектора даних і викликає підфункції, і передає ним дані довжини n. Функції в межах одного і того ж файлу не мають загального доступу до яких-небудь змінних, якщо тільки ви не оголосите ці змінні глобальними або ж не передасте їх у вигляді аргументів у відповідні підфункції, як це реалізовано в наведеному вище прикладі. Крім того, усі засоби допомоги ("help") мають доступ тільки до головної функції в М-файлі. Коли ви викликаєте яку-небудь функцію з М-файлу, MATLAB передусім перевіряє, чи не являється ця функція підфункцією. Потім перевіряється, чи не являється ця функція приватною функцією (private function), описаною в наступному розділі, і далі шукаються стандартні М-файли на шляхах доступу MATLAB. Оскільки підфункції перевіряються першими, ви можете «подавити» виклик будь-якого існуючого М-файлу шляхом застосування підфункцій з тим же ім'ям, як, приклад, ми мали в прикладі з функцією mean. В той же час, в межах одного М-файлу усі підфункції повинні мати різні індивідуальні імена.

Приватні функції. Приватні функції є функціями, які знаходяться в підкаталозі із спеціальним ім'ям private (приватний). Їх видно, тобто вони можуть бути викликані, тільки з функцій в межах батьківського каталогу. Наприклад, допустимо, що каталог newmath знаходиться на шляху доступу MATLAB-а. Підкаталог в цій директорії newmath, названий private, містить тільки функції, які можуть бути викликані з каталогу newmath. Оскільки приватні функції є невидимими поза межами батьківського каталогу, вони можуть використовувати імена, співпадаючі з іменами функцій в інших каталогах. Ця властивість буває корисною, якщо ви хочете створити свою версію якої-небудь конкретної функції, зберігаючи в той же час оригінальну функцію в іншому каталозі. Оскільки MATLAB шукає серед приватних функцій перш ніж перейти до пошуку в інших каталогах, він завжди знайде приватну функцію, наприклад з ім'ям test.m, раніше ніж будь-яку іншу М-функцію, названу тим же ім'ям test.m, але розташовану в інших каталогах. Ви можете створювати свої приватні директорії просто шляхом створення стандартних підкаталогів, названих private. При цьому не слід поміщати директорії private на ваших шляхах доступу.