Оператор цикла for. Общая форма. Примеры решения задач

Оператор цикла for. Общая форма. Примеры решения задач


Содержание


1. Назначение оператора цикла for. Общая форма

Цикл for предназначен для организации циклического процесса. С помощью цикла for можно организовывать циклический процесс любого типа, в котором:

  • количество итераций цикла заведомо известно;
  • количество итераций цикла неизвестно и определяется на основе выполнения некоторого условия.

Общая форма оператора цикла for

for (инициализация; условие; выражение)
{
    // некоторые инструкции, операторы
    // ...
}

где

  • инициализация – выражение, инициализирующее переменную-счетчик. Эта переменная определяет количество итераций, которые должны выполниться в цикле;
  • условие – логическое выражение, которое определяет необходимость выполнения следующей итерации цикла. Если условие = true, то выполняется следующая итерация цикла. Если значение условие = false, то происходит прекращение выполнения цикла и переход к следующему оператору, который следует за оператором for;
  • выражение – некоторое выражение, изменяющее значение переменной-счетчика. Необязательно выражение может изменять значение переменной-счетчика. Также переменная-счетчик может изменять свое значение в теле цикла.

Если оператор цикла for применяется для одного оператора, то в общей форме фигурные скобки можно опустить

for (инициализация; условие; выражение)
    оператор;

здесь оператор – один оператор или одна инструкция.

 

2. Разновидности цикла for. Примеры

В цикле for можно опускать любую из его частей (инициализация, условие, выражение). Следующие примеры демонстрируют универсальность цикла for, который может быть использовано по разному.

Пример 1. В примере опущена часть, которая инициализирует переменную-счетчик. Вычисляется сумма

s = 2 + 4 + 8 + … + 100

Фрагмент кода, решающий данную задачу следующий:

// вычислить сумму 2+4+8+...+100
int sum = 0;
int i = 0;

// нет части инициализации переменной-счетчика
for (; i <= 100; i += 2)
    sum += i;
// sum = 2550

Пример 2. В примере опущена часть, которая проверяет условие выполнения следующей итерации. Пример вычисляет сумму элементов массива A.

// вычислить сумму элементов массива A
double[] A = { 2.5, 1.2, 0.8, 3.3, 4.2 };
double sum = 0;
int i;

// нет части, которая проверяет условие выполнения цикла
for (i = 0; ; i++)
{
    if (i == A.Length) break;
        sum += A[i];              
}          
// sum = 12.0

Пример 3. В примере опущена часть выражения, которая изменяет переменную-счетчик. Дано вещественное число a и натуральное число n. Вычислить:

a × (a+1) × … × (a+n-1)

Фрагмент кода, решающий данную задачу

// вычислить произведение a*(a+1)*...*(a+n-1)
int mult;
int i;
int n, a;

n = 5;
a = 4;
mult = 1;

// отсутствует часть прироста переменной-счетчика i
for (i = 0; i < n; )
{
    mult = mult * (a + i);
    i++;
}
// mult = 6720

Пример 4. В примере цикл for не содержит инициализации и условия. Задано натуральное число n. Определить максимальную цифру этого числа.

Решение данной задачи с использованием цикла for (приложение типа Console Application)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // определить максимальную цифру числа n
            int n;
            int t, d;
            int max;

            // ввод n
            Console.Write("n = ");
            n = Convert.ToInt32(Console.ReadLine());

            t = n;
            max = 0; // максимальная цифра

            for (; t > 0; ) // цикл не содержит инициализации и прироста счетчика
            {
                d = t % 10;
                if (max < d) max = d;
                    t = t / 10;
            }
            Console.WriteLine("Max = {0}", max);
        }
    }
}

Результат выполнения вышеприведенной программы:

n = 283915
Max = 9

Пример 5. В примере цикл for не содержит условия и выражения. Выход из цикла for осуществляется с помощью инструкции break.

Задан массив B чисел типа float. Найти позицию pos первого элемента массива, значение которого лежит в диапазоне от -5 до +5.

Фрагмент кода, решающий данную задачу

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // найти позицию первого вхождения
            float[] B = { 12.4f, -11.9f, 7.5f, 2.3f, 1.8f };
            int pos;

            for (pos = 0; ; ) // цикл for не содержит условия и выражения
            {
                if (pos == B.Length)
                    break;
                if ((B[pos] >= -5) && (B[pos] <= 5))
                    break;
                pos++;
            }

            if (pos == B.Length)
                Console.WriteLine("Искомого элемента нет в массиве.");
            else
                Console.WriteLine("pos = {0}", pos);
        }
    }
}

Результат выполнения программы

pos = 3

Пример 6. В примере демонстрируется «пустой» цикл for. В общем случае пустой цикл for выглядит следующим образом:

for ( ; ; )
{
    // некоторые инструкции
    // ...
}

 

3. Примеры цикла for, в котором количество итераций заведомо известно

Пример 1. Найти сумму всех целых чисел от 100 до 200. Фрагмент программы, которая решает данную задачу с использованием цикла for следующий:

// вычислить сумму
int sum;
int i;
sum = 0;
for (i = 100; i <= 200; i++)
    sum += i;
// sum = 15150


Пример 2. Дано натуральное число n. Разработать программу, которая находит следующую сумму

Фрагмент кода, решающий данную задачу

// вычислить сумму
double sum;
int i;
int n;
n = 10;
sum = 0;
for (i = 1; i <= n; i++)
    sum = sum + 1.0 / i;
// sum = 2.92896825396825

Пример 3. Рекурентные соотношения. Последовательность чисел a0, a1, a2, … получается по закону:

Дано натуральное число n. Получить a1, a2, …, an.

Текст программы, которая решает данную задачу, следующий:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // получить a1, a2, ..., an
            double a0, ak;
            int k;
            int n;

            n = 10;
            a0 = 1;
            k = 0;

            Console.WriteLine("a[{0}] = {1}", k, a0);
            for (k = 1; k <= n; k++)
            {
                ak = k * a0 + 1.0 / k;
                Console.WriteLine("a[{0}] = {1}", k, ak);
                a0 = ak;
            }
        }
    }
}

В результате выполнения вышеприведенного кода, будет выведен следующий результат

a[0] = 1
a[1] = 2
a[2] = 4.5
a[3] = 13.8333333333333
a[4] = 55.5833333333333
a[5] = 278.116666666667
a[6] = 1668.86666666667
a[7] = 11682.2095238095
a[8] = 93457.8011904762
a[9] = 841120.321825397
a[10] = 8411203.31825397

 

4. Примеры цикла for, в котором количество итераций заведомо неизвестно

Пример 1. Дано вещественное число a. Найти такое наименьшее n, что

Решение задачи для приложения типа Console Application

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // цикл for, в котором количество итераций заранее неизвестно
            int n;
            double a;
            double t;
            Console.Write("a = ");
            a = Convert.ToDouble(Console.ReadLine());

            // цикл вычисления
            for (n = 1, t = 0; t < a; n++)
                t = t + 1.0 / n;
            Console.Write("n = {0}", n - 1);
        }
    }
}

Выполнение данной программы даст следующий результат

a = 2
n = 4

Пример 2. Задано число a (1<a≤1.5). Найти такое наименьшее n, что в последовательности чисел

последнее число есть меньше чем a.

Ниже приведено решение задачи для приложения типа Console Application

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // найти наименьшее n
            int n;
            double a;
            double t;

            Console.Write("a = ");
            a = Convert.ToDouble(Console.ReadLine());

            // в части инициализации помещаются два выражения
            for (n = 2, t = 1 + 1.0 / n; t >= a; n++)
                t = 1 + 1.0 / n;

            Console.WriteLine("n = {0}", n-1);
        }
    }
}

Как видно из вышеприведенного кода, в цикле for в части инициализации помещаются два выражения, разделенных запятой:

for (n = 2, t = 1 + 1.0 / n; t >= a; n++)
    t = 1 + 1.0 / n;

Выполнение программы для некоторого значения a может быть, например, следующим

a = 1.3
n = 4

 

5. Понятие вложенного цикла for

Цикл for может быть вложенным в любой другой управляющий оператор, которым может быть:

  • оператор условного перехода if;
  • оператор варианта switch;
  • оператор цикла for;
  • оператор цикла while;
  • оператор цикла do…while.

Количество уровней вложения неограничено.

 

6. Примеры решения задач, в которых цикл for есть вложенным в другие циклы

Пример 1. В примере цикл for вложен в другой цикл for.

Напечатать числа в следующем виде:

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5

Фрагмент кода, который решает данную задачу для приложения типа Console Application:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // в цикле for вложен другой цикл for
            for (int i = 1; i <= 5; i++)
            {
                for (int j = 1; j <= i; j++)
                    Console.Write("{0} ", i);
                Console.WriteLine();
            }
        }
    }
}

Пример 2. Цикл for вложен в цикл while.

Найти все целые числа из промежутка от 1 до 300, в которых ровно 5 делителей.

Фрагмент кода, который решает данную задачу

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            // найти все числа от 1 до 300 в которых ровно 5 делителей
            int num;
            int i, k;

            num = 1;
            while (num <= 300)
            {
                k = 0;
                for (i = 1; i <= num; i++) // цикл for вложен в цикл while
                if (num % i == 0) k++;
                if (k == 5)
                    Console.WriteLine("{0}", num);
                num++;
            }
        }
    }
}

Результат выполнения программы

16
81

 


Связанные темы