Цикл з лічильником - студопедія

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

є зручною скороченою записом для циклу while виду

Вираз e1 служить для завдання початкових умов виконання циклу, вираз e2 забезпечує перевірку умови виходу з циклу, а вираз e3 модифікує умови, задані виразом e1. Будь-яке з виразів e1, e2, e3 може бути опущено. Якщо опущено e2, то за замовчуванням замість нього підставляється значення TRUE. Наприклад, цикл for

з опущеними e1, e3 еквівалентний циклу

з усіма опущеними виразами еквівалентний циклу

тобто еквівалентний нескінченного циклу. Такий цикл може бути перерваний тільки явним виходом з нього за допомогою операторів break, goto, return, що містяться в тілі циклу s.

Незважаючи на зовнішню схожість з ітеративними циклами for мов Паскаль і Ада або ітеративними циклами do мов Фортран або ПЛ / 1, цикл for мови Сі не є їх семантичної копією. Цикл for мови Сі має більшу спільністю, ніж цикли for і do інших мов. На відміну від цих циклів, в загальному випадку число ітерацій в циклі for мови Сі не може бути визначено до виконання цього циклу.

Цикл for і його альтернатива цикл while семантично майже еквівалентні, але, як вказується в роботі (Ritchie, D.M. 1980. The Programming Language - Reference Manual /. ATT Bell Laboratories, Murray Hill, N.J. 07974), не ідентичні. Наприклад, розглянемо випадок, коли оператор s є оператором continue або складеним оператором, що містить оператор continue. Дія оператора continue полягає в переході до кінця циклу, що має різні наслідки для циклу for і його еквівалента у формі циклу while. У випадку з циклом for вираз e3 виконується до обчислення значення виразу e2, в той час як в еквівалентному циклі while вираз e3 пропускається.

Гнучкість конструкції for - наслідок способу використання виразів в специфікації циклу. До сих пір перший вираз застосовувалося для ініціалізації лічильника, друге - для завдання його граничного значення, а третє - для збільшення його поточного значення на 1. Але крім цієї можливості існує ще й багато інших можливостей його застосування, дев'ять з яких ми наведемо нижче.

  1. Можна застосовувати операцію зменшення для рахунку в порядку убування замість рахунку в порядку зростання:
2. for (n = 10; n> 0; n -) 3. printf ( ". секунд! \ n", n); printf ( "Пуск! \ n");
  1. При бажанні можна вести рахунок двійками, десятками і т.д .:
5. for (n = 2; n<60;n=n+13);printf(".\n",n);
  1. Можна вести підрахунок за допомогою символів, а не тільки чисел:
7. for (ch = 'a'; ch<='z';ch++)printf("Величина кода ASCII для %с равна ..\n",ch,ch);

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

  1. Можна перевірити виконання деякого довільного умови, відмінного від умови, що накладається на число ітерацій. Розглянемо приклад в програмі друкує таблицю кубів цілих чисел:
9. / * таблиця кубів * / 10.main () 11.

А тепер замінимо специфікацію

for (num = 1; num<=6; num++)

for (num = 1; num<6; num++)

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

  1. Можна зробити так, щоб значення деякої величини зростала в геометричній, а не в арифметичній прогресії, тобто замість додавання фіксованого значення на кожному кроці циклу виконувалося б множення:
16.for (x = 100.0; x<150.0; x=x*1.1)printf("Ваш долг теперь %3.2f.\n",x);

У цьому фрагменті програми значення змінної x множиться на 1.1 на кожному кроці циклу, що збільшує її на 10%. Результат виглядає наступним чином:

Ваш борг тепер 100.00.Ваш борг тепер 110.00.Ваш борг тепер 121.00.Ваш борг тепер 133.10.Ваш борг тепер 146.41.
  1. В якості третьої вираження можна використовувати будь-який правильно складене вираз. Яке б вираз ми ні вказали, його значення буде змінюватися при кожній ітерації:
18.for (x = y = 1; y<=75; y=5*x++)printf("%10d %10d\n",x,y);

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

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

  1. Можна навіть опустити одне або більше виразів, але при цьому не можна опустити символи "крапка з комою". тіло циклу
20.for (;;)

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

  1. Перший вираз не обов'язково має ініціювати змінну. Замість цього, наприклад, там міг би стояти оператор printf (). Необхідно пам'ятати тільки, що перший вираз обчислюється тільки один раз перед тим, як інші частини циклу почнуть виконуватися.
23.for (printf ( "Запам'ятовуйте числа! \ N"); num! = 6;) 24.scanf ( ".", Num); printf ( "Це як раз те, що я хочу! \ N");

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

  1. Параметри, що входять до виразу, що знаходяться в специфікації циклу, можна змінити при виконанні операцій в тілі циклу. Припустимо, наприклад, що у вас є цикл зі специфікацією такого вигляду:
for (n = 1; n<1000; n+t)

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

Підведемо підсумки. В операторі for використовуються три вирази, що керують роботою циклу. Вони розділені символом "крапка з комою". Инициализирующее вираз обчислюється тільки один раз до початку виконання якого-небудь з операторів циклу. Якщо перевіряється вираз виявляється істинним, або не рівним нулю, тіло циклу виконується один раз. Потім обчислюється величина корректируемого вираження, і значення перевіряється виразу визначається знову. Оператор for - це цикл з передумовою. Рішення про те, чи виконати в черговий раз тіло циклу чи ні, приймається до початку його проходження. Тому може статися так, що тіло циклу не буде виконано жодного разу. Оператор, який утворює тіло циклу, може бути як простим, так і складеним.

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