Примеры решения задач. Циклические конструкции – это очень мощный инструмент, который предназначен не просто для повторения какого-то действия заданное число раз

Обработка данных в циклах

Циклические конструкции – это очень мощный инструмент, который предназначен не просто для повторения какого-то действия заданное число раз. Существует масса алгоритмов, созданных для обработки большого количества данных, причем, алгоритмы эти могут быть как элементарными, так и довольно изощренными. Начнем с алгоритма, который встречается повсюду: вычисление суммы элементов какой-то последовательности. Рассмотрим самый простой случай:

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;

}

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

  1. Приведите примеры, когда целесообразно использовать циклическую конструкцию.
  2. Какие типы циклов существуют в языке Си? Объясните их работу.
  3. Приведите примеры, когда определенный тип цикла использовать лучше, чем другой.
  4. Что такое вложенные циклы? Приведите примеры
  5. Объясните работу операторов break и continue. Приведите примеры.
  6. Как вычислить сумму элементов последовательности, используя циклы. Приведите пример.
  7. Как перевести число из одной системы исчисления в другую? Приведите пример.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: