While-інструкція та її семантика 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

While-інструкція та її семантика



Цикл та інструкція циклу

Цикл — різновид керівної конструкції у високорівневих мовах програмування, призначена з метою організації багаторазового виконання набору інструкцій (команд). Також циклом може називатися будь-яка багатократно виконувана послідовність інструкцій, організована будь-яким чином.

Інструкція циклу – набір команд, що мають виконатися для досягнення бажаного результату.

While-інструкція та її семантика

Це інструкція циклу з передумовою (while -інструкція). Вона має такий загальний вигляд:

while (умова) інструкція

Слово while є зарезервованим, дужки обов’язкові, while (умова) — це заголовок циклу, а інструкція — тіло.

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

Do-while-інструкція та її семантика

Інструкція циклу з післяумовою, або do-інструкція, має такий загальний вигляд.

do інструкція while (умова);

Слово do («виконувати») є ключовим. Інструкція циклу з післяумовою виконується так. Спочатку виконується тіло циклу, потім обчислюється умова. Якщо вона хибна, цикл завершується, інакше повторюється тіло й знову обчислюється умова. На відміну від інструкції з передумовою, цикл починається діями в тілі й закінчується обчисленням умови.

For-інструкція та її семантика

Інструкція циклу for, або for-інструкція, має такий загальний вигляд.

for(початкові дії; умова; перехідні дії) основні дії

Початкові дії, умову та перехідні дії зображено виразами, основні дії — інструкцією, тобто загальна структура інструкції for така.

for(вираз; вираз; вираз) інструкція

Слово for є зарезервованим, дужки та два знаки; всередині дужок обов’язкові. Виконується
ця складна інструкція так само, як інструкції такого вигляду.

початкові дії;

while (умова)

{

основні дії;

перехідні дії;

}

Кожен з виразів всередині дужок може бути порожнім або, навпаки, складатися з кількох виразів, що є операндами операції слідування.

Інструкції збільшення та зменшення

Властивість структурності операторів

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

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

Інструкції break та continue, порушення ними структурності програми

Інструкцію break було представлено в розділі \\\\++++, де за її допомогою переривалося виконання інструкції-перемикача. Виконання цієї інструкції всередині циклу будь-якого різновиду перериває й завершує цикл; далі виконуються дії, наступні після цього циклу.

Якщо break записано в інструкції циклу, яку вкладено в іншу інструкцію циклу, то виконання break завершує вкладений цикл, а зовнішній цикл продовжується.

Інструкція continue всередині циклу задає перехід до обчислення умови продовження циклу.

Використання інструкцій break і continue дозволяє спростити запис розгалужень всередині циклу.

Рекурентне співвідношення

Рівність, яка виражає член послідовності через один або кілька попередніх та його номер, називається рекурентним співвідношенням. Послідовність, члени якої задовольняють певному рекурентному співвідношенню, також називається рекурентною послідовністю.

Система рекурентних співвідношень

Бібліотечні функції, потрібні для утворення послідовностей псевдовипадкових чисел.

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

Користуючися мовою С++, можна отримувати послідовності псевдовипадкових чисел за допомогою двох функцій, оголошених у заголовочному файлі <stdlib.h>. Функція з прототипом void srand(unsigned int) обчислює початкове псевдовипадкове значення за аргументом у виклику (ним має бути невід’ємне ціле число). Функція з прототипом int rand(void) за поточним псевдовипадковим значенням обчислює й повертає наступне. Усі значення є цілими числами в діапазоні від 0 до 32767. Число 32767 позначається константою RAND_MAX; її теж оголошено у файлі <stdlib.h>.

Ім’я rand є скороченням слова random (випадковий), а srand — скороченням seed random (засіяти випадкове). Відповідно, значення аргументу у виклику srand називається зерном.

 

Пам’ять процесу виконання виклику функції

