Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> класс матриц, добавление/удаление строк/столбцов 
:(
    Опции темы
mirosh
Дата 11.12.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.12.2006
Где: Волгоград

Репутация: нет
Всего: нет



Здравствуйте. Такая проблема: нужно написать класс матриц, причём чтобы можно было добавлять и удалять строки/столбцы. Класс вроде написал, а вот как добавлять и удалять не пойму.... не могу разобраться с памятью.

Код


//------------------------------------------------cMatrix.h------------------------
#ifndef CMATRIX_H
#define CMATRIX_H

class cMatrix
{
    private:
        int m, n;        //Dimensions
        int **matrix;    //The matrix itself
    
    public:
        cMatrix(int rows, int colomns);
        //cMatrix(const cMatrix& matr);
        cMatrix (const cMatrix &matr);
        ~cMatrix();
        void InputMatrix();
        void OutputMatrix();
        void OutputSubmatrix();
        void AddRow();
        void DeleteRow();
        void AddColomn();
        void DeleteColomn();
};

#endif 

//------------------------------------------cMatrix.cpp----------------------------------------------
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>

#include "cMatrix.h"

cMatrix::cMatrix(int rows, int colomns)
        {
            int i;

            m = rows;
            n = colomns;
            matrix = new int*[m];
            for(i = 0; i < m; i++)
                matrix[i] = new int[n];
        }
        
cMatrix::~cMatrix()
{
        int i;
            
        for(i = 0; i < m; i++)
            delete matrix[i];
            
        delete matrix;
        matrix = NULL;
}
    
void cMatrix::InputMatrix()
{
    printf("\n");
    for(int i = 0; i < m; i++)
                for(int j = 0; j < n; j++)
                {
                    printf("a(%d,%d)=",i,j);
                    scanf("%d",&matrix[i][j]);
                    printf("\n");
                };
    
}

void cMatrix::OutputMatrix()
{
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
            printf("%3d", matrix[i][j]);
            printf("\n");
    }
    //getch();
    printf("\n");
}

void cMatrix::OutputSubmatrix()
{
  
}

void cMatrix::AddRow()
{
    m=m+1;
    cMatrix b(m,n);
    for(int i = 0; i < m; ++i)
    {    
        for(int j=0; j<n; ++j)
        {
            b.matrix[i][j] = matrix[i][j];
        }
    }
    for(int i=0; i<n; ++i)
        scanf("%d",&b.matrix[m][i]);

    //а вот как запихать матрицу b в память не знаю
       
    
    
}

void cMatrix::DeleteRow()
{
    
}

void cMatrix::AddColomn()
{
    
}

void cMatrix::DeleteColomn()
{
    
}

//----------------------------------------------------main.cpp------------------------------------------
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>

#include "cMatrix.h"

int Menu();
int GetNumber(int min, int max);      
void ExitBack();

void main()
{
    int rows=0,colomns=0;
    printf("Input number of rows: ");
    while(rows<=0)
        scanf("%d",&rows);
    printf("\nInput number of colomns: ");
    while(colomns<=0)
        scanf("%d",&colomns);

    cMatrix a(rows,colomns);
    a.InputMatrix();
    a.OutputMatrix();
    
    bool done = false; 
    while (!done) 
    { 
        switch (Menu()) 
        { 
            case 1: a.AddRow(); break;
            case 2: a.DeleteRow(); break;
            case 3: a.AddColomn(); break;
            case 4: a.DeleteColomn(); break;
            case 5: a.OutputMatrix(); break; 
            case 6: a.OutputSubmatrix(); break;
            case 7: 
                printf("Конец работы.\n"); 
                done = true; 
                break; 
        } 
    }
    
};

int Menu() 
{
    printf(" 1 - Add row\n 2 - Delete row\n 3 - Add colomn\n"); 
    printf(" 4 - Delete colomn\n 5 - Print matrix\n"); 
    printf(" 6 - Print submatrix\n 7 - Exit\n\n");

    return GetNumber(1, 7); 
}

int GetNumber(int min, int max) 
{
    int number = min - 1; 
    while (true) 
    { 
        
        scanf("%d",&number);
        if ((number >= min) && (number <= max)) 
            break; 
        else 
            printf("Review enter, please. Type digits from %d to %d ): ",min,max); 
    } 
    return number;
}

void ExitBack() 
{
    printf("\nPress any key.\n\n"); 
    getch();
}


PM MAIL ICQ   Вверх
JackYF
Дата 11.12.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 12.12.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Действительно, лучше реализуй матрицу как вектор векторов. 
Причем, если можно, возьми за основу именно вектор (std::vector).
Тогда добавление\удаление строки тривиально, да и добавление\удаление столбца тоже.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.