Циклические конструкции – это очень мощный инструмент, который предназначен не просто для повторения какого-то действия заданное число раз. Существует масса алгоритмов, созданных для обработки большого количества данных, причем, алгоритмы эти могут быть как элементарными, так и довольно изощренными. Начнем с алгоритма, который встречается повсюду: вычисление суммы элементов какой-то последовательности. Рассмотрим самый простой случай:
1 + 2 + 3 + … + (N-1) + N.
Конечно, человек, знакомый со школьным курсом математики, знает понятие арифметической прогрессии и быстро вычислит сумму по формуле
1 + 2 + 3 + … + (N-1) + N = N*(N+1)/2.
Однако для того, чтобы уловить алгоритм, представим, что данную формулу не знаем ни мы, ни компьютер. Компьютер просто выполняет команды одну за другой, поэтому наша задача заключается в том, чтобы разбить рассмотренное выражение на элементарные операции, после выполнения которых будет вычислена сумма. Существует стандартный подход, позволяющий это сделать. Более того, этот подход используется при решении и других задач, некоторые из которых рассматриваются в следующих темах.
|
|
Итак, для подсчета требуемой суммы нужно объявить переменную (назовем ее sum) и инициализировать ее нулем, а затем на каждой итерации цикла прибавлять очередной элемент к этой переменной. После обработки всей последовательности переменная sum будет равна сумме всех элементов. Например, при N=7 переменная sum последовательно примет следующие значения: 0, 1, 3, 6, 10, 15, 21 и 28. Последнее значение, равное 28, является суммой чисел от 1 до 7.
int N;
printf("Введите число N:\n");
scanf("%d", &N);
int sum = 0;
for (int i=1; i<=N; i++) {
//Напомним, что эта запись
//эквивалентна sum = sum+i;
sum += i;
}
printf("Сумма чисел от 1 до %d\n", N);
printf("равна %d\n", sum);
Подумайте теперь, как вычислить другую сумму:
1 + 1/2 + 1/3 + … + 1/(N-1) + 1/N.
На первый взгляд, сложностей нет никаких, и нужно просто изменить тип переменной sum на float, заменить выражение sum+=i на sum+=1/i и поставить спецификатор %f в последнем printf(). Однако после запуска на экране появится число 1. Почему? Данная проблема затрагивалась в теме «Операции и выражения» в разделе «Приведение типов». Дело в том, что оператор деления в некотором смысле интеллектуальный: он возвращает значение целого типа, если оба аргумента целые, а вещественным значение является только в том случае, когда хотя бы одно из значений вещественное. Поэтому решить данную проблему можно двумя способами:
float_sum += (float) 1/i;
float_sum += 1.0/i;