Главная Партнеры Контакты  
Юридическая компания — «Основной закон», консультации и помощь в возвращении депозитов, защита по кредиту

ЮК
"ОСНОВНОЙ ЗАКОН"  

г. Киев, бул. Пушкина, 2а                
тел.: (044) 334-99-77                               
         (095) 407-407-3
         (096) 703-11-82

график работы: пн.- пт. с 9:00 до 18:00
          
                           

 












Рассматривается вопрос о предоставление нотариусам права выдачи извлечения из Реестра прав на недвижимое имущество.
Министерством юстиции был разработан проект Закона «О внесении изменений в некоторые Законы Украины относительно предоставления информации о государст...


Держреєстрація речових прав на нерухоме майно та їх обтяжень у 2014 році буде здійснюватись за новою - удосконаленою та спрощеною - процедурою.
Постанова Кабінету Міністрів "Про затвердження порядку державної реєстрації прав на нерухоме майно та їх обтяжень і Порядку надання інформації з Держа...




Система Orphus


1.5. алгоритм Оператори

  1. Принцип вкладеності і структуровані блок-схеми
  2. Оператори лінійної послідовності дій
  3. умовні оператори
  4. Оператори циклу
  5. Оператори переходу
  6. оператор switch
  7. Ще один «джентльменський набір»
  8. Підводні камені

Наступний «шар» конструкцій мови програмування - оператори. Вони створюють те, що в повсякденній свідомості асоціюється з поняттям алгоритм - опис послідовності дій, які виконуються програмою, або логіка її роботи. Це, в свою чергу, асоціюється з поняттям «блок-схема», що, в цілому, досить близько до істини. На цьому рівні мови програмування проявляють завидну однаковість, оскільки кількість видів керуючої логіки програми обмежена. У Сі / Сі ++ реалізовано спільний для більшості мов програмування «джентльменський набір» керуючих конструкцій:

· Лінейнаяпоследовательность дій;

· Умовна конструкція (якщо щось-інакше);

· Конструкція повторення (цикл);

· Перехід (і його різновиди).

Відразу ж відзначимо, що цей набір є функціонально надлишковим, і для запису будь-якого алгоритму досить тільки три види.

Опис керуючих конструкцій мови ( операторів ) Найзручніше робити за допомогою блок-схем. Хоча насправді блок-схема теж є засобом опису логіки алгоритму, так що ми ніби як міняємо «шило на мило». Але все-таки для такого подання є дві підстави:

· Елементи блок-схеми відповідають основним компонентам системи команд комп'ютера з розміщенням програми в лінійної пам'яті (див. 1.2 ) - командам обробки даних, перевірки умов і безумовних (умовних) переходів;

· Блок-схеми є природним інструментом технології «історичного» програмування, що базується на розгортці процесу виконання проектованої програми в часі (див. 3.2 ).

Блок-схема містить елементи трьох видів:

· дія , Пов'язане з обробкою даних, в тому числі послідовність операцій (вираз), присвоювання і введення-виведення. Зображується прямокутником, мають один вхід і один вихід;

Зображується прямокутником, мають один вхід і один вихід;

· Перевірка умови. Зображується ромбом, в якому записано умову, і який має один вхід і два виходи в залежності від результату (0 - брехня, 1 -Істинна);

Зображується ромбом, в якому записано умову, і який має один вхід і два виходи в залежності від результату (0 - брехня, 1 -Істинна);


· перехід явно пов'язує послідовно виконуються дії (зв'язок з управління, потік команд) і позначається стрілкою.

Принцип вкладеності і структуровані блок-схеми

Керуючі конструкції мови є структурованими, якщо еквівалентна їм блок-схема має один вхід і один вихід. Тоді її можна уявити як елементарне дію в конструкції більш високого рівня. Виникає «матрьошка», в якій логічна і синтаксична вкладеність операторів ідентичні один одному: кожен оператор «не виходить за рамки», тобто залишають поза передачею управління поза тієї синтаксичної конструкції, в яку він вписаний. Блок-схема, що складається з таких структурованих конструкцій, також є структурованою. У структурованої блок-схемі елемент-прямокутник «дія» може містити як елементарне дію (вираз, простий оператор), так і вкладену керуючу конструкцію.


Ріс.15.1. Структуровані конструкції і блок-схема

