C C  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Условия и циклы

Задания проверяют ветвления и циклы на реальном коде: сквозное выполнение, короткое замыкание, действие break и continue, обратный обход беззнаковых индексов и ошибки на границах диапазона.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Какая буква будет выведена при этом значении switch?
CC17
#include <stdio.h>

int main(void) {
    int x = 2;
    switch (x) {
        case 0: puts("A"); break;
        case 1: puts("B"); break;
        case 2: puts("C");
        case 3: break;
        default: puts("D");
    }
}
Вопрос 2 из 20
Какое условие корректно проверяет, что x находится в полуинтервале [10, 20)?
CC17
int in_range(int x) {
    return /* условие */;
}
Вопрос 3 из 20
Почему default полезен даже когда перечислены все текущие значения enum?
Вопрос 4 из 20
Какие строки появятся из-за сквозного выполнения ветвей switch?
CC17
#include <stdio.h>

int main(void) {
    int n = 1;
    switch (n) {
        case 0: puts("zero"); break;
        case 1: puts("one");
        case 2: puts("many"); break;
    }
}
Вопрос 5 из 20
Как лучше выразить таблицу из 30 разреженных кодов ошибок, для каждого из которых нужен короткий текст?
CC17
const char *error_text(int code) {
    /* Выберите структуру ветвления. */
}
Вопрос 6 из 20
Сколько раз выполнится тело цикла?
CC17
int count = 0;
for (int i = 1; i < 10; i *= 2) {
    ++count;
}
printf("%d\n", count);
Вопрос 7 из 20
Какое значение напечатает программа с циклом `do ... while`?
CC17
#include <stdio.h>

int main(void) {
    int x = 0;
    do {
        ++x;
    } while (x < 3);
    printf("%d\n", x);
}
Вопрос 8 из 20
Какой вариант безопасно обходит массив из `n` элементов в прямом порядке: от индекса 0 до `n - 1`?
CОбход массива
void visit_all(const int *a, size_t n) {
    /* выбрать цикл */
}
Вопрос 9 из 20
В цикле читают поток, пока функция возвращает очередной байт или EOF. Какой тип должна иметь переменная ch?
CC17
int ch;
while ((ch = fgetc(in)) != EOF) {
    /* обработка байта */
}
Вопрос 10 из 20
Что важнее всего сформулировать перед оптимизацией сложного while?
Вопрос 11 из 20
Какую сумму накопит цикл, пропускающий часть итераций?
CC17
#include <stdio.h>

int main(void) {
    int sum = 0;
    for (int i = 0; i < 6; ++i) {
        if (i == 2) continue;
        if (i == 4) break;
        sum += i;
    }
    printf("%d\n", sum);
}
Вопрос 12 из 20
Во вложенных циклах `continue` находится во внутреннем цикле. Куда перейдёт управление?
CC17
for (size_t r = 0; r < rows; ++r) {
    for (size_t c = 0; c < cols; ++c) {
        if (skip(a[r][c])) continue;
        use(a[r][c]);
    }
}
Вопрос 13 из 20
Что делает break внутри switch, расположенного в цикле?
Вопрос 14 из 20
Какой приём яснее всего завершает два вложенных цикла после первого найденного элемента?
CC17
for (size_t r = 0; r < rows; ++r) {
    for (size_t c = 0; c < cols; ++c) {
        if (match(a[r][c])) {
            /* выйти из обоих циклов */
        }
    }
}
Вопрос 15 из 20
Почему continue в цикле while опаснее, чем в for, если шаг счётчика стоит в конце тела?
CC17
size_t i = 0;
while (i < n) {
    if (skip(a[i])) continue;
    use(a[i]);
    ++i;
}
Вопрос 16 из 20
Где находится выход за границу?
CC17
for (size_t i = 0; i <= n; ++i) {
    printf("%d\n", a[i]);
}
Вопрос 17 из 20
Как корректно обойти массив с индексом типа `size_t` в обратном порядке — от `n - 1` до 0 — включая случай `n == 0`?
CОбратный обход size_t
void visit_reverse(const int *a, size_t n) {
    /* нужны индексы n-1, ..., 0 */
}
Вопрос 18 из 20
Почему условие `i <= n - 1` опасно при n типа size_t?
CC17
for (size_t i = 0; i <= n - 1; ++i) {
    use(a[i]);
}
Вопрос 19 из 20
Функция ищет первый нулевой байт в буфере известной длины n. Какое условие не читает за пределами массива?
CC17
size_t first_nul(const unsigned char *buf, size_t n) {
    size_t i = 0;
    while (/* выбрать условие */) {
        ++i;
    }
    return i;
}
Вопрос 20 из 20
Какая группа тестов лучше всего ловит ошибку на единицу в функции обработки диапазона [begin, end)?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу