Консультация № 188784
05.02.2016, 17:30
0.00 руб.
0 12 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Помогите пожалуйста решить задачу на C++ Builder (компилятор Borland C++ Builder 6):
1. Перегрузить функцию sub_array нахождения разности двух массивов и матриц

Обсуждение

давно
Посетитель
7438
7205
05.02.2016, 18:45
общий
Адресаты:
Как задаются массивы и матрицы? Динамически, статически?
Приведите пример, как хотите задавать массивы и вызывать функцию.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399357
6
05.02.2016, 18:55
общий
Динамически задаются.
Например, вот моя программа с шаблоном:
Код:
//---------------------------------------------------------------------------
template <class Type> Type summa (Type* mas)
{
Type s=0;
for (int i=0;i<9;i++)
{
if (mas [i]>0)
s+=mas[i];
}
return s;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::N1Click(TObject *Sender)
{
randomize;
for (int i=0;i<10;i++)
{
StringGrid1->Cells[i][0]=IntToStr(random(20)-10);
StringGrid2->Cells[i][0]=FloatToStr((random(100)-50)*0.01);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
int a[10], x;
double b[10], y;
for (int i=0;i<10;i++)
{
a[i]=StrToInt(StringGrid1->Cells[i][0]);
b[i]=StrToFloat(StringGrid2->Cells[i][0]);
}
x=summa(a);
y=summa(b);
for (int i=0;i<10;i++)
{
Edit1->Text=IntToStr(x);
Edit2->Text=FloatToStr(y);
}
}
//---------------------------------------------------------------------------
давно
Посетитель
7438
7205
05.02.2016, 19:37
общий
Адресаты:
Как раз статически, в стеке.
Динамически - с запросом памяти под массив.
Меня больше интересует, как собираетесь строить матрицу.
Как сплошной одномерный массив или как массив указателей на столбцы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399357
6
05.02.2016, 20:03
общий
05.02.2016, 20:15
Как сплошной. Например, как здесь:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
randomize;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
StringGrid1->Cells[i][j]=IntToStr(random(20)-10);
StringGrid2->Cells[i][j]=IntToStr(random(20)-10);
}
}
int col (int* mas)
{
int k=0;
int s;
for(int i=0;i<5;i++)
{
s=0;
for(int j=0;j<5;j++)
{
s=s+mas[i*5+j];
}
if (s>0) k++;
}
return k;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int a[5][5], b[5][5];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
a[j][i]=StrToInt(StringGrid1->Cells[i][j]);
b[j][i]=StrToInt(StringGrid2->Cells[i][j]);
}
Edit1->Text=IntToStr(col(&a[0][0]));
Edit2->Text=IntToStr(col(&b[0][0]));
}

давно
Посетитель
7438
7205
05.02.2016, 20:12
общий
Адресаты:
Ок, в ближайшее время (по свободе) отвечу.
Если кто-либо меня не опередит
Еще вопрос: размерность массивов всегда 10? Или будем передавать параметром?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
05.02.2016, 20:16
общий
05.02.2016, 20:17
Адресаты:
Кстати, в функции summa ошибочка
for (int i=0;i<10 9 ;i++)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399357
6
05.02.2016, 20:17
общий
Сама обычно делаю по 10 элементов, но это не принципиально
давно
Посетитель
399357
6
05.02.2016, 20:18
общий
Спасибо что показали ошибку
давно
Посетитель
7438
7205
05.02.2016, 20:22
общий
Адресаты:
И тут
a[j][i]=StrToInt(StringGrid1->Cells[i][j]);
b[j][i]=StrToInt(StringGrid2->Cells[i][j]);
наверное, надо написать:
a[i][j]=StrToInt(StringGrid1->Cells[i][j]);
b[i][j]=StrToInt(StringGrid2->Cells[i][j]);
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399357
6
05.02.2016, 20:25
общий
Ох, точно... Спасибо
давно
Посетитель
399357
6
05.02.2016, 20:25
общий
Ох, точно... Спасибо
давно
Посетитель
7438
7205
06.02.2016, 16:25
общий
это ответ
Здравствуйте, kuroi_yuki_96!
Как вариант...
Что именно будет вызываться определяется числом параметров
[code h=200]
template <class Type> Type* sub_array (Type* mas1, Type* mas2, int cnt)
{
for (int i=0;i<cnt;i++)
mas1[i] -= mas2[i];
return mas1;
}

template <class Type> Type* sub_array (Type* mas1, Type* mas2, int rows, int cols)
{
for (int i=0;i<rows;i++)
for (int j=0;j<cols;j++)
mas1[i*cols+j] -= mas2[i*cols+j];
return mas1;
}

int main()
{
int a1[10] = {1,2,3,4,5,6,7,8,9,0};
int a2[10] = {-1,-2,-3,-4,-5,-6,-7,-8,-9,0};
double b1[10] = {1.,2.,3.,4.,5.,6.,7.,8.,9.,0.};
double b2[10] = {-1.,-2.,-3.,-4.,-5.,-6.,-7.,-8.,-9.,0.};
int aa1[5][5] =
{
{1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9}
};
int aa2[5][5] =
{
{11,12,13,14,15},
{12,13,14,15,16},
{13,14,15,16,17},
{14,15,16,17,18},
{15,16,17,18,19}
};

sub_array(a1,a2,10);
sub_array(b1,b2,10);
sub_array(aa1[0],aa2[0],5,5);
return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа