Разработка текста программы

Для удобства работы с программой введём переменную-константу, которая будет отвечать за количество экземпляров класса moy. То есть будем работать с массивом объектов класса moy размерностью N.

const N=3;

Перейдём к описанию объявленных выше функций:

moy operator =(moy o1);

Данная функция производит перегрузку оператора присваивания, то есть выполняет присваи-вание полей одного объекта класса полям другого объекта этого же класса. При перегрузке бинарного оператора левый операнд передаётся функции неявно, а правый передаётся в каче-стве аргумента. Возвращаемый тип - сам класс, т.е moy. В целом эта функция - аналог функции set.

int operator ==(moy o1);

Функция позволяет установить соответствие между экземплярами одного класса. Т.е. её тело включает проверку на равенство значений числовых полей и сравнение содержимого строк, которое выполняется с помощью функции strcmp. В зависимости от того, тождественны ли экземпляры функцией возвращается 0 или 1.

moy operator +(moy o1);

Функция operator+() возвращает объект типа moy Отметим тот факт, что временный объект tr используется внутри функции operator+() для хранения результата и является возвращаемым объектом. Отметим также, что ни один из операндов не меняется. Назначение переменной tr легко понять.

В данной ситуации оператор + был перегружен способом, аналогичным своему традиционному арифметическому использованию. Поэтому и было важно, чтобы ни один из операндов не менялся. Таким образом, временный объект необходим для хранения результата.

friend ostream & operator<<(ostream &stream, moy &o1);

Первый параметр является ссылкой на объект типа ostream. Это означает, что поток streamдолжен быть потоком вывода. Второй параметр получает выводимый объект. Обратите внимание, что пользовательская функция вывода возвращает ссылку на поток stream, который имеет тип ostream. Это необходимо, если перегруженный оператор << должен использоваться в ряде последовательных выражений ввода/вывода.

friend istream & operator>>(istream &stream, moy &o1);

Пользовательские функции ввода возвращают ссылку, на поток istream, который является по-током ввода. Первый параметр тоже является ссылкой на поток ввода. Второй параметр - это ссылка на объект, получающий вводимую информацию.

Так же, как и пользовательская функция вывода, пользовательская функция ввода не может быть функцией-членом. Хотя внутри такой функции может быть выполнена любая операция, лучше ограничить ее работу вводом информации.

friend void shapka(void);

Данная функция является вспомогательной. Она формирует шапку таблицы при вызове перегруженной формы оператора <<

friend int isvalid(inta, intb);

Функция, описанная выше выполняет проверку данных, которые вводит пользователь. Т.е проверяет соответствие номеров класса на существование.

 

Листинг программы

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <math.h>

#include <stdio.h>

#include <iomanip.h>

const N=3;

class moy {

char *veshestvo;

unsigned int nomer;

unsigned int temperatura;

float vyazkost;

friend ostream & operator<<(ostream &stream, moy &o1);

friend istream & operator>>(istream &stream, moy &o1);

friend void shapka(void);

friend void linebuild(void);

friend int isvalid(int a, int b);

public:

moy () { vyazkost =0; temperatura =0; nomer =0; *(veshestvo = new char[1])='\0';}

moy (char *a, unsigned int b, unsigned int c, float d);

void setall(char *a, unsigned int ,unsigned int , float );

void getall(char *a, unsigned int b, unsigned int c, float d);

void showall(void);

moy operator = (moy o1);

int operator == (moy o1);

moy operator + (moy o1);

};

ostream & operator<<(ostream &stream, moy &o1) {

shapka();

stream<<"|"<<setw(15)<<o1.veshestvo<<" | ";

stream<<setw(9)<<o1. nomer <<"|";

stream<<setw(18)<<o1. temperatura <<" |";

stream<<setw(17)<<o1. vyazkost <<" |";

linebuild();

return stream;

}

istream & operator>>(istream &stream, moy &o1) {

cout<<"Veshestvo, Atomniyi nomer, Temperatura, Vyazkost: \n";

stream>>o1.veshestvo;

stream>>o1. nomer;

stream>>o1. temperatura;

stream>>o1. vyazkost;

return stream;

}

int isvalid(int a, int b){

if (((a>N-1) || (a<0)) || ((b>N-1) ||(b<0)))

{

cout<<" Oshibka! Ekzempliara s takim imenem ne syshestvyet.\n";

getch();

return -1;

}

else if (a==b)

{

cout<<" Oshibka! Ekzempliar ne mozet bit zapisan sam v sebya.\n";

getch();

return -2;

}

return 0;

}

moy moy::operator + (moy o1) {

moy tr;

int i,j;

delete[] tr.veshestvo;

tr.veshestvo =new char [strlen(veshestvo)+strlen(o1.veshestvo)+2];

strcpy(tr.veshestvo,veshestvo);

strcat(tr.veshestvo, o1.veshestvo);

tr. nomer = nomer +o1. nomer;

tr. temperatura = temperatura +o1. temperatura;

tr. vyazkost = vyazkost +o1. vyazkost;

return tr;

}

