Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
1

Матричный калькулятор, динамическая память для матрицы

14.12.2016, 09:11. Показов 1551. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Пишу программу в С++ Builder - матричный калькулятор, с использованием компонента StringGrid.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i, j, col, row;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void RowColChange(void)
{
   col=StrToInt(Form1->Edit1->Text);
   Form1->StringGrid1->ColCount=col+1;
   Form1->StringGrid2->ColCount=col+1;
   Form1->StringGrid3->ColCount=col+1;
   row=StrToInt(Form1->Edit2->Text);
   Form1->StringGrid1->RowCount=row+1;
   Form1->StringGrid2->RowCount=row+1;
   Form1->StringGrid3->RowCount=row+1;
   int a=1;
   for (i=1; i<=col; i++)
   {
      Form1->StringGrid1->Cells[i][0]=a;
      Form1->StringGrid2->Cells[i][0]=a;
      Form1->StringGrid3->Cells[i][0]=a;
      a++;
   }
   int b=1;
   for (j=1; j<=row; j++)
   {
      Form1->StringGrid1->Cells[0][j]=b;
      Form1->StringGrid2->Cells[0][j]=b;
      Form1->StringGrid3->Cells[0][j]=b;
      b++;
   }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   RowColChange();
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   int **A = new int *[col];
   for (i=1; i<=col; i++)
   {
      A[i]=new int [row];
      for (j=1; j<=row; j++)
      {
         A[i][j]=StrToInt(StringGrid1->Cells[i][j]);
      }
   }
   int **B = new int *[col];
   for (i=1; i<=col; i++)
   {
      B[i]=new int [row];
      for (j=1; j<=row; j++)
      {
         B[i][j]=StrToInt(StringGrid1->Cells[i][j]);
      }
   }
   int **C = new int *[col];
   for (i=1; i<=col; i++)
   {
      C[i]=new int [row];
      for (j=1; j<=row; j++)
      {
         C[i][j]=A[i][j]+B[i][j];
      }
   }
   for (i=1; i<=col; i++)
   {
      for (j=1; j<=row; j++)
      {
         StringGrid3->Cells[i][j]=C[i][j];
      }
   }
}
При использовании статической памяти под матрицу, (если объявляю, например, А[100][100] и т.д.) сложение матриц работает (за произведение и разность пока не брался). Но нужно использовать именно динамическую память (использовал оператор "new"). С ним программа не работает (вычисляет только матрицу 1х1). Предположительно, это может быть связано с тем, что из-за какой-то ошибки (которую я никак не могу найти) в использовании оператора "new" (может быть перепутаны строки и столбцы при вычислении).

Помогите пожалуйста, до конца декабря сдать работу нужно)

P.S. язык C++ это единственный, в котором я работал, и то, было это всего пару раз и в прошлом году, так что мало чего здесь понимаю)) (следовательно за компактность кода не ручаюсь, пусть хотя бы так заработает)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2016, 09:11
Ответы с готовыми решениями:

Матричный калькулятор, нахождение обратной матрицы
Всё работает кроме обратной матрицы.помогите найти ошибку #include &quot;stdafx.h&quot;...

Матричный калькулятор, возведение матрицы в степень
Нужно сделать возведение матрицы в n-ую степень(натурального числа). Это умножение матрицы на...

Матричный калькулятор, умножение матрицы на матрицу
Надо сделать операцию по умножению матрицы на матрицу.

Матричный калькулятор, умножение матрицы на число
Умножение матрицы на число. for i:=1 to n do for j:=1 to n do...

11
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
14.12.2016, 09:20 2
i - row, j - col и индексация с нуля. А после всю память освободить.
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
14.12.2016, 09:35  [ТС] 3
Нулевая индексация для нумерации строк и столбцов.
Для освобождения использовать "delete" сразу после циклов?

