Лист задач 2

Тема занятия: функции. Для каждого фрагмента нужно ответить на вопрос из условия.

Зачем нужна функция

Что делает этот код? Что с ним не так?

int main() {
    int a, b, c;
    std::cin >> a >> b >> c;

    int m1 = a;
    if (b > m1) m1 = b;
    if (c > m1) m1 = c;

    int x, y, z;
    std::cin >> x >> y >> z;

    int m2 = x;
    if (y > m2) m2 = y;
    if (z > m2) m2 = z;

    std::cout << m1 - m2 << '\n';
    return 0;
}

Вложенные вызовы

Что выведет программа?

int Twice(int x) {
    return 2 * x;
}

int Inc(int x) {
    return x + 1;
}

int main() {
    std::cout << Twice(Inc(3)) << ' '
              << Inc(Twice(3)) << '\n';
}

Забытый return

Что не так с этой функцией?

int Sign(int x) {
    if (x > 0) return 1;
    if (x < 0) return -1;
}

int main() {
    std::cout << Sign(0);
}

Високосный год

Напишите функцию:

bool IsLeap(int year);

Год високосный, если он делится на 4, но не делится на 100, или если он делится на 400.

IsLeap(2024)  // true
IsLeap(1900)  // false
IsLeap(2000)  // true

Объявление и определение

Какие фрагменты скомпилируются?

// A
void F();
int main() { F(); }
void F() {}
// B
int main() { G(5); }
void G(int x) {}
// C
int H(int);
int H(int a);
int H(int b) { return b; }
// D
int K(int x) { return x; }
int K(int y) { return y; }

Передача по значению

Что выведет программа?

void Reset(int x) {
    x = 0;
    std::cout << x << ' ';
}

int main() {
    int x = 5;
    Reset(x);
    std::cout << x << '\n';
}

Область видимости

Что выведет программа?

int x = 1;

void F() {
    std::cout << x;
    int x = 2;
    std::cout << x;
    {
        int x = 3;
        std::cout << x;
    }
    std::cout << x << '\n';
}

int main() {
    F();
    std::cout << x << '\n';
}

Обмен значений

Что выведет программа и почему?

void Swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
}

int main() {
    int a = 0, b = 1;
    Swap(a, b);
    std::cout << a << ' ' << b << '\n';
}

Значение и ссылка

Что выведет программа?

void A(int x) {
    x *= 2;
}

void B(int& x) {
    x *= 2;
}

void C(int& x, int y) {
    x += y;
    y = 0;
}

int main() {
    int n = 3;
    A(n);
    B(n);
    C(n, n);
    std::cout << n << '\n';
}

Выбор перегрузки

Какая версия функции вызовется в каждой строке?

void F(int)    { std::cout << "int\n"; }
void F(double) { std::cout << "double\n"; }
void F(char)   { std::cout << "char\n"; }

F(5);
F(5.0);
F('5');
F(5.0f);
F(true);

Неоднозначный вызов

Что произойдет при каждом вызове?

void G(long x)      {}
void G(long long x) {}

G(0);
G(0L);

Рекурсивный вывод

Что выведет программа?

void Show(int n) {
    if (n == 0) return;
    std::cout << n;
    Show(n - 1);
    std::cout << n;
}

int main() {
    Show(3);
}

Сумма цифр

Напишите рекурсивную функцию для n >= 0 без циклов:

int SumDigits(int n);
SumDigits(1234)  // 10
SumDigits(7)     // 7

static-переменная

Что выведет программа?

void F(int x) {
    std::cout << ++x;
    {
        static int y;
        int z = x;
        std::cout << ++y << ++z;
    }
}

int main() {
    F(1);
    F(2);
    F(3);
}

← к списку занятий