Принцип вкладеності і оператори переходу. Група операторів переходу (goto, continue, break, return, throw) також можуть бути синтаксично вкладеними, тобто бути складовою частиною (дією) операторів більш високого рівня. Але при цьому логічна вкладеність (структурованість) не дотримується: оператор «виводить» потік управління за межі тієї конструкції, в яку він вписаний (див.нижче). Всі інші види керуючих конструкцій (послідовність, розгалуження і цикл) є структурованими.

Оператори лінійної послідовності дій

Основним «джерелом» операторів в програмі є вираження. Будь-яке з них, обмежене символом « ; - крапка з комою », перетворюється в оператор. За аналогією символ « ; », Що зустрічається в програмі« сам по собі »позначає порожній оператор , Що не виробляє ніяких дій. Порожній оператор використовується там, де по синтаксису потрібна наявність оператора, але ніяких дій робити не потрібно. Наприклад, в циклі, де все необхідне робиться в його заголовку:

for (i = 0; i <n; i ++) s = s + A [i]; // Звичайний цикл

for (i = 0; A [i]! = 0 && i <n; i ++); // Ціклспустимоператором

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

Ріс
Ріс.15.2. Лінійна послідовність операторів

Відповідно до принципу вкладеності елементами послідовності можуть бути не тільки елементарні дії (прості оператори), але і вкладені синтаксичні конструкції, які на поточному рівні також виконуються послідовно один за одним.

У зв'язку з цим для будь-якої послідовності дій в мові програмування важливо тільки позначити її початок і кінець. У багатьох мовах програмування для цієї мети використовуються ключові слова-обмежувачі, які містяться в конструкції верхнього рівня, куди поміщена послідовність. Наприклад, а Бейсике тіло циклу являє собою конструкцію do -послідовність операторів - loop.

У Сі використовується інший принцип: якщо складовою частиною керуючої конструкції є єдиний оператор, то він ніяк синтаксично не виділяється. Якщо ж складовою частиною є послідовність операторів, то вона полягає в фігурні дужки ( {} ) І утворює блок.

Блок, або складовою оператор виступає як єдина синтаксична одиниця, вкладена в конструкцію верхнього рівня. На початку його можуть бути визначені власні змінні блоку, дія яких не поширюється за його межі, а час існування збігається з часом його виконання. Оператори, що становлять блок, виконуються послідовно один за одним.

for (i = 0; i <n-1; i ++)

{// Складовою оператор - блок

int c;

c = A [i];

A [i] = A [i + 1];

A [i + 1] = c;

}


умовні оператори

Єдиний умовний оператор має два різновиди: з else і без нього.


Рис.15. 3. Умовний оператор

Як умова виступає вираз, яке може мати будь-який цілий результат і інтерпретується відповідно до прийнятих в Сі угодами про логічних значеннях: 0 - «брехня», що не 0 - «істина». Круглі дужки є частиною синтаксису (бо відсутній інший обмежувач вираження, наприклад ключове слово then). Діє він як і у всіх мовах програмування: якщо значення виразу є «істина», то виконується перший оператор, якщо «брехня» - другий (після else ). Конструкція є структурованою, обидві гілки - пряма і альтернативна - «зливаються» в одну

Оператори циклу


У Сі є три види циклічних конструкцій. Спільне в них одне: всі умови в них є
умовами продовження , Тобто цикли тривають, поки значення цих умовних виразів - «істина». Оператори циклу складаються з заголовка, в якому визначається характер циклічного процесу і оператора - тіла циклу. Дужки в заголовку циклу є невід'ємним елементом синтаксису мови. Перші два види циклів відрізняються часом перевірки умови продовження - до або після чергового кроку циклу:

Ріс.15.4. Цикл з перед- і постусловіем.

Найбільш універсальний цикл for має повний еквівалент в циклі while, тому його блок-схему можна і не приводити.

for (вираз 1; умова; вираз 2) оператор

вираз 1;

while (умова) {оператор вираз 2; }

цикл for включає в себе чотири обов'язкові компоненти кожного циклу:

· вираз_1 одноразово обчислюється перед початком циклу і встановлює його початковий стан;

· умова є умовою продовження циклу. Воно перевіряється перед кожним кроком циклу, і при його істинності цикл повторюється. Відповідно до угод, прийнятих в Сі, в якості умови може виступати будь-який вираз із значенням 0 - «брехня», що не 0 - «істина»;

