Загрузка данных
Обработка заняла 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 для почасовых сотрудников я добавил ввод отработанных часов, поскольку без них зарплату посчитать невозможно.