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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2015, 07:23   #1
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
Восклицание Произведение матриц

Помогите разобраться с ошибкой.

При компилировании нету ошибок, но выдается ошибка при запуске программы:


В коде программы выделил красным цветом фрагмент, на который мне показывает в программе:
Код:
#include <iostream.h>
#include <conio.h>
#include "stdio.h"
#include <fstream.h>
#include <algorithm>
#include <ctime>
#pragma hdrstop
#pragma argsused
using namespace std;

int main(int argc, char* argv[])
{
   //Input Matrix A
   int M, N;
   ifstream ifs("A.txt");
   ifs >> M >> N;
   int ** a = new int * [M];
   //Output Matrix A
   cout << "Matrix A:\n";
   for (int r = 0; r < M; r++, cout << endl)
      {
         a[r] = new int [N];
         for (int c = 0; c < N; c++)
            {
               ifs >> a[r][c];
               cout << a[r][c] << " ";
            }
      }
   cout << endl;
   //Input Matrix B
   int m, n;
   ifstream ifs1("B.txt");
   ifs1 >> m >> n;
   int ** a1 = new int * [m];
   //Output Matrix B
   cout<<"Matrix B:\n";
   for (int r1 = 0; r1 < m; r1++, cout << endl)
      {
         a1[r1] = new int [n];
         for (int c1 = 0; c1 < n; c1++)
            {
               ifs1 >> a1[r1][c1];
               cout << a1[r1][c1] << " ";
            }
      }
   cout << endl;

   //Input Matrix C
   int i,j;
   int **c = new int *[i];
   for (i = 0; i < M; i++)
      c[i] = new int [j];
   //Multiplication of Matrices
   for(i = 0; i < M; i++)
      for(j = 0; j < n; j++)
         {
            c[i][j] = 0;
            for(int k = 0; k < n; k++)
               c[i][j] += (a[i][k] * a1[k][j]);
         }
   //Output Matrix C
   cout << "Matrix C: " << endl;
   for(i = 0; i < M; i++)
      {
         for (j = 0; j < n; j++)
         cout << c[i][j] << " ";
         cout << endl;
      }

   for (int r = 0; r < M; r++) delete[] a[r];
   for (int r1 = 0; r1 < m; r1++) delete[] a1[r1];
   for (int i = 0; i < M; i++) delete[] c[i];
   delete[] a;
   delete[] a1;
   delete[] c;
   getch();
}

Последний раз редактировалось Vitalyas; 26.04.2015 в 07:34.
Vitalyas вне форума Ответить с цитированием
Старый 26.04.2015, 07:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

И правильно.

Код:
   int i,j;
   int **c = new int *[i];
Что по вашему лежит в i? Сколько вы выделяете элементов?
p51x вне форума Ответить с цитированием
Старый 26.04.2015, 07:49   #3
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И правильно.

Код:
   int i,j;
   int **c = new int *[i];
Что по вашему лежит в i? Сколько вы выделяете элементов?
То есть перед этим мне надо i приравнять к M (количество строк первой матрицы). Я правильно понимаю?

Но ведь потом у нас все равно i приравнивает 0, или это неважно? Что-то я не могу понять

Все, я понял, спасибо большое =)
Сидел мучился блин 2 часа и понять не мог :D

Последний раз редактировалось Stilet; 26.04.2015 в 07:56.
Vitalyas вне форума Ответить с цитированием
Старый 26.04.2015, 08:48   #4
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Снова нужна ваша помощь.

Добавил небольшое меню и проверку на совпадение размеров матриц для умножения. Проверка и меню работает, но при повторении программы через меню выдает следующую ошибку:


Подозреваю, что проблема при очистке памяти для матрицы С в конце программы. Код программы с выделенным фрагментов красного цвета прилагается:
Код:
#include <iostream.h>
#include <conio.h>
#include "stdio.h"
#include <fstream.h>
#include <algorithm>
#include <ctime>
#pragma hdrstop
#pragma argsused
using namespace std;