· На кожному кроці циклу виконується оператор (тіло циклу) і вираженіе_2 , Обидва вони є повторюваною частиною циклу. Вираз включає в себе необхідні дії для переходу до наступного кроку.

цикл for НЕ накладає ніяких обмежень на вид виразів в його заголовку (відсутнє поняття «змінна циклу», все значення, що змінюються в циклі, зберігаються після виходу, кількість і способи зміни змінних можуть бути різними). Найпоширеніший варіант, в якому змінна пробігає ряд послідовних значень від 0 до n-1 включно, виглядає так:

for (i = 0; i <n; i ++) ... телоцікладля i ...

Оператори переходу

Проста послідовність, умовний оператор і цикл складають «прожитковий мінімум» операторів, за допомогою яких можна написати будь-яку програму. Вони дотримуються сувору ієрархію синтаксичної і логічної вкладеності операторів одного в інший. Але існує оператор, що порушує цей встановлений порядок, який дозволяє з будь-якої точки програми переміститися в іншу, зрозуміло, в межах однієї функції. Ця дія називається «переходом» ( «передачею управління»), а сам оператор - оператором переходу ( goto ). Для вказівки оператора, до якого виробляється перехід з даної точки програми, використовується мітка. Мітка - це ідентифікатор, обмежений двокрапкою і поставлений перед оператором, який в такому випадку називається поміченим:

оператор

goto mmm:

...

mmm: оператор

оператор goto дає програмісту велику свободу пов'язувати між собою різні частини програми. Як усвідомлено користуватися цією свободою і не зловживати їй, обговорюється в 3.3 . Оператори break, continue, return, throw є варіантами оператора переходу, що діють в рамках поточного циклу і функції. Тому вони в меншій мірі порушують природну логіку роботи програми, задану іншими операторами:

· Оператор continue виконує перехід з тіла циклу до його повторюваної частини, тобто достроково завершує поточний крок і переходить до наступного;

· Оператор break виробляє альтернативний вихід з самого внутрішнього циклу, тобто переходить до першого оператора, що випливає за поточним оператором циклу. Зауважимо, що «покинути» одночасно кілька вкладених один в одного циклів за допомогою break не вдається;

· Оператор return виробляє достроковий вихід з поточної функції. Він, крім усього іншого, повертає значення результату функції (див. 1.6) ;

· Оператор генерації виключення throw використовується в Сі ++ як засіб обробки помилок, виконуючи, в тому числі, і дії, еквівалентні оператору return ( см. 12.2)

void F () {// Не зовсім синтаксично коректна

for (i = 0; i <n; m1: i ++) // іллюстраціявиполненія continue, break, return

{

if (A [i] == 0) continue; // goto m1;

if (A [i] == - 1) return; // goto m2;

if (A [i] <0) break; // goto m3;

}

m2: // продовження тіла функції

...

m3: // завершення функції

}

Оператори continue, break і return повинні завершуватися обмежувачем ";" .

оператор switch

оператор switch - «синтаксичний монстр» мови Сі, по суті є множинним переходом по групі значень заданого виразу.

switch (Вираз)

{

case константа1: послідовність операторов_1

case Константа2: послідовність операторов_2

case константа3: послідовність операторов_3

default : Послідовність операторів

}

Виконується він наступним чином. Обчислюється значення виразу, що стоїть в дужках. Потім послідовно перевіряється його збіг з кожної з констант, що стоять після ключового слова case і обмежених двокрапкою. Якщо сталося збіг, то проводиться перехід на що йде за константою просту послідовність операторів. Звідси випливає, що якщо не вжити жодних дій, то після переходу до n-ой послідовності операторів буде виконана n + 1 і всі наступні. Щоб цього не відбувалося, в кінці кожної з них явно поміщається оператор break , Який в даному випадку виробляє вихід за межі оператора switch . мітка default позначає послідовність, яка виконується «за замовчуванням», тобто коли не було переходу з якого-небудь case . Всі ці нюанси відображені в прикладі, що містить повний програмний еквівалент оператора switch з використанням операторів goto .

