понедельник, 7 марта 2016 г.

Циклы и ветвления: while.

  С помощью ключевого слова while, в С++ можно писать циклы. Цикл похож на условный оператор if. Если условие, заключенное в круглые скобки истинно(true), выполнение программы попадет в тело цикла. Отличие лишь в том, что тело цикла будет повторяться до тех пор, пока условие, записанное в его круглые скобки не станет ложным(false). Если Вам не терпится запустить собственную программу, что навсегда повиснет, запустите следующий код:

#include <iostream>


int main()
{

  while( 0 < 1 )
  {
    std::cout << "0 still less 1";
    std::cout << std::endl;
  }

  return 0;
}


  Первая проверка 0 < 1 даст true и мы попадем в тело цикла, где выведем на экран "0 still less 1". Вот только проблема в том, что ноль никогда не станет больше либо равен единице. Так что проверка будет выполняться снова и снова, собственно как и тело цикла. Программа повиснет и будет бесконечно печатать "0 still less 1". Бесконечность эта, правда, ограничена закрытием программы или ее крешем. Как же написать условие, что какое-то время будет истинным, а потом станет ложным?

#include <iostream>

int main()
{

  int i = 0;
  while( i < 10 )
  {
    std::cout << i << std::endl;
    i++;
  }

  system("pause");
  return 0;
}


  Я объявил переменную "i" и инициализировал ее нолем. Первая проверка "i < 10" даст true, так как 0 и вправду меньше 10. Выполнение попадет в тело цикла, где выведется на экран значение переменной i. Но дело в том, что в этом же теле переменная "i" увеличится на один(i++). Получается, цикл будет повторять виток за витком, пока значение переменной "i" не вырастет до 10. Тогда проверка "i < 10" даст false, так как 10 не меньше 10. И выполнение программы покинет цикл. Вернемся к нашим баранам. Ой, студентам.

  Давайте для начала выведем на экран успеваемость всех студентов с помощью цикла:

#include <iostream>


int main()

{
  float studentsProgress[10] =
  {
    3.0f, 4.2f, 3.4f, 3.9f, 4.75f,
    4.2f, 4.8f, 3.1f, 4.4f, 3.8f
  };

  int i = 0;
  while( i < 10 )
  {
    std::cout << studentsProgress[i];
    std::cout << endl;
    i++;
  }

  system("pause");
  return 0;
}

  Условие, что мы использовали ранее для цикла(i < 10) нам вполне подходит, так как студентов в этом примере тоже 10. Зайдя в тело цикла первый раз, программа выведет на экран успеваемость студента с индексом 0(так как в "i" будет содержаться именно он). Затем, значение переменной "i" увеличится на один и в новом витке программа выведет на экран успеваемость студента с индексом 1. И так для всех последующих элементов массива. Когда переменная "i" станет равна 10, выполнение покинет тело цикла.

  Поскольку циклы могут содержать в себе условия, равно как и условия могут содержать в себе циклы, поиск максимального элемента в массиве не составит труда:
#include <iostream>

int main()
{
  float studentsProgress[10] =
  {
    3.0f, 4.2f, 3.4f, 3.9f, 4.75f,
    4.2f, 4.8f, 3.1f, 4.4f, 3.8f
  };

  float maxProgress = studentsProgress[0];
  int i = 0;
  while( i < 10 )
  {
    if( studentsProgress[i] > maxProgress )
    {
      maxProgress = studentsProgress[i];
    }

    i++;
  }

  std::cout << "Max progress is: ";
  std::cout << std::endl;
  system("pause");
  return 0;

}

  На каждом новом витке цикла мы будем сравнивать: не выше ли успеваемость текущего студента, той, что на данный момент считается максимальной. Если выше, то планка будет подниматься, пока ее снова кто-то не переплюнет. Таким образом, пройдя по всему массиву, мы получим желаемое. Заметьте, код для поиска максимального элемента в массиве из 1000 элементов практически такой же.

Комментариев нет:

Отправить комментарий