Нужно вычислить произведение матрицы на вектор. В полученном векторе найти макисмальный элемент. необходимо решить данную задачу тремя способами:
- с использованием статических массивов
- использовать только динамические массивы с явным разыменованием указателя
- использовать только динамические массивы, адресацию к элементам массива выполнять с помощью индексов.
То есть, у вас должно получиться три отдельных исходника — три программы. Пример работы программы смотрите ниже.
Произведение матрицы на вектор с использованием статических массивов.
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
int matrix[100][100], // статический массив
rows = 0, // строки
columns = 0; // столбцы
cout << "Введите количество строк матрицы: ";
cin >> rows;
cout << "Введите количество столбцов матрицы: ";
cin >> columns;
// заполнение матрицы
for (int ix = 0; ix < rows; ix++ )
for (int jx = 0; jx < columns; jx++)
{
cout << "matrix[" << (ix + 1) << "][" << (jx + 1) << "] = ";
cin >> matrix[ix][jx];
}
int vector[100]; // вектор
cout << "Введите элементы вектора:\n";
// заполнение вектора
for (int ix = 0; ix < columns; ix++ )
{
cout << "vector[" << (ix + 1) << "] = ";
cin >> vector[ix];
}
cout << "\nВведенная матрица:\n";
for (int ix = 0; ix < rows; ix++ )
{
for (int jx = 0; jx < columns; jx++)
{
cout << setw(4) << matrix[ix][jx];
}
cout << endl;
}
cout << "\nВведенный вектор:\n";
for (int ix = 0; ix < columns; ix++ )
{
cout << setw(4) << vector[ix] << endl;
}
int out[100]; // выходной вектор
// умножение элементов матрицы на вектор
for (int ix = 0; ix < rows; ix++)
{
out[ix] = 0;
for (int jx = 0; jx < columns; jx++)
out[ix] += matrix[ix][jx] * vector[jx];
}
cout << "\результирующий вектор:\n";
for (int ix = 0; ix < rows; ix++ )
{
cout << setw(4) << out[ix] << endl;
}
int max = out[0]; // переменная для хранения максимального значения
for (int ix = 0; ix < rows; ix++ )
if ( max < out[ix] ) // поиск максимального значения в одномерном массиве
max = out[ix];
cout << "\nМаксимальное значение = " << max << endl;
return 0;
}
Произведение матрицы на вектор с использованием динамических массивов с явным разыменованием указателя.
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
int rows = 0, // строки
columns = 0; // столбцы
cout << "Введите количество строк матрицы: ";
cin >> rows;
cout << "Введите количество столбцов матрицы: ";
cin >> columns;
// объявление двумерного динамического массива
int **matrix = new int* [rows];
for (int count = 0; count < 2; count++)
*(matrix+ count) = new int [columns];
// заполнение матрицы
for (int ix = 0; ix < rows; ix++ )
for (int jx = 0; jx < columns; jx++)
{
cout << "matrix[" << (ix + 1) << "][" << (jx + 1) << "] = ";
cin >> *((*(matrix + ix)) + jx);
}
// объявление одномерного динамического массива
int *vector = new int [columns];
cout << "Введите элементы вектора:\n";
// заполнение вектора
for (int ix = 0; ix < columns; ix++ )
{
cout << "vector[" << (ix + 1) << "] = ";
cin >> *(vector + ix);
}
cout << "\nВведенная матрица:\n";
for (int ix = 0; ix < rows; ix++ )
{
for (int jx = 0; jx < columns; jx++)
{
cout << setw(4) << *((*(matrix + ix)) + jx);
}
cout << endl;
}
cout << "\nВведенный вектор:\n";
for (int ix = 0; ix < columns; ix++ )
{
cout << setw(4) << *(vector + ix) << endl;
}
// объявление одномерного динамического массива
int *out = new int [columns];
// умножение элементов матрицы на вектор
for (int ix = 0; ix < rows; ix++)
{
out[ix] = 0;
for (int jx = 0; jx < columns; jx++)
*(out + ix) += *((*(matrix + ix)) + jx) * *(vector + jx);
}
cout << "\результирующий вектор:\n";
for (int ix = 0; ix < rows; ix++ )
{
cout << setw(4) << *(out + ix) << endl;
}
int max = *out; // переменная для хранения максимального значения
for (int ix = 0; ix < rows; ix++ )
if ( max < *(out + ix) ) // поиск максимального значения в одномерном массиве
max = *(out + ix);
cout << "\nМаксимальное значение = " << max << endl;
// высвобождение памяти отводимой под двумерный динамический массив:
for (int count = 0; count < rows; count++)
delete [] *(matrix + count);
// высвобождение памяти отводимой под одномерный динамический массив
delete [] vector;
delete [] out;
return 0;
}
Произведение матрицы на вектор с использованием динамических массивов с адресацией элементов массивов по индексам.
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
int rows = 0, // строки
columns = 0; // столбцы
cout << "Введите количество строк матрицы: ";
cin >> rows;
cout << "Введите количество столбцов матрицы: ";
cin >> columns;
// объявление двумерного динамического массива
int **matrix = new int* [rows];
for (int count = 0; count < 2; count++)
matrix[count] = new int [columns];
// заполнение матрицы
for (int ix = 0; ix < rows; ix++ )
for (int jx = 0; jx < columns; jx++)
{
cout << "matrix[" << (ix + 1) << "][" << (jx + 1) << "] = ";
cin >> matrix[ix][jx];
}
// объявление одномерного динамического массива
int *vector = new int [columns];
cout << "Введите элементы вектора:\n";
// заполнение вектора
for (int ix = 0; ix < columns; ix++ )
{
cout << "vector[" << (ix + 1) << "] = ";
cin >> vector[ix];
}
cout << "\nВведенная матрица:\n";
for (int ix = 0; ix < rows; ix++ )
{
for (int jx = 0; jx < columns; jx++)
{
cout << setw(4) << matrix[ix][jx];
}
cout << endl;
}
cout << "\nВведенный вектор:\n";
for (int ix = 0; ix < columns; ix++ )
{
cout << setw(4) << vector[ix] << endl;
}
// объявление одномерного динамического массива
int *out = new int [columns];
// умножение элементов матрицы на вектор
for (int ix = 0; ix < rows; ix++)
{
out[ix] = 0;
for (int jx = 0; jx < columns; jx++)
out[ix] += matrix[ix][jx] * vector[jx];
}
cout << "\результирующий вектор:\n";
for (int ix = 0; ix < rows; ix++ )
{
cout << setw(4) << out[ix] << endl;
}
int max = out[0]; // переменная для хранения максимального значения
for (int ix = 0; ix < rows; ix++ )
if ( max < out[ix] ) // поиск максимального значения в одномерном массиве
max = out[ix];
cout << "\nМаксимальное значение = " << max << endl;
// высвобождение памяти отводимой под двумерный динамический массив:
for (int count = 0; count < rows; count++)
delete [] matrix[count];
// высвобождение памяти отводимой под одномерный динамический массив
delete [] vector;
delete [] out;
return 0;
}
Введите количество строк матрицы: 2
Введите количество столбцов матрицы: 4
matrix[1][1] = 1
matrix[1][2] = 2
matrix[1][3] = 3
matrix[1][4] = 4
matrix[2][1] = 5
matrix[2][2] = 6
matrix[2][3] = 7
matrix[2][4] = 8
Введите элементы вектора:
vector[1] = 1
vector[2] = 0
vector[3] = 1
vector[4] = 0
Введенная матрица:
1 2 3 4
5 6 7 8
Введенный вектор:
1
0
1
0
результирующий вектор:
4
12
Максимальное значение = 12
Комментарии
Eduard_P
Выполнил только вариант 3, так как он наиболее сложен в понимании работы с указателями.
#include <cstdlib> #include <iostream> //#include <iomanip> using namespace std; /* * */ int main(int argc, char** argv) { int ni, nj, i=0, j=0; float maximum = 0; int rang;//ширина поля наибольшего элемента матрицы cout << "Введите количество строк матрицы: "; cin >> ni; cout << "Введите количество столбцов матрицы: "; cin >> nj; float** matrix; matrix = new float * [ni]; for (i=0; i<ni; i++) matrix[i]= new float [nj]; float * vector; vector = new float [nj]; float * vectorout; vectorout = new float [ni]; for (i=0; i<ni; i++){ for (j=0; j<nj; j++){ cout << "matrix ["<<i+1<<"]["<<j+1<<"] = "; cin >> *(*(matrix+i) + j); } } cout << "Введите элементы вектора:\n"; for (i=0; i<nj; i++){ cout << "vector [" <<i+1<< "] = "; cin >> *(vector + i); } /*Ширина поля элемента матрицы для правильного вывода на экран столбцов*/ int buf, buf2; for (i=0; i<=ni-1; i++){ for (j=0; j<=nj-1; j++) {buf = *((*(matrix + i)) + j); buf2 = 0; do{buf = buf/10; buf2++; } while (buf>0); if (rang < buf2) rang = buf2; } } cout << "\nВведенная матрица:\n"; for (i=0; i<ni; i++){ for (j=0; j<nj; j++) {cout.width(rang+1); cout << matrix [i][j]; } cout << "\n"; } cout << "\nВведенный вектор:\n"; for (i=0; i<nj; i++){ vectorout [i] = 0; cout << *(vector + i) << "\n";} cout << "\nPезультирующий вектор:\n"; for(i=0; i<ni; i++){ for(j=0; j<nj; j++) *(vectorout + i) += *(vector + j) * (*(*(matrix + i) + j)); cout << *(vectorout + i) <<"\n"; } cout << "\nМаксимальное значение = "; for(i=0; i<=nj-1; i++) if(maximum < *(vectorout+i)) maximum = *(vectorout+i); cout << maximum << "\n"; for (i=0; i<ni; i++) delete matrix[i]; delete matrix; delete vector; delete vectorout; return 0; }fishb0ne
#include <iostream> #include <limits> using namespace std; int main() { int m_str, m_stl; double maxel = - numeric_limits<double>::max(); do { cout<<"Введите количество строк матрицы: "; cin>>m_str; } while (m_str <= 0); do { cout<<"Введите количество столбцов матрицы: "; cin>>m_stl; } while (m_stl <= 0); double **matrix = new double* [m_str]; for (int i = 0; i < m_str; i++) matrix[i] = new double [m_stl]; double *vect = new double [m_stl]; double *rez = new double [m_str]; for(int i = 0; i < m_str; i++) for(int j = 0; j < m_stl; j++) { cout<<"matrix[" << i + 1 << "][" << j + 1 << "] = "; cin>>*(*(matrix + i) + j); } cout<<"Введите элементы вектора:" << endl; for(int i = 0; i < m_stl; i++) { cout<<"vector[" << i + 1 << "] = "; cin>>*(vect + i); } cout<<"\nВведённая матрица: " << endl; for(int i = 0; i < m_str; i++) { for (int j = 0; j < m_stl; j++) cout<<*(*(matrix + i) + j) << " "; cout<<endl; } cout<<"\nВведённый вектор: " << endl; for(int i = 0; i < m_stl; i++) cout<<*(vect + i) << endl; cout<<"\nРезультирующий вектор:" << endl; for(int i = 0; i < m_str; i++) { for(int j = 0; j < m_stl; j++) *(rez + i) += *(*(matrix + i) + j) * (*(vect + j)); cout<<*(rez + i)<<endl; if (*(rez + i) > maxel) maxel = *(rez + i); } cout<<"\nМаксимальное значение = " << maxel; for (int i = 0; i < m_str; i++) delete [] matrix[i]; delete [] vect; delete [] rez; return 0; }Данилъ Сейфуллинъ
fishb0ne
//динамические массивы с явным разыменованием указателя #include <iostream> #include <limits> using namespace std; int main() { int m_str, m_stl; double maxel = - numeric_limits<double>::max(); do { cout<<"Введите количество строк матрицы: "; cin>>m_str; } while (m_str <= 0); do { cout<<"Введите количество столбцов матрицы: "; cin>>m_stl; } while (m_stl <= 0); double **matrix = new double* [m_str]; for (int i = 0; i < m_str; i++) matrix[i] = new double [m_stl]; double *vect = new double [m_stl]; double *rez = new double [m_str]; for(int i = 0; i < m_str; i++) for(int j = 0; j < m_stl; j++) { cout<<"matrix[" << i + 1 << "][" << j + 1 << "] = "; cin>>matrix[i][j]; } cout<<"Введите элементы вектора:" << endl; for(int i = 0; i < m_stl; i++) { cout<<"vector[" << i + 1 << "] = "; cin>>vect[i]; } cout<<"\nВведённая матрица: " << endl; for(int i = 0; i < m_str; i++) { for (int j = 0; j < m_stl; j++) cout<<matrix[i][j] << " "; cout<<endl; } cout<<"\nВведённый вектор: " << endl; for(int i = 0; i < m_stl; i++) cout<<vect[i] << endl; cout<<"\nРезультирующий вектор:" << endl; for(int i = 0; i < m_str; i++) { for(int j = 0; j < m_stl; j++) rez[i] += matrix[i][j] * vect[j]; cout<<rez[i]<<endl; if (rez[i] > maxel) maxel = rez[i]; } cout<<"\nМаксимальное значение = " << maxel; for (int i = 0; i < m_str; i++) delete [] matrix[i]; delete [] vect; delete [] rez; return 0; }fishb0ne
#include <iostream> using namespace std; int main() { int m_str, m_stl; do { cout<<"Введите количество строк матрицы: "; cin>>m_str; } while (m_str <= 0); do { cout<<"Введите количество столбцов матрицы: "; cin>>m_stl; } while (m_stl <= 0); double matrix[m_str][m_stl], vect[m_stl], rez[m_str], sum; for(int i = 0; i < m_str; i++) for(int j = 0; j < m_stl; j++) { cout<<"matrix[" << i + 1 << "][" << j + 1 << "] = "; cin>>matrix[i][j]; } cout<<"Введите элементы вектора:" << endl; for(int i = 0; i < m_stl; i++) { cout<<"vector[" << i + 1 << "] = "; cin>>vect[i]; } cout<<"\nВведённая матрица: " << endl; for (int i = 0; i < m_str; i++) { sum = 0; for (int j = 0; j < m_stl; j++) { cout<<matrix[i][j] << " "; sum += matrix[i][j] * vect[j]; } cout<<endl; rez[i] = sum; } cout<<"\nВведённый вектор: " << endl; for(int i = 0; i < m_stl; i++) cout<<vect[i] << endl; sum = - 1.7976931348623158e+308; cout<<"результирующий вектор:" << endl; for(int i = 0; i < m_str; i++) { cout<<rez[i] << endl; if (rez[i] > sum) sum = rez[i]; } cout<<"\nМаксимальное значение = " << sum; return 0; }