#include <iostream>
#include <cmath>
#include <vector>
#include <iomanip>

using namespace std;

// плотность воздуха ro(H)
double ro(double H)
{
    return 1.3661924862989573034545085 - 0.0001418065280049439870457 * H + 0.0000000067724452175195049 * pow(H, 2) - 0.0000000000000901906541734 * pow(H, 3);
}

// скорости звука a(H)
double a(double H)
{
    return 342.8873180441046321920151030 - 0.0035032436716794758557481 * H - 0.0000000518023700664785279 * pow(H, 2);
}

// коэффициент подъемной силы Cy(alpha)
double Cy(double alpha)
{
    return -0.2234285714285730306549738 + 0.1278571428571436963128605 * alpha - 0.0035714285714287135643785 * pow(alpha, 2) + 0.0000000000000000077098821 * pow(alpha, 3);
}

// лобовое сопротивление Cx(alpha)
double Cx(double alpha)
{
    return 19.0500000000000397903932026 - 12.7708333333333623471617102 * alpha + 3.2104166666666742457891814 * pow(alpha, 2) - 0.3541666666666675733488034 * pow(alpha, 3) + 0.0145833333333333717285463 * pow(alpha, 4);
}

// сила тяги двигателей P(M)
double P(double M)
{
    return 44294.8064442556933499872684479 + 47830.2664371878781821578741074 * M - 126839.0779774459660984575748444 * pow(M, 2) + 95497.6562483121379045769572258 * pow(M, 3);
}

int get_k()
{
    int k;
    cout << "Введите количество разбиений (от 1 до 99): ";
    cin >> k;

    if (k <= 0 || k >= 100)
    {
        cout << "Ошибка: количество разбиений должно быть от 1 до 99.\n";
        return get_k();
    }
    return k;
}

int main()
{
    int k = get_k();

    vector<double> M(k + 1);
    vector<double> H(k + 1);
    vector<double> V(k + 1);
    vector<double> alpha(k + 1);

    V[0] = 310 / 3.6;
    V[k] = 700 / 3.6;

    H[0] = 300;
    H[k] = 6000;

    // cout << "Введите начальное число Маха: ";
    // cin >> M[0];
    // cout << "Введите конечное число Маха: ";
    // cin >> M[k];
    M[0] = 0.3;
    M[k] = 0.7;

    for (int i = 0; i < k; ++i)
    {
        H[i + 1] = H[i] + (H[k] - H[0]) / k;
        V[i + 1] = V[i] + (V[k] - V[0]) / k;
        M[i + 1] = M[i] + (M[k] - M[0]) / k;
    }

    // cout << "Введите начальный угол атаки (градусы): ";
    // cin >> alpha[0];
    alpha[0] = 4;
    for (int i = 0; i < k; ++i)
    {
        alpha[i + 1] = alpha[i] + 1.0;
    }

    cout << fixed;
    cout << "\nРезультаты:\n";
    cout << left << setw(7) << "№"
         << right << setw(10) << "H (м)"
         << right << setw(15) << "V (м/с)"
         << right << setw(12) << "alpha (°)"
         << right << setw(12) << "M"
         << right << setw(12) << "a (м/с)"
         << right << setw(12) << "ro (кг/м^3)"
         << right << setw(12) << "Cy"
         << right << setw(10) << "Cx"
         << right << setw(15) << "P (кгс)"
         << endl;

    cout << string(107, '-') << endl;

    for (int i = 0; i <= k; ++i)
    {
        cout << left << setw(5) << (i + 1);
        cout << right << setw(10) << setprecision(0) << H[i];
        cout << right << setw(10) << setprecision(2) << V[i];
        cout << right << setw(12) << setprecision(2) << alpha[i];
        cout << right << setw(10) << setprecision(4) << M[i];
        cout << right << setw(10) << setprecision(2) << a(H[i]);
        cout << right << setw(15) << setprecision(6) << ro(H[i]);
        cout << right << setw(10) << setprecision(4) << Cy(alpha[i]);
        cout << right << setw(10) << setprecision(4) << Cx(alpha[i]);
        cout << right << setw(15) << setprecision(2) << P(M[i]);
        cout << endl;
    }

    return 0;
}
