Как сделать счетчик на си

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Циклы в программировании имеют очень большой вес. При написании кода некоего алгоритма бывает необходимо повторить какой-то этап несколько раз. Можно повторить один и тот же фрагмент несколько раз, но что делать если таких фрагментов нужно несколько тысяч?

Существует три вида циклов

1. Безусловный цикл (for())
2. Цикл с предусловием (while())
3. Цикл с постусловием(do … while())

Код, который находится в фигурных скобках (<>) после служебного слова (наименования используемого самим языком, в данном случае for, while, do), называется кодом находящимся в теле цикла.

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

For (безусловный цикл)

Этот тип циклов бывает полезен в тех случаях, когда мы заранее знаем количество проходов цикла (количество повторяющихся фрагментов кода).
В данном случае счётчик всегда увеличивается на 1.

System. Diagnostics

Простой пример использования Stopwatch

Для начала, рассмотрим простой пример использования класса Stopwatch для измерения затраченного времени на выполнение операции.

  1. Создать объект класса Stopwatch ;
  2. Выполнить метод Start() для того, чтобы засечь время начала операции;
  3. Выполнить метод Stop() для того, чтобы засечь время окончания операции;
  4. Воспользоваться одним из свойств объекта для получения данных о затраченном на выполнение операции времени.

В примере использовано свойство ElapsedMilliseconds , которое позволяет получить количество миллисекунд, затраченных на выполнение операции. Рассмотрим какие ещё есть свойства и методы у класса Stopwatch .

Stopwatch

Свойства Stopwatch

Elapsed

Свойство Elapsed позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch . Описание свойства выглядит следующим образом:

Свойство возвращает объект типа TimeSpan — интервал времени, используя который, можно получить время выполнения операции в удобном для вас виде. Например,

ElapsedMilliseconds

Свойство ElapsedMilliseconds позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch в миллисекундах. В примере использования класса Stopwatch выше продемонстрировано использование этого свойства.

Elapsed Ticks

Свойство Elapsed Ticks позволяет получить общее время выполнение операции в тактах таймера, измеренное текущим экземпляром Stopwatch . Такт — это наименьшая единица времени, которую Stopwatch может измерять таймер. В следующем примере показано использование свойства Elapsed Ticks для измерения времени, затраченного на преобразование строки в целое число типа int .

Результатом выполнения этого кода может быть вот такой вывод консоли:

Is Running

Свойство IsRunning позволяет получить значение типа bool , указывающее на то запущен ли в данный момент таймер Stopwatch .

Поля Stopwatch

Класс Stopwatch содержит два статических поля, позволяющих получить сведения о настройках таймера.

Frequency

Поле Frequency содержит частоту таймера в виде количества тактов в секунду.

Это поле удобно использовать вместе со свойством Elapsed Ticks для преобразования количества тактов в секунды. Например,

Is High Resolution

Свойство Is High Resolution указывает, зависит ли таймер Stopwatch от счетчика производительности высокого разрешения ( true ) или же использует класс DateTime ( false ).

Пример использования поля

Вывод консоли будет иметь следующий вид:

Операции рассчитываются с использованием системного счетчика производительности с высоким разрешением.

Частота таймера = 10000000

Таймер работает с точностью до 100 наносекунд

Методы Stopwatch

Start и Stop

Метод Start() запускает или возобновляет работу таймера Stopwatch . В свою очередь, Stop() выполняет противоположную операцию — останавливает работу таймера. Использование этих методов продемонстрировано в самом первом примере из этой статьи.

Start New

Метод Start New() выполняет сразу несколько операций — он инициализирует новый экземпляр класса Stopwatch , обнуляет счётчик затраченного времени и запускает таймер. То есть, этот метод позволяет немного сократить исходный код программы. Например, код из первого примера можно было бы записать вот так:

Reset

Restart

Метод Restart() останавливает измерение интервала времени, обнуляет затраченное время и повторно запускает таймер. Таким образом, предыдущий пример можно переписать следующим образом:

Итого

Существует три вида циклов в C++:

В данной статье речь пойдет о цикле for .

Как работает цикл for?

Давайте рассмотрим структуру цикла for :

Теперь давайте поподробнее рассмотрим синтаксис цикла for:

  • — здесь нужно создать переменную (счетчик цикла) и задать ей первоначальное значение. Эта команда выполняется до запуска цикла;
  • — оно похоже на условие оператора if. Нам нужно указать логическое выражение, при истинности которого, цикл будет работать;
  • — данная инструкция будет выполняться в конце каждой итерации, переводя счетчик цикла на новое значение;
  • — здесь мы указываем код, который будет выполнятся на каждой итерации цикла.

Возможно у вас остались вопросы, поэтому давайте разберем одну простенькую программу.