int main(int argc, char* argv[])
{
   l1:
   //Input Matrix A
   int M, N;
   ifstream ifs("A.txt");
   ifs >> M >> N;
   int ** a = new int * [M];
   //Output Matrix A
   cout << "Matrix A:\n";
   for (int r = 0; r < M; r++, cout << endl)
      {
         a[r] = new int [N];
         for (int c = 0; c < N; c++)
            {
               ifs >> a[r][c];
               cout << a[r][c] << " ";
            }
      }
   cout << endl;
   //Input Matrix B
   int m, n;
   ifstream ifs1("B.txt");
   ifs1 >> m >> n;
   int ** a1 = new int * [m];
   //Output Matrix B
   cout<<"Matrix B:\n";
   for (int r1 = 0; r1 < m; r1++, cout << endl)
      {
         a1[r1] = new int [n];
         for (int c1 = 0; c1 < n; c1++)
            {
               ifs1 >> a1[r1][c1];
               cout << a1[r1][c1] << " ";
            }
      }
   cout << endl;

   if (N==m)
     {
        //Input Matrix C
        int i=0,j;
        int **c = new int *[i];
        for (i = 0; i < M; i++)
           c[i] = new int [j];
        //Multiplication of Matrices
        for(i = 0; i < M; i++)
           for(j = 0; j < n; j++)
              {
                 c[i][j] = 0;
                 for(int k = 0; k < n; k++)
                 c[i][j] += (a[i][k] * a1[k][j]);
              }
        //Output Matrix C
        cout << "Matrix C: " << endl;
        for(i = 0; i < M; i++)
           {
              for (j = 0; j < n; j++)
                 cout << c[i][j] << " ";
                 cout << endl;
           }
        for (int i = 0; i < M; i++) delete[] c[i];
        delete[] c;
   }
   else cout<<"The number of columns of the matrix A is not equal to the number of rows of the matrix B\n";
   for (int r = 0; r < M; r++) delete[] a[r];
   for (int r1 = 0; r1 < m; r1++) delete[] a1[r1];
   delete[] a;
   delete[] a1;
   {
        //Menu
        int g;
        cout<<"\n1-Repeat\n0-Exit\n";
        cin>>g;
        if (g!=0 && g!=1) {cout<<"\nEntered an incorrect value. The program automatically closes\n"; getch();}
        else
            {
             if (g==1) {goto l1;}
             else {goto l2;};
            }
        l2:
        exit(0);
     }
   getch();
}

Последний раз редактировалось Vitalyas; 26.04.2015 в 08:50.
Vitalyas вне форума Ответить с цитированием
Старый 26.04.2015, 12:30   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
        //Input Matrix C
        int i=0,j;
        int **c = new int *[i];
        for (i = 0; i < M; i++)
           c[i] = new int [j];
Опять то же самое. i равен нулю, а j неизвестно чему.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.04.2015, 13:28   #6
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
        //Input Matrix C
        int i=0,j;
        int **c = new int *[i];
        for (i = 0; i < M; i++)
           c[i] = new int [j];
Опять то же самое. i равен нулю, а j неизвестно чему.
Хорошо, предположим что j=0, тогда при повторе программы результат выводится совсем другой, то есть неправильный. Конечно ошибка эта исчезла, но появилась другая:


Снова скидываю код, но уже с другим проблемным местом (оно также выделено красным цветом):

Код:
#include <iostream.h>
#include <conio.h>
#include "stdio.h"
#include <fstream.h>
#include <algorithm>
#include <ctime>
#pragma hdrstop
#pragma argsused
using namespace std;

