Второе занятие по С++: вложенные конструкции, циклы.

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

Вложенные конструкции.

Сначала проверим, насколько хорошо ты понял, как можно рисовать блок-схемы. На прошлом занятии мы находили наибольшее из двух чисел. А как найти наибольшее из трех? Очень просто! Вот так:

Обрати внимание: так рисовать МОЖНО! =) Одну конструкцию можно вставлять в другие сколько угодно раз, но конец всегда один. Если из условного блока вышли две ветки, они должны соединиться, когда он закончился. Нельзя соединять более двух ветвей одновременно! Пример правильного соединения — на блок-схеме.

Как реализовать это на С++? Мы также можем использовать вложенные условные операторы — все будет работать!

#include <iostream>

using namespace std;

int main () {
    int a, b, c;
    cin >> a >> b >> c;
    if (a > b) {
       if (a > c) cout << a; //так можно писать, когда в if только один оператор
       else cout << c;
    } else {
       if (b > c) { //смысл тот же, что в первом случае, но так длиннее
           cout << b;
       } else {
           cout << c;
       }
    }
    return 0;
}

Вывод: может быть любое количество условных операторов, вложенных друг в друга, однако надо следить за правильностью оформления. Следите за отступами. Вложенные if-ы находятся правее. На самом деле это необязательно, но так намного проще воспринимать большие, сложные программы.

Циклы.

Сейчас мы вплотную подошли к изучению новой конструкции, которая называется цикл.

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

В виде блок-схемы это выглядит вот так:

Как ты можешь проследить, это программа выводит значение переменной i на экран, и увеличивает ее на 1, пока оно не дойдет до a. В итоге, если a = 10, программа выведет:

0 1 2 3 4 5 6 7 8 9

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

Циклы бывают двух видов: с постусловием и предусловием.

В чем разница? Если i изначально будет больше a (условие неверно), то первый не выполнится, а второй выполниться один раз. Иногда это бывает полезным =)

Переменная i — в данном случае называется счетчиком, т.к. в ней хранится количество пройденных итераций цикла.

Итерация — один проход по циклу, то есть один возврат к началу.

Цикл с предусловием на C++:

int i = 0;
while (i < a) { //условие продолжения
   cout << i; //тело цикла
   i = i + 1;
}

Цикл с постусловием на C++:

int i = 0;
do {
   cout << i; //тело цикла
   ++i; // То же, что и i = i + 1; но короче :)
}
while (i < a); //условие продолжения

Так же, как и условные операторы, циклы могут быть вложенными.

Цикл for
Код вот такого цикла:

int i = 0;
while (i < 10) {
   //тут какой то код, который называется телом цикла
   ++i;
}

Можно записать как:

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

Как ты видишь, for — просто более короткая форма записи цикла. Очень часто так писать бывает удобнее =)

Консольный счетовод.

Задача: С клавиатуры вводятся числа, последнее число — 0, найти сумму этих чисел.

Ввод Вывод
1 2 3 4 5 6 7 8 9 0 55
100500 100500 0 201000

 

Проблема в том, что чисел может быть сколь угодно много… Но теперь с нами цикл, и он всегда готов прийти к нам на помощь =).

В программе нам понадобится дополнительная переменная, в которой мы будем хранить сумму всех введенных на данный момент чисел. Назовем ее sum. Т.к. если мы ничего не ввели, то сумма введенных чисел равна нулю, то и sum изначально будет нулем.

Также нам понадобится переменная, в которую мы будем каждый раз класть вводимое число. Пусть это будет a.

Итак, дамы и господа, встречайте!

Теперь надо попробовать запрограммировать нашего бумажного счетовода! Приступим:

#include <iostream> //уже классика...=)

using namespace std;

int main () {
   int sum = 0, a = 0;
   do { //условие после тела на блок-схеме - используем цикл с постусловием
     cin >> a;
     sum = sum + a;
   } 
   while (a != 0); //пока a не равно 0 
   cout << sum; //выводим
   return 0; //бежим с деньгами в Канаду (шутка =) )
}

Готово! Запускай и тестируй!

Звездный строитель.

Теперь решим чуть более сложную задачку: нужно вывести на экран одностороннюю пирамидку из звездочек высотой n.

Ввод Вывод
3 *
**
***
5 *
**
***
****
*****

 

Секрет этой задачи в том, что нам понадобятся сразу два цикла! Первый будет отвечать за вывод n строк, а второй (внутри него) за вывод нужного количества звездочек на каждой строке. Обрати внимание: число звездочек на строке равно номеру строки. Т.е. на первой строке — одна звездочка, на второй — две и так далее. Попробуем нарисовать блок-схему:

 

