Консультация № 182607
24.03.2011, 07:17
117.17 руб.
0 15 1
Здравствуйте, уважаемые эксперты!
Необходимо решить задачу: Даны квадратная матрица А порядка М, натуральное число N, действительные числа Р0, Р1, …, РN. Получить матрицу РNA^N+PN-1A^N-1 +…+P1A+P0E, где Е – единичная матрица порядка М. Компилятор Borland C++ Builder 6.0, оконное приложение для Windows.

Обсуждение

Неизвестный
28.03.2011, 12:51
общий
Добрый день!
Я так понимаю на этот мой вопрос ответов не поступит?
Что делается в таких случаях, подскажите пожалуйста.
давно
Мастер-Эксперт
425
4118
28.03.2011, 13:08
общий
Может быть Вам подойдёт консольное приложение или написанное в MS Visual C++? Просто большинство экспертов не желают пользоваться ворованным Borland C++ Builder 6.
У меня, к примеру, стоит только консольный gcc.
Если откажетесь от Билдера, то я Ваш вопрос продлю, чтобы на него смогли ответить.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.03.2011, 15:27
общий
Адресаты:
Консольное приложение не подойдет, необходимо написать графическое приложение для Windows. Билдер - не критично, подойдет и MS Visual C++ (просто у меня стоит Билдер - как в нем насчет совместимости с приложением написаном в Visual С++?) Насколько я понимаю, проект созданный в Visual нельзя открыть для редактирования в Builder`e?
давно
Мастер-Эксперт
425
4118
28.03.2011, 15:48
общий
Цитата: 347478
у меня стоит Билдер - как в нем насчет совместимости с приложением написаном в Visual С++?) Насколько я понимаю, проект созданный в Visual нельзя открыть для редактирования в Builder`e?

Тяжёлый случай. Дело в том, что Билдер и MS Studio используют совершенно различные компоненты для отображения окошек, кнопочек и т.д. В Билдере используется VCL, а в VC++ - MFC. Однако, если писать на чистом WinAPI, то исходный код можно открывать и править как в Билдере, так и в Студии. Но чистый WinAPI - это геморой, т.к. надо писать много кода по сравнению с объектным подходом Билдера или Студии.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.03.2011, 15:51
общий
Постараюсь написать сегодня или завтра на билдере, у меня на работе стоит.
Неизвестный
28.03.2011, 15:53
общий
Спасибо заранее, буду ждать.
Неизвестный
28.03.2011, 15:54
общий
Адресаты:
Пожалуйста, продлите вопрос
Неизвестный
28.03.2011, 15:54
общий
Я уже продлила :)
Неизвестный
29.03.2011, 15:24
общий
это ответ
Здравствуйте, Иван!
Вот решение Вашей задачи. Данный вариант не оптимален, поскольку возведение в степень происходит на каждой итерации. Можно было бы накапливать произведение, таким образом на каждой итерации происходила бы только операция умножения матриц. Вы можете изменить имеющийся код под более оптимальное использование, все необходимые функции присутствуют.
В приложении - основной код, в архиве - проект.

Удачи!

Приложение:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ChangeClick(TObject *Sender)
{//изменение размерности матрицы
try {
n = StrToInt(Ntb->Text);
} catch (...) {
ShowMessage ("Ошибка ввода");
return;
}
if (n>maxN) {
ShowMessage ("Слишком большое M");
return;
}
aGrid->ColCount = n;
aGrid->RowCount = n;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{//изменение размерности массива
try {
m = StrToInt(Edit1->Text)+1;
} catch (...) {
ShowMessage ("Ошибка ввода");
return;
}
if (m>maxN) {
ShowMessage ("Слишком большое N");
return;
}
PGrid->ColCount = m;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComputeClick(TObject *Sender)
{//вычисление
try { //получение данных из интерфейса
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
a[i][j] = StrToFloat (aGrid->Cells[j][i]);
for (int i=0; i<m; i++)
p[i] = StrToFloat (aGrid->Cells[i][0]);
} catch (...) {
ShowMessage ("Ошибка ввода");
return;
}
//обнуление результирующей матрицы
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
res[i][j] = 0;

double buf[maxN][maxN]; //буфер для вычислений

for (int pi = m-1; pi>=0; pi--) {
Pow (a, pi, buf); //возведение в степень
Mult (buf, p[pi]); //домножение
Sum (buf, res); //суммирование в результат
}

ResultGrid->ColCount = n;
ResultGrid->RowCount = n;

for (int i=0; i<n; i++) //вывод на интерфейс
for (int j=0; j<n; j++)
ResultGrid->Cells[i][j] = FloatToStrF (res[j][i], ffFixed, 3, 3);

}
//---------------------------------------------------------------------------

void TForm1::Mult(double x[][maxN], double y[][maxN], double r[][maxN])
{//перемножение матриц x и y в r
double s;
int i,j,k;

for(i=0;i < n;i++)
for(j=0;j < n;j++)
{
s=0;
for(k=0;k < n;k++)
s+=x[i][k]*y[k][j];
r[i][j]=s;
}
return;
}

void TForm1::Mult(double x[][maxN], double y)
{//домножение матрицы х на у
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
x[i][j] = x[i][j]*y;
}


void TForm1::Copy (double dest[][maxN], double src[][maxN])
{//копирование матрицы src в dest
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
dest[i][j] = src[i][j];
}

void TForm1::Pow (double x[][maxN], int d, double r[][maxN])
{//возведение матрицы x в степень d, результат в r
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
if (i==j) r[i][j] = 1;
else r[i][j] = 0;
double buf[maxN][maxN];
while (d>0)
{
if (d&1) {
Mult (r, x, buf);
Copy (r, buf);
--d;
} else {
d>>=1;
Mult (x, x, buf);
Copy (x, buf);
}
}
}

void TForm1::Sum (double x[][maxN],double r[][maxN])
{//прибавление к x r, результат в r
int i,j;

for(i=0;i < n;i++)
for(j=0;j < n;j++)
r[i][j]=x[i][j]+r[i][j];
}


Прикрепленные файлы:
5
Неизвестный
30.03.2011, 07:18
общий
Здравствуйте Алёна! К сожалению сам не смогу оптимизировать код, не настолько хорошо знаю язык. Разбираться долго, а времени мало Подправьте пожалуйста задачу чтоб работала и чтобы можно было отдать на проверку преподавателю. Спасибо заранее.
Неизвестный
30.03.2011, 07:56
общий
Пожалуйста продлите вопрос еще на сутки, до ответа Киселевой Алёны.
давно
Мастер-Эксперт
425
4118
30.03.2011, 08:18
общий
Я продлил.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
30.03.2011, 08:55
общий
Адресаты:
Спасибо!
Неизвестный
30.03.2011, 22:59
общий
Прошу прощения, пропустила Ваше сообщение. А сейчас что не так? У меня программа вполне себе работаетОпишите ошибку.
Неизвестный
31.03.2011, 07:42
общий
Спасибо Алёна. Программа работает, наверное я неправильно понял Ваше сообщение в ответе.
Форма ответа