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


#pragma once

namespace OSAGO_Calculator {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Globalization;

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
        }

    protected:
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }

    // Коэффициенты для расчета
    private: double GetTerritoryCoefficient()
        {
            switch (comboBoxTerritory->SelectedIndex)
            {
                case 0: return 2.0;   // Москва
                case 1: return 1.8;   // Санкт-Петербург
                case 2: return 1.5;   // Другие города > 1 млн
                case 3: return 1.3;   // Другие города < 1 млн
                case 4: return 0.9;   // Сельская местность
                default: return 1.0;
            }
        }

    private: double GetAgeExperienceCoefficient()
        {
            switch (comboBoxAgeExperience->SelectedIndex)
            {
                case 0: return 1.8;   // До 22 лет, стаж до 3 лет
                case 1: return 1.7;   // 22-25 лет, стаж до 3 лет
                case 2: return 1.4;   // Старше 25 лет, стаж до 3 лет
                case 3: return 1.0;   // Старше 25 лет, стаж более 3 лет
                default: return 1.0;
            }
        }

    private: double GetPowerCoefficient()
        {
            switch (comboBoxPower->SelectedIndex)
            {
                case 0: return 0.6;   // До 50
                case 1: return 1.0;   // 50-70
                case 2: return 1.1;   // 70-100
                case 3: return 1.2;   // 100-120
                case 4: return 1.4;   // 120-150
                case 5: return 1.6;   // Свыше 150
                default: return 1.0;
            }
        }

    private: double GetPeriodCoefficient()
        {
            switch (comboBoxPeriod->SelectedIndex)
            {
                case 0: return 0.5;   // 3 месяца
                case 1: return 0.7;   // 6 месяцев
                case 2: return 0.9;   // 9 месяцев
                case 3: return 1.0;   // 12 месяцев
                default: return 1.0;
            }
        }

    private: double GetDriversCoefficient()
        {
            return checkBoxLimitedDrivers->Checked ? 1.0 : 1.8;
        }

    private: double GetKBMCoefficient()
        {
            // Упрощенный расчет КБМ
            try 
            {
                int class_val = Int32::Parse(textBoxClass->Text);
                int accidents = Int32::Parse(textBoxAccidents->Text);
                
                // Базовый КБМ для класса 3 = 1.0
                double kbm = 1.0;
                
                // Увеличиваем/уменьшаем в зависимости от аварий
                if (accidents > 0)
                    kbm = 1.0 + (accidents * 0.5);
                
                return kbm;
            }
            catch (...)
            {
                return 1.0;
            }
        }

    // Обработчик кнопки OK
    private: System::Void buttonOK_Click(System::Object^  sender, System::EventArgs^  e)
        {
            try
            {
                // Проверка ввода
                double baseRate = Double::Parse(textBoxBaseRate->Text, 
                    CultureInfo::InvariantCulture);
                
                if (baseRate <= 0)
                {
                    MessageBox::Show("Базовая ставка должна быть положительным числом!",
                        "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Warning);
                    return;
                }

                // Расчет стоимости ОСАГО
                double coefficient = GetTerritoryCoefficient() *
                    GetAgeExperienceCoefficient() *
                    GetPowerCoefficient() *
                    GetPeriodCoefficient() *
                    GetDriversCoefficient() *
                    GetKBMCoefficient();

                double totalCost = baseRate * coefficient;

                // Формирование сообщения
                String^ message = String::Format(
                    "Стоимость ОСАГО: {0:F2} руб.\n\n" +
                    "Коэффициенты:\n" +
                    "Территория: {1:F2}\n" +
                    "Возраст/стаж: {2:F2}\n" +
                    "Мощность: {3:F2}\n" +
                    "Период: {4:F2}\n" +
                    "Водители: {5:F2}\n" +
                    "КБМ: {6:F2}\n\n" +
                    "Итоговый коэффициент: {7:F2}",
                    totalCost,
                    GetTerritoryCoefficient(),
                    GetAgeExperienceCoefficient(),
                    GetPowerCoefficient(),
                    GetPeriodCoefficient(),
                    GetDriversCoefficient(),
                    GetKBMCoefficient(),
                    coefficient);

                MessageBox::Show(message, "Результат расчета ОСАГО",
                    MessageBoxButtons::OK, MessageBoxIcon::Information);
            }
            catch (FormatException^)
            {
                MessageBox::Show("Пожалуйста, введите корректные числовые значения!",
                    "Ошибка ввода", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
            catch (Exception^ ex)
            {
                MessageBox::Show("Произошла ошибка: " + ex->Message,
                    "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
        }

    private: System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        // ... (остальной код генерируется автоматически)
#pragma endregion
    };
}