Загрузка данных
Да. Сделаем все 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).