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

Поиск:

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


Новичок



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

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



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


Код


#include "stdafx.h"
#include <iostream>
using namespace std;

int ** vvod(int m,int n)
{int ** a;
cout<<"Vvedite elementi matrici: "<<endl;
a=new int* [n];
for (int i=0;i<n;i++)
{*(a+i)=new int [m];
for (int j=0;j<m;j++)
    cin>>*(*(a+i)+j);
        cout<<endl;}
          return a; }

void vivod(int n,int m,int ** a)
{for (int i=0;i<n;i++)
{for (int j=0;j<m;j++)
cout<<*(*(a+i)+j)<<" ";
cout<<endl;}
}


int ** uravnenie(int ** A,int ** B,int m,int n,int x)
{int ** transp_B;
transp_B=new int * [n];
for(int i=0;i<n;i++)
    {*(transp_B+i)=new int [m];       
        for(int j=0;j<m;j++)
        {
            *(*(transp_B+i)+j)=0;  //транспонируем матрицу B 
    for(int k=0;k<n;k++)
    transp_B[j][i]=B[i][j];}}

int ** umnozenie;                     //создаем новый массив результат умножения матрицы A на транспонированную B
{umnozenie=new int * [n];             
for(int i=0;i<n;i++)          
    {*(umnozenie+i)=new int [m];
        for(int j=0;j<m;j++)
        {
            *(*(umnozenie+i)+j)=0;
    for(int k=0;k<n;k++)
    
    *(*(umnozenie+i)+j)+=( *(*(A+i)+k)) * (*(*(transp_B+k)+j) ) ;}}  //результат умножения матрицы A транспонированную B

int ** slozenieA_B;
{slozenieA_B=new int* [n];
for (int i=0;i<n;i++)
    {*(slozenieA_B+i)=new int [m];
for (int j=0;j<m;j++)
    *(*(slozenieA_B+i)+j)=*(*(A+i)+j) + *(*(B+i)+j);}}   //результат сложения (A+B)


int constanta;
constanta=x;

int ** tr_slozenie;
{tr_slozenie=new int* [n];
for (int i=0;i<n;i++)
    { *(tr_slozenie+i)=new int [m];
for (int j=0;j<m;j++)
    tr_slozenie[j][i]=slozenieA_B[i][j];}}   //транспонируем матрицу (A+B)

for (int i=0;i<n;i++)
{    for (int j=0;j<m;j++)
    { *(*(tr_slozenie+i)+j)=constanta * (*(*(tr_slozenie+i)+j));} } // транспонированную (A+B) умножаем на константу


int ** rezultat;
{rezultat=new int* [n];
for (int i=0;i<n;i++)
    {*(rezultat+i)=new int [m];
for (int j=0;j<m;j++)
    *(*(rezultat+i)+j)=*(*(tr_slozenie+i)+j) + *(*(umnozenie+i)+j); //результат 
}
return rezultat;}}}
  

int _tmain(int argc, _TCHAR* argv[])
{ int x;   //константа const=x
  int ** A;
  int ** B;
  int ** rezultat;
  int m,n;
  cout<<"vvedite razmernoct matriz A,B"<<endl;
  cin>>m>>n;
  cout<<"vvedite constanty"<<endl;
  cin>>x;
  A=vvod(m,n);
  B=vvod(m,n);
  rezultat=uravnenie(A,B,m,n,x);
  vivod(m,n,rezultat); 
   }


Это сообщение отредактировал(а) Valya111 - 25.4.2013, 18:38
PM MAIL   Вверх
kolesnle
Дата 22.4.2013, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Это компилятор протестует против русских названий переменных! ))
PM MAIL   Вверх
Valya111
Дата 22.4.2013, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kolesnle @ 22.4.2013,  18:36)
Это компилятор протестует против русских названий переменных! ))

всмысле русские? они все же там вроде на английском.. 
я не увижу где там хотя бы одна переменная была написана на русском.

Это сообщение отредактировал(а) Valya111 - 22.4.2013, 18:47
PM MAIL   Вверх
kolesnle
Дата 22.4.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Транслит

Добавлено через 2 минуты и 30 секунд
Код

transp_B[j][i]=B[i][j];}}

нарушение прав доступа
PM MAIL   Вверх
feodorv
Дата 22.4.2013, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Уравнения, как такового, здесь нет. Есть выражение, значение которого Вам нужно вычислить.

