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


#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;
}