пятница, 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); сам сделал... почти не реально, но все-таки оно так и есть =)).. Нет, это наконец-то не говно, это нормальный код (неужели свершилось)... хотяяяя...

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