Матрица 3на3 перемножиная с матрицей 3на1

  • Автор темы Orion4ik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
O

Orion4ik

#1
C++:
//задана матрица 3х3. Перемножить её с матрицей 3х1 и вывести итог на экран
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale (LC_ALL, ".1251");
int arr1[3][3]={1,2,3,
2,3,1,
3,1,2};
int arr2[3][1]={1,2,3};
int arr3[3][3];
int i;
for (i=0;i<1;i++)
{
arr3[1][1]=arr1[1][1]*arr2[1][1];
arr3[1][2]=arr1[1][2]*arr2[2][1];
arr3[1][3]=arr1[1][3]*arr2[3][1];
arr3[2][1]=arr1[2][1]*arr2[1][1];
arr3[2][2]=arr1[2][2]*arr2[2][1];
arr3[2][3]=arr1[2][3]*arr2[3][1];
arr3[3][1]=arr1[3][1]*arr2[1][1];
arr3[3][2]=arr1[3][2]*arr2[2][1];
arr3[3][3]=arr1[3][3]*arr2[3][1];
}
printf("Полученая матрица:", arr3[3][3]);
}
вот задача помогите пожалуйста найти суть ошибки и переписать её через for, так что бы индексы были в for-e (j,k) и в это же время были на месте индексов в arr1 и arr2. Заранее благодарен!
 
R

RiCrO

#2
Уделай препада. Заставь его поверить в то, что ты сидел днями напролёт и решал задачу. В конечном итоге у тебя получилось это.

C++:
// Matrix.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"

using namespace std;


//Выделить память для матрицы
double ** AllocMatrix(int Rows, int Colomns)
{
double ** Matrix;
try
{
Matrix = new double * [Rows];
if( Matrix == NULL ) throw 0;
for (int i = 0; i < Rows; i++)
{
Matrix[i] = new double [Colomns];
if( Matrix[i] == NULL ) throw i;
}
}
catch( int index )
{
cout << "Ошибка выделения памяти" << endl;
for (int i = 0; i < index; i++)
{
delete [] Matrix[i];
Matrix[i] = NULL;
}
return NULL;
}
return Matrix;
}

//Ввод матрицы
bool GetMatrix(double ***Matrix, int *Rows, int *Colomns)
{
cout << "Rows: "; cin >> (*Rows);
cout << "Colomns: "; cin >> (*Colomns);
//Выделить память под массив
double **Ret;
Ret = AllocMatrix(*Rows, *Colomns);
*Matrix = Ret;
if (Ret != NULL)
{
for (int i = 0; i < *Rows; i++)
for (int j = 0; j < *Colomns; j++)
{
printf("Matrix[%d][%d] = ", i, j);
cin >> Ret[i][j];
}
return true;
}else return false;
}


//Проверка размерностей
bool CheckMatrixes(int Rows1, int Colomns1, int Rows2, int Colomns2)
{
return (Rows2 == Colomns1);
}



//Умножение матриц
bool MultiplyMatrix(double **Matrix1, int Rows1, int Columns1,
double **Matrix2, int Rows2, int Columns2,
double ***ResultMatrix, int *ResultRows, int *ResultColumns)
{
*ResultRows = Rows1;
*ResultColumns = Columns2;
double **Ret;
Ret = AllocMatrix(*ResultRows, *ResultColumns);
*ResultMatrix = Ret;
if (Ret != NULL)
{
for (int i = 0; i < *ResultRows; i++)
for (int j = 0; j < *ResultColumns; j++)
{
double Sum = 0;
for (int n = 0; n < Rows2; n++)
{
Sum += Matrix1[i][n]*Matrix2[n][j];
}
(*ResultMatrix)[i][j] = Sum;
}
return true;
}else return false;
}


//Вывод матрицы
void MatrixOut(double **Matrix, int Rows, int Columns)
{
for (int i = 0; i < Rows; i++)
{
for (int j = 0; j < Columns; j++)
cout << Matrix[i][j] << "\t";
cout << endl;
}
}


//Освободить память матрицы
void FreeMatrix(double **Matrix, int Rows)
{
for (int i = 0; i < Rows; i++)
{

delete [] Matrix[i];
Matrix[i] = NULL;
}
delete [] Matrix;
Matrix = NULL;
}

//Основной блок программы
int main()
{
locale::global(locale("rus"));
double ***A = new double **, ***B = new double **, ***C = new double **;
int ARowCount, AColCount, BRowCount, BColCount, CRowCount, CColCount;
do
{
cout << "Введите матрицу A:\n";
} while (!GetMatrix(A, &ARowCount, &AColCount));
do
{
cout << "Введите матрицу B:\n";
} while (!GetMatrix(B, &BRowCount, &BColCount));
if (CheckMatrixes(ARowCount, AColCount, BRowCount, BColCount))
{
if (MultiplyMatrix(*A, ARowCount, AColCount,
*B, BRowCount, BColCount, C, &CRowCount, &CColCount))
{
cout << "Результат:\n";
MatrixOut(*C, CRowCount, CColCount);
FreeMatrix(*C, CRowCount);
}
} else cout << "Невозможно перемножить матрицы\n";
FreeMatrix(*A, ARowCount);
FreeMatrix(*B, BRowCount);
system("pause");
return 0;
}

http://plagiata.net.ru/?p=206 - читай тут. Такие темы стоит искать в Google.
 
R

RiCrO

#3
По твоему коду, укажу места где есть ошибки.

C++:
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale (LC_ALL, ".1251"); // .1251 - замени на Russian или rus.
int arr1[3][3]={{1,2,3},{2,3,1},{3,1,2}};
int arr2[3][1]={1,2,3};
int arr3[3][3];
int i;
for (i=0;i<1;i++) // Абсолютно нет смысла
{
arr3[1][1]=arr1[1][1]*arr2[1][1];
arr3[1][2]=arr1[1][2]*arr2[2][1];
arr3[1][3]=arr1[1][3]*arr2[3][1];
arr3[2][1]=arr1[2][1]*arr2[1][1];
arr3[2][2]=arr1[2][2]*arr2[2][1];
arr3[2][3]=arr1[2][3]*arr2[3][1];
arr3[3][1]=arr1[3][1]*arr2[1][1];
arr3[3][2]=arr1[3][2]*arr2[2][1];
arr3[3][3]=arr1[3][3]*arr2[3][1];
}
printf("Полученая матрица:", arr3[3][3]); // Интересный момент. Выводишь элемент 3-й строки 3-го столбца. Тут лучше использовать cout << arr[i][j];

// Забыл дописать строчку кода: тут необходим return 0;
}
Короче, вот тебе твоя работа, но матрица 3х3. Подумай сам что делать дальше. Работа простая.

C++:
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
setlocale (LC_ALL, "Russian");
int arr1[3][3]={{1,2,3},{2,3,1},{3,1,2}};
int arr2[3][3]={{1,2,3},{2,3,1},{3,1,2}};
int arr3[3][3];
int i;
int j;

for (i=0; i<3; i++)
{ 
for (j=0; j<3; j++)
{
arr3[i][j] = (arr1[i][j])*(arr2[i][j]);

}

}

cout << " Матрица arr3: ";
for (i=0; i<3; i++)
{ 
for (j=0; j<3; j++)
{
cout << arr3[i][j] << ' '; 


}

}

cout << endl;
return 0;
}
 
O

Orion4ik

#4
Спасибо, только не пойму в чём разница если локаль поменять?
 
Статус
Закрыто для дальнейших ответов.