Загрузка данных


Обработка заняла 1m 9s

В практической №4 пять заданий. Сделал их на простом C++, по лекции №8: функции, возврат значений и рекурсия. Для каждого задания нужны три отдельных файла: `main.cpp`, `functions.h` и `functions.cpp`. Использую только `iostream`.

### Задание 1. Калькулятор

### `main.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main() {
    int a, b, c;

    do {
        cin >> a;

        if (a == 0)
            break;

        if (a == 9 || a == 12) {
            cin >> b;

            if (a == 9)
                cout << bitNot(b) << endl;
            else
                cout << fact(b) << endl;
        }
        else {
            cin >> b >> c;

            switch (a) {
                case 1: cout << add(b, c) << endl; break;
                case 2: cout << sub(b, c) << endl; break;
                case 3: cout << mul(b, c) << endl; break;
                case 4:
                    if (c != 0)
                        cout << divide(b, c) << endl;
                    break;
                case 5:
                    if (c != 0)
                        cout << mod(b, c) << endl;
                    break;
                case 6: cout << bitAnd(b, c) << endl; break;
                case 7: cout << bitOr(b, c) << endl; break;
                case 8: cout << bitXor(b, c) << endl; break;
                case 10: cout << leftShift(b, c) << endl; break;
                case 11: cout << rightShift(b, c) << endl; break;
                case 13: cout << power(b, c) << endl; break;
            }
        }
    } while (a != 0);

    return 0;
}
```

### `functions.h`

```cpp
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int divide(int a, int b);
int mod(int a, int b);
int bitAnd(int a, int b);
int bitOr(int a, int b);
int bitXor(int a, int b);
int bitNot(int a);
int leftShift(int a, int b);
int rightShift(int a, int b);
int fact(int a);
int power(int a, int b);
```

### `functions.cpp`

```cpp
#include "functions.h"

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

int mul(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    return a / b;
}

int mod(int a, int b) {
    return a % b;
}

int bitAnd(int a, int b) {
    return a & b;
}

int bitOr(int a, int b) {
    return a | b;
}

int bitXor(int a, int b) {
    return a ^ b;
}

int bitNot(int a) {
    return ~a;
}

int leftShift(int a, int b) {
    return a << b;
}

int rightShift(int a, int b) {
    return a >> b;
}

int fact(int a) {
    if (a <= 1)
        return 1;

    return a * fact(a - 1);
}

int power(int a, int b) {
    if (b == 0)
        return 1;

    return a * power(a, b - 1);
}
```

Команды калькулятора: `0` — выход, `1` — сложение, `2` — вычитание, `3` — умножение, `4` — деление, `5` — остаток, `6` — AND, `7` — OR, `8` — XOR, `9` — NOT, `10` — сдвиг влево, `11` — сдвиг вправо, `12` — факториал, `13` — степень. Для факториала и степени использована рекурсия.

### Задание 2. Контроль питания

### `main.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main() {
    int go = 1;

    do {
        int a[5];
        int n, sum = 0, b;

        for (int i = 0; i < 5; i++) {
            cin >> a[i];
            sum += a[i];
        }

        cin >> n;
        b = 0;

        for (int i = 0; i < n; i++) {
            int c;
            cin >> c;
            b += c;
        }

        check(sum, b, n);

        cin >> go;
    } while (go != 0);

    return 0;
}
```

### `functions.h`

```cpp
void check(int a, int b, int c);
```

### `functions.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

void check(int a, int b, int c) {
    if (a != b) {
        if (b > a)
            cout << "Превышение калорий: " << b - a << endl;
        else
            cout << "Не хватает калорий: " << a - b << endl;
    }
    else {
        cout << "План выполнен" << endl;
    }

    if (b * 2 <= a || b >= a * 2)
        cout << "Предупреждение: потребление отличается в 2 раза" << endl;

    if (c <= 2)
        cout << "Предупреждение: мало приемов пищи" << endl;
}
```

Вводи калорийность пяти запланированных блюд, затем количество фактически съеденных блюд и калорийность каждого. В конце введи `1`, чтобы повторить расчёт, или `0`, чтобы выйти.

### Задание 3. Зарплата сотрудников

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

### `main.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main() {
    int go = 1;

    do {
        int* a = new int[15];
        int n, fixedSum = 0, hourlySum = 0;
        int min = 0;

        for (int i = 0; i < 15; i++) {
            cin >> a[i];
            fixedSum += a[i];

            if (i == 0 || a[i] < min)
                min = a[i];
        }

        cin >> n;

        int* b = new int[n];

        for (int i = 0; i < n; i++) {
            int rate, hours;
            cin >> rate >> hours;
            b[i] = rate * hours;
            hourlySum += b[i];
        }

        int* c = new int[15 + n];

        for (int i = 0; i < 15; i++)
            c[i] = a[i];

        for (int i = 0; i < n; i++)
            c[15 + i] = b[i];

        double average = (double)(fixedSum + hourlySum) / (15 + n);

        cout << "Общий фонд: " << fixedSum + hourlySum << endl;

        if (fixedSum > hourlySum)
            cout << "Больше затрат на фиксированные ставки: " << fixedSum << endl;
        else
            cout << "Больше затрат на почасовую оплату: " << hourlySum << endl;

        cout << "Выше среднего: " << countAbove(c, 15 + n, average) << endl;
        cout << "Почасовых ниже минимальной фиксированной ставки: "
             << countBelow(b, n, min) << endl;

        delete[] a;
        delete[] b;
        delete[] c;

        cin >> go;
    } while (go != 0);

    return 0;
}
```

### `functions.h`

```cpp
int countAbove(int a[], int n, double average);
int countBelow(int a[], int n, int min);
```

### `functions.cpp`

```cpp
#include "functions.h"

