• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Транспонирование и умножение матриц.

  • Автор темы aaaaaa
  • Дата начала
A

aaaaaa

Дана квадратная матрица А порядка n. Получить вектор А(T)b;
Элементы вектора b вычисляются по формуле: b(i)=1(i^2+2), при i-четное, b(i)=1/i , при i-нечетное.
Определить функции транспонирования квадратной матрицы и умножения квадратной матрицы на вектор.
Разместить определение данных в заголовочном файле, а определения функций и главную функцию программы в двух отдельных файлах.

Программа крашится после транспонирования, Помогите найти в ошибку, пожалуйста,и , лучше, с обьяснениями. Заранее спасибо

main.cpp:
C++:
#include <iostream>
#include <conio.h>
#include <string.h>
#include "functions.h"



using namespace std;

int main()
{
int n;
cout << " Enter n:";
cin >> n;

int** mtrx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
mtrx[i][j] = j;
}
}

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",mtrx[i][j]);
}
cout << endl;
}
cout << endl;
int** tmtrx = Transposition(mtrx, n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",tmtrx[i][j]);
}
cout << endl;
}

int** vec=newvector(n);

Fillvec(vec, n);

int **res=newvector(n);

Calculations (tmtrx, vec, res,n);

for (int i=0; i<n; i++)
{
cout << res[i];
}

cleanmem(mtrx, n);
cleanmem(tmtrx, n);
cleanmem(vec, n);
return 0;
}

functions.h:
C++:
#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

int** newmatrix(const int n);

int** Transposition(int** matrix,const int n);

void cleanmem(int** array, const int n);

int** newvector(const int n);

void Fillvec(int** vector,const int n);

void Calculations (int** transmax, int** vector, int** results, const int n);

#endif // FUNCTIONS_H_INCLUDED

functions.cpp:

C++:
#include <iostream>
#include <conio.h>
#include "functions.h"

using namespace std;

int** newmatrix(const int n)
{
int** array = new int*[n];
for(int i = 0; i < n; ++i)
{
array[i] = new int[n];
}
return array;
}

//-------------------------------

int** newvector(const int n)
{
int** vector=new int*[n];
return vector;
}

void Fillvec(int** vector,const int n)
{
for (int i=0; i<n; i++)
{
if (i%2==0)
{
*vector[i]=(1/i);
}
else
{
*vector[i]=(1/(i*i+2));
}
}
}

//---------------
void cleanmem(int** array, const int n)
{
for(int i = 0; i < n; ++i)
{
delete[] array[i];
}
delete[] array;
}

//---------------

int** Transposition(int** matrix, const int n)
{
int** transmatx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
transmatx[j][i] = matrix[i][j];
}

}
return transmatx;
}


//-------------------------

void Calculations (int** transmatx, int** vector, int** results, const int n)
{
int sum;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
sum+=(transmatx[i][j]+*vector[j]);
}
*results[i]=sum;
}
}
 
L

lazybiz

А как это ты так вектор интересно заполняешь? И почему у тебя вектор имеет размерность два? Это же вектор! Он должен быть одномерным.
 
A

aaaaaa

Я честно говоря запутался в этих указателях уже . :lool:
Тогда, наверное, должно быть так. Но что-то все равно она крашится после транспонирования. Похоже я чего-то не понимаю. Напишите хотя-бы примерно, как это должно быть, пожалуйста.

main.cpp

C++:
#include <iostream>
#include <conio.h>
#include <string.h>
#include "functions.h"



using namespace std;

int main()
{
int n;
cout << " Enter n:";
cin >> n;

int** mtrx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
mtrx[i][j] = j;
}
}

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",mtrx[i][j]);
}
cout << endl;
}
cout << endl;
int** tmtrx = Transposition(mtrx, n);

for(int i = 0; i < n; ++i)
{
for (int j=0; j<n; j++)
{
printf ("%3i",tmtrx[i][j]);
}
cout << endl;
}
cout<< endl;

int* vec=newvector(n);

Fillvec(vec, n);

for (int i=0; i<n; i++)
{
cout << vec[i];
}
cout << endl;

int *res=newvector(n);

Calculations (tmtrx, vec, res,n);

for (int i=0; i<n; i++)
{
cout << res[i];
}

cleanmem(mtrx, n);
cleanmem(tmtrx, n);
cleanmem2(vec, n);
cleanmem2 (res, n);
return 0;
}


functions.cpp:
C++:
#include <iostream>
#include <conio.h>
#include "functions.h"

using namespace std;

int** newmatrix(const int n)
{
int** array = new int*[n];
for(int i = 0; i < n; ++i)
{
array[i] = new int[n];
}
return array;
}

//-------------------------------

int* newvector(const int n)
{
int* vector=new int [n];
return vector;
}

void Fillvec(int* vector,const int n)
{
for (int i=0; i<n; i++)
{
if (i%2==0)
{
vector[i]=(1/i);
}
else
{
vector[i]=(1/(i*i+2));
}
}
}

//---------------
void cleanmem(int** array, const int n)
{
for(int i = 0; i < n; ++i)
{
delete[] array[i];
}
delete[] array;
}

void cleanmem2(int* array, const int n)
{
delete[] array;
}

//---------------

int** Transposition(int** matrix, const int n)
{
int** transmatx = newmatrix(n);

for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
transmatx[j][i] = matrix[i][j];
}

}
return transmatx;
}


//-------------------------

void Calculations (int** transmatx, int* vector, int* results, const int n)
{
int sum;
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
sum+=(transmatx[i][j]+vector[j]);
}
results[i]=sum;
}
}

//----------------

functions.h:

C++:
ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

int** newmatrix(const int n);

int** Transposition(int** matrix,const int n);

void cleanmem(int** array, const int n);

void cleanmem2(int* array, const int n);

int* newvector(const int n);

void Fillvec(int* vector,const int n);

void Calculations (int** transmax, int* vector, int* results, const int n);

#endif // FUNCTIONS_H_INCLUDED
 
L

lazybiz

Поправь в Calculations: изначально sum = 0; но крашится не из-за этого, а из-за того что...

vector=(1/i);

...на ноль обычно никто не делит.

P.S.: 0%2==0 <--- истина!
 
A

aaaaaa

Спасибо огромное, не заметил. :lool:

Кстати, если можно, удалите пожалуйста тему. ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!