Проаналізуйте теоретичний матеріал та опрацюйте дану добірку опорних задач

Циклічними програмами називають програми, в яких реалізовано команди циклу. Цикли служать для багаторазового повторення деякого фрагмента коду. У Сі-шарп є чотири оператора циклів: for, while, do-while, foreach.

1. Цикл for

Цей цикл використовується тоді, коли наперед відомо, скільки повторень потрібно зробити (його ще прийнято називати циклом із параметром). Він має наступну структуру:

for (ініціалізація лічильника; умова продовження; ітерація)

{

    // блок коду, який буде повторюватися

}

Приклад програми, яка виводить на екран числа 0, 1, 2, 3, 4:

for (int i = 0; i <5; i ++) // цикл виконається 5 разів

 {

       Console.WriteLine (i);

}

Спочатку відбувається створення і ініціалізація лічильника, i = 0. Далі йде перевірка умови (i <5), якщо результат буде «істина», то далі виконується блок коду в тілі циклу. Наприкінці ітерації відбувається зміна значення лічильника (у даному прикладі збільшення на одиницю). Після цього знову відбувається перевірка умови і так далі. Коли умова буде «хибно», цикл роботу завершить.

Приклад циклу for (виведення чисел 5, 4, 3, 2, 1), коли лічильник зменшується після кожної ітерації:

for (int i = 5; i> 0; i--) // виконається 5 разів

{

    Console.WriteLine (i);

}

Лічильник можна змінювати не тільки на одиницю.  Приклад програми, яка виводить парні числа (по число 50):

for (int i = 2; i <= 50; i + = 2) // виконається 26 разів

{

         Console.WriteLine (i);

}

2. Цикл while

Слово while перекладається, як «поки», що добре його характеризує. Він продовжує виконуватися до тих пір, поки «істинно» деяка умова. Він має таку структуру:
while (умова продовження)
{
    // блок коду, який буде повторюватися
}
Спочатку перевіряється умова, а далі виконується блок коду.
Приклад тієї ж програми, яка виводить на екран числа 0, 1, 2, 3, 4:
int i = 0;
while (i <5)
{
    Console.WriteLine (i);
    i ++;
}
3. Цикл do-while
 Цей той же цикл while, тільки тут спочатку виконується блок коду, а вже потім йде перевірка умови. Це гарантує хоча б один прохід циклу.
do
{
// блок коду, який буде повторюватися
}
while (умова продовження);

Приклад програми введення чисел з клавіатури, яка не завершить роботу, поки з клавіатури не введуть число 5:

    int n;
    do
    {
       Console.WriteLine ("Введіть число (завершити введення чисел - число 5)");
       n = Convert.ToInt32 (Console.ReadLine ());
    }
    while (n! = 5);
 

Оператор break

З будь-якого циклу можна достроково вийти, використовуючи оператор break.
Приклад програми, яка перевіряє, чи є в масиві число кратне 13-ти. Знайшовши таке число, немає сенсу далі перевіряти інші елементи масиву, і тут використовуємо оператор break:

    int [] numbers = {4, 7, 13, 20, 33, 23, 54};
    bool b = false;
    for (int i = 0; i <numbers.Length; i ++)
    {
       if (numbers [i]% 13 == 0)
       {
          b = true;
          break;
       }
    }
    Console.WriteLine (b? "У масиві є число кратне 13": "У масиві немає числа кратного 13");
    Console.ReadKey ();

Оператор continue
Даний оператор дозволяє перейти до наступної ітерації, не завершивши до кінця поточну. Приклад програми, яка знаходить суму непарних елементів масиву:

    int [] numbers = {4, 7, 13, 20, 33, 23, 54};
    int s = 0;
    for (int i = 0; i <numbers.Length; i ++)
    {
       if (numbers [i]% 2 == 0)
          continue; // перехід до наступної ітерації
       s + = numbers [i];
       }
    Console.WriteLine (s);
    Console.ReadKey ();


