Приветствую Вас ГостьСуббота, 25.11.2017, 02:46

Robostroi


AVR GCC :: ЦИКЛЫ

AVR GCC :: ЦИКЛЫ


Циклы в языке программирования Си. Цикл "для". Цикл "пока". Принудительное прерывание цикла. Бесконечные циклы.
Вложенные циклы. Формирование временной задержки.


Для того чтобы много раз повторить какую-либо последовательность действий, применяют алгоритмические конструкции, которые называются циклами. Саму последовательность действий при этом называют телом цикла.

Различают следующие разновидности циклов: цикл "для" (цикл со счетчиком) и цикл "пока" (цикл с условием).


Цикл "для"


Цикл "для" используют, когда заранее известно количество повторений.

У такого цикла есть "счетчик повторений", или "переменная цикла", которая должна быть предварительно объявлена.

 int i;

for (i = a; i < b; i = i + c)
{
// тело_цикла
}

Тело цикла повторяется столько раз, сколько значений приобретает переменная цикла i от своего начального значения, задаваемого конструкцией присваивания i = a, до конечного, задаваемого условием i < b. Изменение переменной i задается конструкцией присваивания вида i = i + c (также могут быть использованы инкремент i++ или декремент i--). При i = b цикл заканчивается и выполняется оператор, следующий за закрывающей скобкой цикла.

Пример:

 int i;

for (i = 1; i <= 5; i++)
{
// тело_цикла
}

На первом шаге цикла переменная i будет равна 1, перед вторым шагом она увеличится на 1 в результате декремента (i++) и станет равной 2. На третьем шаге цикла i примет значение 3. И так до тех пор, пока на пятом шаге цикла она не станет равной 5. В результате следующей операции i++ переменная цикла примет значение 6, но условие i <= 5 уже не будет истинным, и цикл завершится. Таким образом, тело цикла будет выполнено 5 раз.

Существует возможность объявлять переменную цикла непосредственно в его оглавлении:

 for (int i = 0; i < 100; i++)
{
// тело_цикла
}

Но на первом этапе изучения языка Си лучше объявлять переменные отдельно.

Рассмотрим пример мигания светодиодом 10 раз с помощью цикла "для".
Рисунок 1



/******************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДОМ 10 РАЗ
Пример подключения светодиода на рисунке 1
*******************************************/


#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 8000000UL // указываем частоту в герцах, для кварца 8 MHz

int main(void) { // начало основной программы

int i; // объявляем переменную i

DDRD = 0xff; // все выводы порта D сконфигурировать как выходы


for (i = 1; i <= 10; i++) // цикл "для", повторяющийся 10 раз
{

PORTD |= _BV(PD1); // установить "1" (высокий уровень) на выводе PD1,
//зажечь светодиод


_delay_ms(250); // ждем 0.25 сек.

PORTD &= ~_BV(PD1); // установить "0" (низкий уровень) на выводе PD1,
//погасить светодиод


_delay_ms(250); // ждем 0.25 сек.

} // закрывающая скобка цикла


} // закрывающая скобка основной программы



Цикл "пока"


Цикл "пока", по-другому называемый циклом с условием, повторяется, пока истинно условие цикла.

 while (условие)
{
// тело_цикла
}

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

Чтобы цикл завершился, в теле цикла должна меняться какая-либо переменная, от которой зависит истинность условия повторений.

Пример:

 int x;

x = 50;

while (x > 0)
{
x = x - 1;
}

В даном примере тело цикла будет повторяться 50 раз, до тех пор пока переменная x будет больше нуля. На каждом шаге цикла x будет уменьшаться на 1. Когда x станет равным нулю, цикл прекратится.


Оператор break


Оператор break позволяет прервать выполнение тела цикла (при дополнительных условиях).

Для того чтобы воспользоваться этим оператором, необходимо просто вставить строчку

 break;

в том месте цикла, где необходимо организовать его прерывание.


Бесконечные циклы


Организовать бесконечный цикл можно как с помощью цикла "для", так и с помощью цикла "пока"

 for(;;)
{
// тело_цикла
}

или

 while (1)
{
// тело_цикла
}

Единственный способ выйти из таких циклов - это сделать break (при каком-либо условии) в теле цикла.


Вложенные циклы


Один цикл повторения может находиться внутри другого цикла. При использовании вложенных циклов следует соблюдать простое правило: один цикл внутри другого должен находиться так же, как одна матрешка внутри другой матрешки.

Рассмотрим пример формирования задержки с помощью двух вложенных друг в друга циклов "для".

 unsigned short i, j, k, ms; // объявляем переменные

ms = 1500;

for (i = 0; i < ms; i++) // главный цикл формирования задержки
{
for (j = 0; j < 185; j++) // вложенный цикл формирования задержки
{
k++; // произвольное действие
}
}

Данный пример реализует задержку длительностью в полторы секунды (для кварца 8 МГц), которая определяется значением переменной ms. Значение этой переменной задается в миллисекундах (1 секунда равна 1000 миллисекунд).

Такую конструкцию можно применять в тех случаях, когда необходимы временные задержки (до 65 секунд) в ходе работы программы. Для реализации более длительных задержек тип переменной ms может быть объявлен как unsigned long, в этом случае можно реализовать временную задержку вплоть до 49 суток, а при использовании типа unsigned long long еще более длительную.
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 180
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Календарь новостей
«  Ноябрь 2017  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930
Реклама
    WMmail.ru - сервис почтовых рассылок WMlink.ru - рекламный брокер SB-MONEY.RU - Электронная коммерция, Сервисы для вебмастеров, Раскрутка
    OZON.ru
    Обмен SMS
    ПОЛУЧИТЬ:  
    НА:
Мини-чат