Обработка данных в циклах
Циклические конструкции – это очень мощный инструмент, который предназначен не просто для повторения какого-то действия заданное число раз. Существует масса алгоритмов, созданных для обработки большого количества данных, причем, алгоритмы эти могут быть как элементарными, так и довольно изощренными. Начнем с алгоритма, который встречается повсюду: вычисление суммы элементов какой-то последовательности. Рассмотрим самый простой случай:
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;
cout << "Введите число N:\n";
cin >> N;
int sum = 0;
for (int i=1; i<=N; i++) {
//Напомним, что эта запись
//эквивалентна sum = sum+i;
sum += i;
}
cout << "Сумма чисел от 1 до " << N << "\n";
cout << "равна " << sum << "\n";
Подумайте теперь, как вычислить другую сумму:
1 + 1/2 + 1/3 + … + 1/(N-1) + 1/N.
На первый взгляд, сложностей нет никаких, и нужно просто изменить тип переменной sum на float и заменить выражение sum+=i на sum+=1/i. Однако после запуска на экране появится число 1. Почему? Данная проблема затрагивалась в теме «Операции и выражения» в разделе «Приведение типов». Дело в том, что оператор деления в некотором смысле интеллектуальный: он возвращает значение целого типа, если оба аргумента целые, а вещественным значение является только в том случае, когда хотя бы одно из значений вещественное. Поэтому решить данную проблему можно двумя способами:
float_sum += (float) 1/i;
float_sum += 1.0/i;
Задача 1. Напишите программу, которая принимает с клавиатуры число N и выводит все четные числа из диапазона от 1 до N.
|
|
#include "stdafx.h"
#include <clocale>
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
int N;
cout << "Введите число N:\n";
cin >> N;
for (int i=2; i<=N; i+=2) {
cout << i << " ";
}
system("pause");
return 0;
}
Задача 2. Напишите программу, которая принимает с клавиатуры число N и вычисляет сумму 1/21+1/22+…+1/2N.
#include "stdafx.h"
#include <clocale>
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
int N;
cout << "Введите число N:\n";
cin >> N;
float result = 0;
int denominator = 2;
for (int i=1; i<=N; i++) {
result += (float) 1/denominator;
denominator *= 2;
}
cout << "Результат равен " << result << "\n";
system("pause");
return 0;
}
Задача 3. Напишите программу, которая принимает с клавиатуры число N и выводит N первых членов последовательности Фибоначчи, которая задается следующими соотношениями: a0=0, a1=1 и an=an-1+an-2. Другими словами, очередной элемент этой последовательности равен сумме двух предыдущих.
#include "stdafx.h"
#include <clocale>
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
int N;
cout << "Введите число N:\n";
cin >> N;
int a0 = 0;
int a1 = 1;
for (int i=0; i<N; i++) {
int a2 = a0+a1;
cout << a0 << " ";
a0=a1;
a1=a2;
}
system("pause");
return 0;
}
Задача 4. Напишите программу, которая переводит числа из десятичной системы исчисления в семеричную.
#include "stdafx.h"
#include <clocale>
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
int base = 7;
int number = 1000;
while (number > 0) {
cout << number%base;
number/=base;
}
system("pause");
return 0;
}
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
- Приведите примеры, когда целесообразно использовать циклическую конструкцию.
- Какие типы циклов существуют в языке Си? Объясните их работу.
- Приведите примеры, когда определенный тип цикла использовать лучше, чем другой.
- Что такое вложенные циклы? Приведите примеры
- Объясните работу операторов break и continue. Приведите примеры.
- Как вычислить сумму элементов последовательности, используя циклы. Приведите пример.
- Как перевести число из одной системы исчисления в другую? Приведите пример.