Разработка шаблона класса, реализующего структуру данных «стек», страница 2

};

Complex.cpp:

#include "comPlex.h"

int Complex::counter;

double const Complex::pi = 3.1415926536;

Complex::Complex(): real(0.), image(0.)                                         // конструктор по умолчанию

{

counter++;

}

Complex::Complex(double re, double im): real(re), image(im)                     // конструктор с параметрами

{

counter++;

}

Complex::Complex(const Complex &obj) : real(obj.real), image(obj.image)         // конструктор копирования

{

counter++;

}

Complex::~Complex()                                                             // деструктор

{

counter--;

}

int Complex::getCounter()                                                       // возврат счётчика

{

return counter;

}

void Complex::edit()                                                    // редактирование объекта

{

cin>>*this;

return;

}

void Complex::del(Complex* &obj)                                        // удаление объекта

{

if (obj!=NULL)

{

delete obj;

obj = NULL;

}

return;

}

void Complex::show()                                                    // вывод объекта

{

cout<<*this;

return;

}

double Complex::mod()                                                   // модуль |Z|

{

return sqrt(real*real+image*image);

}

double Complex::arg()                                                   // аргумент arg Z

{

if (real>0) return atan(image/real);

if (real<0)

{

if (image>0) return pi+atan(image/real);

if (image<0) return -pi+atan(image/real);

if (image==0) return pi;

}

if (real==0)

{

if (image>0) return pi/2;

if (image<0) return -pi/2;

}

return 0;

}

ostream & operator << (ostream &out, Complex &obj)                      // cout<<

{

out<<"Z="<<obj.real<<"+"<<obj.image<<"*i"<<"\t"<<"|Z|="<<obj.mod()<<"\t";

if (obj.arg()!=0)

out<<"arg Z="<<obj.arg()*180/obj.pi<<"\t\n";

else

out<<"\t"<<"n/a"<<endl;

return out;

}

istream & operator >> (istream &in, Complex &obj)                       // cin>>

{

cout<<"Введите real =     \b\b\b\b";

in>>obj.real;

cout<<"Введите image =     \b\b\b\b";

in>>obj.image;

return in;

}

main.cpp:

#include <conio.h>

#include <Windows.h>

#include <clocale>

#include "Complex.h"

#include "Stack.h"

#define ONE         49

#define TWO         50

#define ESCAPE      27

bool menu();

void gotoxy(int, int);

Stack<Complex> *objPtr=NULL;

int main()

{

setlocale(LC_ALL, "Russian");

int stackSize;

cout<<"Размер стека: ";

cin>>stackSize;

Stack<Complex> obj(stackSize);

objPtr = &obj;

while(menu());

}

bool menu()

{

gotoxy(0, 1);                                   // оформление

cout<<"Содержимое стека:";                      // вывода

gotoxy(50, 1);                                  // содержимого

cout<<"Полученное значение:";                   // стека

//

int elemCount = objPtr->getTop();               //

if (elemCount>0)                                //

{                                               //

for (int i = 0; i<elemCount; i++)           //

{                                           //

gotoxy(0, 3+i);                         //

cout<<objPtr->getElement(i);            //

}

}

gotoxy(0, 15);

cout<<"\t1 - вывод из стека"<<endl

<<"\t2 - ввод в стек"<<endl

<<"\tESCAPE - выход"<<endl

<<"                             "<<endl

<<"                             "<<endl;

gotoxy(0, 18);

while (!_kbhit());                              // ожидание выбора клавиши

int choice;

choice = _getch();

switch (choice)

{

case ONE:                                       // удаление

{

system("cls");

gotoxy(50, 3);

if (elemCount>0)

cout<<objPtr->pop();

else

{

system("cls");

gotoxy(50, 3);

cout<<"Стек пуст!                               "<<endl;

}

break;

}

case TWO:                                       // ввод

{

if (objPtr->getTop()>objPtr->getSize())

break;

Complex object;

cin>>object;

objPtr->push();

break;

}

case ESCAPE:

{

return false;

}

default:

{

system("cls");

}

}

return true;

}

voidgotoxy(intx, inty)                           // перевод курсора в положение X,Y

{

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(hStdOut, coord);

return;

}

7.  Дополнительные вопросы.