Оператор циклу 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; // задано деяке n
            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

 


Зв’язані теми