switch (n) {// Еквівалент

// if (n == 1) goto m1;

// if (n == 2) goto m2;

// if (n == 4) goto m3;

// goto mdef;

case 1: n = n + 2; break; // m1: n = n + 2; goto mend;

case 2: n = 0; break; // m2: n = 0; goto mend;

case 4: n ++; break; // m4: n ++; goto mend;

default: n = -1; // mdef: n = -1;

} // mend: ...

оператор switch зазвичай використовується при аналізі значень змінної, коли він замінює групу умовних операторів:

switch (c) {// Еквівалент

case '': ... break; // if (c == '') {...}

case '+': ... break; // if (c == '+') {...}

case '-': ... break; // if (c == '-') {...}

}

Якщо кілька гілок оператора switch повинні містити ідентичні дії (можливо, з різними параметрами), то можна використовувати загальну послідовність операторів в одній гілці, але не відділить її оператором break від попередніх:

sign = 0; // Гілка для значення c, рівного '+',

switch (c) {// використовується і попередньої гілкою

case '-': sign = 1; // для значення '-'

case '+': Sum (a, b, sign);

break; }

Ще один «джентльменський набір»

Набір керуючих конструкцій алгоритму може бути різним і надмірною. Але мінімально необхідною є тріада: для архітектурно-орієнтованої логіки - це дія, умова, перехід. Структуровані конструкції - послідовність, вибір (розгалуження), повторення (цикл) - також володіють необхідною повнотою. Але на практиці зустрічається ще одна, досить екзотична тріада: послідовність, розгалуження і рекурсія. Будучи технологічним прийомом програмування (див. 7.1), вона здатна, як мінімум, замінити конструкцію повторення (цикл). Існують мови програмування (ПРОЛОГ), а також математичні формалізму (формальні граматики, частково-рекурсивних функцій), які спираються на цю тріаду.

логіка алгоритму

набір конструкцій

застосування

Архітектурно-орієнтована

· дія

· умова

· перехід

«Історичне» програмування, програмування на рівні архітектури (системи команд) - Асемблер

структурована

· послідовність

· Вибір (розгалуження)

· Повторення (цикл)

Технологія структурного програмування

рекурсивна

· послідовність

· Вибір (розгалуження)

· рекурсія

Функціональне програмування (ПРОЛОГ), уявлення синтаксису в формальних граматиках (транслятори), частково-рекурсивних функцій (теорія алгоритмів)

Підводні камені

Особливість синтаксису Сі полягає в тому, що послідовності керуючих конструкцій, що відрізняються буквально на один символ, можуть бути синтаксично правильними, але давати різні послідовності виконання дій в програмі. Це стосується, перш за все, тіла циклу, де виявляється максимальну кількість помилок програмування (але те ж саме можна віднести і до складових частин умовного оператора). Отже, тіло циклу може мати чотири різні варіанти реалізації:

· Порожній оператор - символ « ; - крапка з комою";

· Простий (первинний) оператор - вираз, обмежене символом «;»;

· Єдиний оператор, який має довільну внутрішню структуру свого тіла - умовний, цикл, перемикач;

· Складовою оператор - блок, що містить послідовність операторів, об'єднану дужками « {} ».

Звідси випливає, що символ «крапка з комою» не можна розставляти «для надійності», він може виступити в якості порожнього оператора, відрізавши заголовок циклу від його справжнього тіла. Аналогічно, при ускладненні тіла циклу в процесі модифікації програми (замість одного оператора - послідовність з декількох) не потрібно забувати об'єднувати отримані послідовності в блоки. Інакше до тіла циклу буде віднесений тільки перший з них.

Наступний фрагмент показує, до чого призводить звичка - ставити знак « ; »Для надійності. Все виконується відповідно до піснею: «Краще сорок разів по разу, ніж ні разу сорок раз». Зайва крапка з комою створює порожній оператор, який є тілом циклу. А справжнє тіло циклу виконується один раз і «після», причому з некоректним значенням індексу.

for (int s = 0, i = 0; i <40; i ++) // Сорокразпоразу

s = s + A [i];

for (int s = 0, i = 0; i <40; i ++); // Жодного разу сорок раз

s = s + A [i]; // Один раз - після (зі значенням A [40] поза масиву)

// «Гільйотина» - тіло циклу окремо від «голови»

Главная Партнеры Контакты    
Cистема управления сайта от студии «АртДизайн»