Двумерный массив в языке c++

#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
const double Rad_to_deg = 57.2957795130823;
using namespace std;

class Vector
{
private:
    double x;
    double y;
    double mag;
    double ang;
    char mode;

    void set_mag();
    void set_ang();
    void set_x();
    void set_y();
public:
    Vector();
    Vector(double n1, double n2, char form = 'r');
    void set(double n1, double n2, char form = 'r');
    ~Vector();
    double xval() const { return x; }
    double yval() const { return y; }
    double magval() const { return mag; }
    double angval() const { return ang; }
    void polar_mode();
    void rect_mode();

    Vector operator+(const Vector &b) const;
    Vector operator-(const Vector &b) const;
    Vector operator-() const;
    Vector operator*(double n) const;

    friend Vector operator*(double n, const Vector &a);
    friend ostream & operator<<(ostream &co, const Vector &v);
};


void Vector::set_mag()
{
    mag = sqrt(x * x + y * y);
}
void Vector::set_ang()
{
    if(x == 0.0 && y == 0.0)
    {
        ang = 0.0;
    }
    else
    {
        ang = atan2(y,x);
    }
}
void Vector::set_x()
{
    x = mag * cos(ang);
}
void Vector::set_y()
{
    y = mag * sin(ang);
}
Vector::Vector()
{
    x = y = mag = ang = 0.0;
    mode = 'r';
}
Vector::Vector(double n1, double n2, char form)
{
    mode = form;
    if (form == 'r')
    {
        x = n1;
        y = n2;
        set_ang();
        set_mag();
    }
    else if (form == 'p')
    {
        mag = n1;
        ang = n2 / Rad_to_deg;
        set_x();
        set_y();
    }
    else
    {
        cout << "Incorrect 3rd argument, please write correct, vector set to 0" << endl;
        x = y = mag = ang = 0.0;
        mode = 'r';
    }
}
void Vector::set(double n1, double n2, char form)
{
    mode = form;
    if (form == 'r')
    {
        x = n1;
        y = n2;
        set_ang();
        set_mag();
    }
    else if (form == 'p')
    {
        mag = n1;
        ang = n2 / Rad_to_deg;
        set_x();
        set_y();
    }
    else
    {
        cout << "Incorrect 3rd argument, please write correct, vector set to 0" << endl;
        x = y = mag = ang = 0.0;
        mode = 'r';
    }
}
Vector::~Vector()
{
}
void Vector::polar_mode()
{
    mode = 'p';
}
void Vector::rect_mode()
{
    mode = 'r';
}
Vector Vector::operator+(const Vector &b) const
{
    return Vector(x + b.x, y + b.y);
}
Vector Vector::operator-(const Vector &b) const
{
    return Vector(x - b.x, y - b.y);
}
Vector Vector::operator-() const
{
    return Vector(-x, -y);
}
Vector Vector::operator*(double n) const
{
    return Vector(n * x, n * y);
}
Vector operator*(double n, const Vector &a) 
{
    return a * n;
}
ostream & operator<<(ostream &co, const Vector &v)
{
    if(v.mode == 'r')
    {
        co << "(x,y) = (" << v.x << ", " << v.y << ")" << endl;
    }
    else if(v.mode == 'p')
    {
        co << "(m,a) = (" << v.mag << ", " << v.ang * Rad_to_deg << ")" << endl;
    }
    else
    {
        co << "Vector object is invalid!" << endl;
    }
    return co;
}



