Очень часто возникает необходимость выполнить одну и ту же последовательность действий несколько раз: например, для вычисления выражения an необходимо выполнить умножение на величину a n-1 раз. Для этого используются циклы. В данном листочке речь пойдет о цикле for.
Рассмотрим задачу вычисления суммы всех натуральных чисел от 1 до n. Для этого заведем переменную s, и к ней будем прибавлять значение переменной i, где i будет принимать все значения от 1 до n. На языке C++ это можно сделать при помощи цикла for следующим образом:
int n, s=0, i;
cin>>n;
for (i=1; i<=n; ++i)
{
s=s+i;
}
cout<
В этом примере последовательность инструкций в блоке, то есть инструкция s=s+i будет выполнена многократно для всех значений переменной i от 1 до n, то есть в результате переменная s будет равна сумме всех натуральных чисел от 1 до n.
При использовании цикла for необходимо задать три параметра (в круглых скобках через точку с запятой).
Первый параметр – начальное значение переменной, задается в виде присваивания переменной значения, в нашем случае – i=1.
Второй параметр – конечное значение переменной, задается в виде условия на значение переменной. Цикл будет исполняться, пока условие истинно, в нашем случае условие i<=nозначает, что переменная i будет принимать значения до n включительно.
Третий параметр – шаг изменения переменной. Запись ++i означает, что переменная i будет увеличиваться на 1 с каждым новым исполнением цикла, запись --i – уменьшаться.
В нашем примере мы могли бы сделать цикл, в котором переменная i принимала бы все значения от n до 1, уменьшаясь при этом: for(i=n; i>0; --i).
Если хочется, чтобы значение переменной в цикле менялось не на 1, а на большую величину, то это можно сделать, например, так: i=i+2.
Упражнения -
(A) По данному натуральному n вычислите сумму 12+22+...+n2.
-
(B) По данному натуральном n вычислите сумму 13+23+...+n3.
-
(C) По данному натуральном n вычислите сумму 1×2+2×3+...+(n-1)×n.
-
(D) По данным числам a и b выведите на экран все четные числа от a до b включительно. Например, при вводе 1 и 10 программа должна вывести 2 4 6 8 10.
-
(E) По данному числу n вычислите значение n!.
-
(F) По данным натуральным n и k вычислите значение Cnk=n!/(k!(n-k)!) (число сочетаний из n элементов по k).
-
(G) По данному действительному числу a и натуральному n вычислите величину an. Программа считывает значение a и n и выводит an.
-
(H) По данному натуральному n вычислите сумму 1+(1+2)+(1+2+3)+...+(1+2+...+n).
-
(I) По данному числу n вычислите сумму 1+1/22+1/32+...+1/n2. Как вы думаете, к чему приближается эта сумма с увеличением n?
-
(J) По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+...+(-1)n/(2n+1)). Как вы думаете, к чему будет приближаться эта сумма с увеличением n?
-
(K) По данному действительному числу a и натуральному n вычислите сумму 1+a+a2+...+an не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n. Затем решите эту задачу по формуле суммы геометрической прогрессии и сдайте ее в тестирующую систему.
-
(L) Дано 10 целых чисел. Вычислите их сумму. Например, при вводе чисел 1 2 3 4 5 6 7 8 9 10 программа должна вывести 55.
-
(M) Дано несколько чисел. Вычислите их сумму.
Сначала вводится количество чисел N. Затем вводится N целых чисел, программа должна вывести их сумму.
Например, при вводе 3 1 20 300 программа должна вывести 321.
-
(без тестирующей системы) Найдите все двузначные числа, которые равны удвоенному произведению своих цифр. Указание: организуйте цикл, в котором переменная iпринимает значения от 10 до 99, проверьте, равна ли i удвоенному произведению своих цифр.
-
(без тестирующей системы) Квадрат трехзначного числа оканчивается тремя цифрами, равными этому числу. Найдите все такие числа.
Цикл while
В языке C++ существует три вида циклов: цикл while c предусловием, цикл while с постусловием, цикл for.
Цикл while ("пока") с предусловием
Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.
При выполнении цикла while сначала проверяется условие. Если оно ложно, то цикл не выполняется и управление передается на следующую иячнструкцию после тела цикла while. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.
Синтаксис цикла while ("пока") c предусловием такой:
while (условие)
{
блок инструкций
}
Следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10:
int i=1;
while (i<=10)
{
cout< ++i;
}
В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i==11 условие i<=10 впервые перестанет выполняться.
В следующем примере цикл используется для того, чтобы найти количество знаков в десятичной записи целочисленной переменной i.
int Ndigits=0;
while(n!=0)
{
Ndigits=Ndigits+1;
n=n/10;
}
Внутри цикла значение переменной n уменьшается в 10 раз до тех пор, пока она не станет равна 0. Уменьшение целочисленной переменной в 10 раз (с использованием целочисленного деления) эквивалентно отбрасыванию последней цифры этой переменной.
Цикл while ("пока") с постусловием
Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):
do
{
Блок инструкций
}
while (условие);
Поскольку условие проверяется после выполнения тела цикла, то блок цикла с постусловием всегда будет выполнен хотя бы один раз, независимо от истинности условия. Это может привести к ошибкам, поэтому использовать цикл while с постусловием следует только тогда, когда это действительно упрощает алгоритм.
Упражнения
Во всех задачах этого листочка основная (содержательная) часть программы должна быть оформлена в виде функции. Функция main должна считывать значения входных данных, вызывать основную функцию, решающую задачу, выводить результат на экран.
-
(A) Напечатайте все точные квадраты натуральных чисел, не превосходящие данного числа n. (например, при вводе 50 программа должна вывести 1 4 9 16 25 36 49).
-
(B) Дано натуральное число n. Определите, является ли оно степенью числа 2, и выведите слово YES, если является и слово NO, если не является.
-
(C) Для данного натурального числа n определите такое наименьшее целое k, что 2k≥n. Например, при вводе числа 7 программа должна вывести 3.
-
(D YES) В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров. Например, при вводе 10 20 программа должна вывести 9. x и y – действительные числа, ответ – целое число.
-
(E) В первый день спортсмент пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который суммарный пробег спортсмена составит не менее y километров. Например, при вводе 10 100 программа должна вывести 8.
-
(F) Дано натуральное число n. Напишите функцию int SumOfDigits (int n), вычисляющую сумму цифр числа n. Выведите сумму цифр числа n.
-
(G) Дано натуральное число n. Напишите функцию int NumberOfZeroes (int n), определяющую количество нулей среди всех цифр числа n. Выведите результат.
-
(H) Дано натуральное число n. Напишите функцию int MinDigit (int n) и int MaxDigit (int n), определяющую наименьшую и наибольшую цифры данного числа. Выведите наименьшую и наибольшую цифры данного числа (например, при вводе 179 программа выводит 1 9).
-
(I) Вводится последовательность целых чисел до тех пор, пока не будет введено число 0. После ввода числа 0 программа должна завершить свою работу и вывести сумму введенных чисел.
-
(J) По данному натуральному числу n найдите сумму чисел 1+1/1!+1/2!+1/3!+...+1/n!. Количество действий должно быть пропорционально n. Напишите программу, которая считывает значение n и выводит результат в виде действительного числа. К чему будет стремиться эта сумма при росте числа n?
-
(K) По данному числу n выведите n-e число Фибоначчи. Использовать рекурсию нельзя.
-
(L) Напишите функцию int reverse(int n), которая переставляет цифры числа в обратном порядке (например, reverse(179)==971). Напишите программу, которая по данному натуральному n печатает его цифры в обратном порядке.
-
(M) Назовем число палиндромом, если оно не меняется при перестановке его цифр в обратном порядке. Напишите функцию bool IsPalindrome (int n), проверяющую по данному числу n, является ли оно палиндромом. Напишите программу, которая по заданному числу K выводит количество натуральных палиндромов, не превосходящих K. Например, при вводе 1 программа выводит 1, а при вводе 100 программа выводит 18.
Достарыңызбен бөлісу: |