Статья Автор: Лебедев Дмитрий

Конспект 5. Цикл while


C++_Цикл while. Часть 1

В программировании часто возникает задача повторения одного и того же действия несколько раз. Для этого обычно используются циклы. Рассмотрим цикл while (пока) на примере нескольких задач.

Задача про сумму чисел от 1 до 100

Вывести на экран все числа от 1 до 100 и их сумму.

Решение

#include <iostream>
using namespace std;
int main()
{
    int i, s;
    i = 1;
    s = 0;
    while (i <= 100){
        cout << i << " ";
        s = s + i;
        i = i + 1;
    }
    cout << s << endl;
    return 0;
}
 

В даннoм примере мы выполняем действия внутри цикла while до тех пор, пока логическое выражение i<=100 истинно.

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

Задача про степень двойки

Найдём наибольшую степень двойки, которая не превосходит 1000.

Решение

#include <iostream>
using namespace std;
int main()
{
    int ans = 1;
    while (ans * 2 < 1000){
        ans = ans * 2;
    }
    cout << ans;
    return 0;
}

Заметим, что если мы напишем в условии выхода из цикла ans<1000, то мы получим первую степень двойки, большую или равную 1000.

Задача про наибольшее число в последовательности

Дана последовательность чисел, необходимо найти самое большое число в последовательности. Признаком завершения последовательности является число 0.

Решение

#include <iostream>
using namespace std;
int main()
{
    int x, ma = 0;
    cin >> x;
    while (x != 0){
        if (x > ma){
            ma = x;
        }
        cin >> x;
    }
    cout << ma << endl;
    return 0;
}
 

Задача про цифры числа

Дано число xx. Необходимо посчитать количество и сумму его цифр.

Решение

#include <iostream>
using namespace std;
int main()
{
    int x, cnt = 0, s = 0;
    cin >> x;
    while (x > 0){
        cnt = cnt + 1;
        s = s + x % 10;
        x = x / 10;
    }
    cout << cnt << " " << s << endl;
    return 0;
}
 

Заметим, что программа даст неправильный ответ для числа 0 (в его записи присутствует одна цифра). Этот случай нужно рассмотреть отдельно.


C++_Цикл while. Часть 2

Задача про наибольшее число в последовательности

Дана последовательнось чисел. Необходимо найти самое большое число в последовательности. Признаком завершения последовательности является число 0.

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

#include <iostream>
using namespace std;
int main()
{
    int maxx, now;
    cin >> now;
    maxx = now;
    while (now > 0){
        if (now > maxx){
            maxx = now;
        }
        cin >> now;
    }
    cout << maxx << endl;
    return 0;
}
 

Задача про количество максимумов в последовательности

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

#include <iostream>
using namespace std;
int main()
{
    int maxx, now, cntmax = 0;
    cin >> now;
    maxx = now;
    while (now > 0){
        if (now > maxx){
            maxx = now;
            cntmax = 1;
        } else if (now == maxx){
            cntmax = cntmax + 1;
        }
        cin >> now;
    }
    cout << maxx << " " << cntmax << endl;
    return 0;
}
 

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

Если в реализации программы допустить ошибку, то цикл может работать бесконечно долго. Рассмотрим это на примере задачи, в которой требуется вывести все числа от 1 до n.

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int i = 1;
    while (i <= n){
        cout << i << " ";
    }
    return 0;
}
 

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

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int i = 1;
    while (i <= n){
        cout << i << " ";
        i = i + 1;
    }
    return 0;
}

C++_Цикл while. Часть 3

Задача о локальных максимумах

Элемент последовательности называется локальным максимумом, если он строго больше предыдущего и последующего элементов последовательности. Первый и последний элементы последовательности не являются локальными максимумами.

Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих локальных максимумов в этой последовательности.

Решение

#include <iostream>
using namespace std;
int main()
{
    int prev, now, next, cnt = 0;
    cin >> prev;
    cin >> now;
    cin >> next;
    while (next > 0){
        if (now > prev && now > next){
            cnt = cnt + 1;
        }
        prev = now;
        now = next;
        cin >> next;
    }
    cout << cnt << endl;
    return 0;
}

C++_Цикл while. Часть 4

Познакомимся с инструкциями break и continue.

Задача о поиске числа

Дана последовательность и число x. Необходимо вывести номер позиции, в которой число x первый раз встречается в последовательности. Если число x не присутствует в последовательности, то необходимо вывести количество элементов в ней. Признаком завершения последовательности является число 0.

Решение

Для решения задачи используем команду break. Данная инструкция применяется только внутри цикла. Если она запустилась, то выполнение цикла немедленно останавливается, и программа переходит на первую инструкцию после цикла.

#include <iostream>
using namespace std;
int main()
{
    int x, now, i = 0;
    cin >> x;
    cin >> now;
    while (now > 0){
        if (now == x){
            break;
        }
        i = i + 1;
        cin >> now;
    }
    cout << i;
    return 0;
}

Инструкция break сильно затрудняет чтение кода, поэтому использовать её не рекомендуется.

Задача о чётных числах

Дана последовательность. Необходимо вывести сумму всех чётных элементов последовательности. Признаком завершения последовательности является число 0.

Решение

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

#include <iostream>
using namespace std;
int main()
{
    int now, summ = 0;
    cin >> now;
    while (now > 0){
        if (now % 2 != 0){
            cin >> now;
            continue;
        }
        summ = summ + now;
        cin >> now;
    }
    cout << summ << endl;
    return 0;
}

Заметим, что в данной задаче можно написать более понятное и простое решение без инструкции continue. Инструкция continue сильно затрудняет чтение кода, поэтому использовать её не рекомендуется.


Задачи для тренировки

1) Трискайдекафобия

 
2) Номер числа Фибоначчи  
3) Банковские проценты  
4) Минимальный простой делитель  
5) Количество элементов, которые больше предыдущего  
6) Количество локальных максимумов  
7) Среднее значение последовательности  

Задачи с разбором

Разбор задачи "Второй минимум"
z1*)  Второй минимум  

Печать