Тренувальні вправи (опорні вправи)  

Приклад 1. Знайти суму перших n натуральних чисел

            int n, sum = 0;
            Console.Write ("n=");
            n = int.Parse (Console.ReadLine());
            for (int i = 1; i <= n; i++)
                      sum = sum + i;
            Console.WriteLine("s={0}",sum); 

n=15
s=120

Приклад 2. З клавіатури вводяться цілі числа. Знайти їх суму. Ознакою завершення вводу - число 9999.

          int n, s=0;
         Console.WriteLine("Ввести число. Ознака завершення вводу - число 9999");
         n=int.Parse(Console.ReadLine());
         while (n!=9999)
         {
          s+=n;
          Console.WriteLine("Ввести наступне число");
          n = int.Parse(Console.ReadLine());
         }
         Console.WriteLine("s={0} ",s);

Тренувальні вправи

Завдання 1. Серед чисел з проміжку [2, 25] вибрати та вивести на екран ті, що кратні 3, та знайти і вивести їх кількість

            int n;
            int k=0;
            for (n = 2; n <= 25; n++)
            {
                if (n % 3 == 0)
                {
                    Console.Write("{0} ",n);
                    k++;
                }
            }
            Console.WriteLine();
            Console.WriteLine("k={0}", k);
            Console.ReadKey();

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

3 6 9 12 15 18 21 24
k=8

Завдання 2. Середнє арифметичне двозначних чисел

            int n, int k=0;
            int s = 0;
            double sa;
            for (n = 10; n < 100; n++)
            {
                s += n;
                k++;
            }
            sa = s / k;
            Console.WriteLine("s={0}   k={1}   sa={2} ", s,k,sa);

Завдання 3. Серед тризначних чисел вибрати ті, що кратні 125.

            int n;
            for (n = 100; n < 1000; n++)
                  if (n%125==0)         
                     Console.WriteLine("{0} ", n);

Результат виконання програми: 125 250 375 500 625 750 875

Завдання 4. Згенерувати випадкове число та знайти кількість кратних йому чисел із промiжку (a,b).

            Random rand = new Random();
            int n = rand.Next(1, 30);
            int a,b;
            int k = 0;
            Console.Write("a=");
            a = int.Parse(Console.ReadLine());
            Console.Write("b=");
            b = int.Parse(Console.ReadLine());
            for (int i = a; i <= b; i++)
            {
                if (i % n == 0)
                    k++;
            }
           Console.WriteLine("Випадкове число {0} ", n);
           Console.WriteLine("У заданому промiжку чисел, що кратнi {0} - {1} ", n, k);
            Console.ReadKey();

Завдання 5. Тротабулювати функцію y=(2*x*x-1)/(x-1) на проміжку (-5, 5) з кроком: 1,  2.

1) for (int x = -5; x <= 5; x++)
            {
                if (x == 1) Console.WriteLine("При х={0} y не можна визначити", x);
                else
                {
                    float y = (2*x *x - 1) / (x-1);
                    Console.WriteLine("При х={0} y= {1:f1} ", x, y);
                }
            }

2)         int x = -5;
            while (x <= 5)
            {
                if (x == 1) Console.WriteLine("При х={0} y не можна визначити", x);
                else
                {
                    float y = (2*x *x - 1) / (x-1);
                    Console.WriteLine("При х={0} y= {1:f1} ", x, y);
                   
                }
                x = x + 2;
            }

Завдання 5-1. 

double x = -(Math.PI) / 2;
            while (x <= (Math.PI) / 2)
            {
                double y = Math.Sin(x);
                Console.WriteLine("При х={0:f1}      y= {1:f1} ", x, y);
                x = x + (Math.PI) / 6;
            }

 

Завдання 6. Обчислити значення виразу . В циклі записуються відразу дві ітеррації

            int n,c;
            Console.Write("n=");
            n = int.Parse(Console.ReadLine());
            double d;
            double sum = 0;
            for (c = 1, d = 0.3; c <= n; c++, d += 0.1) //с - значення чисельника, d - значення знаменника
                      sum += c / d;
            Console.WriteLine("sum={0:f3}", sum);

