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


Да. Сделаем все 5 заданий Практической №3 с твоими условиями:

while (true) — нигде нет.

максимально простой код;

только то, что нужно для заданий;

без лишних усложнений;

в 3-м задании — динамический массив new / delete[];

без комментариев внутри кода;

стиль как у начинающего программиста.



---

Задание 1

#include <iostream>
using namespace std;

int main() {
    int a[100];
    int n = 0;
    int b, c;

    do {
        cin >> b;

        if (b == 0)
            break;

        if (b == 1) {
            cin >> c;

            bool ok = true;

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

            if (ok) {
                a[n] = c;
                n++;
            }
        }
        else if (b == 2) {
            cin >> c;

            for (int i = 0; i < n; i++) {
                if (a[i] == c) {
                    for (int j = i; j < n - 1; j++)
                        a[j] = a[j + 1];

                    n--;
                    break;
                }
            }
        }
        else if (b == 3) {
            for (int i = 0; i < n; i++)
                cout << a[i] << " ";

            cout << endl;
        }

    } while (b != 0);

    return 0;
}

Что здесь происходит

a[100] — массив для номеров задач.

n — сколько задач сейчас есть.

b — команда:

1 — добавить;

2 — удалить;

3 — показать;

0 — выйти.


При добавлении программа сначала проверяет, нет ли такого номера.

При удалении элементы после удалённого сдвигаются влево.



---

Задание 2

#include <iostream>
using namespace std;

int main() {
    int a[100];
    int n, sum = 0;

    cin >> n;

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

    double average = (double)sum / n;

    int max = a[0];
    int min = a[0];
    int maxDay = 1;
    int minDay = 1;

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

        if (a[i] < min) {
            min = a[i];
            minDay = i + 1;
        }
    }

    int low = 0;

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

    cout << sum << endl;
    cout << average << endl;
    cout << max << " " << maxDay << endl;
    cout << min << " " << minDay << endl;
    cout << (double)low * 100 / n;

    return 0;
}

Здесь

Например, введены посещения:

5
100 200 150 300 50

sum — сумма всех посетителей.

average — среднее.

max — максимальное количество.

maxDay — день, когда был максимум.

min — минимум.

minDay — день минимума.

low — сколько дней было ниже среднего.


i + 1 нужен потому, что массив начинается с 0, а дни считаются с 1.


---

Задание 3 — динамический массив

Здесь специально используем new и delete[].

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    char* a = new char[n + 1];

    cin.ignore();
    cin.getline(a, n + 1);

    int k;
    cin >> k;

    k = k % 26;

    for (int i = 0; a[i] != '\0'; i++) {
        if (a[i] >= 'a' && a[i] <= 'z') {
            a[i] = a[i] + k;

            if (a[i] > 'z')
                a[i] = a[i] - 26;
        }

        if (a[i] >= 'A' && a[i] <= 'Z') {
            a[i] = a[i] + k;

            if (a[i] > 'Z')
                a[i] = a[i] - 26;
        }
    }

    cout << a;

    delete[] a;

    return 0;
}

Самое главное здесь

char* a = new char[n + 1];

Создаём динамический массив.

cin.getline(a, n + 1);

Записываем в него весь текст.

Например:

hello

При сдвиге 2 получится:

jgnnq

А:

delete[] a;

удаляет динамический массив из памяти.

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


---

Задание 4

#include <iostream>
using namespace std;

int main() {
    int a[24];
    int limit;

    cin >> limit;

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

    int sum = 0;
    int normal = 0;
    int maxNormal = 0;
    int over = 0;
    int maxOver = 0;
    int hours = 0;

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

        if (a[i] > 0)
            hours++;

        if (a[i] <= limit) {
            normal++;
            over = 0;

            if (normal > maxNormal)
                maxNormal = normal;
        }
        else {
            over++;
            normal = 0;

            if (over > maxOver)
                maxOver = over;
        }
    }

    cout << (double)sum / 24 << endl;
    cout << maxNormal << endl;
    cout << maxOver << endl;
    cout << hours;

    return 0;
}

Логика

normal — сколько часов подряд скорость была не выше лимита.

over — сколько часов подряд скорость была выше лимита.

Например:

50 60 70 120 130 80

Если лимит 100:

50 60 70

— 3 часа в пределах лимита.

120 130

— 2 часа выше лимита.

Когда начинается другая ситуация, счётчик предыдущей серии обнуляется.


---

Задание 5

#include <iostream>
using namespace std;

int main() {
    int a[22], b[22];

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

    for (int i = 0; i < 22; i++)
        cin >> b[i];

    int sum = 0;
    int maxCount = 0;
    int minCount = 0;

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

        if (a[i] > 100000)
            maxCount++;

        if (a[i] < 10000)
            minCount++;
    }

    cout << (double)sum / 22 << endl;

    cout << maxCount << endl;

    for (int i = 0; i < 22; i++) {
        if (a[i] > 100000)
            cout << i + 1 << " ";
    }

    cout << endl;

    cout << minCount << endl;

    for (int i = 0; i < 22; i++) {
        if (a[i] < 10000)
            cout << i + 1 << " ";
    }

    cout << endl;

    int periods = 0;
    int days = 1;

    for (int i = 1; i < 22; i++) {
        if (a[i] < a[i - 1]) {
            days++;
        }
        else {
            if (days > 3) {
                periods++;
                cout << days << " ";
            }

            days = 1;
        }
    }

    if (days > 3) {
        periods++;
        cout << days << " ";
    }

    cout << endl;
    cout << periods << endl;

    int plan = 0;

    for (int i = 0; i < 22; i++) {
        if (a[i] >= b[i])
            plan += a[i] + (a[i] * 10 + 50) / 100;
        else
            plan += (a[i] + b[i] + 1) / 2;
    }

    cout << plan / 22;

    return 0;
}

Здесь две группы данных

int a[22], b[22];

a — продажи текущего месяца.

b — продажи такого же месяца прошлого года.

Большие продажи

if (a[i] > 100000)
    maxCount++;

Считаем дни, где продажи больше 100000.

Маленькие продажи

if (a[i] < 10000)
    minCount++;

Считаем дни, где меньше 10000.

Падение продаж

if (a[i] < a[i - 1])
    days++;

Если сегодняшний день меньше вчерашнего — продолжается период падения.

Если падение закончилось:

if (days > 3)
    periods++;

считаем этот период, только если он больше 3 дней.


---

Итого

Получается:

Задание	Что используется

1	обычный массив, for, do while, if
2	массив, for, if, среднее, максимум/минимум
3	динамический массив new / delete[], char, Caesar
4	массив из 24 элементов, for, серии
5	два массива по 22 элемента, for, анализ продаж


И главное: ни в одном из пяти заданий нет while (true).