Переменных стало много, надо разобраться какая за что отвечает…

n - высота пирамиды
i - счетчик строк, в нем всегда лежит номер строки, которую мы выводим в данный момент
s - счетчик выведенных звездочек на данной строке

endl - это просто перенос строки :)

Переменная i изначально равно 1, т.к. мы выводим первую строчку. Когда номер строки становится больше необходимого количества — цикл строк завершается.

Переменная s приравнивается к нулю в начале каждой строки, т.к. в ней лежит количество уже выведенных звездочек на этой строке. Когда мы только начали — это ноль =)

Затем мы выводим i звездочек. Почему i? i — номер текущей строки, а количество звездочек на строке, как мы заметили ранее, равно номеру строки. Когда мы вывели i звездочек — переходим на следующую строчку.

Фух… А теперь — самое сложное — реализация программы:

#include <iostream>

using namespace std;

int main () {
   int n, i = 1, s = 0;
   cin >> n;
   while (i <= n) {
      s = 0;
      while (s < i) {
         cout << "*";
         ++s;
      }
      cout << endl;
      ++i;
   }
   return 0;
}

А теперь все тоже самое запишем с циклом for:

#include <iostream>

using namespace std;

int main() {
   int n = 0;
   cin >> n;
   for( int i = 1; i <= n; ++i ) {
      for( int s = 0; s < i; ++s ) 
        cout << '*';
      cout << endl;
   }
   return 0;
}

Как видишь, получилось чуть-чуть короче =)

Досрочный выход из цикла(*).

Иногда в программе нужно выйти из цикла в процессе его выполнения или из середины перейти на следующую итерацию. Для этого существуют команды break и continue.

Команда break заставляет немедленно прервать из цикла:

for (int i = 0; i < 10; ++i) {
    cout << i << endl;
    break; //выходим
}
//попадаем сюда
cout << "end";

Такая программа выведет всего лишь 0 end, так как мы принудительно вышли из цикла прямо на первой итерации. Обычно break используют в случае выполнения какого либо условия (вместе с if).

Команда continue принудительно переходит на следующую итерацию цикла.

for (int i = 0; i < 10; ++i) {
    cout << i << " ";
    continue; //идем к началу цикла
    //сюда мы никогда не попадаем =)
    cout<<"text";
}

Эта программа выведет на экран числа от 0 до 9, но никогда не покажет слова end.

В примерах я использовал цикл for, но в while все работает точно также!

Задачи для самостоятельного решения.

2.1 Числа вводятся с клавиатуры. Конец ввода – число 0. Вывести на экран максимальное из введенных чисел.

2.2 Числа вводятся с клавиатуры. Конец ввода – число 0. Вычислить среднее арифметическое введенных чисел (среднее арифметическое — это сумма чисел, деленная на их количество).

2.3 Вводится последовательность чисел, до тех пор, пока не будет введено два равных числа подряд. Вывести на экран количество введенных чисел.

2.4 Число K вводится с клавиатуры. Вывести на экран двухстороннюю пирамиду из звездочек высотой K этажей. Например:

использовать не больше пяти переменных. (cout << » «; выведет пробел =)).

2.5 Вводятся числа. Конец ввода — 0. Вывести разность первого числа и минимального.

2.6 Вводятся числа. Конец ввода — 0. Вывести разность предпоследнего и первого.

2.7 Вводятся числа. Конец ввода — 0. Вывести разность предпоследнего и максимального.

2.8 Числа вводятся с клавиатуры, конец ввода – 0. Требуется вывести на экран произведение этих чисел, если их сумма не превышает 100, или их сумму, в противном случае.

2.9 Число N вводится с клавиатуры. Вычислить N факториал (1 * 2 * 3 *… * (N-1) * N). (N <= 15).

2.10 (*) Число N вводится с клавиатуры. Вывести на экран последовательность из N первых чисел Фибоначчи (каждое последующее число есть сумма двух предыдущих; первое число равно нулю, второе – единице).

Последовательность: 0, 1, 1, 2, 3, 5, 8, 13…

Сложная задача.

2.10 (**) Значение многочлена

Требуется вычислить значение многочлена P(x) = a0 + a1x + a2x2 + … в заданной точке x.

Формат входных данных

В первой строке задано вещественное число x. Во второй строке задана последовательность вещественных коэффициентов многочлена по убыванию степеней an an–1 an–2 … a0. Конец ввода — 0.

Формат выходных данных

Вывести значение многочлена в точке x.

Примеры

Входные данные Выходные данные
1.51 2 1 0 6.25

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

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