суббота, 18 октября 2008 г.

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

мое кунг-фу стало быстрее и сильнее =8-)

Комплексное число состоит из двух частей: вещевещественной и мнимой. Одним из способов записи мнимнимого числа является такой: (3.0, 4.0i). Здесь 3.0 - вещественная часть, а 4.0 - мнимая. Предположим, что а = (A,Bi) и с = (C,Di). Вот некоторые операоперации, выполняемые над комплексными числами: • Сложение: а + с = (А + С, (В + D)i) • Вычитание: а - с = (А - С, (В - D)i) • Умножение: а*с = (А*С- B*D,(A*D + B*C)i) • Умножение: (х - вещественное число): х * с = (x*C,x*Di) • Поиск сопряженного числа: ~а = (A, -Bi) Определите класс, оперирующий комплексными числами, чтобы приводимая ниже программа могла воспользоваться им и получать правильные результарезультаты. Обратите внимание на то, что должна выполнятьвыполняться перегрузка операций << и >>. Многие системы уже включают поддержку комплексных чисел в заголовочном файле complex.h, поэтому воспользуйтесь файлом complex0.h, чтобы избежать проблем. Используйте ключевое слово const там, где это оправдано.

#include <iostream>
#include <cstdlib>
using namespace std;
#include "complex0.h" // чтобы избежать путаницы с файлом complex.h

int main ()
{
complex a(3.0, 4.0); // инициализация посредством (3,4i)
complex c;
cout << "Enter a complex number (q to quit):\n";
while (cin >> c)
{
cout << "c is " << c << "\n" ;
cout << "complex conjugate is " << ~c << "\n";
cout << "a + c is " << a + c << "\n";
cout << "a - c is " << a - c << "\n";
cout << "a * c is " << a * c << "\n";
cout << "2 * c is " << 2 * c << "\n";
cout << "Enter a complex number (q to quit):\n";
}
cout << "Done!\n";
system("PAUSE");
return 0;
}

Результаты выполнения программы. (Обратите внивнимание на то, что оператор cin >> с благодаря перегрузке теперь требует ввода вещественной части и мнимой части.)



Enter a complex number (q to quit) :
real: 10
imaginary: 12
с is (10,12i)
complex conjugate is (10,-12i)
a + с is (13,16i)
a - с is (13,16i)
a * с is (-18,76i)
2 * с is (20,24i)
Enter a complex number (q to quit) :
real: q
Done!

------------------------------------------------------------


complex0.h



// complex0.h - определение класса complex0
#ifndef _COMPLEX0_H_
#define _COMPLEX0_H_
class complex
{
private:
double v; // вещественное число
double m; // мнимое число

public:
complex();
complex(double a , double b);
~complex();
complex operator+(const complex & b) const;
complex operator-(const complex & b) const;
complex operator~() const;
complex operator*(double n)const;
complex operator*(const complex & b)const;
friend complex operator*(double n, const complex & b);
friend ostream & operator<<(ostream & os, const complex & b);
friend istream & operator>>(istream & is, complex & b);
};
#endif


complex0.cpp



// complex0.cpp
#include <iostream>
using namespace std;
#include "complex0.h"