Пример работы цикла for

Следующая программа находит произведение цифр от 1 до N (факториал):

Данная программа — это реализация алгоритма нахождения НОД. Давайте не будем разбирать его работу, а просто рассмотрим особенности данного кода:

  • в качестве счетчика можно указывать сразу несколько переменных. Также они не обязательно должны быть объявлены непосредственно в самом блоке;
  • любой из блоков (их 3) может вовсе отсутствовать. Вот хороший пример работы бесконечного цикла:

Возможные ошибки

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

Сегфолт

У данной ошибки довольно много причин. Подробнее о ней можете почитать на Википедии. В случае работы с циклами она может возникнуть следующим образом:

Постарайтесь выработать привычку всегда обнулять созданные переменные. Это избавит вас от огромного количества проблем при написании собственных программ.

Некоторые компиляторы обнуляют переменные при их создании. Например, это делает компилятор gcc.

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

Данная ошибка часто возникает из-за неправильного условия или изменение значения счетчика внутри цикла.

Безусловно, наиболее используемым циклом в языке C++ является цикл for.

Цикл for

Цикл for в языке С++ идеален, когда известно необходимое количество итераций. Выглядит он следующим образом:

for (объявление переменных; условие; инкремент/декремент счетчика)
тело цикла;

Или, преобразуя for в эквивалентный цикл while:

< // обратите внимание, цикл находится в блоке
объявление переменных;
while (условие)
<
тело цикла;
инкремент/декремент счетчика;
>
> // переменные, объявленные внутри цикла, выходят из области видимости здесь

Переменные, определенные внутри цикла for, имеют специальный тип области видимости: область видимости цикла. Такие переменные существуют только внутри цикла и недоступны за его пределами.

Выполнение цикла for

Цикл for в C++ выполняется в 3 шага:

Шаг №1: Объявление переменных. Как правило, здесь выполняется определение и инициализация счетчиков цикла, а точнее — одного счетчика цикла. Эта часть выполняется только один раз, когда цикл выполняется впервые.

Шаг №2: Условие. Если оно равно false, то цикл немедленно завершает свое выполнение. Если же условие равно true, то выполняется тело цикла.

Шаг №3: Инкремент/декремент счетчика цикла. Переменная увеличивается или уменьшается на единицу. После этого цикл возвращается к шагу №2.

Рассмотрим пример цикла for и разберемся детально, как он работает:

Сначала мы объявляем переменную count и присваиваем ей значение 0 . Далее проверяется условие count , а так как count равен 0 , то условие 0 имеет значение true. Следовательно, выполняется тело цикла, в котором мы выводим в консоль переменную count (т.е. значение 0 ).

Затем выполняется выражение ++count , т.е. инкремент переменной. Затем цикл снова возвращается к проверке условия. Условие 1 имеет значение true, поэтому тело цикла выполняется опять. Выводится 1 , а переменная count увеличивается уже до значения 2 . Условие 2 является истинным, поэтому выводится 2 , а count увеличивается до 3 и так далее.

В конце концов, count увеличивается до 10 , а условие 10 является ложным, и цикл завершается. Следовательно, результат выполнения программы:

0 1 2 3 4 5 6 7 8 9

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

Обратите внимание, внешние фигурные скобки здесь необходимы, так как переменная count выходит из области видимости при завершении цикла.

Еще примеры циклов for

Давайте, используя цикл for, напишем функцию вычисления значений в степени n :

Функция возвращает значение base^exponent (число в степени n ). base — это число, которое нужно возвести в степень, а exponent — это степень, в которую нужно возвести base .

Если экспонент равен 0 , то цикл for выполняется 0 раз, и функция возвращает 1 .

Если экспонент равен 1 , то цикл for выполняется 1 раз, и функция возвращает 1 * base .

Если экспонент равен 2 , то цикл for выполняется 2 раза, и функция возвращает 1 * base * base .

Хотя в большинстве циклов используется инкремент счетчика, мы также можем использовать и декремент счетчика:

8 7 6 5 4 3 2 1 0

Также с каждой новой итерацией мы можем увеличить или уменьшить значение счетчика больше, чем на единицу:

Ошибка неучтенной единицы

При написании циклов for помните, что цикл будет выполняться до тех пор, пока условие является истинным. Рекомендуется тестировать циклы, используя разные значения для проверки работоспособности цикла. Хорошей практикой является проверять циклы с помощью данных ввода (чисел, символов и прочего), которые заставляют цикл выполниться 0, 1 и 2 раза. Если цикл работает исправно, значит всё ОК.

Правило: Тестируйте свои циклы, используя входные данные, которые заставляют цикл выполниться 0, 1 и 2 раза.

Читайте также: