C#. Оператор цикла 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

 


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