complex::complex()
{
v = 0.0;
m = 0.0;
}
complex::complex(double a, double b)
{
v = a;
m = b;
}
complex::~complex()
{
}
complex complex::operator+(const complex & b) const
{
return complex(v + b.v, m + b.m);
}
complex complex::operator-(const complex & b) const
{
return complex(v - b.v, m - b.m);
}
complex complex::operator~() const
{
return complex(v, -m);
}
complex complex::operator*(double n)const
{
return complex(n * v, n * m);
}
complex complex::operator*(const complex & b)const
{
return complex((v * b.v - m * b.m), (v * b.m + m * b.v));
}
complex operator*(double n, const complex & b)
{
return (b * n);
}
ostream & operator<<(ostream & os, const complex & b)
{
os << "(" << b.v << ", " << b.m << "i)";
return os;
}
istream & operator>>(istream & is, complex & b)
{
cout << "real: ";
is >> b.v;
cout << "imaginary: ";
is >> b.m;
return is;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "complex0.h" // чтобы избежать путаницы с файлом complex.h

int main ()
{
complex a(3.0, 4.0); // инициализация посредством (3,4i)
complex c;
cout << "Enter a complex number (q to quit):\n";
while (cin >> c)
{
cout << "c is " << c << "\n" ;
cout << "complex conjugate is " << ~c << "\n";
cout << "a + c is " << a + c << "\n";
cout << "a - c is " << a - c << "\n";
cout << "a * c is " << a * c << "\n";
cout << "2 * c is " << 2 * c << "\n";
cout << "Enter a complex number (q to quit):\n";
}
cout << "Done!\n";
system("PAUSE");
return 0;
}

пятница, 17 октября 2008 г.

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

Перепишите класс Stonewt таким образом, чтобы он мог перегружать операции сравнения. Напишите программу, которая объявляет массив из шести объектов класс а Stonewt и выполняет инициализацию трех первых объектов в объявлении массива. Воспользуйтесь циклом, чтобы осуществить считывание значений, используемых для присваивания остальным трем элементам массива. Далее необходимо отобразить максимальный и минимальный элементы, а также количество элементов, превышающих или равных 11 стоунам.


stonewt.h



// stonewt.h - определение класса Stonewt
#ifndef _STONEWT_H_
#define _STONEWT_H_
class Stonewt
{
private:
int stone; //всего стоунов
double pds_left; //дробное число фунтов
double pounds; //общий вес в фунтах
char mode; // f - фунты, s - стоуны
public:
Stonewt(double lbs, int stn = 0, char form = 'f'); // конструктор
Stonewt ();// конструктор, заданный по умолчанию
~Stonewt();
void f_mode(); // установить mode в 'f'
void s_mode(); // установить mode в 's'
Stonewt operator+(const Stonewt & b) const;
Stonewt operator-(const Stonewt & b) const;
Stonewt operator-() const;
Stonewt operator*(double n) const;
bool operator==(const Stonewt & b) const;
bool operator<(const Stonewt & b) const;
bool operator>(const Stonewt & b) const;
bool operator<=(const Stonewt & b) const;
bool operator>=(const Stonewt & b) const;
bool operator!=(const Stonewt & b) const;
// дружественные конструкции
friend Stonewt operator*(double n, const Stonewt & a);
friend ostream & operator<<(ostream & os, const Stonewt & v);
friend istream & operator>>(istream & is, Stonewt & v);
int st()const; // возвращает число стоунов
};
#endif

stonewt.cpp



#include <iostream>
using namespace std;
#include "stonewt.h"
const int Lbs_per_stn = 14;
Stonewt::Stonewt() // конструктор по умолчанию
{
mode = 'f';
pounds = 0.0;
pds_left = 0.0;
stone = 0;
}
Stonewt::Stonewt(double lbs, int stn, char form) // создает объект Stonewt на базе значения double
{
mode = form;
stone = int(lbs) / Lbs_per_stn + stn;
pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs) ;// целочисленное деление
pounds = stn * Lbs_per_stn +lbs;
}
Stonewt::~Stonewt() // деструктор
{
}
void Stonewt::f_mode()
{
mode = 'f';
}
void Stonewt::s_mode()
{
mode = 's';
}
Stonewt Stonewt::operator+(const Stonewt & b) const
{
return Stonewt(pounds + b.pounds);
}
Stonewt Stonewt::operator-(const Stonewt & b) const // вычитание объекта b класса Stonewnt из объекта а
{
return Stonewt(pounds - b.pounds);
}
Stonewt Stonewt::operator-() const // изменяет знак объекта Stonewnt на противоположный
{
return Stonewt(-pounds);
}
Stonewt Stonewt::operator*(double n) const // умножение Stonewnt на n
{
// v.stone = int(v.pounds) / Lbs_per_stn; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// v.pds_left = int(v.pounds) % Lbs_per_stn + v.pounds - int(v.pounds) ;

return Stonewt(n * pounds);
}
//операции сравнения
bool Stonewt::operator==(const Stonewt & b) const
{
return pounds == b.pounds;
}
bool Stonewt::operator>(const Stonewt & b) const
{
return pounds > b.pounds;
}
bool Stonewt::operator<(const Stonewt & b) const
{
return pounds < b.pounds;
}
bool Stonewt::operator>=(const Stonewt & b) const
{
return pounds >= b.pounds;
}
bool Stonewt::operator<=(const Stonewt & b) const
{
return pounds <= b.pounds;
}
bool Stonewt::operator!=(const Stonewt & b) const
{
return pounds != b.pounds;
}
// дружественные методы
Stonewt operator*(double n, const Stonewt & a) // умножает n на объект а класса Stonewnt a
{
return (a * n);
}
ostream & operator<<(ostream & os, const Stonewt & v) // отображает в фунтах, если mode является f,
{ // отображает в поундах и фунтах, если mode является s
if (v.mode == 'f')
os << "pounds = " << v.pounds << "\n";
else
if (v.mode == 's')
os << "stone = " << v.stone << ", " << "pounds = " << v.pds_left << "\n" ;
else
os << "Stonewt object mode is invalid";
return os;
}
istream & operator>>(istream & is, Stonewt & v)
{
cout << "mode s or f : ";
is >> v.mode;
if (v.mode == 's')
{
cout << "stone : ";
is >> v.stone;
cout << "pds_left : ";
is >> v.pds_left;
v.pounds = v.stone * Lbs_per_stn + v.pds_left;
}
if (v.mode == 'f')
{
cout << "pounds : ";
is >> v.pounds;
v.stone = int(v.pounds) / Lbs_per_stn;
v.pds_left = int(v.pounds) % Lbs_per_stn + v.pounds - int(v.pounds) ;
}
return is;
}
int Stonewt::st() const // возвращает число стоунов (нужно для этой конченой задачи)
{
return stone;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "stonewt.h"
const int ArSize = 6;
int main()
{
Stonewt a[ArSize] =
{
Stonewt(122.4, 5, 's'),
Stonewt(200, 0, 's'),
Stonewt(80.5, 9, 's')
};
Stonewt min;
Stonewt max;
int elem = 0;
cout << "-=-=-=vvedite zna4eni9l dlja 3 objectov=-=-=-=-\n";
for (int i = 3; i < ArSize; i++)
{
cout << "object #" << i+1 << " :\n";
cin >> a[i];
}
min = max = a[0];
for (int n = 0; n < ArSize; n++)
{
if (max < a[n])
max = a[n];
else min = a[n];
if (a[n].st() >= 11)
elem++;
cout << "object #" << n << " " << a[n];
};
cout << "minimalnyi object: " << min << endl;
cout << "maximalnyi object: " << max << endl;
cout << elem << " objectov soderzhat 11 i bolshe stounov\n";
system("PAUSE");
return 0;
}

вот это говно friend istream & operator>>(istream & is, Stonewt & v); сам сделал... почти не реально, но все-таки оно так и есть =)).. Нет, это наконец-то не говно, это нормальный код (неужели свершилось)... хотяяяя...

четверг, 16 октября 2008 г.

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

это полный ппц... тупо передрал с 1ого упражнения... даже впадлу было нормальный майн напесать.. да и вротмненоги йатд, что это песдатый говнокод *lol

Внесите такие изменения в класс Stonewt, чтобы в нем содержался элемент состояния, посредством которого можно было бы установить представление объекта в стоунах, в целых или дробных значениях фунтов. Перегрузите операцию << для замены методов show_stn() и show_lbs(). Перегрузите операции сложения, вычитания и умножения таким образом, чтобы можно было складывать, вычитать и умножать значения Stonewt. Выполните тестирование полученного класса с помощью короткой программы.

stonewt.h



//определение класса Stonewt
#ifndef _STONEWT_H_
#define _STONEWT_H_
class Stonewt
{
private:
int stone; //всего стоунов
double pds_left; //дробное число фунтов
double pounds; //общий вес в фунтах
char mode; // f - фунты, s - стоуны
public:
Stonewt(double lbs = 0.0, int stn = 0, char form = 'f'); // конструктор
Stonewt ();// конструктор, заданный по умолчанию
~Stonewt();
void f_mode() ; // установить mode в 'f'
void s_mode(); // установить mode в 's'
Stonewt operator+(const Stonewt & b) const;
Stonewt operator-(const Stonewt & b) const;
Stonewt operator-() const;
Stonewt operator*(double n) const;
// дружественные конструкции
friend Stonewt operator*(double n, const Stonewt & a);
friend ostream & operator<<(ostream & os, const Stonewt & v);
};
#endif

stonewt.cpp



#include <iostream>
using namespace std;
#include "stonewt.h"
const int Lbs_per_stn = 14;
Stonewt::Stonewt() // конструктор по умолчанию
{
mode = 'f';
pounds = pds_left = 0.0;
stone = 0;
}
Stonewt::Stonewt(double lbs, int stn, char form)// создает объект Stonewt на базе значения double
{
mode = form;
stone = int(lbs) / Lbs_per_stn + stn;
pds_left = int (lbs) % Lbs_per_stn + lbs - int (lbs) ;// целочисленное деление
pounds = stn * Lbs_per_stn +lbs;
}
Stonewt::~Stonewt() // деструктор
{
}
void Stonewt::f_mode()
{
mode = 'f';
}
void Stonewt::s_mode()
{
mode = 's';
}
Stonewt Stonewt::operator+(const Stonewt & b) const
{
return Stonewt(pounds + b.pounds);
}
Stonewt Stonewt::operator-(const Stonewt & b) const // вычитание объекта b класса Stonewnt из объекта а
{
return Stonewt(pounds - b.pounds);
}
Stonewt Stonewt::operator-() const // изменяет знак объекта Stonewnt на противоположный
{
return Stonewt(-pounds);
}
Stonewt Stonewt::operator*(double n) const // умножение Stonewnt на n
{
return Stonewt(n * pounds);
}
// дружественные методы
Stonewt operator*(double n, const Stonewt & a) // умножает n на объект а класса Stonewnt a
{
return (a * n);
}
ostream & operator << (ostream & os, const Stonewt & v) // отображает в фунтах, если mode является f,
{ // отображает в поундах и фунтах, если mode является s
if (v.mode == 'f')
os << "pounds = " << v.pounds << "\n";
else
if (v.mode == 's')
os << "stone = " << v.stone << ", " << "pounds = " << v.pds_left << "\n" ;
else
os << "Stonewt object mode is invalid";
return os;
}

main.cpp



#include <iostream>
#include <cstdlib>
using namespace std;
#include "stonewt.h"
int main()
{
Stonewt vasja(234);
Stonewt gogi(250.5, 2, 's');
Stonewt vagogi(0.0, 0, 'f');

double d = 0;
cout << vasja;
cout << gogi;
vagogi = vasja + gogi;
cout << vagogi;
vagogi.s_mode();
cout << vagogi;
cout << vasja/2;
cout << gogi * 2;
cout << 2 * gogi;
system("PAUSE");
return 0;
}

среда, 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;
}