Завдання 7. Знайти добуток непарних натуральних чисел, що менші за K

Примітка. Оператор continue може бути використаний у будь-якому із циклів у випадку, коли немає потреби виконувати до кінця усі оператори тіла циклу поточної ітерації, а необхідно одразу перейти до наступної ітерації

Оскільки нас цікавлять тільки непарні числа, то випадок парного числа ігноруємо.

  int K;
 Console.Write("K=");
 K=int.Parse(Console.ReadLine());
 int dob=1;
 for (int i = 1; i<=K; i++)
 {
 if ((i % 2) == 0) continue;
 dob *= i;
 }
 Console.Write("Добуток ={0}",dob);

Завдання 8. Знайти найменше значення факторіалу натурального числа, що перевищує число K.

Примітка. Оператор break у циклах використовують для негайного виходу з того циклу, в тілі якого він знаходиться.

            int K;
            Console.Write("K=");
            K = int.Parse(Console.ReadLine());
            int fakt = 1;
            for (int i = 1; ; i++) // тут немає ознаки завершення циклу
            {
                fakt *= i;
                if (fakt > K) break;  // тут ознака завершення циклу
            }
            Console.WriteLine("fakt={0}", fakt);

Вкладені цикли

Часто буває так, що при повтореннях змінюється не одна величина, а дві (чи навіть більше). І при кожному значенні однієї величини інша величина «пробігає» усі свої значення.

У деяких випадках важливо повторити підзадачу кілька разів усередині більш загальної задачі. Один зі способів написання такої програми - включити цикл у набір інструкцій, що повторюються всередині іншого циклу. Така структура, що складається з циклу в циклі, називається вкладеними циклами.

Вкладення циклів використовується зокрема при розв'язуванні таких задач:

  • задачі на перебір варіантів;
  • табулювання функцій;
  • обробка двовимірних масивів.

Якщо в програмі використовуються вкладені цикли, то для підвищення наочності програмного коду прийнято кожний наступний рівень вкладання зміщувати відносно попереднього. Правило вкладення циклів: внутрішній цикл цілком укладається в тіло зовнішнього циклу.

Наприклад. Старовинна задача. Скільки можна купити биків, корів та телят, якщо вартість одного бика - 10 руб, однієї корови - 5 руб, а за одного теля платять 0,5 рубля. І якщо на 100 рублів потрібно купити 100 голів скоту.

Розв'язування:

Позначимо через b кількість биків; k - кількість корів; t - кількість телят. Після цього можна записати два рівняння:

10b + 5k + 0.5t = 100 і b + k + t = 100

На 100 рублів можна купити:
не більше 10 биків, тобто 0<=b<=10;
не більше 20 корів, тобто 0<=k<=20;
не більше 200 телят, тобто 0<=t<=200.

Отже отримуємо:

int b, k, t;
            for (b=0; b<=10; b++)
               for (k=0; k<=20; k++)
                  for (t=0; t<=200 ; t++)
                    if ((10*b + 5*k + 0.5*t == 100) && (b + k + t == 100))
                        Console.WriteLine("бикiв -{0}  корiв - {1}  телят - {2}", b, k,t);

Результат виконання програми: бикiв -1  корiв - 9  телят - 90

Завдання 9. Серед двозначних чисел вибрати тільки ті, у яких цифри різні

             for (int i = 1; i <= 9; i++)
            {
                for (int j = 0; j <= 9; j++)
                {
                    if (j != i) 
                    Console.Write("{0}{1}   ", i, j);
                }
            }

Завдання 10. Чотиризначний номер автомобіля із сумою цифр 20 має першу цифру 9. Вивести всі можливі номери.

            Console.WriteLine("Можливі номери:");
            for (int i = 0; i <= 9; i++)
                for (int j = 0; j <= 9; j++)
                     for (int k = 0; k <= 9; k++)
                         if (9+i + j + k == 20)
                                Console.Write("{0}{1}{2}{3}   ", 9, i, j, k);

Завдання 11. Вивести на екран усі натуральні двоцифрові числа, у яких друга цифра не перевищує першу.

Примітка. При розв’язанні цього завдання використати оператор break , який здійснює вихід тільки із вкладеного циклу (робота зовнішнього циклу продовжується).

             for (int i = 1; i <= 9; i++)
            {
                for (int j =0; j <= 9; j++)
                {
                    if (j > i) break;
                    Console.WriteLine("{0}{1}", i, j);
                }
            }

Завдання для самостійного опрацювання

12. Задано натуральне число n . Чи утворюють цифри цього числа зростаючу послідовність.

13. Задано натуральне число n . Знайти кількість цифр числа n , які дорівнюють 1.

14. Задано натуральне число n . Знайти кількість цифр числа n.

15. Задано натуральне число n . Знайти суму цифр числа n .

16. Задано натуральне число n . Знайти суму цифр числа n , які дорівнюють 1.

17. Задано натуральне число n . Знайти добуток парних цифр числа n .

Завдання 18. 4 заводи поставляють телевізори до магазинів міста. Кожен завод ставить унікальні чотиризначні номери на своїх виробах. У першого заводу перша цифра 5, у 2 – 6, у 3 – 8, у 4 – 1. Решта цифр послідовно присвоюються відповідно до запису у БД. Вам відомо, що 2 останні цифри однакові, а друга зліва дорівнює сумі двох останніх. Вивести можливі номери, що стоять на телевізорах.

            int i = 5, i1 = 6, i2 = 8, i3 = 1; //заданi в умовi першi цифри номерiв
            int f, f1, f2, f3;
            for (int b1 = 0; b1 <= 9; b1++)// друга цифра номера
                  for (int b2 = 0; b2 <= 9; b2++)// третя цифра номера
                         for (int b3 = 0; b3 <= 9; b3++)// четверта цифра номера
                            if (b2 == b3) //якщо 2 останні однакові
                            {
                                if (b1 == b2 + b3) //якщо друга дорівнює сумі двох останніх
                                {
                                    f = i * 1000 + b1 * 100 + b2 * 10 + b3; // утворення чотирицифрових номерів
                                    f1 = i1 * 1000 + b1 * 100 + b2 * 10 + b3;
                                    f2 = i2 * 1000 + b1 * 100 + b2 * 10 + b3;
                                    f3 = i3 * 1000 + b1 * 100 + b2 * 10 + b3;
                                    //виведення номерів
                                    Console.WriteLine("{0}   {1}   {2}   {3}", f, f1, f2, f3);
                                }
                            }

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

5000   6000   8000   1000
5211   6211   8211   1211
5422   6422   8422   1422
5633   6633   8633   1633
5844   6844   8844   1844

Завдання 19. Задача Випадкові числа. На гральному кубику випадає довільне число. Серед тризначних чисел маємо вибрати ті, що містять цифру, яка випала на кубику.

            Random rand = new Random();
            int n = rand.Next(1, 7);
            Console.WriteLine("На гранi кубика випало число  {0}",n);
            for (int i = 1; i <= 9; i++)
                  for (int j = 0; j <= 9; j++)
                         for (int k = 0; k <= 9; k++)
                            if (i==n || j==n || k == n) 
                            {
                               int a= i * 100 + j*10 + k; 
                               Console.Write("{0}    ", a);
                            }

Завдання 20. Відоме найменше значення х=0 і крок його зміни 0,5. Вивести 10 перших значень функції y=sqrt(x).

            double x = 0;
            for (int i = 1; i <= 10; i++)
            { 
                double y = Math.Sqrt(x);
                Console.WriteLine("При х={0:f1}      y= {1:f1} ", x, y);
                x = x + 0.5;
            }

Тренувальні вправи (перейти на іншу сторінку)