int main(int argc, char* argv[])
{
   l1:
   //Input Matrix A
   int M, N;
   ifstream ifs("A.txt");
   ifs >> M >> N;
   int ** a = new int * [M];
   //Output Matrix A
   cout << "Matrix A:\n";
   for (int r = 0; r < M; r++, cout << endl)
      {
         a[r] = new int [N];
         for (int c = 0; c < N; c++)
            {
               ifs >> a[r][c];
               cout << a[r][c] << " ";
            }
      }
   cout << endl;
   //Input Matrix B
   int m, n;
   ifstream ifs1("B.txt");
   ifs1 >> m >> n;
   int ** a1 = new int * [m];
   //Output Matrix B
   cout<<"Matrix B:\n";
   for (int r1 = 0; r1 < m; r1++, cout << endl)
      {
         a1[r1] = new int [n];
         for (int c1 = 0; c1 < n; c1++)
            {
               ifs1 >> a1[r1][c1];
               cout << a1[r1][c1] << " ";
            }
      }
   cout << endl;

   if (N==m)
     {
        //Input Matrix C
        int i=0,j=0;
        int **c = new int *[i];
        for (i = 0; i < M; i++)
           c[i] = new int [j];
        //Multiplication of Matrices
        for(i = 0; i < M; i++)
           for(j = 0; j < n; j++)
              {
                 c[i][j] = 0;
                 for(int k = 0; k < n; k++)
                 c[i][j] += (a[i][k] * a1[k][j]);
              }
        //Output Matrix C
        cout << "Matrix C: " << endl;
        for(i = 0; i < M; i++)
           {
              for (j = 0; j < n; j++)
                 cout << c[i][j] << " ";
                 cout << endl;
           }
        for (int i = 0; i < M; i++) delete[] c[i];
        delete[] c;
   }
   else cout<<"The number of columns of the matrix A is not equal to the number of rows of the matrix B\n";
   for (int r = 0; r < M; r++) delete[] a[r];
   for (int r1 = 0; r1 < m; r1++) delete[] a1[r1];
   delete[] a;
   delete[] a1;
   {
        //Menu
        int g;
        cout<<"\n1-Repeat\n0-Exit\n";
        cin>>g;
        if (g!=0 && g!=1) {cout<<"\nEntered an incorrect value. The program automatically closes\n"; getch();}
        else
            {
             if (g==1) {goto l1;}
             else {goto l2;};
            }
        l2:
        exit(0);
     }
   getch();
}
Проблема решена. Я приравнял j к количество столбцов второй матрицы, то есть j=n. И все заработало, спасибо большое ребята =)

Последний раз редактировалось Vitalyas; 26.04.2015 в 13:32.
Vitalyas вне форума Ответить с цитированием
Старый 26.04.2015, 13:33   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
        //Input Matrix C
        int i=0,j=0;
        int **c = new int *[i];
        for (i = 0; i < M; i++)
           c[i] = new int [j];
        //Multiplication of Matrices
        for(i = 0; i < M; i++)
           for(j = 0; j < n; j++)
              {
                 c[i][j] = 0;
И в который раз Вы ошибку не исправляете
Сначала Вы выделяете место под ноль указателей на инт, затем выделяете ноль интов, а затем пытаетесь работать, будто там матрица M на n.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.04.2015, 13:35   #8
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

В смысле? не понял
Vitalyas вне форума Ответить с цитированием
Старый 26.04.2015, 13:40   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Если нужна матрица M на n, то так и надо писать:
Код:
        int **c = new int *[M];
        for (i = 0; i < M; i++)
           c[i] = new int [n];
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.04.2015, 13:43   #10
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если нужна матрица M на n, то так и надо писать:
Код:
        int **c = new int *[M];
        for (i = 0; i < M; i++)
           c[i] = new int [n];
Хорошо, все понял, спасибо что объяснили =)

Есть у кого-нибудь наброски записи матрицы в файл? В данном случае надо записать матрицу С в файл.

Последний раз редактировалось Vitalyas; 26.04.2015 в 13:49.
Vitalyas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
произведение матриц mary1010 C++ Builder 0 12.12.2012 00:57
Произведение матриц.. (Pascal) Groslerg Помощь студентам 0 13.11.2012 18:39
Произведение разреженных матриц MafoR Помощь студентам 1 24.04.2010 18:37
произведение матриц Lampard Помощь студентам 3 30.03.2009 19:00
Произведение двух матриц 010 Паскаль, Turbo Pascal, PascalABC.NET 5 03.06.2008 11:33