Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2014, 23:47   #1
Ostor
 
Регистрация: 02.11.2014
Сообщений: 5
По умолчанию Работа с матрицей в шаблонном классе(Начинающий)

Часть работы разобрал, не получается сделать такое задание как: создать метод который дает возможность изменять кол-во строк или столбцов матрицы, вроде бы и имею представление как сделать, но все попытки заканчивались сбоями, потому надеюсь что вы подскажете

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
 
template <class T> class matrix
{
    private:
    T** data; // массив элементов матрицы
        int rows; // количество строк
        int cols; // количество столбцов
    
       public:
        matrix( int rows , int cols );
        void out();
              ~matrix( );
            void dobav(int k);
            
//};
// Методы     
 
 
template < class T >
matrix< T >::matrix( int rows, int cols )  // Констр. с 2 пар-ми
{
    this ->rows = rows;   // int a,b; a= rows; b=cols; (ne rabotaet)
    this ->cols = cols;   //
    data = new T* [rows];
    for (int i=0; i<rows; i++)
    {
        data[i]=new T[cols];
    }///создание пустого массива
    for (int k=0; k<rows; k++)
    {
        for (int i=0; i<cols;i++)
        {
            data[k][i] = rand()%25;
        }
    }///заполнение
 
}
 
template <class T>
void matrix<T>::out(){
        for (int k=0; k<rows; k++)
        {
            for (int i=0; i<cols; i++)
            {
                cout << data[k][i] << ' ';
            }
            cout << endl;
 
        }
}
 
 
template <class T>
matrix<T>::~matrix()
{
    for (int i=0; i<rows; i++) delete[] data[i];
    delete []data;
}
 
 
/* (Ну тут уж не знаю как правильно это оформить, записал первую мысль если добавлять в рядок но понимаю что бред наверно написал)
 
template <class T>
void matrix<T>::dobav(int k)
{
 
for(int i=0; i<k; i++)
{
data= new T*;
data[i][cols]=rand()%25;
cout << endl << data[i][cols];
} 
 
*/
 
 
}
 
 
int main()
{
    srand(0);
    int n,m,k;
    setlocale(LC_ALL,"Russian");
    
    matrix< int >b(5,6);
    b.out();
    cout << endl;
    //cout << endl << "Ввести кол-во добавляемых элементов: ";
    //cin >> k;
    //b.dobav(k);
    system("pause");
    return 0;
}

Последний раз редактировалось Stilet; 03.11.2014 в 08:50.
Ostor вне форума Ответить с цитированием
Старый 03.11.2014, 14:27   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Ostor Посмотреть сообщение
создать метод который дает возможность изменять кол-во строк или столбцов матрицы
Это сложно сделать с вашим подходом через ручное выделение памяти с помощью new, а с std::vector будет гораздо проще

Я написал класс Matrix и пример его использования. Готов ответить на ваши вопросы по моему примеру:

Пример сеанса работы с программой:
Цитата:
Enter a number of rows:
> 10

Enter a number of columns:
> 3

51 45 98
33 19 52
48 40 9
28 24 1
24 91 69
17 21 90
40 12 0
70 50 63
92 15 64
81 39 69

Press <RETURN> to close this window...
main.cpp
Код:
#include <cstdlib>      // std::srand, std::rand
#include <iostream>     // std::cout std::cin
#include <ctime>        // std::time
#include "Matrix.h"

int main( )
{
    // Enter a number of rows
    size_t nrows;
    std::cout << "\nEnter a number of rows:\n> ";
    std::cin >> nrows;

    // Enter a number of rows
    size_t ncols;
    std::cout << "\nEnter a number of columns:\n> ";
    std::cin >> ncols;

    // Create a matrix
    Matrix<int> matrix( 0, nrows, ncols );

    // Initialize random seed
    std::srand ( std::time( NULL ) );

    // Fill the matrix
    for ( size_t row = 0; row < matrix.countRows(); ++row ) {
        for ( size_t col = 0; col < matrix.countCols(); ++col ) {
            matrix.setValue( rand() % 100, row, col );
        }
    }

    // Show the matrix
    std::cout << '\n';
    for ( size_t row = 0; row < matrix.countRows(); ++row ) {
        for ( size_t col = 0; col < matrix.countCols(); ++col ) {
            std::cout << matrix.value( row, col ) << " ";
        }
        std::cout << '\n';
    }
    std::cout << '\n';

    return 0;
}
Matrix.h
Код:
#ifndef MATRIX_H
#define MATRIX_H

#include <vector>
#include <cstddef>

template <typename Type>
class Matrix
{
public:
    Matrix( Type initValue, size_t nrows = 2, size_t ncols = 2 ) :
        m_matrix( nrows ),
        m_nrows( nrows ),
        m_ncols( ncols )
    {
        // Create columns
        for ( size_t row = 0; row < nrows; ++row ) {
            m_matrix[row].resize( ncols, initValue );
        }
    }

    void setValue( Type value, unsigned int row, unsigned int col )
    {
        m_matrix[row][col] = value;
    }

    Type value( unsigned int row, unsigned int col ) const
    {
        return m_matrix[row][col];
    }

    size_t countRows() const
    {
        return m_nrows;
    }

    size_t countCols() const
    {
        return m_ncols;
    }

private:
    std::vector< std::vector<Type> > m_matrix;
    size_t m_nrows;
    size_t m_ncols;
};

#endif // MATRIX_H

Последний раз редактировалось 8Observer8; 03.11.2014 в 14:29.
8Observer8 вне форума Ответить с цитированием
Старый 03.11.2014, 20:10   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Добавил в класс Matrix два метода:

Код:
    void addRow()
    {
        std::vector<Type> row( m_ncols, m_initValue );
        m_matrix.push_back( row );
    }

    void addColumn()
    {
        for ( size_t row = 0; row < m_nrows; ++row ) {
            m_matrix[row].push_back( m_initValue );
        }
    }
Output
Цитата:
Enter a number of rows:
> 10

Enter a number of columns:
> 3

31 39 47 0
1 1 88 0
21 27 14 0
0 88 61 0
54 62 91 0
25 1 92 0
22 44 63 0
37 34 92 0
29 74 32 0
95 1 78 0
0 0 0 0

Press <RETURN> to close this window...
main.cpp
Код:
#include <cstdlib>      // std::srand, std::rand
#include <iostream>     // std::cout std::cin
#include <ctime>        // std::time
#include "Matrix.h"

// Show the matrix
template <typename Type>
void showMatrix( const Matrix<Type> &matrix );

int main( )
{
    // Enter a number of rows
    size_t nrows;
    std::cout << "\nEnter a number of rows:\n> ";
    std::cin >> nrows;

    // Enter a number of rows
    size_t ncols;
    std::cout << "\nEnter a number of columns:\n> ";
    std::cin >> ncols;

    // Create a matrix
    Matrix<int> matrix( 0, nrows, ncols );

    // Initialize random seed
    std::srand ( std::time( NULL ) );

    // Fill the matrix
    for ( size_t row = 0; row < matrix.countRows(); ++row ) {
        for ( size_t col = 0; col < matrix.countCols(); ++col ) {
            matrix.setValue( rand() % 100, row, col );
        }
    }

    // Add a row
    matrix.addRow();

    // Add a column
    matrix.addColumn();

    // Show the matrix
    showMatrix( matrix );

    return 0;
}

// Show the matrix
template <typename Type>
void showMatrix(const Matrix<Type> &matrix )
{
    std::cout << '\n';
    for ( size_t row = 0; row < matrix.countRows(); ++row ) {
        for ( size_t col = 0; col < matrix.countCols(); ++col ) {
            std::cout << matrix.value( row, col ) << " ";
        }
        std::cout << '\n';
    }
    std::cout << '\n';
}
Matrix.h
Код:
#ifndef MATRIX_H
#define MATRIX_H

#include <vector>
#include <cstddef>

template <typename Type>
class Matrix
{
public:
    Matrix( Type initValue, size_t nrows = 2, size_t ncols = 2 ) :
        m_initValue( initValue ),
        m_matrix( nrows ),
        m_nrows( nrows ),
        m_ncols( ncols )
    {
        // Create columns
        for ( size_t row = 0; row < nrows; ++row ) {
            m_matrix[row].resize( ncols, initValue );
        }
    }

    void setValue( Type value, unsigned int row, unsigned int col )
    {
        m_matrix[row][col] = value;
    }

    Type value( unsigned int row, unsigned int col ) const
    {
        return m_matrix[row][col];
    }

    void addRow()
    {
        std::vector<Type> row( m_ncols, m_initValue );
        m_matrix.push_back( row );
        ++m_nrows;
    }

    void addColumn()
    {
        for ( size_t row = 0; row < m_nrows; ++row ) {
            m_matrix[row].push_back( m_initValue );
        }
        ++m_ncols;
    }

    size_t countRows() const
    {
        return m_nrows;
    }

    size_t countCols() const
    {
        return m_ncols;
    }

private:
    Type m_initValue;
    std::vector< std::vector<Type> > m_matrix;
    size_t m_nrows;
    size_t m_ncols;
};

#endif // MATRIX_H
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки в шаблонном классе _SOKOL_ Общие вопросы C/C++ 8 06.02.2013 08:08
перегрузка операторов дружеской ф-ции в шаблонном классе Rayzor Общие вопросы C/C++ 1 24.05.2012 14:29
перегрузка оператора вывода в шаблонном классе Anubys Общие вопросы C/C++ 3 14.03.2012 15:15
работа с множествами в классе настюх Помощь студентам 0 09.11.2011 18:28
Перегрузка оператора в шаблонном классе alex_alpha Общие вопросы C/C++ 0 12.08.2010 21:37