четверг, 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;
}

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