Сукупність змінних, які утворюються під час виклику функції (підпрограми), має назву пам’ять виклику функції, або не зовсім точно, локальна пам’ять функції. Змінні в цій пам’яті називаються локальними. Ними є параметри-значення та змінні, означені в тілі функції.

Локальна пам’ять функції містить також посилання на аргументи, відповідні параметрам-посиланням, а також ще один елемент — посилання на місце, з якого має виконуватися програма після закінчення виклику. Наприклад, якщо деяка функція f містить декілька викликів тієї самої функції g, то після кожного з них функція fпродовжується з відповідного місця після виклику.

Місце, з якого продовжується виконання програми після виклику, називається точкою повернення з виклику функції.

Посилання на точку повернення зберігається в локальній пам’яті виклику функції. Окрім того, будемо вважати: якщо функція повертає значення типу, відмінного від void, то це значення також записується в пам’яті виклику.

Огляд процесу виконання виклику функції

1. Виділяється пам’ять для точки повернення та параметрів функції. Зберігається посилання на точку повернення з функції.

2. Обчислюються значення аргументів для параметрів-значень, посилання на пам’ять аргументів для параметрів-посилань. Відбувається підстановка аргументів.

3. Виконуються інструкції тіла функції до інструкції повернення, зокрема, створюються змінні, оголошені в тілі функції.

4. Якщо підпрограма не є void-функцією, то значення, що повертається з її виклику, копіюється до пам’яті функції, яка містила виклик.

6. Функція, яка містила виклик, продовжується з точки повернення.

Імена у функції, яка містить виклик, не позначають змінних у пам’яті цього виклику, тому ця пам’ять недоступна після закінчення виклику. Вона вважається звільненою; її можна використовувати для наступного виклику цієї ж або іншої функції.

Відбувається так зване логічне звільнення пам’яті виклику, тобто її зміст не змінюється, але стає недоступним.

Синтаксичне правило

Ще один приклад рекурсивних означень — це синтаксичні правила, які описують структуру виразів у різноманітних мовах.

В свій час було винайдено декілька форм запису синтаксичних правил. Найбільш поширені контекстно-вільні граматики Хомського (КВ-граматики) та їх різновиди — системи форм Бекуса-Наура (БНФ) та синтаксичні діаграми. Кожна з них дозволяє описати майже весь синтаксис мов програмування. Розглянемо синтаксичні правила у вигляді БНФ.

Надамо синтаксичним правилам чіткішу форму. Поняття мови позначимо словом у кутових дужках < >, наприклад, <вираз> або <ім’я>. Слова (лексеми) самої мови будемо записувати в 'апострофах' або виділяти напівжирним шрифтом, наприклад '=' або while. Порожню послідовність символів позначимо кутовими дужками < >.

Масив

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

Масив — це змінна, утворена послідовністю змінних, які називаються елементами (компонентами), є однотипними й ідентифікуються номерами (індексами). Елементи масиву рівнодоступні — можливість їх обробки не залежить від їх місця в масиві.

Означення масиву має вигляд T a[n], де T — тип елементів, a — ім’я масиву, nціла константа, можливо, іменована. Константа задає розмір масиву. Елементи можуть мати довільний скалярний або структурний тип (масив та інші, про які йдеться в наступних главах). Індексами елементів є цілі числа від 0 до n -1.

Тип та кількість елементів масиву (його розмір) фіксується в означенні або під час створення й далі не змінюється.

Елемент масиву

Елемент масиву ідентифікується іменем масиву та індексом. Наприклад, елемент масиву зі ста елементів, int a[100], позначається виразом вигляду a[ IE ], де вираз IE повинен мати ціле значення від 0 до 99.

Індексна множина масиву

Розмір масиву

Ініціалізація масиву.

