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; // задано деяке 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

 


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