Нахождение квадрата матрицы.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Вообще знаю как это сделать, и сделал. Но решил я это сделать с классами. Вообщем вот мой код:

Код: Выделить всё

#include <iostream>
#include <time.h>
#include <fstream>
#include <iomanip>
#include <ctime>
#include <cstdlib>

using namespace std;

class qwadra {
public:
int **mas; //сама матрица сдесь
int **kwmas; //сюда закину квадратную матрицу
int a, b; //размер матрицы

int** InitDwumerMas (int** mas, int a, int b); 
int** qwadratMatrics (int** mas, int** kwmas, int a, int b);
~qwadra()
{
for (int i = 0; i<a; i++){ delete[] mas[i]; }
delete[] mas;
};

};

int** qwadra::InitDwumerMas (int** mas, int a, int b) //выделение памяти двумерного динамического массива
{
 mas = new int* [a];

for(int i=0; i<a; i++)
  {
   mas[i] = new int[b];
  }
  return mas;
}


int** qwadra::qwadratMatrics (int** mas, int** kwmas, int a, int b) //нахождение квадрата матрицы
{
 int W=0;
   for (int i=0; i<a; i++)
   {

       for (int j=0; j<b; j++)
         {
             for (int l=0; l<b; l++)
             {
             W=mas[i][l]*mas[l][j]+W;
             }
           kwmas[i][j]=W;
           W=0;
         }
         cout << endl;

   }
   return kwmas;
}


int main()
{

    int N, M;
    int** matrics;
    int** matrics2;
    qwadra cl;
   ifstream file1; //открываем фаил для чтение.
   file1.open("file1.txt");
   file1>>N; //записываем первое число из файла то есть размер матрицы
   file1>>M; //записываем второе число

   matrics=cl.InitDwumerMas (matrics, M, N); //выделяем память
   matrics=cl.InitDwumerMas (matrics2, M, N);


for (int i=0; i<N; i++) //сяитываем элементы матрицы из файла и записываем в массив
   {
       for (int j=0; j<M; j++)
         {
            file1>>matrics[i][j];
         }
   }

matrics=cl.qwadratMatrics (matrics, matrics2, M, N); //находим квадрат матрицы

   for (int i=0; i<N; i++) //вывод массива
   {
       for (int j=0; j<M; j++)
         {
            cout << setw(4) << matrics[i][j];
         }
         cout << endl;
   }
   cout << endl;



}
Программа вылетает. Вообщем вся проблема в этой строчке

Код: Выделить всё

 kwmas[i][j]=W;
Думал что с указателем напутал, но если просто для эксперемента написать

Код: Выделить всё

 mas[i][j]=W;
то программа работает (правда не так как надо). Вот и ломаю голову, что я не так сделал?
Аватара пользователя
rrrFer
Сообщения: 237
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

поля класса не должны быть публичными, ты нарушаешь инкапсуляцию

Код: Выделить всё

int** qwadra::InitDwumerMas (int** mas, int a, int b) //выделение памяти двумерного динамического массива
//..
  return mas;
}
это должно выполняца в конструкторе, наверное. Возвращать указатель на матрицу тоже нехорошо, ты опять нарушаешь инкапсуляцию

В чем смысл класса если указатель на массив хранится и исопльзуется снаружи?

Код: Выделить всё

matrics=cl.InitDwumerMas (matrics, M, N); //выделяем память
зачем это:

Код: Выделить всё

int **kwmas; //сюда закину квадратную матрицу
я не понял, и ты как бы даже не освобождаешь память из под этого массива.

Еще, в деструкторе у тебя таки освобождается память из под одной матрицы, программа сломаеца когда объект будет удален при попытке работы с указаетлем на этот массив (который ты исопльзуешь снаружи, но про инкапсуляцию я уже писал).

Код: Выделить всё

matrics=cl.InitDwumerMas (matrics, M, N); //выделяем память
   matrics=cl.InitDwumerMas (matrics2, M, N);
еще более странный код, в левой части обоих выражений идет matrics1, т.е. matrics2 ты вобще не инициализируешь? - тогда оно и не может работать, никак.

Вобщем мне код полностью непонятен, я думаю что ошибка именно в том, что ты неверно инициализируешь matrics снаружи класса. Либо следи за указателями внимательно, либо не нарушай инкапсуляцию.
Приглашаю на свой блог о программировании: pro-prof.com
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

rrrFer писал(а):поля класса не должны быть публичными, ты нарушаешь инкапсуляцию

Код: Выделить всё

int** qwadra::InitDwumerMas (int** mas, int a, int b) //выделение памяти двумерного динамического массива
//..
  return mas;
}
это должно выполняца в конструкторе, наверное. Возвращать указатель на матрицу тоже нехорошо, ты опять нарушаешь инкапсуляцию

В чем смысл класса если указатель на массив хранится и исопльзуется снаружи?

Код: Выделить всё

matrics=cl.InitDwumerMas (matrics, M, N); //выделяем память
зачем это:

Код: Выделить всё

int **kwmas; //сюда закину квадратную матрицу
я не понял, и ты как бы даже не освобождаешь память из под этого массива.

Еще, в деструкторе у тебя таки освобождается память из под одной матрицы, программа сломаеца когда объект будет удален при попытке работы с указаетлем на этот массив (который ты исопльзуешь снаружи, но про инкапсуляцию я уже писал).

Код: Выделить всё

matrics=cl.InitDwumerMas (matrics, M, N); //выделяем память
   matrics=cl.InitDwumerMas (matrics2, M, N);
еще более странный код, в левой части обоих выражений идет matrics1, т.е. matrics2 ты вобще не инициализируешь? - тогда оно и не может работать, никак.

Вобщем мне код полностью непонятен, я думаю что ошибка именно в том, что ты неверно инициализируешь matrics снаружи класса. Либо следи за указателями внимательно, либо не нарушай инкапсуляцию.

Спасибо что указали на ошибки. Попробую разобраться. Опыта в программировании с классами у меня мало, так что вот учусь)
Ответить