2015-05-19 2 views
0

Это задание, с которым я боролся. В основном у меня есть основная идея и код в рабочем состоянии. Но проблема в том, что я сделал это иначе, чем инструкции.Умножение матриц с использованием массивов?

Итак, чтобы умножить матрицы, я заранее задал размеры массива (строки, столбцы). Затем я снова попрошу задать значения массива.

Но то, что я хотел бы сделать, это просто ввести значения моего массива и автоматически найти размеры массива по числу вводимых целых чисел. Но я не уверен, как это сделать, потому что я думал, что мой преподаватель сказал что-то о том, что нельзя устанавливать массивы на переменные значения или что-то в этом роде.

//what I'd like to be able to do 
Enter the first matrix: 
1 2 3 
4 5 6 

Enter the second matrix: 
5 6 
7 8 
9 0 

// what I am currently doing 
#include<iostream> 
using namespace std; 
int main() 
{ 
int l,m,z,n; 
int matrixA[10][10]; 
int matrixB[10][10]; 
int matrixC[10][10]; 

cout<<"enter the dimension of the first matrix"<<endl; 
cin>>l>>m; 
cout<<"enter the dimension of the second matrix"<<endl; 
cin>>z>>n; 
if(m!=z||z!=m){ 
cout<<"error in the multiblication enter new dimensions"<<endl; 
cout<<"enter the dimension of the first matrix"<<endl; 
cin>>l>>m; 
cout<<"enter the dimension of the second matrix"<<endl; 
cin>>z>>n; 
} 

else{ 
cout<<"enter the first matrix"<<endl; 
for(int i=0;i<l;i++){ 
for(int j=0;j<m;j++){ 
    cin>>matrixA[i][j]; 
    } 
    } 
cout<<"enter the second matrix"<<endl; 
for(int i=0;i<z;i++){ 
for(int j=0;j<n;j++){ 
    cin>>matrixB[i][j]; 
} 
} 
for(int i=0;i<l;i++){ 
for(int j=0;j<n;j++){ 
     matrixC[i][j]=0; 
     for(int k=0;k<m;k++){ 
matrixC[i][j]=matrixC[i][j]+(matrixA[i][k] * matrixB[k][j]); 
} 
} 
} 

cout<<"your matrix is"<<endl; 
for(int i=0;i<l;i++){ 
for(int j=0;j<n;j++){ 
cout<<matrixC[i][j]<<" "; 
} 
cout<<endl; 
} 
} 
//system("pause"); 
return 0; 
} 
+0

Вы хотите помочь хранить матрицы или определить их размеры? – Beta

+0

Я хочу иметь возможность определять размеры, когда я это делаю: cin >> matrixA [i] [j]. Так что в основном я пытаюсь получить значения двухмерного массива и установить их в одно и то же время, если возможно что-то подобное. – Sam

+0

Возможно, но это требует некоторой работы. Вы знакомы с ['getline'] (http: //www.cplusplus.ком/ссылка/IStream/IStream/GetLine /)? Как насчет ['stringstream'] (http://www.cplusplus.com/reference/sstream/stringstream/stringstream/) или [' strtok'] (http://www.cplusplus.com/reference/cstring/strtok/)? Как насчет динамического распределения памяти или контейнеров типа 'std :: vector'? – Beta

ответ

0

Вы не можете объявить массив с размерностью времени выполнения (известный как массив переменной длины в C, где они разрешены), размер должен быть известен во время компиляции. Решение состоит в том, чтобы либо использовать стандартный контейнер, как std::vector

std::vector<std::vector<int>> matrix(M, std::vector<int>(N)); // M x N 

или использовать динамические массивы,

int** matrix = new int*[M]; // allocate pointers for rows 
for(size_t i = 0; i < N; ++i) 
    matrix[i] = new int[N]; // allocate each row 

, то не забудьте удалить их в конце вашей программы

for(size_t i = 0; i < N; ++i) 
    delete[] matrix[i]; 
delete[] matrix; 

Вы должны предпочесть подход std::vector, так как вам не нужно иметь дело с распределением памяти и т. Д.

+0

Но вектор-вектор не идеален для прямоугольных матриц. Лучше иметь один вектор с размером (строки * столбцы) и, возможно, второй вектор указателей, к началу каждой строки. Таким образом, местность поддерживается. –

+0

@BenVoigt Спасибо за комментарий, действительно, вы продолжаете это так. – vsoftco

0

Из ваших строк кода кажется, что вы хотите попросить пользователя ввести правильные значения столбца матрицы 1 и строки матрицы 2. то, что вы использовали, является оператором if, который будет работать только один раз. если ваше значение «m» и «z» не равно на самом первом входе, вы никогда не сможете ввести другую часть своего кода, где вы указали остальную часть вашего кода, чтобы вводить и умножать матрицы.

Чтобы проверить, равны или нет значения «m» и «z», вы можете использовать цикл while или цикл while.

while(m!=z) 
{cout<<"enter the value m and z";` 
cin>>m>>z; 
} 

Кроме того, было бы хорошо, если бы вы использовали l, m, z, n в качестве статических элементов для сохранения памяти.

Если вы хотите объявить матрицу нужных размеров, вы можете сделать это вот так.

Во-первых, вы просите пользователя ввести размер матрицы. , после чего, когда введено правильное измерение, вы должны будете сделать матрицу необходимых размеров. Вот что я хочу сказать:

cout<<"enter the values of l and m"; 
cin>>l>>m; 
cout<<"enter the values of z and n"; 
cin>>z>>n; 
int array1[l][m]; 
int array2[z][n]; 

Таким образом, вы можете ввести размеры нужной матрицы легко.

+0

'int array1 [l] [m]; int array2 [z] [n]; 'не является законным в C++ –

+0

Я не уверен, но я думал, что значение переменных массива, подобное этому, не разрешено. – Sam

+0

Я думаю, что как только вы назначили значение переменной, вы можете использовать ее любым способом. Я думаю, что это должно сработать. Если это не сработает, вы можете использовать константу для решения проблемы. –

Смежные вопросы