Крім програм з лінійною структурою, інструкції яких виконуються строго по порядку, існує безліч алгоритмів, структура яких нелінійна. При цьому послідовність елементів алгоритмів може виконуватися в залежності від певних умов, іноді з кінцевим числом повторень - регулярних циклів, іноді у вигляді циклів, завершує при виконанні заданої умови. Практично будь-яка серйозна програма має нелінійну структуру. Для створення таких програм необхідні спеціальні керуючі структури. Вони є в будь-якій мові програмування високого рівня, і зокрема в Matlab.
Розглянемо оператори m-файлів докладніше.
Оператор присвоювання. Основним оператором системи програмування MatLab є оператор присвоювання. має наступну структуру:
Оператор призначений для ідентифікації змінних і позначається символом =. зліва від якого знаходиться ім'я змінної, а праворуч арифметичне або строкове вираження (правила записи арифметичних і рядкових виразів були розглянуті в п. 1.1.2). Наведемо кілька прикладів операторів присвоювання (рис. 1.3.4-1).
Мал. 1.3.4-1. Приклади операторів присвоювання
Всі змінні, використовувані в правій частині оператора присвоювання, повинні бути попередньо визначені. Якщо командний рядок закінчується символом крапка з комою (;), то результат виконання оператора не виводиться, інакше він виводиться в наступному рядку командного вікна. Це зауваження поширюється і на виконання операторів присвоювання, розташованих в m файлах.
Оператори введення даних. Введення даних в Matlab може здійснюватися як з використанням оператора присвоювання (a = 5;), так і з використанням функції введення даних з клавіатури:
Ця функція вводить вираз з клавіатури, а результат заноситься в змінну з ім'ям a. У наведеному нижче прикладі в змінну a введено спочатку числове значення, а потім числове вираз (рис. 1.3.4-2).
Мал. 1.3.4-2. Введення даних з клавіатури
Функція input () може використовуватися і для введення довільних строкових виразів. При цьому вона задається в наступному вигляді:
При виконанні цієї функції обчислення зупиняються в очікуванні введення строкового вираження. Введене вираз виводиться в наступному рядку. Для обчислення виразу, заданого в символьному вигляді, використана функція eval (). Це ілюструє приклад на рис. 1.3.4-3.
Мал. 1.3.4-3. Обчислення виразу, заданого в символьному вигляді
Умовний оператор if ... end. Умовний оператор if в загальному вигляді записується в такий спосіб:
Правила запису логічних виразів описано в темі 1.1.
Ця конструкція допускає кілька приватних варіантів. Найпростіше - усеченное розгалуження [x] має такий вигляд:
Нагадаємо, що якщо ЛогіческоеВираженіе повертає логічне значення 1 (тобто «Істина»), виконуються Інструкції. складові тіло структури if. end. При цьому оператор end вказує на кінець списку інструкцій. Інструкції в списку поділяють кома або крапка з комою. Якщо ЛогіческоеВираженіе не виконується (дає логічне значення 0. «Брехня»), то Інструкції також не виконуються.
Нижче наведено приклад використання найпростішого усіченого розгалуження, реалізованого з використання оператора if (рис. 1.3.4-4).
Мал. 1.3.4-4. Приклад усіченого розгалуження
Друга приватна конструкція нагадує стандартне розгалуження [x]:
Тут виконуються Інструкціі1. якщо виконується істинно
ЛогіческоеВираженіе. або, в іншому випадку, виконуються
Інструкціі2.
У прикладі, наведеному на рис. 1.3.4-5, розглядається стандартне розгалуження, реалізоване з використанням оператора if.
Мал. 1.3.4-5. Приклад стандартного розгалуження
З наведеного прикладу видно, що оператор if може бути як в один рядок, так і в кілька рядків.
Розглянемо приклад більш складного - вкладеного розгалуження. Розглянемо приклад
причому, для того щоб повністю відбити структуру складного розгалуження, не піклуючись про перенесення довгих командних рядків, використовуємо m-функцію (рис. 1.3.4-7). Підберемо дані для перевірки основного розгалуження і звернемося до функції raz () з різними вихідними даними (рис. 1.3.4-6).
Мал. 1.3.4-6. Звернення до функції raz () з різними вихідними даними
Мал. 1.3.4-9. Звернення до функції multifunc ()
У функції multifunc (x, n) два параметра, причому другий грає роль індикатора, що визначає тип функціональної залежності. Значення функції записується в змінну y. Якщо n = 1, то виконується перший case-блок, якщо 2, то - другий, якщо n = 2, 3 або 4, то - третій. Якщо ж значення змінної n не збігається ні з одним з перерахованих значень, то виконується команда, розташована після ключового слова otherwise.
Оператор регулярного циклу - for. end. Оператор циклу типу for. end зазвичай використовується для організації обчислень з заданим числом повторень циклів. Конструкція такого циклу має такий вигляд:
де s - початкове значення змінної циклу var. d - приріст цієї змінної і е - кінцеве значення керуючої змінної, при перевищенні якого цикл завершується. Можлива і запис у вигляді s: е (в цьому випадку d = l). Список виконуваних в циклі інструкцій завершується оператором end.
Як приклад використання оператора for. end обчислимо суму елементів масиву х. значення якого визначено в командному вікні з використанням m-функції summa () (рис. 1.3.4-10), параметром якої є вектор x. Кількість елементів масиву х визначається функцією length. Окрім звернення до функції в командному вікні передбачена перевірка результату обчислень з використанням вбудованої функції sum (x) (рис. 1.3.4-11).
Мал. 1.3.4-10. Функція, що обчислює суму елементів масиву
Мал. 1.3.4-11. Звернення до функції summa () і вбудованої функції sum ()
У циклі може бути використаний оператор continue. який передає управління в наступну ітерацію циклу, пропускаючи оператори, які записані за ним, причому у вкладеному циклі він передає управління на наступну ітерацію основного циклу. Оператор break може використовуватися для дострокового переривання виконання циклу (наприклад, при налагодженні ділянки програми). Як тільки він зустрічається в програмі, цикл переривається.
Крім простих регулярних циклів в Matlab є можливість організації вкладених циклів. Розглянемо приклад формування двовимірного масиву а, кожен елемент якого являє суму його індексів (рис. 1.3.4-12). Звернення до script -файлу vzikl наведено на рис. 1.3.4-13.
Мал. 1.3.4-12. Script-файл, який ілюструє вкладені цикли
Мал. 1.3.4-13. Звернення до script -файлу з ім'ям vzikl
Оператор ітеративного циклу - while ... end. Загальний вигляд структури while ... end виглядає наступним чином:
Відмінною особливістю цієї структури є те, що інструкції, розташовані в тілі структури повторення, виконуються тільки в тому випадку, якщо якийсь ЛогіческоеВираженіе «істинно». Як тільки умова стає «помилковим», відбувається вихід зі структури повторення, і управління передається на інструкцію, розташовану після ключового слова end.
Наведемо простий приклад (рис. 1.3.4-14).
Мал. 1.3.4-14. Діалогова програма, яка використовує оператор while ... end
Ця програма, яку було збережено m-файл з ім'ям primer11. служить для багаторазового обчислення довжини кола по вводиться користувачем значенням радіуса r. де діалог реалізований за допомогою команди input. Рядок, пов'язані з введенням змінної r і обчисленням довжини окружності, включені в керуючу структуру while. end. Це необхідно для циклічного повторення обчислень при введенні різних значень r. Поки r> = 0. цикл повторюється. Але варто поставити r<0. вычисление длины окружности перестает выполняться, а цикл завершается. Поскольку во второй строке программы величинаr определена равной 0, цикл повторяется хотя бы один раз.
Робота з програмою в командному вікні представлена на рис. 1.3.4-15.
Мал. 1.3.4-15. Звернення до програми обчислення довжини кола
У керуючих структурах, зокрема в циклах for і while. часто використовуються оператори, що впливають на їх виконання. Так, оператор break може використовуватися для дострокового переривання виконання циклу. Як тільки він зустрічається в програмі, цикл переривається.
Розглянемо приклад дострокового переривання циклу при виконанні умови i = 5 (рис. 1.3.4-16).
Мал. 1.3.4-16. Переривання програми із застосуванням оператора break
Оператор continue передає управління в наступну ітерацію циклу, про-пускаючи оператори, які записані за ним, причому у вкладеному циклі він передає управління на наступну ітерацію основного циклу. Нижче наведено приклад обчислення суми і твори позитивних елементів двовимірного масиву b (3,3) (рис. 1.3.4-17).
Мал. 1.3.4-17. Переривання програми із застосуванням оператора continue
Приклади розв'язання задач з використанням
Приклад 1.3.5-1. Дано n чисел. Потрібно обчислити їх суму: де
Для вирішення поставленого завдання розроблена функція fb (x). реалізує алгоритм обчислення поточного значення функції. Функція має один вхідний параметр - поточне значення елемента масиву b і один вихідний параметр - y (рис. 1.3.5-1). Звернення до функції відбувається в циклі, організованому для обчислення суми (рис. 1.3.5-2).
Мал. 1.3.5-1. Функція, що реалізує алгоритм Прімера 1.3.5-1
Мал. 1.3.5-2. Програма, що реалізує обчислення суми чисел
Для обчислення суми значень функції створений script-файл з ім'ям zadashа.m. в якому спочатку задані кількість чисел (n = 10) і вектор їх значень (b), а потім організовано регулярний цикл для звернення до функцій fb () і обчислення суми.
Обчислення проводяться запуском script-файлу шляхом набору в командному рядку вікна Command Window його імені zadasha. Результати його виконання виведені на рис. 1.3.5-3.
Мал. 1.3.5-3. Запуск script-файлу zadasha на виконання
Приклад 1.3.5 -2. Сформувати з довільних чисел двовимірний масив а (3,4). Обчислити і вивести одновимірний масив b, кожен елемент якого є середнє арифметичне елементів відповідного рядка масиву а [].
На рис. 1.3.5-4 наведено script-файл з ім'ям zadasha2. де введена матриця, а. що складається з трьох рядків і чотирьох стовпців. Організовано цикл за кількістю формованих елементів масиву b шляхом звернення до функції sred_ar (). У функцію передається масив а. номер рядка (i) і кількість елементів в рядку (m). Висновок елементів масиву b передбачений в стовпець.
Мал. 1.3.5-4. Програма формування масиву b
Функція sred_ar () (рис. 1.3.5-5) призначена для формування i -го елемента масиву b. рівного середньому арифметичному елементів рядка масиву а.
Мал. 1.3.5-5. Функція sred_ar (). обчислює середнє арифметичне
елементів рядка масиву a
В результаті запуску script-файл з ім'ям zadasha2 в вікно Command Window виводиться стовпець елементів масиву b
Приклад. 1.3.5-3. Задати дійсні числа a, b, натуральне n (a
Рішення завдання вимагає розробки двох функцій: fab (a, h, i). призначеної для обчислення i-го доданка (рис. 1.3.5-7) і sumf (a, h, n), призначеної для обчислення заданого виразу (рис. 1.3.5-8).
Мал. 1.3.5-7. Функція fab (), що обчислює значення i-го доданка