Оператор цикла с условием - while


Изучая цикл for, мы говорили, что если известно число повторений каких-либо действий, то можно сократить программу, используя оператор цикла for. А что делать, если количество повторений не известно? А такое бывает довольно часто.
Например, вспомним перевод числа из десятичной системы счисения в любую другую: нам необходимо делить число (а затем результат деления) на основание системы счисления, пока в ответе мы не получим ноль. Сколько раз мы поделим - неизвестно. А программ, реализщующих такой алгоритм, достаточно много. 
Как же это реализовывается?
Для таких случаем в программировании существует оператор цикла с условием. 
В языке программировании Pascal, оператор цикла с условием начинается со слова while и имеет следующую конструкцию.
while <условие> do begin
  тело цикла
end
Как нам уже известно:
- условие - это выражение, результатом которого может быть либо истина либо ложь (как в условном операторе)
- тело цикла - это команды, которые необходимо повторить
- begin и end можно опустить, если тело цикла состоит из одного только оператора

Как работает оператор:
1. Сначала программа вычисляет условие, стоящее после слова while. Если условие выполнятся (истинно), то программа выполняет оператор(ы), содержащийся в теле цикла.
2. Как и в цикле for, если тело цикла содержит только один оператор, то слова begin и end, выделяющие тело цикла, можно опустить.
3. После того, как завыршено выполнение тела цикла, программа возвращается на проверку условия и заново его проверяет.
4. Эти действия (проверка условия - выполнение тела цикла) повторяются до тех пор, пока условие не станет ложным.
5. Если при первом выполнении данного оператора, условие сразу не выполняется (ложно), то программа ни разу не выполнит тело цикла.

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

Пример программы, которую мы назовем "Молчаливый счет"
Заставим программу вместо нас считать, например, до 10.
Программа должна выводить фразу, "Start" и "Finish", и между этими действиями выводить на экран числа, которые считаются.
Например так, 
Start
1 2 3 4 5 6 7 8 9 10
Finish
Программа, с использованием цикла while, будет выглядеть следующим образом.
var i: integer;
begin
    writeln('Start');
    i := 1;
    while i <= 10 do begin
        write(i, ' ');
        i += 1; //Оператор, который влияет на изменение переменной в условии    
    end;
    writeln();
    writeln('Finish');
end.
В данной программе мы присваиваем значение переменной i := 1 - начало отсчета
Далее, пока у нас значение переменной i не больше (то есть меньше либо равно) нужного нам значения, мы 
 1 - выводим на экран значение переменной i 
 2 - увеличиваем значение переменной i на 1 - данный оператор, влияет на значение условия, стоящего в скобках. Переменная i увеличивается, то есть в какой-то момент условие i<=10 станет ложным. Это произойдет, когда i станет равно 11. В этом случае тело цикла выполняться уже не будет, и программа будет выполнять следующий после цикла оператор, т.е. writeln();
writeln('Finish');

Попробуем написать программу для решения следующей задачи:

Необходимо ввести число (пусть оно будет меньше 3 000 000) и определить количество цифр в нем.

Идея решения


Заведём счётчик цифр числа. Изначально счётчик равен 0. Нам необходимо просто последовательно отсекать от числа последнюю цифру (сделать это можно, уменьшив число в 10 раз, применяя целочисленное деление на 10), при этом каждый раз необходимо увеличить счетчик на 1. 
В итоге после того, как мы отсечём все цифры, в счётчике мы получим количество цифр в числе.
По-другому алгоритм можно сформулировать так:
ПОКА ЧИСЛО НЕ РАВНО НУЛЮ, УМЕНЬШИТЬ ЕГО В 10 РАЗ и УВЕЛИЧИТЬ СЧЕТЧИК НА 1.
число (n) счетчик
123 0
12 1
1 2
0 3
Программа будет выглядеть следующим образом.
var n, count: integer;
begin
    read(n);
    count := 0;
    while n <> 0 do begin
        count += 1;
        n := n div 10;
    end;
    writeln('Number - ', n, ' contains ', count, ' digits');
end.
Данную программу нужно знать наизусть, т.к. на ее основе решаются многие другие задачи, связанные с вычислением по цифрам числа.

Задача

На вход программы поступает поток данных — последовательность целых чисел, которая заканчивается нулём (ноль не входит в последовательность). Требуется найти сумму элементов этой последовательности.
 
Алгоритм решения
 sum=0
 ввод x           // ввести первое число 
 пока x != 0      // в условии ставится признак окончания ввода, 
 нц               // то есть пока не ввели ноль
   sum = sum + x // с исходным числом можно выполнить какие-либо действия. 
                  // Можно добавить проверку числа на какое-то условие и т.д.
   ввод x         // ввести следующее число
 кц
 вывести sum      //вывод результата