Про код и его оформление я лучше промолчу))) По задаче: 
  • определитесь, какие у Вас размерности матриц: n строк по m столбцов (я правильно понимаю?) Не допускайте перепутывания:
    Цитата(Valya111 @  22.4.2013,  19:05 Найти цитируемый пост)
    void vivod(int n,int m,int ** a)

    Цитата(Valya111 @  22.4.2013,  19:05 Найти цитируемый пост)
      vivod(m,n,rezultat); 

    Так что первым - m или n???
  • если матрица имеет размерность n*m, то транспонированная матрица уже будет иметь размерность m*n, а у Вас:
    Цитата(Valya111 @  22.4.2013,  19:05 Найти цитируемый пост)
    {int ** transp_B;
    transp_B=new int * [n];
    for(int i=0;i<n;i++)
        {*(transp_B+i)=new int [m];       
            for(int j=0;j<m;j++)
            {
                *(*(transp_B+i)+j)=0;  //транспонируем матрицу B 
  • доступ к ячейке двумерной матрицы осуществляется как matrix[i][j], но не как у Вас:
    Цитата(Valya111 @  22.4.2013,  19:05 Найти цитируемый пост)
    *(*(transp_B+i)+j)

    Цитата(Valya111 @  22.4.2013,  19:05 Найти цитируемый пост)
    *(*(slozenieA_B+i)+j)
     и т.д.
  • разбейте задачу на подзадачи, введите отдельную подпрограмму заказа памяти под матрицу, для транспонированных матриц не нужно делать отдельного экземпляра матрицы (так как достаточно просто A[i][j] заменить на A[j][i])

PS Я никак не пойму, как можно складывать матрицы разного размера:
A+B => n*m, (A+B)t = m*n; в то время как A*Bt => n*m * (m * n) = n*n, то есть в конце концов матрица m*n складывается с матрицей n*n smile Выходит, матрицы-то квадратные...







--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kolesnle
Дата 22.4.2013, 18:58 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



А инициализировать матрицу кто будет?

Добавлено @ 19:02
Код

// Инициализация происходит так
    mas=new int*[n];
 
    for(i=0; i<n; i++)
       mas[i]=new int[n];


Добавлено @ 19:07
Код

//Функция транспонирования квадратной матрицы
void transpose(int **matrix, size_t size)
{
    int t;
    for(int i = 0; i < size; ++i)
    {
        for(int j = i; j < size; ++j)
        {
            t = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = t;
        }
    }
}


Добавлено @ 19:11
Код

//Функция умножения матрицы
void mult(int** x, int n, int m, int** y, int** mt)
{
        int temp = 0;
        for (int i = 0; i < n; i++){
                for (int j = 0; j < m; j++){
                        for(int k = 0; k < n; k++) {
                                temp += x[j][k] * y[k][j];
                        }
                        mt[i][j] = temp;
                }
        }
}


Это сообщение отредактировал(а) kolesnle - 22.4.2013, 19:12
PM MAIL   Вверх
kolesnle
Дата 22.4.2013, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Код

//Функция сложения матриц
void matrix_sum(int **matrix1, int **matrix2, int **result, int m, int n)
{
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            result[i][j] = matrix1[i][j] + matrix2[i][j];
}

PM MAIL   Вверх
feodorv
Дата 23.4.2013, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



kolesnle, не торопитесь с кодом!
Цитата(kolesnle @  22.4.2013,  19:58 Найти цитируемый пост)
void mult(int** x, int n, int m, int** y, int** mt)
{
        for (int i = 0; i < n; i++){
                for (int j = 0; j < m; j++){
                        int temp = 0;                    
                        for(int k = 0; k < n; k++) {
                                temp += x[j][k] * y[k][j];
                        }
                        mt[i][j] = temp;
                }
        }
}



Цитата(kolesnle @  22.4.2013,  19:58 Найти цитируемый пост)
// Инициализация происходит так

Это не инициализация))) К тому же Вы конструируете квадратную матрицу (оно, скорее всего, так и нужно, но зачем тогда эти m и n?)
Автор топика и так под каждую матрицу тщательно память отводит...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kolesnle
Дата 23.4.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



i'm sorry  smile 
PM MAIL   Вверх
xvr
Дата 23.4.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Valya111 @  22.4.2013,  18:05 Найти цитируемый пост)
и на этом работа программы заканчивается.

А как вы это определили? Если по тому, что окно с програмой закрылось, то это вполне ожидаемое поведение - вам программа что то написала (если смогла, про ошибки вам уже тут рассказали), а потом завершилась. И ОС немедленно закрыла окно, где она резвилась  smile 

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


Упертый сишник
*


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

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



Цитата(xvr @  23.4.2013,  13:23 Найти цитируемый пост)
А как вы это определили? Если по тому, что окно с програмой закрылось, то это вполне ожидаемое поведение - вам программа что то написала (если смогла, про ошибки вам уже тут рассказали), а потом завершилась. И ОС немедленно закрыла окно, где она резвилась

Да нет, у него там нарушение прав доступа

Это сообщение отредактировал(а) kolesnle - 23.4.2013, 18:34
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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