Вычислить произведение матрицы на вектор: статические и динамические массивы

Уровень сложности:

Нужно вычислить произведение матрицы на вектор. В полученном векторе найти макисмальный  элемент. необходимо решить данную задачу тремя способами:

  1. с использованием статических массивов
  2. использовать только динамические массивы с явным разыменованием указателя
  3. использовать только динамические массивы, адресацию к элементам массива выполнять с помощью индексов.

То есть, у вас должно получиться три отдельных исходника — три программы. Пример работы программы смотрите ниже.

Произведение матрицы на вектор с использованием статических массивов.

#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;
}

CppStudio.com

Введите количество строк матрицы: 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

Следующие статьи помогут вам в решении данной задачи:
Автор: Marienko L.
Дата: 08.11.2012
Поделиться:

Комментарии

  1. Eduard_P

    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;
    }
  2. 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;
    }
  3. 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;
    }
  4. 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;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.