int countAbove(int a[], int n, double average) {
    int count = 0;

    for (int i = 0; i < n; i++) {
        if (a[i] > average)
            count++;
    }

    return count;
}

int countBelow(int a[], int n, int min) {
    int count = 0;

    for (int i = 0; i < n; i++) {
        if (a[i] < min)
            count++;
    }

    return count;
}
```

Сначала вводятся зарплаты 15 сотрудников с фиксированной ставкой. Затем количество почасовых сотрудников, а для каждого — ставка за час и количество часов работы. В конце `1` — повторить, `0` — выйти.

### Задание 4. Температура в октябре

В условии не указаны конкретные температуры прошлого октября, поэтому в коде используются примерные данные. Если преподаватель дал свои значения, замени ими массив `b`.

### `main.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main() {
    int go = 1;

    do {
        int b[31] = {-5, -3, 0, 2, 5, 7, 4, 1, -2, -4,
                     3, 6, 8, 2, 0, -1, -3, 4, 5, 7,
                     3, 1, -2, -4, 0, 2, 6, 8, 4, 1, -1};

        int n;
        cin >> n;

        if (n < 1 || n > 31) {
            cout << "Неверное количество дней" << endl;
        }
        else {
            int a[31];

            for (int i = 0; i < n; i++)
                cin >> a[i];

            double x = average(a, n);
            double y = average(b, 31);

            cout << "Средняя температура текущего октября: " << x << endl;
            cout << "Средняя температура прошлого октября: " << y << endl;

            if (x > y)
                cout << "Текущий октябрь теплее" << endl;
            else if (x < y)
                cout << "Прошлый октябрь теплее" << endl;
            else
                cout << "Средние температуры равны" << endl;

            if (x - y > 5 || y - x > 5)
                cout << "Предупреждение: перепад больше 5 градусов" << endl;

            int maxA = maximum(a, n);
            int maxB = maximum(b, 31);
            int minA = minimum(a, n);
            int minB = minimum(b, 31);

            cout << "Максимумы: " << maxA << " " << maxB << endl;
            cout << "Минимумы: " << minA << " " << minB << endl;
            cout << "Дней ниже нуля сейчас: " << belowZero(a, n) << endl;
            cout << "Дней ниже нуля раньше: " << belowZero(b, 31) << endl;
        }

        cin >> go;
    } while (go != 0);

    return 0;
}
```

### `functions.h`

```cpp
double average(int a[], int n);
int maximum(int a[], int n);
int minimum(int a[], int n);
int belowZero(int a[], int n);
```

### `functions.cpp`

```cpp
#include "functions.h"

double average(int a[], int n) {
    int sum = 0;

    for (int i = 0; i < n; i++)
        sum += a[i];

    return (double)sum / n;
}

int maximum(int a[], int n) {
    int max = a[0];

    for (int i = 1; i < n; i++) {
        if (a[i] > max)
            max = a[i];
    }

    return max;
}

int minimum(int a[], int n) {
    int min = a[0];

    for (int i = 1; i < n; i++) {
        if (a[i] < min)
            min = a[i];
    }

    return min;
}

int belowZero(int a[], int n) {
    int count = 0;

    for (int i = 0; i < n; i++) {
        if (a[i] < 0)
            count++;
    }

    return count;
}
```

Сначала вводится количество дней текущего октября, затем температуры за эти дни. После расчётов введи `1`, чтобы повторить, или `0`, чтобы выйти.

### Задание 5. Финансовые расходы семьи

### `main.cpp`

```cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main() {
    int go = 1;

    do {
        double income;
        int n;

        cin >> income;

        cin >> n;

        int* a = new int[n];
        double* b = new double[n];
        double sum = 0;

        for (int i = 0; i < n; i++) {
            cin >> a[i] >> b[i];
            sum += b[i];
        }

        double fixed = mandatory();

        cout << "Обязательные расходы: " << fixed << endl;
        cout << "Незапланированные расходы: " << sum << endl;
        cout << "Средние обязательные расходы: " << fixed / 7 << endl;
        cout << "Средние незапланированные расходы: "
             << average(sum, n) << endl;

        for (int i = 0; i < n; i++)
            cout << "Категория " << a[i] << ": " << b[i] << endl;

        if (sum > fixed) {
            cout << "Превышение среднего: "
                 << percent(average(sum, n), fixed / 7) << "%" << endl;
        }

        cout << "Остаток денег: " << income - fixed - sum << endl;
        cout << "Максимум незапланированных расходов для остатка 10%: "
             << allowed(income, fixed) << endl;

        delete[] a;
        delete[] b;

        cin >> go;
    } while (go != 0);

    return 0;
}
```

### `functions.h`

```cpp
double mandatory();
double average(double sum, int n);
double percent(double a, double b);
double allowed(double income, double fixed);
```

### `functions.cpp`

```cpp
#include "functions.h"

double mandatory() {
    return 5800 + 6200 + 4700 + 10500 + 5000 + 3600 + 23700;
}

double average(double sum, int n) {
    if (n == 0)
        return 0;

    return sum / n;
}

double percent(double a, double b) {
    if (b == 0)
        return 0;

    return (a - b) * 100 / b;
}

double allowed(double income, double fixed) {
    double sum = income * 0.9 - fixed;

    if (sum < 0)
        return 0;

    return sum;
}
```

Вводишь доход семьи, количество незапланированных расходов, а затем для каждого расхода — номер категории и сумму. В конце `1` — повторить расчёт, `0` — выйти.

Обрати внимание: в задании №4 данные прошлого октября не указаны, поэтому там стоят примерные температуры. В №3 для почасовых сотрудников я добавил ввод отработанных часов, поскольку без них зарплату посчитать невозможно.