Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
#1

Умножение матриц и нахождение суммы элементов - C++

28.12.2011, 21:39. Просмотров 838. Ответов 11
Метки нет (Все метки)

надо умножить матрицу A на матрицу B, где матрица A размером m на n,
и найти в получившейся матрице сумму элементов строк и столбцов, на пересечении которых отрицательные элементы, помогите кто может, внизу наработки программы, единственное что надо это как определить эти элементы и сложить элементы срок и столбцов, пишу программу на xcode, так как другого компьютера нет
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <stdio.h>
using namespace std;
double ** AllocMatrix(int Rows, int Colomns)
{
    double ** Matrix;
    try
    {
        Matrix = new double * [Rows];
        if( Matrix == NULL ) throw 0;
        for (int i = 0; i < Rows; i++)
        {
            Matrix[i] = new double [Colomns];
            if( Matrix[i] == NULL ) throw i;
        }
    }
    catch( int index )
    {
        cout << "Error" << endl;
        for (int i = 0; i < index; i++)
        {
            delete [] Matrix[i];
            Matrix[i] = NULL;
        }
        return NULL;
    }
    return Matrix;
}
 
//vvod matrici
bool GetMatrix(double ***Matrix, int *Rows, int *Colomns)
{
    cout << "Rows: "; cin >> (*Rows);
    cout << "Colomns: "; cin >> (*Colomns);
    //Memory for massiv
    double **Ret;
    Ret = AllocMatrix(*Rows, *Colomns);
    *Matrix = Ret;
    if (Ret != NULL)
    {
        for (int i = 0; i < *Rows; i++)
            for (int j = 0; j < *Colomns; j++)
            {
                printf("Matrix[%d][%d] = ", i, j);
                cin >> Ret[i][j];
            }
        return true;
    }else return false;
}
//Razmernost
bool CheckMatrixes(int Rows1, int Colomns1, int Rows2, int Colomns2)
{
    return (Rows2 == Colomns1);
}
 
//Umnpzhenie matric
bool MultiplyMatrix(double **Matrix1, int Rows1, int Columns1,
                    double **Matrix2, int Rows2, int Columns2,
                    double ***ResultMatrix, int *ResultRows, int *ResultColumns)
{
    *ResultRows = Rows1;
    *ResultColumns = Columns2;
    double **Ret;
    Ret = AllocMatrix(*ResultRows, *ResultColumns);
    *ResultMatrix = Ret;
    if (Ret != NULL)
    {
        for (int i = 0; i < *ResultRows; i++)
            for (int j = 0; j < *ResultColumns; j++)
            {
                double Sum = 0;
                for (int n = 0; n < Rows2; n++)
                {
                    Sum += Matrix1[i][n]*Matrix2[n][j];
                }
                (*ResultMatrix)[i][j] = Sum;
            }
        return true;
    }else return false;
}
 
//Vivod matric
void MatrixOut(double **Matrix, int Rows, int Columns)
{
    for (int i = 0; i < Rows; i++)
    {
        for (int j = 0; j < Columns; j++)
            cout << Matrix[i][j] << "\t";
    }
}
 
 
//Osvobodit' pamyat
void FreeMatrix(double **Matrix, int Rows)
{
    for (int i = 0; i < Rows; i++)
    {
        
        delete [] Matrix[i];
        Matrix[i] = NULL;
    }
    delete [] Matrix;
    Matrix = NULL;
}
void MinusElementRows(double **Matrix, int Rows, int Columns, int minus[100])
{for (int i=0;i<Rows;i++)
 
    for (int j=0;j<Columns;j++)
        {
        if (Matrix[i][j]<0)
            (Matrix[i][j]) = minus[i]; i++;
        }
    }
void SumRows(int* minus, int i, int n, int sum )
{
    for (n=0, sum = 0; n<i; n++) sum+= minus[i];
    cout << sum;
}
int main()
{
    double ***A = new double **, ***B = new double **, ***C = new double **;
    int ARowCount, AColCount, BRowCount, BColCount, CRowCount, CColCount, *minus, i, n, sum;
    do
    {
        cout << "vvedite matricu A:\n";
    } while (!GetMatrix(A, &ARowCount, &AColCount));
    do
    {
        cout << "vvedite matricu B:\n";
    } while (!GetMatrix(B, &BRowCount, &BColCount));
    if (CheckMatrixes(ARowCount, AColCount, BRowCount, BColCount))
    {
        if (MultiplyMatrix(*A, ARowCount, AColCount,
                           *B, BRowCount, BColCount, C, &CRowCount, &CColCount))
        {
            cout << "result:\n";
            MatrixOut(*C, CRowCount, CColCount);
        }
    }else cout << "Nevozmozhno peremnozhit\n";
    
    cout << "otricatelnie elementi";
    MinusElementRows(*C, CRowCount, CColCount, minus);
    SumRows(minus, i, n, sum);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2011, 21:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Умножение матриц и нахождение суммы элементов (C++):

Нахождение суммы матриц - C++
Помогите с написанием программы, не могу уже 2 день написать, выдает ошибки :( ------- Разработать на языке С++ функцию, которая...

Вычислить суммы элементов нижних треугольных матриц. Суммы вычислять в функции - C++
Вычислить суммы элементов нижних треугольных матриц для А(15,15) и В(20,20). Суммы вычислять в функции.

Ввод элементов массива с клавиатуры, вычисление суммы по формуле, нахождение максимальной суммы - C++
Помогите дополнить код. Нужно, чтоб элементы массива вводились с клавиатуры. Выводилось на экран все суммы, которые вычисляются по формуле,...

Класс "Матрица" для нахождения суммы, разности, умножения матриц и суммы элементов матрицы. - C++
Всем привет. Вы могли бы протестировать работу на предмет ошибок, и если нетрудно указать места, где можно было бы написать код как-то...

Умножение треугольных матриц«Методы обработки разреженных матриц» - C++
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным проблем нет. Доступ к элементам свёрнутой матрицы...

Нахождение суммы всех элементов массива и суммы первых 3-х элементов массива - C++
Нужно создать алгоритм нахождения суммы всех элементов массива А и В ,и сумму первых 3-х элементов массива С. Проблема в том ,что я...

11
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 21:41 #2
Элементарное задание, что именно не получается. И задание уточните


Цитата Сообщение от devilcry86 Посмотреть сообщение
умножение матриц и нахождение суммы элементов
умножение матриц на что? и суммы каких элементов?
0
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 21:43  [ТС] #3
в первом сообщении написано задание, и там же написано что не получется
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 21:51 #4
Цитата Сообщение от devilcry86 Посмотреть сообщение
в первом сообщении написано задание, и там же написано что не получется
Странно, не заметил
C++
1
2
3
4
5
6
7
8
for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    { 
        c[i][j]=0; //обнуляем элемент,  в который будет производится запись перемножения строка на                      
              //столбец
        for (z=0;z<m;z++)
            c[i][j]+=a[i][z]*b[z][j]; //записываем сумму  умножая поочередно элементы строки и столбца 
    }
Добавлено через 1 минуту
Только смотрите, чтобы размер соответствовал правилу.
0
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 21:57  [ТС] #5
а как в двумерном массиве определить отрицательный элемент и потом номер строки и столбца передать в функцию суммы их элементов???
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 22:12 #6
Цитата Сообщение от devilcry86 Посмотреть сообщение
а как в двумерном массиве определить отрицательный элемент и потом номер строки и столбца передать в функцию суммы их элементов???
два цикла, в них условие
C
1
if ( arr[i][j] < 0 )
0
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 22:50  [ТС] #7
то есть мне надо зациклить условие, а в условие поставить ещё циклы которые будут считать сумму?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 22:54 #8
Цитата Сообщение от devilcry86 Посмотреть сообщение
то есть мне надо зациклить условие, а в условие поставить ещё циклы которые будут считать сумму?
Да, но лучше, чтобы не было большое вложенности, в условии вызывать функцию подсчета суммы
например, вот прототип, опишете ее сами
C
1
int sum (int **arr, int row, int column);
0
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
29.12.2011, 11:24  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int** Sum(double **Matrix, int Rows, int Columns, int i, int j, int k, int n, int z, int m, double **c, int **a, int **b, double result)
{for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    { 
    c[i][j]=0; //обнуляем элемент,  в который будет производится запись перемножения строка на                      
        //столбец
        for (z=0;z<m;z++)
            c[i][j]+=a[i][z]*b[z][j]; //записываем сумму  умножая поочередно элементы строки и столбца 
     }
    c[i][j] = result;
}
 
 
int vivod (int **c, int Rows, int Columns, int k, int n, int i, int j, int z, int m, double ***vivodmatrix, double** ret, int **Matrix, int **a, int **b)
{for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    {if ( c[Rows][Columns] < 0 )
        ret = Sum(*Matrix, Rows, Columns, k,n,i,j,z,m,  *c, *a, *b );
        *vivodmatrix = ret;
        }
}
подскажите как корректно все это дело увязать между собой, а то в этом вообще ноль, но работу надо сделать

Добавлено через 36 минут
ребят подскажите пожалуйста, очень надо...

Добавлено через 10 часов 45 минут
в 11 строке компилятор выдает предупреждение control reqches end of non-void function, а в 18 выдает ошибку not matching found function to call Sum
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 11:28 #10
Исходя из Ваших функций:
- Функция sum должна вернуть int **
- Переменная ret должна иметь тип int **
0
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
29.12.2011, 12:11  [ТС] #11
какое именно значение она должна возвращать, и все же компилятор ругается что не может найти функцию

Добавлено через 21 минуту
вписываю эти функции в тело программы, мне выдает ошибку что они не найдены, как с этим бороться?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 16:24 #12
devilcry86, правильно описать функцию.
0
29.12.2011, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 16:24
Привет! Вот еще темы с ответами:

Подсчет суммы элементов на периметре матриц - C++
Дана квадратная матрица. Мне нужно подсчитать сумму элементов на периметре исходной матрицы, а также на периметрах всех вложенных в нее...

Нахождение суммы элементов - C++
Нахождение суммы элементов в каждой строке массива

Вычеслить суммы элементов главных диагоналей матриц - C++
Вычеслить суммы элементов главных диагоналей матриц A(N,N) B(M,M).M и N(&lt;=20)

Нахождение суммы элементов строки - C++
как найти сумму элементов 4-ой строки матрицы? ну номер не принципиален, просто как оформить переход этот? #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.