Добавлено через 8 минут
чот не получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
   int **A = new int *[row];
   for (i=1; i<=row; i++)
   {
      A[i]=new int [col];
      for (j=1; j<=col; j++)
      {
         A[i][j]=StrToInt(StringGrid1->Cells[i][j]);
      }
   }
   int **B = new int *[row];
   for (i=1; i<=row; i++)
   {
      B[i]=new int [col];
      for (j=1; j<=col; j++)
      {
         B[i][j]=StrToInt(StringGrid1->Cells[i][j]);
      }
   }
   int **C = new int *[row];
   for (i=1; i<=row; i++)
   {
      C[i]=new int [col];
      for (j=1; j<=col; j++)
      {
         C[i][j]=A[i][j]+B[i][j];
      }
   }
   for (i=1; i<=col; i++)
   {
      for (j=1; j<=row; j++)
      {
         StringGrid3->Cells[i][j]=C[i][j];
      }
   }
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
14.12.2016, 09:38 4
Я же сказал - с нуля все индексы для массивов.
C++
1
for (i = 0; i < row; i++)
А для StringGrid1 поправка и индексы наоборот:
C++
1
A[i][j] = StrToInt(StringGrid1->Cells[j + 1][i + 1]);
В конце функции всё удалить.
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
14.12.2016, 19:35  [ТС] 5
Получилось, спасибо. Но когда одна матрица заполнена, а другая нет, то при нажатии кнопки вычисления (разности, умножения), также выдаёт ошибку. Есть ли способ "защиту от дурака" сделать, например, если хотя бы одна матрица пустая, или заполнена не до конца, то при нажатии кнопки вычисления, не будет никаких действий? Не могу придумать вариантов, как реализовать это.

Добавлено через 13 минут
И как матрицу заставить "съедать" вещественные числа?
Я заменил StrToInt на StrToFloat, но этого видимо недостаточно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
   int **A = new int *[row];
   for (i=0; i<row; i++)
   {
      A[i]=new int [col];
      for (j=0; j<col; j++)
      {
         A[i][j]=StrToFloat(StringGrid1->Cells[j+1][i+1]);
      }
   }
   int **B = new int *[row];
   for (i=0; i<row; i++)
   {
      B[i]=new int [col];
      for (j=0; j<col; j++)
      {
         B[i][j]=StrToFloat(StringGrid2->Cells[j+1][i+1]);
      }
   }
   int **C = new int *[row];
   for (i=0; i<row; i++)
   {
      C[i]=new int [col];
      for (j=0; j<col; j++)
      {
         C[i][j]=A[i][j]+B[i][j];
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col; j++)
      {
         StringGrid3->Cells[j+1][i+1]=FloatToStr(C[i][j]);
      }
   }
   for (i = 0; i<row; i++) delete A[i];
   delete [] A;
   for (i = 0; i<row; i++) delete B[i];
   delete [] B;
   for (i = 0; i<row; i++) delete C[i];
   delete [] C;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
14.12.2016, 20:46 6
Лови ошибку StrToFloat(). Там же вроде бы исключение есть для этого. Запятую в качестве разделителя ставишь?
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
18.12.2016, 19:19  [ТС] 7
С вещественными разобрался (вместо int написал double (при выделении динам. памяти) Доделал умножение программы.. Но с отрицательными числами программа работает некорректно: 3*(-5)=-14, -3-4=-6. Именно, когда взаимодействуют два числа, отличные по знаку друг от друга. В чём проблема то??

Операция вычитания двух матриц:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
   double **A = new double *[row];
   for (i=0; i<row; i++)
   {
      A[i]=new double [col];
      for (j=0; j<col; j++)
      {
         A[i][j]=StrToFloat(StringGrid1->Cells[j+1][i+1]);
      }
   }
   double **B = new double *[row];
   for (i=0; i<row; i++)
   {
      B[i]=new double [col];
      for (j=0; j<col; j++)
      {
         B[i][j]=StrToFloat(StringGrid2->Cells[j+1][i+1]);
      }
   }
   double **C = new double *[row];
   for (i=0; i<row; i++)
   {
      C[i]=new double [col];
      for (j=0; j<col; j++)
      {
         C[i][j]=A[i][j]-B[i][j];
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col; j++)
      {
         StringGrid3->Cells[j+1][i+1]=SimpleRoundTo(C[i][j], -w); //задаётся точность
      }
   }
   for (i = 0; i<row; i++) delete A[i];
   delete [] A;
   for (i = 0; i<row; i++) delete B[i];
   delete [] B;
   for (i = 0; i<row; i++) delete C[i];
   delete [] C;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
18.12.2016, 20:15 8
А без округления?
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
19.12.2016, 11:03  [ТС] 9
округление убрал - то же самое

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void __fastcall TForm1::Button5Click(TObject *Sender)
{
 
   double **A = new double *[row];
   for (i=0; i<row; i++)
   {
      A[i]=new double [col];
      for (r=0; r<col; r++)
      {
         A[i][r]=StrToFloat(StringGrid1->Cells[r+1][i+1]);
      }
   }
   double **B = new double *[row];
   for (r=0; r<row; r++)
   {
      B[r]=new double [col];
      for (j=0; j<col; j++)
      {
         B[r][j]=StrToFloat(StringGrid2->Cells[j+1][r+1]);
      }
   }
   double **C = new double *[row];
   for (i=0; i<row; i++)
   {
      C[i]=new double [col];
      for (j=0; j<col; j++)
      {
         C[i][j]=0;
      }
   }
   for (j=0; j<row; j++)
   {
      for (r=0; r<row; r++)
      {
         for (i=0; i<col; i++)
         {
            C[i][j]=C[i][j]+A[i][r]*B[r][j];
         }
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col; j++)
      {
         StringGrid3->Cells[j+1][i+1]=SimpleRoundTo(C[i][j], -w);
      }
   }
   for (i = 0; i<row; i++) delete A[i];
   delete [] A;
   for (i = 0; i<row; i++) delete B[i];
   delete [] B;
   for (i = 0; i<row; i++) delete C[i];
   delete [] C;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
19.12.2016, 17:43 10
Как-то слишком просто для умножения матриц. Здесь смотри: Умножение матриц
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
19.12.2016, 19:37  [ТС] 11
дык это ж кусок из программы. Для него все параметры уже имеются: заданы размеры матриц, в двумерные массивы A[i][r] и B[r][j] передаются значения из уже заполненных таблиц (StringGrid1, StringGrid2), потом цикл, выполняющий умножение этих двух "2D-массивов" (По формуле умножения матриц C(ij)=Summ(A(ir)*B(rj)). и в конечном итоге из двумерного массива C[i][j] полученные значения отправляются в StringGrid3. Там ошибка где-то в циклах, которую я никак не могу найти. А принцип у меня точно такой же, как и в этой ссылке.

Установка размерности первой, второй и третьей матрицы (для сложения и вычитания)
C++
1
2
3
4
5
6
7
8
   col=StrToInt(Form1->Edit1->Text);
   StringGrid1->ColCount=col+1;
   StringGrid2->ColCount=col+1;
   StringGrid3->ColCount=col+1;
   row=StrToInt(Form1->Edit2->Text);
   StringGrid1->RowCount=row+1;
   StringGrid2->RowCount=row+1;
   StringGrid3->RowCount=row+1;
Установка размерности второй и третьей матриц (для умножения)
C++
1
2
3
4
5
   col1=StrToInt(Form1->Edit3->Text);
   StringGrid2->ColCount=col1+1;
   StringGrid3->ColCount=StringGrid2->ColCount;
   StringGrid2->RowCount=StringGrid1->ColCount;
   StringGrid3->RowCount=StringGrid1->RowCount;
Процесс умножения (значения вводятся непосредственно во время программы)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void __fastcall TForm1::Button5Click(TObject *Sender)
{
 
   double **A = new double *[row];
   for (i=0; i<row; i++)
   {
      A[i]=new double [col];
      for (r=0; r<col; r++)
      {
         A[i][r]=StrToFloat(StringGrid1->Cells[r+1][i+1]);
      }
   }
   double **B = new double *[row];
   for (r=0; r<row; r++)
   {
      B[r]=new double [col];
      for (j=0; j<col; j++)
      {
         B[r][j]=StrToFloat(StringGrid2->Cells[j+1][r+1]);
      }
   }
   double **C = new double *[row];
   for (i=0; i<row; i++)
   {
      C[i]=new double [col];
      for (j=0; j<col; j++)
      {
         C[i][j]=0;
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col1; j++)
      {
         for (r=0; r<row; r++)
         {
            C[i][j]=C[i][j]+A[i][r]*B[r][j];
         }
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col; j++)
      {
         StringGrid3->Cells[j+1][i+1]=SimpleRoundTo(C[i][j], -w);
      }
   }
   for (i = 0; i<row; i++) delete A[i];
   delete [] A;
   for (i = 0; i<row; i++) delete B[i];
   delete [] B;
   for (i = 0; i<row; i++) delete C[i];
   delete [] C;
}
Некоторые варианты "неквадратичных" матриц умножает.
0
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 24
23.12.2016, 12:56  [ТС] 12
проблема решена
0
23.12.2016, 12:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2016, 12:56
Помогаю со студенческими работами здесь

динамическая память под матрицы
Добрый день! Нужна помощь очень сильно. Есть две задачи, помогите пож реализовать. 1.Написать...

Упорядочить столбцы матрицы по неубыванию характеристик. Динамическая память
Дана целочисленная матрица A(M,N). Характеристикой j –го столбца матрицы назовем значение элемента,...

Матричный калькулятор C++
Доброго времени суток, не так давно изучаю программирование на языке C++ и вот при решении...

Матричный калькулятор
Это умножении матрицы на число. StringGrid3.Cells:=StringGrid1.Cells*StrToFloat(Edit1.Text); У...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru