Назад Вперед Зміст


Оператор циклу з передумовою (while)

Приклад

Внесена в банк сума дорівнює S, процентна ставка N річних, визначити за допомогою циклу while на скільки років потрібно зробити розміщення щоб отримати суму F.

using System;

class Program
{
    static void Main()
    {
        // ---------- 1. Вхідні дані (задані прямо) ----------
        double S = 1000.0;   // початкова сума
        double N = 10.0;     // річна ставка, %
        double F = 2000.0;   // цільова сума

        Console.WriteLine($"Початковий вклад: {S:F2} грн");
        Console.WriteLine($"Річна ставка:    {N}%");
        Console.WriteLine($"Цільова сума:    {F:F2} грн");
        Console.WriteLine();

        // ---------- 2. Перевірки ----------
        if (N <= 0 && F > S)
        {
            Console.WriteLine("Помилка: при ставці <= 0 сума ніколи не досягне цілі.");
            return;
        }

        if (F <= S)
        {
            Console.WriteLine("Ціль уже досягнута: 0 років.");
            return;
        }

        // ---------- 3. Основний цикл ----------
        double current = S;
        int years = 0;

        while (current < F)
        {
            current = current * (1 + N / 100.0);
            years++;
            Console.WriteLine($"Рік {years,2}: {current,10:F2} грн");
        }

        // ---------- 4. Результат ----------
        Console.WriteLine();
        Console.WriteLine($"Потрібно років: {years}");
        Console.WriteLine($"Кінцева сума:   {current:F2} грн");
    }
}

Початковий вклад: 1000.00 грн
Річна ставка:    10%
Цільова сума:    2000.00 грн

Рік  1:    1100.00 грн
Рік  2:    1210.00 грн
Рік  3:    1331.00 грн
Рік  4:    1464.10 грн
Рік  5:    1610.51 грн
Рік  6:    1771.56 грн
Рік  7:    1948.72 грн
Рік  8:    2143.59 грн

Потрібно років: 8
Кінцева сума:   2143.59 грн

Розбір ключових моментів

1. Формула складних відсотків

За один рік сума зростає на N%:


current = current + current * N/100 =  current * (1 + N / 100.0);

Ділення на 100.0 (а не на 100) важливе: N — ціле або double, і нам потрібне дробове ділення. Якщо написати N / 100 з цілим N, отримаєте 0 при N < 100.

2. Чому while (current < F), а не while (current != F)

Сума може «перескочити» цільове значення. Наприклад, при ставці 10% вона ніколи не дорівнюватиме рівно 2000 — роки дають 1948.72, а потім одразу 2143.59. Якщо писати !=, цикл ніколи не завершиться.

3. Захист від нескінченного циклу

Якщо N <= 0 і F > S, сума не зростатиме — цикл while (current < F) крутитиметься вічно. Перевірка перед циклом це відсікає.

4. Лічильник років

years++ стоїть усередині циклу. Якщо F <= S, цикл не виконається жодного разу — і years залишиться 0. Це коректно: вкладати нічого не треба.

Варіант із вводом з клавіатури

Якщо потрібно, щоб користувач сам вводив S, N, F:

Console.Write("Початкова сума S: ");
double S = double.Parse(Console.ReadLine());
Console.Write("Річна ставка N (%): ");
double N = double.Parse(Console.ReadLine());
Console.Write("Цільова сума F: ");
double F = double.Parse(Console.ReadLine());

Але для надійності краще використати TryParse, щоб програма не падала на некоректному вводі.Чому TryParse надійніший за Parse.Різниця між ними — як вони поводяться з некоректним вводом. Parse кидає виняток і валить програму, TryParse повертає false і дає вам шанс обробити помилку.

int.TryParse(string s, out int result)
Пробує перетворити рядок. Якщо вдалося — повертає true і кладе результат у result. Якщо ні — повертає false, а result дорівнює 0. Жодних винятків


Console.Write("Початкова сума S: ");
if (!double.TryParse(Console.ReadLine(), out double S))
{
    Console.WriteLine("Некоректне число.");
    return;
}

Оператори continue і break

Іногда виникає ситуація, коли потрібно вийти з циклу, не дочекавшись його завершення. В цьому випадку ми можемо скористатися оператором break.

Наприклад:


for (int i = 0; i < 9; i++)
{
    if (i == 5)
        break;
    Console.WriteLine(i);
}

Хоча в умові циклу сказано, що цикл виконуватиметься, поки лічильник i не досягне значення 9, насправді цикл спрацює 5 разів. Оскільки при досягненні лічильником i значення 5, спрацює оператор break, і цикл завершиться. 0 1 2 3 4

Тепер поставимо собі інше завдання. А що якщо ми хочемо, щоб при перевірці цикл не завершувався, а просто пропускав поточну ітерацію. Для цього ми можемо скористатися оператором continue:


for (int i = 0; i < 9; i++)
{
    if (i == 5)
        continue;
    Console.WriteLine(i);
}

У цьому випадку цикл, коли дійде до числа 5, яке не задовольняє умову перевірки, просто пропустить це число і перейде до наступної ітерації: 0 1 2 3 4 6 7 8


Назад Вперед Зміст