int main()
{
    srand(time(0));

    int ite = 0;
    int tr = 0;
    double direction;
    Vector step;
    Vector result(0.0, 0.0);
    double target;
    double dstep;
    int d = 0;
    unsigned long steps[tr][3];
    for(int i = 0; i < tr; i++)
    {
        for(int a = 0; a < 3; a++)
        {
            steps[i][a] = 0;
        }
    }
    cout << "Enter target distance(q to quit): ";

    while(cin >> target)
    {
        cout << "Enter step length: ";
        if(!(cin >> dstep))
        {
            break;
        }
        cout << "Enter try: ";
        if(!(cin >> tr))
        {
            break;
        }
        unsigned long steps[tr][3];
        for(int i = 0; i < tr; i++)
        {
            for(int a = 0; a < 3; a++)
            {
                steps[i][a] = 0;
            }
        }
        while(d < tr)
        {
            while(ite != 2)
            {
            while(result.magval() < target)
            {
                direction = rand() % 360;
                step.set(dstep, direction, 'p');
                result = result + step;
                if(ite == 0)
                {
                    steps[d][ite]++;
                }
                if(ite == 1)
                {
                    steps[d][ite]++;
                }
                if(ite == 2)
                {
                    steps[d][ite]++;
                }
            }
            ite++;
            };
            d++;
        }
        for(int i = 0; i < tr; i++)
        {
            unsigned long min;
            unsigned long mid;
            unsigned long max;
            cout << "Minimum is: ";
            if(steps[i][0] < steps[i][2]) min = steps[i][0];
            if(steps[i][1] < min) min = steps[i][1];
            if(steps[i][2] < min) min = steps[i][2];
            cout << min << endl << endl;

            cout << "Middle is: ";
            if((steps[i][0] < steps[i][1]) < steps[i][2]) mid = steps[i][1];
            if((mid < steps[i][0]) < steps[i][2]) mid = steps[i][0];
            if(mid < steps[i][2] < steps[i][1]) mid = steps[i][2];
            if(steps[i][1] < steps[i][2] < mid) mid = steps[i][2];
            cout << mid << endl << endl;

            cout << "Maximum is: ";
            if(steps[i][0] < steps[i][2]) max = steps[i][0];
            if(steps[i][1] < max) max = steps[i][1];
            if(steps[i][2] < max) max = steps[i][2];
            cout << max << endl << endl;
        }
        cout << "Enter target distance if you want to continue(q to quit): "; 
    }
    cout << "Bye\n";
    return 0;
}

Так сразу хочу сказать что в строке от 220 до 231, двумерный массив не прибавляется, программа просить человека ввести значения, первое значения длина пути, второе длина шага и третья для количество попыток, а класс пытается решить за сколько шагов человек пройдет заданный путь, а также rand() % 360, это направление куда идет человек, а также в классе есть mode которому присваивается p или r,p это полярная а r прямоугольная, короче класс решает векторные задачи, заранее спасибо за помощь


Ответы (1 шт):

Автор решения: DmitryK

Вообще-то двумерный массив прибавляется, но только steps[0][ite]++;. Потому что потом происходит выход из цикла. Т.к. вы при итерации по d не обнуляете следующий итератор ite. При первой итерации d == 0 циклы все проходят и ite == 2. При второй итерации d == 1, а ite уже равно двум с предыдущей итерации и цикл по ite не запускается. И т.д.
То же самое по d. Если пользователь захочет ещё раз ввести дистанцию, то дистанция новая, шаг новый, а d с прошлой итерации уже равна количеству попыток.
И то же самое с result.magval(). На первой итерации оно становится больше чем target и цикл больше не выполняется.

d = 0; // вот тут нужно обнулять итератор
while(d < tr)
{   
    ite = 0; // вот тут нужно обнулять итератор
    while(ite != 2) // скорее всего ошибка - должно быть while(ite < 3)
    {
        // вот здесь нужно обнулять значение result.magval()
        Vector result(0.0, 0.0);  // например вот так
        while(result.magval() < target)
        {
            direction = rand() % 360;
            step.set(dstep, direction, 'p');
            result = result + step;
            steps[d][ite]++;
        }
        ite++;
    };
    d++;
}

Ну и по мелочам всякое:
Массив unsigned long steps[tr][3]; объявляется 2 раза - первый в начале main(), второй - в цикле. Дальше не смотрел, но вполне возможно что где-то в коде используются разные массивы.
Не используйте "магических" чисел - объявите константу const int max_ite = 3; и используйте её дальше в коде - это убережет от ошибок:

const int max_ite = 3;
unsigned long steps[tr][max_ite];

for(int i = 0; i < tr; i++)
   for(int a = 0; a < max_ite; a++)
      steps[i][a] = 0;

while(ite < max_ite)
{
   ...
}
→ Ссылка