объекта второй операнд, если передавать
pd = new elem[two.sz];
sz=two.sz;
for (int i=0; i<sz; i++) pd[i]=two.pd[i];
}
// Личный метод поиска " места расположения" коэффициента
int matrix::find(int xx, int yy){
for (int i=0; i<sz; i++)
if (pd[i].x==xx && pd[i].y==yy) return i;
return 1;
}
matrix matrix::operator+(matrix &two){
int newsz=sz; // Размерность выходного массива
for (int i=0; i<two.sz; i++) // Если коэффициент из второго отсутствует
if (find(two.pd[i].x, two.pd[i].y)==-1)
newsz++; // в первом - увеличить размерность на 1
matrix out(); // Выходной объект
delete out.pd; // При создании не пустой
out.pd = new elem[newsz];
for (i=0; i<sz; i++) // Копировать первый в выходной
out.pd[i]=pd[i];
out.sz=sz;
for (i=0; i<two.sz; i++) // Если коэффициент из второго присутствует
{ // в выходном сложить, иначе добавить.
int nn=out.find(two.pd[i].x, two.pd[i].y);
if (nn!=-1)
out.pd[nn]+= two.pd[i];
else
out.pd[out.sz++] = two.pd[i];
}
return out;
}
// Вариант 2. Можно использовать в качестве временного
// объекта второй операнд, если передавать его по значению
matrix matrix::operator+(matrix two){
int newsz=sz; // Размерность выходного массива
for (int i=0; i<two.sz; i++) // Если коэффициент из второго отсутствует
if (find(two.pd[i].x, two.pd[i].y)==-1)
newsz++; // в первом - увеличить размерность на 1
// Перераспределить память во втором объекте
two.pd=realloc(two.pd, sizeof(elem)*newsz;
for (i=0; i<sz; i++) // Если коэффициент из второго присутствует
{ // в выходном сложить, иначе добавить.
int nn=two.find(pd[i].x, pd[i].y);
if (nn!=-1)
two.pd[nn]+= pd[i];
else
two.pd[two.sz++] = pd[i];
}
return two;
}
Содержание Назад Вперед