int moy::operator == (moy o1) {

if (temperatura!= o1. temperatura) {cout << " Dannie ekzempliari klassa ne ravni."; getch();}

else if (ceil(vyazkost)!=ceil(o1. vyazkost)) {cout << " Dannie ekzempliari klassa ne ravni."; getch();}

else if (strcmp(veshestvo,o1.veshestvo) != 0) {cout << " Dannie ekzempliari klassa ne ravni."; getch();}

else if (nomer!= o1. nomer) {cout << " Dannie ekzempliari klassa ne ravni."; getch();}

else cout<<" Ekzemplyari klassa ravni."; getch();

return 0;

}

moy moy::operator = (moy o1) {

delete [] veshestvo;

 

veshestvo = new char [strlen(o1.veshestvo)+2];

if (!veshestvo) {

cout<<" Oshibka! Pamiat ne videlena.";

exit(1);

}

strcpy(veshestvo,o1.veshestvo);

nomer = o1. nomer;

temperatura = o1. temperatura;

vyazkost = o1. vyazkost;

return o1;

}

moy:: moy (char *a, unsigned int b, unsigned int c, float d) {

veshestvo=new char [strlen(a)+1];

strcpy(veshestvo,a);

nomer =b;

temperatura =c;

vyazkost =d;

}

void moy::setall(char *a, unsigned int b, unsigned int c, float d) {

strcpy(veshestvo,a);

nomer =b;

temperatura =c;

vyazkost =d;

}

 

void moy::showall(void) {

cout<< veshestvo <<" ";

cout<< nomer <<" ";

cout<< temperatura <<" ";

cout<< vyazkost <<" ";

}

void moy::getall( char * a, unsigned int b, unsigned int c, float d)

{

delete[] a;

a=new char [strlen(veshestvo)+1];

strcpy(a, veshestvo);

b= nomer;

c= temperatura;

d= vyazkost;

cout<<a<<" ";

cout<<b<<" ";

cout<<c<<" ";

cout<<d<<" ";

cout<<"\n";

}

void shapka(void)

{

cout<<"_____________________________________________\n";

cout<<"| Vyazkost metallov v ghidkom sostoyanii |\n";

cout<<"|---------------------------------------------------------------------------|\n";

cout<<"| Veshestvo | Atomniyi nomer | Temperatura | Vyazkost |\n";

cout<<"|---------------------------------------------------------------------------|\n";

}

void linebuild(void) {

cout<<"\n|--------------------------------------------------------------------------|\n";

}

int main(void) {

char *n;

unsigned int t;

unsigned int s;

float h;

short i,k;

unsigned int s1;

short q,q1;

moy obj[N]={ moy ("Alyuminiyi", 13,700,2.90),

moy ("Vismut", 83,304,1.65),

moy ("Svinec", 82,441,2.11)};

clrscr();

cout.precision(2);

cout<<" Veshestvo, Atomniyi nomer, Temperatura, Vyazkost: \n";

for (i=0; i<N; i++) {

obj[i].showall();

cout<<"\n";

}

cout<<"\nPeregryzka operatora prisvaivania '='.\n";

cout<<" Vvedite nomera ekzemplyarov klassa: zameniaimi b zameniashi >\n";

cin>>q;

cin>>q1;

if (isvalid(q, q1)!=0) exit(-1);

obj[q] = obj[q1];

 

cout<<" Veshestvo, Atomniyi nomer, Temperatura, Vyazkost: \n";

for(i=0; i<N; i++) {

obj[i].showall();

cout<<"\n";

}

 

cout<<"\nPeregryzka operatorov sootvetstviya '=='.\n";

cout<<" Vvedite nomera ekzemplyarov klassa, kotorie nyzhno sravnit >\n";

cin>>q;

cin>>q1;

if (isvalid(q, q1)!=0) exit(-1);

obj[q] == obj[q1];

 

cout<<"\nPeregryzka operatorov symmi '+'.\n";

cout<<" Vvedite nomera ekzemplyarov klassa, kotorie nyzhno slozhit >\n";

cin>>q;

cin>>q1;

moy temp;

if (isvalid(q, q1)!=0) exit(-1);

temp=obj[q]+obj[q1];

cout<<" Veshestvo, Atomniyi nomer, Temperatura, Vyazkost: ";

temp.getall(n,t,s,h);

 

cout<<"\nPeregryzka operatorov potovogo vvoda '>>'.";

cout<<"\nVvedite nomer ekzemplyara klassa: ";

cin>>q;

if ((q>N-1)||(q<0)) {cout<<" Oshibka! Ekzempliara s takim indeksom ne syshestvyet."; getch(); exit(-1);}

cin>>obj[q];

 

cout<<"\n Peregryzka operatorov potovogo vivoda '<<'.";

cout<<"\n Vvedite nomer ekzemplyara klassa: ";

cin>>q;

if ((q>N-1)||(q<0)) {cout<<" Oshibka! Ekzempliara s takim indeksom ne syshestvyet."; getch(); exit(-1);}

cout<<obj[q];

 

getch();

return 0;

}