Перегрузка операций
Пояснения
Для решения ЛР6 потребуется созданные ранее классы complex и vect, немного модернизированные. Часть материала к лабораторной давалась на лекциях №5-6, там достаточно подробно все описано.
Постановка задачи
Общая задача. Даны два массива Х, У (элементы класса vect). Массивы состоят из комплексных чисел. Подсчитать есть ли равные элементы на соответствующих местах, то есть есть ли xi=yi?, сколько их. Использовать перегрузку == в классе complex
Создать в main массив mas комплексных чисел и решить в main следующую задачу, использовать при решении перегрузку операций в классе complex, необходимую для решения поставленной задачи (номер варианта по списку в журнале).
В примере приведена немного измененная задача. Ищем в массиве mas (типа class vect) количество пар равных чисел, а затем создаем новый массив mas1, в котором убраны все повторения, и массив повторных элементов mas2.
! Реализаций решения данной задачи может быть несколько. Выбирайте ту, что вам понятнее. Соблюдайте все условия задачи!
Обратите внимание на использование различных методов вывода массивов комплексных чисел.
Тестовые примеры
1. |
В массиве несколько повторяющихся чисел.
|
2. |
В массиве нет повторных чисел
|
Метод
//Теперь вы сами сможете написать согласно коду программы
Программа
/*
Для корректной работы программы используем конструктор по умолчанию и метод set_c задания значения комплексного числа.
*/
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <ctime>
using namespace std;
class vect;
class complex{
double re, im;
public:
// complex() {re=0; im=0;}
// complex(int r=1, int i=0) {re=r; im=i;}
void set_c(double Re=0, double Im=0)
{
re=Re; im=Im;
}
double get_c_re() { return re;}
double get_c_im() { return im;}
void print();
bool operator== (complex b)
{
return (re==b.re && im==b.im);
}
};
class vect
{
complex *base;
int size;
public:
vect(int n=1) { size=n; base=new complex[size];}
~vect() {delete [] base;}
void fill_vect();
void print();
void print_table();
int get_size() {return size;}
int& set_size() {return size;}
complex get_elem(int i) {return base[i];}
complex& set_elem(int i) {return base[i];}
};
//заполняем массив комплексных чисел
void vect::fill_vect()
{
srand(time(0));
double re, im;
int t;
cout<<"Choose vector filling: 1 - random; 2 - hand\n";
do { cin>>t;} while (t!=1&&t!=2);
cout<<"Input "<<size<<" complex values (<re>+<im>i)\n";
for (int i=0;i<size;i++)
{
if (t==1) {re=rand()%7-3;im=rand()%7-3;}
else cin>>re>>im;
base[i].set_c(re,im);
}
}
void complex::print()
{
cout<<re;
if (im >=0) cout<<"+";
cout<<im<<"i";
}
void vect::print()
{
for (int i=0;i<size;i++)
{
base[i].print();
cout<<" ";
}
}
void vect::print_table()
{
cout<<endl<<setw(5)<<"re: ";
for (int i=0;i<size;i++)
cout<<setw(3)<<base[i].get_c_re()<<" ";
cout<<endl<<setw(5)<<"im: ";
for (int i=0;i<size;i++)
cout<<setw(3)<<base[i].get_c_im()<<" ";
cout<<endl;
}
//главная
int main(void)
{
int i,j, n;
cout<<"Input size of massiv ";
do { cin>>n;} while (n<2);
vect mas(n);
mas.fill_vect();
mas.print();
mas.print_table();
//считаем количество равных элементов в массиве
int k=0;
for (i=0;i<mas.get_size()-1;i++)
for (j=i+1;j<mas.get_size();j++)
if (mas.get_elem(i)==mas.get_elem(j)) k++;
cout<<"Количество пар равных элементов "<<k<<endl;
if (k==0)
{
cout<<"В массиве нет повторяющихся чисел";
return 0;
}
//создаем массив без повторений
vect mas1(n);
complex *mas2=new complex[n];
bool f;
mas1.set_elem(0)=mas.get_elem(0);
int n1=1, n2=0;
for (i=1;i<mas.get_size();i++)
{
f=0;//новый элемент
for (j=n1; j>=0;j--)
if (mas.get_elem(i)==mas1.get_elem(j))
f=1; //элемент повторный
if (!f)
{
// cout<<endl<<"New elem ";
// mas.get_elem(i).print();
mas1.set_elem(n1)=mas.get_elem(i);
n1++;
}
else
{
mas2[n2]=mas.get_elem(i);
n2++;
}
}
mas1.set_size()=n1;
cout<<"Массив без повторов: ";
mas1.print();
cout<<endl<<"Массив повторов: ";
for (i=0;i<n2;i++)
{
mas2[i].print();
cout<<" ";
}
return 0;
}