Двумерный массив в языке 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 шт):
Вообще-то двумерный массив прибавляется, но только 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)
{
...
}