Основы программирования на С++ для начинающих

Задачи: циклы while, do while, вложенные циклы

Мы познакомились с циклами while и do while в C++ и с вложенными конструкциями в циклах. Займёмся решением задач.

1. Организовать беспрерывный ввод чисел с клавиатуры, пока пользователь не введёт 0. После ввода нуля, показать на экран количество чисел, которые были введены, их общую сумму и среднее арифметическое. Подсказка: необходимо объявить переменную-счетчик, которая будет считать количество введенных чисел, и переменную, которая будет накапливать общую сумму чисел.

2. Необходимо суммировать все нечётные целые числа в диапазоне, который введёт пользователь с клавиатуры.

3. Задача посложней. Нарисовать равнобедренный треугольник из символов ^. Высоту выбирает пользователь. Например: высота = 5, на экране

задачи вложенные циклы

173 thoughts on “Задачи: циклы while, do while, вложенные циклы

  1. #include
    #include
    using namespace std;

    int main()
    {
    int h;
    cout << "Enter height: " <> h;
    for (int i = 1; i <= h; i++)
    {
    cout << setw(h – i+1);
    for (int l = 1; l <= i; l++)
    {
    if (l == 1)
    cout << "^";
    else
    cout << "^^";
    }
    cout << endl;
    }
    system("pause");
    }

  2. Добрый день!
    Не могу разобраться в последней задаче.

    #include
    using namespace std;
    int main()
    {
    setlocale(LC_ALL, “rus”);
    int height = 0; // высота треугольника
    cout <> height;
    for (int i = 0; i < height; i++)
    {

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

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

    1. Ещё проще объяснений вы просто не найдёте – проще не бывает (поэтому и здесь объяснения с упрощениями, умолчаниями и, как следствие, с неточностями).
      Если вам непонятно, то непонятно не то, что связано с языком C++, а то, что связано вообще с логикой построения вычисления, алгоритмированием. Вот на эту часть (логику) и обратите внимание.

    2. Вложенные циклы достаточно просты в теории, но бывают заковыристыми на практике. Опишите что именно непонятно? Тут тройная матрёшка: самая верхняя – большой цикл выводит строки, в зависимости от высоты фигуры, два вложенных цикла в нее “сидят” рядом на двух стульях, только команды выполняют последовательно: сначала первый вложенный выводит нужное количество пробелов, затем второй вложенный необходимое количество символов – потом следующая строка…..и так далее вниз до конечной цифры высоты.

    3. Для тех, кто в танке, попробую разжевать (для самого себя тоже =) ):

      for (int i = 0; i > height высоте треугольника*/
      {
      for (int j = 1; j < height – i; j++) /*Цикл, которым мы рисуем пробелы перед символом "^". Выполняется (height – i – 1) кол-во раз. То есть за каждый проход внешнего цикла длина пустой строки снижается на i (переменная i увеличивается на единицу за каждый проход внешнего цикла, поэтому кол-во раз выполнения этого маленького цикла снижается на 1, соответственно длина пустого поля перед символом в строке тоже каждый раз сокращается).*/
      {
      cout << ' ';
      }

      for (int j = height – 2 * i; j <= height; j++) /*второй маленький цикл пишет символы "^"в кол-ве height – (height – 2 * i) + 1. Кажется немного запутанно на первый взгляд. Если внешний цикл печатает первую строку (i=0), то кол-во символов будет равно: height – height + 2*i + 1 = 1 + i*2;

      Из уравнения видно, что применение переменной height здесь вовсе ни к чему – она взаимоуничтожается при решении уравнения. При любом её значении она не влияет на кол-во выполняемых циклов. Это не ошибка программиста, но, что называется, "быдлокод" – некрасивое решение задачи с одной совершенно ненужной переменной, вводящей в заблуждение читателя.

      Поэтому может показаться затруднительным понять такую запутанную конструкцию, ведь в ней совершенно не обязательно использование "высоты треугольника". Ниже я предложу свой вариант решения, без участия переменной height, ведь вместо нёё можно поставить вообще любое значение, хоть ноль, хоть -242148: результат будет тот же! */
      {
      cout << '^';
      }
      cout << endl;
      }

      Вот как я решил эту задачу без участия переменной height во втором вложенном цикле (изменение только в одном цикле, все остальное оставил как и было):

      #include
      using namespace std;

      int main()
      {
      setlocale(LC_ALL, “rus”);

      int height = 0; // высота треугольника

      cout <> height;

      for (int i = 0; i < height; i++)
      {
      for (int j = 1; j < height – i; j++)
      {
      cout << ' ';
      }

      for (int j = 0; j < i * 2 + 1; j++) /* кол-во символов "^" в строке определяется уравнением: (кол-во символов) = i * 2 + 1. Как видите, использована всего одна переменная из внешнего цикла. Таким образом, кол-во символов будет возрастать на 2 каждый проход внешнего цикла. Всё просто! */
      {
      cout << '^';
      }
      cout << endl;
      }
      return 0;
      }

      Надеюсь, мой комментарий кому-нибудь поможет понять эту задачу. Всех благ! P.S. Я сам только учусь, не кидайтесь тапками =)))

  3. Обратить то я обратил, только что толку с этого? Я до сих пор не понимаю все те действия, которые находятся во внешнем цикле.

    1. “не понимаю все те действия” – это всё не относится к языку С++, и более того, не относится к программированию вообще.
      Это область аналитического мышления, математического способа восприятия, логических построений … – этому учат в других местах и других курсах.

    1. Не пишите сюда эти свои глупости (которые считаете программным кодом). Пишите это лучше … на заборах ;-)

  4. Сформировать список из последовательности натуральных чисел r1, r2, r3, … rn , которые вводятся с клавиатуры. Вывести данные числа сначала в обратном порядке, а затем в порядке ввода. Из полученного списка удалить все числа, кратные 3 и вывести полученный список.

    1. Сформировать список из последовательности натуральных чисел r1, r2, r3, … rn , которые вводятся с клавиатуры. Вывести данные числа сначала в обратном порядке, а затем в порядке ввода. Из полученного списка удалить все числа, кратные 3 и вывести полученный список.Помогите мне пжста

    2. vaillant, здесь же сайт, который ставит своей целью хоть чему-то научить своих читателей относительно C++, а не делать вместо читателей их домашние задания.

      А если вам уже совсем “в край” караул по домашнему заданию к уроку, который вы прогуляли – тогда вам сюда: https://purecodecpp.com/archives/2821

  5. Автор, спасибо за ваш труд!

    Во втором вложенном цикле вы намудрили с переменной height в условии цикла. Она не нужна, а лишняя макулатура, как говориться, голову морочит новичкам. Я сам не сразу понял, что она там лишняя. Вот моё лаконичное решение с использованием всего двух переменных вместо трех:

    for (int j = 0; j < i * 2 + 1; j++) /* кол-во символов "^" в строке определяется уравнением: (кол-во символов) = i * 2 + 1. Как видите, использована всего одна переменная из внешнего цикла. Таким образом, кол-во символов будет возрастать на 2 каждый проход внешнего цикла. Всё просто! */

  6. Ломал бошку часа 2. (Только осваиваю С++). Туго с логикой. В ответ не подглядывал. В итоге получилось, но гораздо громозче чем у автора.
    Кстати, автор, что скажете?

    1. странно, почему-то код на сайте другой становится, не тот, что я скидывал. Где cin? Где запрос на ввод высоты.

      1. 1. Редактор комментариев портит код.
        2. Уже не один раз писалось здесь: не пишите свой код в комментарии – он никому не нужен.
        3. Никто не станет комментировать ваш код, даже если бы он и не был искажён.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *