If, switch и циклы в C на простых задачах

В этом уроке мы соберем маленькую консольную программу: пользователь вводит число, программа проверяет его через if, показывает меню через switch и считает сумму чисел через цикл. Так условия и циклы в C перестают быть набором слов из справочника и становятся рабочей механикой

Нам важны не все формы сразу, а порядок мышления: условие отвечает на вопрос «делать эту ветку или нет», цикл отвечает на вопрос «повторять действие или остановиться». Если это уложить в голове, синтаксис C становится гораздо спокойнее

Что получится в конце

Файл control_flow.c:

#include <stdio.h>

int main(void)
{
    int number = 0;
    int action = 0;

    printf("Enter positive number: ");
    if (scanf("%d", &number) != 1) {
        printf("Number expected\n");
        return 1;
    }

    if (number <= 0) {
        printf("Number must be positive\n");
        return 1;
    }

    printf("1 - print numbers\n");
    printf("2 - print sum\n");
    printf("Choose action: ");
    if (scanf("%d", &action) != 1) {
        printf("Action expected\n");
        return 1;
    }

    switch (action) {
        case 1:
            for (int i = 1; i <= number; i++) {
                printf("%d\n", i);
            }
            break;

        case 2: {
            int sum = 0;
            int i = 1;

            while (i <= number) {
                sum += i;
                i++;
            }

            printf("Sum: %d\n", sum);
            break;
        }

        default:
            printf("Unknown action\n");
            return 1;
    }

    return 0;
}

Сборка:

gcc -Wall -Wextra -std=c17 control_flow.c -o control_flow
./control_flow

if: проверяем вход до основной работы

Первая защита в программе стоит прямо после ввода:

if (scanf("%d", &number) != 1) {
    printf("Number expected\n");
    return 1;
}

Мы не начинаем считать, пока не убедились, что получили число. Это хорошая привычка для C: сначала проверка, потом работа. В языках с исключениями или более высокоуровневым вводом часть проблем скрыта. В C вы ближе к реальности, поэтому лучше явно проверять результат функций

Вторая проверка:

if (number <= 0) {
    printf("Number must be positive\n");
    return 1;
}

Здесь условие читается почти как обычная фраза: если число меньше или равно нулю, вывести ошибку и завершить программу. return 1 показывает, что программа завершилась не штатно

else нужен не всегда

Новички часто пишут:

if (number <= 0) {
    printf("Bad number\n");
} else {
    /* main logic */
}

Так можно, но в учебных программах часто удобнее сделать ранний выход:

if (number <= 0) {
    printf("Bad number\n");
    return 1;
}

После этого основной код идет без лишнего вложения. Чем меньше вложенность, тем проще читать программу. Это особенно заметно в C, где фигурные скобки быстро превращают простой пример в лестницу

switch: меню без цепочки if

Для выбора действия подходит switch:

switch (action) {
    case 1:
        printf("First action\n");
        break;
    case 2:
        printf("Second action\n");
        break;
    default:
        printf("Unknown action\n");
}

switch сравнивает значение с наборами case. После выполненной ветки почти всегда нужен break. Если его забыть, выполнение провалится в следующий case. Иногда это используют специально, но в первых уроках почти всегда это ошибка

В нашем примере у case 2 есть дополнительные фигурные скобки:

case 2: {
    int sum = 0;
    int i = 1;
    ...
    break;
}

Так мы аккуратно ограничиваем область видимости переменных sum и i внутри ветки

for: когда заранее понятен счетчик

Цикл for удобен, когда есть счетчик:

for (int i = 1; i <= number; i++) {
    printf("%d\n", i);
}

Он читается как три части: откуда начинаем, пока выполняем, что делаем после каждого шага. В нашем случае i начинается с 1, цикл работает пока i <= number, после каждой итерации i++ увеличивает счетчик на единицу

Типичная ошибка — перепутать < и <=. Если пользователь ввел 5, условие i < number напечатает только 1 2 3 4, а i <= number напечатает 1 2 3 4 5

while: когда важнее условие остановки

Цикл while удобен, когда повторение зависит от условия:

int sum = 0;
int i = 1;

while (i <= number) {
    sum += i;
    i++;
}

Здесь счетчик тоже есть, но он живет снаружи цикла. Это делает while гибче, но требует дисциплины. Если забыть i++, программа попадет в бесконечный цикл. Поэтому при чтении while всегда задавайте себе вопрос: какая строка меняет условие остановки

do while отличается тем, что тело выполнится хотя бы один раз:

do {
    printf("Number: ");
    scanf("%d", &number);
} while (number <= 0);

Для меню и повторного запроса это бывает удобно, но в первом примере обычного while достаточно

Проверяем программу как пользователь

Проверка должна включать не только идеальный ввод. Запустите программу и попробуйте:

Enter positive number: 5
Choose action: 1

Затем:

Enter positive number: 5
Choose action: 2

Потом проверьте плохие сценарии:

Enter positive number: -1

И:

Enter positive number: hello

Если программа объясняет ошибку и завершает работу без странного вывода, вы уже пишете намного аккуратнее, чем большинство первых учебных примеров

Мини-практика: повторяем меню до выхода

Один раз показать меню просто. Чуть полезнее сделать программу, которая повторяет меню, пока пользователь не выберет выход. Здесь появляется хороший учебный сценарий для while и switch

#include <stdio.h>

int main(void)
{
    int action = 0;

    while (action != 3) {
        printf("1 - say hello\n");
        printf("2 - show square\n");
        printf("3 - exit\n");
        printf("Choose: ");

        if (scanf("%d", &action) != 1) {
            printf("Number expected\n");
            return 1;
        }

        switch (action) {
            case 1:
                printf("Hello\n");
                break;

            case 2: {
                int value = 0;
                printf("Value: ");
                if (scanf("%d", &value) != 1) {
                    printf("Number expected\n");
                    return 1;
                }
                printf("Square: %d\n", value * value);
                break;
            }

            case 3:
                printf("Bye\n");
                break;

            default:
                printf("Unknown action\n");
                break;
        }
    }

    return 0;
}

Этот пример важен не из-за меню, а из-за условия остановки. Цикл while (action != 3) читается так: повторять, пока действие не равно выходу. Переменная action меняется внутри цикла после ввода пользователя. Значит, программа не застрянет навсегда, если пользователь сможет выбрать 3

Как читать условия без путаницы

Условие лучше читать как вопрос, на который программа отвечает «да» или «нет». number <= 0 — число меньше или равно нулю? action != 3 — действие не равно трем? i < count — счетчик еще внутри диапазона?

Когда условие становится сложным, разбивайте его:

int is_valid = number > 0 && number <= 100;

if (!is_valid) {
    printf("Number must be from 1 to 100\n");
    return 1;
}

В C есть логические операторы &&, || и !. Они читаются как «и», «или», «не». Но в первых программах не стоит собирать огромные выражения в одной строке. Если условие занимает полэкрана, вынесите часть смысла в переменную с понятным именем

Где чаще всего ломается цикл

У каждого цикла есть три вопроса: откуда стартуем, когда останавливаемся, что меняется на каждом шаге. Если вы не можете ответить на один из них, цикл подозрительный

Для for эти части обычно видны сразу:

for (int i = 0; i < count; i++)

Для while часть логики может быть разбросана по коду. Поэтому при отладке временно печатайте значения:

printf("debug i=%d\n", i);

Такой вывод не нужно оставлять в финальном материале или проекте, но во время учебы он помогает увидеть, меняется ли переменная и почему условие остается истинным

Частые ошибки и порядок проверки

Один знак равно вместо двух if (action = 1) присваивает значение, а не сравнивает. Для сравнения нужен ==: if (action == 1). Компилятор с предупреждениями часто подскажет проблему

Забытый break в switch Если после case 1 нет break, программа может выполнить код из case 2. В первых программах почти всегда ставьте break явно

Бесконечный while Проверьте, меняется ли переменная, которая участвует в условии. Если i <= number всегда остается истинным, цикл не остановится

Лишняя точка с запятой после for или if for (...); означает пустой цикл. Тело в фигурных скобках после него уже не будет частью цикла

Что может быть еще интересно по этой теме

Что лучше использовать: for или while? Если есть понятный счетчик, берите for. Если условие остановки зависит от ввода, файла или состояния программы, часто удобнее while

Можно ли писать if без фигурных скобок? Можно для одной инструкции, но новичку лучше ставить скобки всегда. Это защищает от ошибок при добавлении второй строки

Почему switch работает не со всеми типами? switch в C рассчитан на целочисленные значения и похожие типы. Для строк нужны другие подходы, например сравнение через функции из <string.h>

Что изучать после циклов? Следующий естественный шаг — массивы. Цикл почти всегда нужен, чтобы пройти по массиву от первого элемента к последнему

Что почитать дальше по C

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x