Значення, що ініціалізують послідовні елементи масиву, задаються списком констант у дужках {}, наприклад, int a[4]={2,10,3,15};. Якщо констант менше ніж елементів у масиві, вони присвоюються першим елементам масиву, а решта елементів отримують нульові значення відповідного типу. Наприклад, оголошення int cnt[4]={}; ініціалізує всі елементи значенням 0. Якщо ж констант більше ніж елементів масиву, то це є помилкою.

В ініціалізації можна не вказувати розмір масиву — він стає рівним кількості констант. Наприклад, оголошення int a[]={9,8,7}; задає масив з трьох елементів.

Елементи масиву, оголошеного без ініціалізації за межами функцій, в якості початкових значень отримують нулі відповідного типу, а масиву, оголошеного в тілі функції — випадкове «сміття».

Вказівник

Вказівник — це змінна, значеннями якої є адреси.

Типізований вказівник

типізовані вказівники — їхніми значеннями можуть бути адреси даних тільки певного типу. Тип адрес даних типу T позначається виразом T *. При цьому тип T називається базовим, а вказівник типу T * — вказівником на дані типу T (вказівником типу T).

Арифметичні дії з адресами

Мова С++ дозволяє додати до адреси або відняти від неї ціле число. Можна також до цілого числа додати адресу. Отже, якщо A та I позначають, відповідно, адресний та цілий вирази, то A + I, AI, I + A є адресними виразами.

Якщо доданок-адреса має тип T*, то ціле значення розглядається як кількість одиниць даних типу T. Наприклад, якщо x — змінна типу int, то адресні вирази &x+1 та 1+&x задають адресу цілої змінної, розташованої відразу після змінної x. Ця адреса більше адреси змінної x на sizeof(int), тобто на 4. Віднімання цілого від адреси аналогічне. Так, значенням виразу &x-1 є адреса змінної, яка в пам’яті займає місце безпосередньо перед x.

Звідси, якщо p — вказівник типу T*, то вирази p+1, p+2, … задають адреси даних типу T, розташованих після *p «на відстані» 1, 2, … від *p. Так само, вирази p-1, p-2, … позначають адреси даних типу T перед *p

До вказівників застосовні складені присвоювання +=, -= (з цілим виразом праворуч), а також ++ і --. Вони збільшують або зменшують значення вказівника на відповідну кількість sizeof(T), тобто переставляють його «з кроком sizeof(T)». Наприклад, якщо p має тип int*, то вираз p+=2 збільшує значення p (адресу!) на 8, переставляючи його вперед на дві одиниці даних типу int.

До однотипних адрес застосовна операція віднімання. Якщо AE1, AE2 — адресні вирази типу T*, то значенням арифметичного виразу AE2 - AE1 є ціла кількість одиниць даних типу T, які «уміщаються між адресами» AE1 і AE2 (можливо, це число від’ємне). Зокрема, виразами AE2 та AE1 можуть бути імена вказівників.

Нарешті, адреси однотипних даних можна порівнювати за допомогою операторів ==,!=, <, <=, >, >=. Наприклад, якщо p — вказівник на деякий тип, то значенням виразів p<p+1, p!=p-1 є істина.

Арифметичні операції з вказівниками вимагають підвищеної уваги. Помилки в цих операціях призводять, як правило, до спроб змінити зовсім не ті дані, які передбачає програміст, тому є дуже небезпечними.

Цикл та інструкція циклу

Цикл — різновид керівної конструкції у високорівневих мовах програмування, призначена з метою організації багаторазового виконання набору інструкцій (команд). Також циклом може називатися будь-яка багатократно виконувана послідовність інструкцій, організована будь-яким чином.

Інструкція циклу – набір команд, що мають виконатися для досягнення бажаного результату.

while-інструкція та її семантика

Це інструкція циклу з передумовою (while -інструкція). Вона має такий загальний вигляд:

while (умова) інструкція

Слово while є зарезервованим, дужки обов’язкові, while (умова) — це заголовок циклу, а інструкція — тіло.

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



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 410; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.12.172 (0.018 с.)