среда, 15 октября 2008 г.

глава 10 упражнение 1

припизженей задание не придумаешь, но я сделал как сам понял =8-|) Я понял, что
нужно работать с количеством шагов (итераций.. ну с steps++ короче). Возможно
аффтар имел ввиду сравнивать сами вектора ( Vector).. ну можно было.. можно было
добавить в описание класса перегрузку больше, меньше и ровно (>, <, == )... только
вот вопрос возникает: а по какому показателю сравниваются вектора?.. короче я не
знаю = )).. да и впадлу думать...


ЗАДАНИЕ : листинг 10.13



#include <iostream>
#include <cstdlib> // прототипы функций rand () , srand()
#include <ctime> // прототип функции time()
using namespace std;
#include "vector.h"
int main()
{
srand(time(0)); //генератор случайных чисел с начальным значением
double direction;
Vector" step;
Vector result(0.0, 0.0);
unsigned long steps = 0;
double target;
double dstep;
cout << Enter target distance (q to quit): ";
while (cin >> target)
{
cout << "Enter step length: ";
if (!(cin >> dstep))
break;
while (result.magval() < target)
{
direction = rand() % 360;
step.set(dstep, direction, 'p');
result = result + step;
steps++;
}
cout << "After " << steps << " steps, the subject has the following location: \n"
cout << result << "\n";
result.polar_mode();
cout << " или\n" << result << "\n";
cout << "Average outward distance per step = << result.magval()/steps << "\n";
steps = 0 ;
result.set(0.0, 0.0);
cout << "Enter target distance (q to quit) :
}
cout << "Bye!\n";
return 0;
}


Внести изменения в листинг 10.13, чтобы представленная в нем программа, вместо
того чтобы сообщать результаты одной попытки конкретной комбинации цель-итерация,
сообщала о максимальном, минимальном и среднем числе итераций для N попыток,
где N - это целое число, задаваемое в программе пользователем.


vector.h



// vector.h - класс векторов с операцией <<, выбор режима
#ifndef _VECTOR_H_
#define _VECTOR_H_
class Vector
{
private:
double x ; // значение по горизонтали
double y; // значение по вертикали
double mag;// длина вектора
double ang;// направление вектора
char mode; // 'r' = прямоугольная 'р' = полярная

// приватные методы установки значений
void set_mag() ;
void set_ang() ;
void set_x() ;
void set_y() ;
public:
Vector();
Vector (double nl, double n2 , char form = 'r');
void set (double nl, double n2, char form = 'r');
~Vector() ;
double xval() const { return x;} // отображение значения х
double yval() const { return y;} // отображение значения y
double magval() const { return mag;} // отображение модуля
double angval() const { return ang;} // отображение угла
void polar_mode() ; // установить mode в 'р'
void rect_mode(); // установить mode в 'r'
// перегрузка операций
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 & os, const Vector & v);
};
#endif



vector.cpp



// vector.cpp - методы класса Vector
#include <iostream>
#include <cmath>
using namespace std;
#include "vector.h"
const double Rad_to_deg = 57.2957795130823;
// приватные методы
// вычисляет модуль по значениям х и у
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 nl, double n2, char form) // создает вектор на базе прямоугольных координат, если form является r
{ // (по умолчанию) или на базе полярных координат, если form является р
mode = form;
if (form == 'r'){
x = nl;
y = n2;
set_mag();
set_ang();
}
else if (form = 'p'){
mag = nl;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else{
cout << "Incorrect 3rd argument to Vector () - ";
cout << "vector set to 0\n";
x = y = mag = ang = 0.0;
mode = 'r';
}
}
void Vector::set(double nl, double n2, char form) // создается вектор на базе прямоугольных координат, если form является r
{ // (по умолчанию) или на базе полярных координат, если form является p
mode = form;
if (form == 'r'){
x = nl;
y = n2;
set_mag();
set_ang();
}
else if (form == 'p'){
mag = nl;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else{
cout << "Incorrect 3rd argument to Vector() - ";
cout << "vector set to 0 \n";
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 // сложение двух объектов Vector
{
return Vector(x + b.x, y + b.y);
}
Vector Vector::operator-(const Vector & b) const // вычитание объекта b класса Vector из объекта а
{
return Vector(x - b.x, y - b.y);
}
Vector Vector::operator-() const // изменяет знак объекта Vector на противоположный
{
return Vector(-x, -y);
}
Vector Vector::operator*(double n) const // умножение вектора на n
{
return Vector(n * x, n * y);
}
// дружественные методы
Vector operator*(double n, const Vector & a) // умножает n на объект а класса Vector a
{
return (a * n);
}
ostream & operator << (ostream & os, const Vector & v) // отображает прямоугольные координаты, если mode является r,
{ // отображает полярные координаты, если mode является p
if (v.mode == 'r')
os << "(x,y) = (" << v.x << ", " << v.y << ")";
else
if (v.mode == 'p')
os << "(m,a) = (" << v.mag << ", " << v.ang * Rad_to_deg << ") " ;
else
os << "Vector object mode is invalid";
return os;
}



main.cpp



#include <iostream>
#include <cstdlib> // прототипы функций rand(), srand()
#include <ctime> // прототип функции time()
using namespace std;
#include "vector.h"
int main()
{
int N = 0, Nq = 0; // число попыток итераций
srand(time(0)); //генератор случайных чисел с начальным значением
double direction;
Vector step;
Vector result (0.0, 0.0);
unsigned long steps = 0, accum = 0, max = 0, min = 0;
double target;
double dstep;
cout << "Enter kolichestvo popytok (q to quit): ";
if (cin >> N)
cout << "Enter target distance (q to quit): ";
else
{
cout << "Nevernyj vvod!\n";
system("PAUSE");
return 0;
}
while ( (cin >> target)) //(N > 0) &&
{
cout << "Enter step length: ";
if (!(cin >> dstep))
break;
while (result.magval() < target)
{
direction = rand() % 360;
step.set(dstep, direction, 'p');
result = result + step;
steps++;
}
accum = accum + steps;
if (steps > max)
max = steps;
if (min == 0)
min = steps;
else
if ( min > steps)
min = steps;
cout << "After " << steps << " steps, the subject has the following location:\n" ;
cout << result << "\n";
result.polar_mode();
cout << " or\n" << result << "\n";
cout << "Average outward distance per step = " << result.magval()/steps << "\n";
steps = 0;
result.set(0.0, 0.0);
Nq++;
if (--N > 0)
cout << "\n Enter target distance (q to quit): ";
else break;
}
cout << "\n \n \n za " << Nq << " popytok bylo sdelano " << accum << " shagov... \n";
cout << " v srednem za popytku : " << accum/Nq << " shagov\n";
cout << " maximum za popytku : " << max << " shagov\n";
cout << " minimum za popytku : " << min << " shagov\n";
cout << "Bye!\n";
system("PAUSE");
return 0;
}

Комментариев нет: