Загрузка данных
#include <iostream>
#include <cmath>
using namespace std;
// ==================== ФУНКЦИЯ ДЛЯ ВВОДА ЦЕЛЫХ ЧИСЕЛ (ТОЛЬКО > 0) ====================
int inputInt(const char* prompt) {
int value;
bool validInput = false;
cout << prompt;
for (int attempt = 0; attempt < 3 && !validInput; attempt++) {
if (attempt > 0) {
cout << "Oshibka! Vvedite chislo: ";
}
if (cin >> value) {
if (value > 0) {
validInput = true; // число положительное
} else {
cout << "Chislo dolzhno byt' bol'she 0. ";
cin.clear();
cin.ignore(10000, '\n');
}
} else {
cin.clear();
cin.ignore(10000, '\n');
cout << "Nekorrektnyy vvod. ";
}
}
if (!validInput) {
cout << "Prekratnyy vvod. Ustanovleno znachenie 1." << endl;
value = 1;
}
return value;
}
// ==================== АБСТРАКТНЫЙ БАЗОВЫЙ КЛАСС ====================
class geom {
public:
virtual double area() const = 0; // чисто виртуальная для площади
virtual double volume() const = 0; // чисто виртуальная для объёма
virtual ~geom() {}
};
// ==================== КЛАССЫ ДЛЯ ПЛОЩАДЕЙ ====================
// Прямоугольник
class Rectangle : public geom {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() const override {
return width * height;
}
double volume() const override {
return 0;
}
double getWidth() const { return width; }
double getHeight() const { return height; }
};
// Круг
class Circle : public geom {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override {
return M_PI * radius * radius;
}
double volume() const override {
return 0;
}
double getRadius() const { return radius; }
};
// Квадрат
class Square : public geom {
private:
double side;
public:
Square(double s) : side(s) {}
double area() const override {
return side * side;
}
double volume() const override {
return 0;
}
double getSide() const { return side; }
};
// ==================== ЗАДАЧА 1 ====================
double remainingAreaAfterSubtraction(const Rectangle& rect, const Circle& circle, const Square& square) {
double rectArea = rect.area();
double circleArea = circle.area();
double squareArea = square.area();
double remaining = rectArea - circleArea - squareArea;
return (remaining > 0) ? remaining : 0;
}
// ==================== КЛАССЫ ДЛЯ ОБЪЁМОВ ====================
// Параллелепипед (прямоугольный)
class Cuboid : public geom {
private:
double length, width, height;
public:
Cuboid(double l, double w, double h) : length(l), width(w), height(h) {}
double volume() const override {
return length * width * height;
}
double area() const override {
return 0;
}
};
// Треугольная призма (основание – прямоугольный треугольник)
class TriPrism : public geom {
private:
double a, b, h; // a, b – катеты основания, h – высота призмы
public:
TriPrism(double a_, double b_, double h_) : a(a_), b(b_), h(h_) {}
double volume() const override {
double baseArea = 0.5 * a * b;
return baseArea * h;
}
double area() const override {
return 0;
}
};
// ==================== ЗАДАЧА 2 (БЕЗ VECTOR) ====================
double totalVolume(geom** shapes, int count) {
double sum = 0;
for (int i = 0; i < count; i++) {
sum += shapes[i]->volume();
}
return sum;
}
// ==================== ТЕСТИРОВАНИЕ С ВВОДОМ ПОЛЬЗОВАТЕЛЯ ====================
int main() {
double a, b, c, d, e, f, g, h, i, j;
cout << "========== ZADACHA 1 ==========" << endl;
// Ввод данных для прямоугольника
cout << "\nVvedite dannye dlya pryamougol'nika:" << endl;
a = inputInt(" Shirina (width): ");
b = inputInt(" Vysota (height): ");
Rectangle rect(a, b);
// Ввод данных для круга
cout << "\nVvedite dannye dlya kruga:" << endl;
c = inputInt(" Radius: ");
Circle circ(c);
// Ввод данных для квадрата
cout << "\nVvedite dannye dlya kvadrata:" << endl;
d = inputInt(" Storona (side): ");
Square sq(d);
// Вычисление и вывод результата
double remaining = remainingAreaAfterSubtraction(rect, circ, sq);
cout << "\nRezul'taty:" << endl;
cout << " Ploshad' pryamougol'nika: " << rect.area() << endl;
cout << " Ploshad' kruga: " << circ.area() << endl;
cout << " Ploshad' kvadrata: " << sq.area() << endl;
cout << " Ostatok ploshadi: " << remaining << endl;
cout << "\n========== ZADACHA 2 ==========" << endl;
// Ввод данных для параллелепипеда
cout << "\nVvedite dannye dlya parallelepipeda:" << endl;
e = inputInt(" Dlina (length): ");
f = inputInt(" Shirina (width): ");
g = inputInt(" Vysota (height): ");
Cuboid box(e, f, g);
// Ввод данных для треугольной призмы
cout << "\nVvedite dannye dlya treugol'noy prizmy:" << endl;
cout << " (osnovanie - pryamougol'nyy treugol'nik)" << endl;
h = inputInt(" Katuet a: ");
i = inputInt(" Katuet b: ");
j = inputInt(" Vysota prizmy h: ");
TriPrism prism(h, i, j);
// Массив указателей на geom
geom* shapes[2];
shapes[0] = &box;
shapes[1] = &prism;
// Вычисление и вывод результата
double sumVol = totalVolume(shapes, 2);
cout << "\nRezul'taty:" << endl;
cout << " Ob" << char(39) << "em parallelepipeda: " << box.volume() << endl;
cout << " Ob" << char(39) << "em prizmy: " << prism.volume() << endl;
cout << " Summa ob" << char(39) << "emov: " << sumVol << endl;
return 0;
}