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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2010, 20:16   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Вычисление определителя

Добрый вечер.Необходимо вычислить определитель матрицы на c++, вот что написала
Код:
/*
				программа вычисление определителя матрицы
*/

#include "stdafx.h"
#include "iostream"
#include "windows.h"

using namespace System;

/*=============================================================================================================
													описание данных
==============================================================================================================*/
	const int n=4;	//размерность массива
	int mtx[n][n];	//матрица
	int i,j;
	int det_res;	//определитель

void printMtx(int matrix[n][n])	//процедура печати матрицы (матрица)
{
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}

void get_matr(int matrix[n][n],int * temp_matrix[n][n],int kolvo,int i,int j)	//процедура вычеркивания строки и столбца
{
	int ki,kj,di,dj;
	di=0;
	for (ki=0;ki<kolvo-1;ki++)
	{
		if (ki==i) di=1;
		dj=0;
		for (kj=0;kj<kolvo-1;kj++)
		{
			if (kj==j) dj=1;
			temp_matrix[ki][kj]=matrix[ki+di][kj+dj];
		}
	}
}

int det(int matrix[n][n], int count)	//функция вычисления определителя(матрица,размерность)
{
	int temp=0;	//временная переменная для хранения определителя
	int k=1;	//степень
	int temp_mtx[n][n];	//временная матрица
/*=============================================================================================================
													вычисление определителей
==============================================================================================================*/
	if(count<1)
		std::cout<<"not run";
	else if (count==1)
		temp=matrix[0][0];
	else if (count==2)
		temp=matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1];
	else
	{
		for(i=0;i<count;i++)
		{
			get_matr(matrix,temp_mtx,count,i,0);
			temp=temp+k*matrix[i][0]*det(temp_mtx,n-1);
			k=-k;
		}
	}
	return temp;
}

void main()
{	
/*=============================================================================================================
													инициализация элементов матрицы
==============================================================================================================*/
	srand(17);
	for (i=0;i<n;i++)
		for(j=0;j<n;j++)
			mtx[i][j]=(int)(rand()%20);

	printMtx(mtx);
	
/*=============================================================================================================
													вычисление определителя
==============================================================================================================*/
	det_res=det(mtx,n);
	std::cout<<det_res;
	getchar();
}
Но выдает следующие ошибки:
1.Error 1 error C2440: '=' : cannot convert from 'int' to 'int *' d:\My work\C++\det_4x4\det_4x4\det_4x4.cp p 40 det_4x4
2.Error 2 error C2664: 'get_matr' : cannot convert parameter 2 from 'int [4][4]' to 'int *[][4]' d:\My work\C++\det_4x4\det_4x4\det_4x4.cp p 63 det_4x4

Что нужно исправить?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.03.2010, 20:53   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

давай поразмыслим
вот так совсем неправильно делать
Код:
void get_matr(int matrix[n][n],
используй указатель на матрицу, а то так происходит лишнее копирование элементов матрицы

если тебе будет полезно, посмотри пример работы с матрицей при помощи указателей



Код:
int **pmat; int *pv; int *pvn, *max;  // объявление указателей на массивы
	int R; // размерность матрицы и векторов
	cout<<"Vvedite razmernost' matricy: "<<endl; // предлагаем ввести пользователю размерность
	cin>>R; // присваиваем переменной R размерность
	pmat = new int *[R];  // создаём массив указателей
	max = new int[R];   //указатель на массив элементов
	for (int i = 0; i < R; i++)
	{
		*(max + i) = 0; //обнуляем массив, нужен для нахождения максимального элемента строки матрицы
	}
	for (int i = 0; i < R; i++)
	{
		*(pmat + i) = new int[R]; //создаём матрицу указателей
	}
	pv = new int[R]; pvn = new int[R];  //вектор, указанный пользователем, и получившийся в результате умножения новый вектор
	randomize(); //чтобы числа в функции random не повторялись
	for (int i = 0; i < R; i++)  // цикл по строкам
	{
		for (int j = 0; j < R; j++) //цикл по столбцам
		{
			*(*(pmat + i) + j) = random(9); //не предлагаем ввести пользователю элементы матрицы, а заполняем случайными числами 0..9
			if (*(*(pmat + i) + j) > *(max + i))
			{
				*(max + i) = *(*(pmat + i) + j); //находим максимальный элемент строки матрицы
			}
		}
		*(pv + i) = random(9);
		*(pvn + i) = *(pv + i) * *(max + i);
		cout<<*(pvn + i)<<" ";
	}
	delete[] pmat, pv, pvn, max; //удаляем объекты
	return 0;

*(max + i) - можно заменить на max[i]
*(*(pmat + i) + j) - можно заменить на pmat[i, j]
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 06.03.2010, 20:58   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

а можно все-таки исправление моего примера, как будет правильно определить передачу по ссылке, проблема с пониманием этого
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.03.2010, 21:30   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от RUSt88 Посмотреть сообщение
давай поразмыслим
вот так совсем неправильно делать
Код:
void get_matr(int matrix[n][n],
Эмм... почему?
В Си нельзя передать массив по значению, всегда передаётся указатель.

2Sparky
Код:
void get_matr(int matrix[n][n],int * temp_matrix[n][n],int kolvo,int i,int j)
звёздочку уберите перед temp_matrix, именно на неё ругается компилятор )
netrino вне форума Ответить с цитированием
Старый 07.03.2010, 08:17   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

мне нужно чтоб второй параметр передавался по ссылке, в паскале нужно писать var, а вот как правильно в с++ для меня вопрос
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.03.2010, 08:32   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

исправила вот так
Код:
/*
				программа вычисление определителя матрицы
*/

#include "stdafx.h"
#include "iostream"
#include "windows.h"

using namespace System;

/*=============================================================================================================
													описание данных
==============================================================================================================*/
	const int n=4;	//размерность массива
	int mtx[n][n];	//матрица
	int i,j;
	int det_res;	//определитель

void printMtx(int matrix[n][n])	//процедура печати матрицы (матрица)
{
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}

void get_matr(int matrix[n][n],int *temp_matrix[n][n],int kolvo,int i,int j)	//процедура вычеркивания строки и столбца
{
	int ki,kj,di,dj;
	di=0;
	for (ki=0;ki<kolvo-1;ki++)
	{
		if (ki==i) di=1;
		dj=0;
		for (kj=0;kj<kolvo-1;kj++)
		{
			if (kj==j) dj=1;
			*temp_matrix[ki][kj]=matrix[ki+di][kj+dj];
		}
	}
}

int det(int matrix[n][n], int count)	//функция вычисления определителя(матрица,размерность)
{
	int temp=0;	//временная переменная для хранения определителя
	int k=1;	//степень
	int temp_mtx[n][n];	//временная матрица
/*=============================================================================================================
													вычисление определителей
==============================================================================================================*/
	if(count<1)
		std::cout<<"not run";
	else if (count==1)
		temp=matrix[0][0];
	else if (count==2)
		temp=matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1];
	else
	{
		for(i=0;i<count;i++)
		{
			get_matr(matrix,&temp_mtx,count,i,0);
			temp=temp+k*matrix[i][0]*det(temp_mtx,n-1);
			k=-k;
		}
	}
	return temp;
}

void main()
{	
/*=============================================================================================================
													инициализация элементов матрицы
==============================================================================================================*/
	srand(17);
	for (i=0;i<n;i++)
		for(j=0;j<n;j++)
			mtx[i][j]=(int)(rand()%20);

	printMtx(mtx);
	
/*=============================================================================================================
													вычисление определителя
==============================================================================================================*/
	det_res=det(mtx,n);
	std::cout<<det_res;
	getchar();
}
Но все равно одна ошибка
Error 1 error C2664: 'get_matr' : cannot convert parameter 2 from 'int (*)[4][4]' to 'int *[][4]' d:\My work\C++\det_4x4\det_4x4\det_4x4.cp p 63 det_4x4

Ребят помогите исправить
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.03.2010, 11:08   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Вам же netrino ясно написал

Цитата:
void get_matr(int matrix[n][n],int * temp_matrix[n][n],int kolvo,int i,int j)
звёздочку уберите перед temp_matrix, именно на неё ругается компилятор )
Код:
void get_matr(int matrix[n][n],int temp_matrix[n][n],int kolvo,int i,int j)
если вы хотите с указателями, то надо было написать так
Код:
void get_matr(int** matrix,int** temp_matrix,int kolvo,int i,int j)
Цитата:
В Си нельзя передать массив по значению, всегда передаётся указатель.
да, но в данном случае язык С++

Последний раз редактировалось NiCola999; 07.03.2010 в 11:11.
NiCola999 вне форума Ответить с цитированием
Старый 07.03.2010, 11:14   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

дак все равно ошибки =(. Посмотрите пожалуйста весь код, нужно ли при вызове процедуры перед параметром ставить &, и ставить *при обращение к этому указателю в теле процедуры
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.03.2010, 12:21   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

держи=) считай, что это мой подарок на 8 марта, немного изменил
работает как по маслу, считает определитель правильно(проверял)
Код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>


/*=============================================================================================================
													описание данных
==============================================================================================================*/
	const int n=4;	//размерность массива
	int mtx[n][n];	//матрица
	int temp_matrix[n][n];
	int i,j;
	int det_res;	//определитель

void printMtx(int matrix[n][n])	//процедура печати матрицы (матрица)
{
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}

void get_matr(int matrix[n][n],int kolvo,int i,int j)	//процедура вычеркивания строки и столбца
{
	int ki,kj,di,dj;
	di=0;
	for (ki=0;ki<kolvo-1;ki++)
	{
		if (ki==i) di=1;
		dj=0;
		for (kj=0;kj<kolvo-1;kj++)
		{
			if (kj==j) dj=1;
			temp_matrix[ki][kj]=matrix[ki+di][kj+dj];
		}
	}
}

int det(int matrix[n][n], int count)	//функция вычисления определителя(матрица,размерность)
{
	int temp=0;	//временная переменная для хранения определителя
	int k=1;	//степень
/*=============================================================================================================
													вычисление определителей
==============================================================================================================*/
	if(count<1){
		std::cout<<"not run";
                return 0;
        }
	else if (count==1)
		temp=matrix[0][0];
	else if (count==2)
		temp=matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1];
	else
	{
		for(i=0;i<count;i++)
		{
			get_matr(matrix,count,i,0);
			
			temp=temp+k*matrix[i][0]*det(temp_matrix,count-1);
			k=-k;
		}
	}
	return temp;
}

void main()
{	
/*=============================================================================================================
													инициализация элементов матрицы
==============================================================================================================*/
	srand(17);
	for (i=0;i<n;i++)
		for(j=0;j<n;j++)
			mtx[i][j]=(int)(rand()%20);

	printMtx(mtx);
	
/*=============================================================================================================
													вычисление определителя
==============================================================================================================*/
	det_res=det(mtx,n);
	std::cout<< "Determinant = " << det_res << std::endl;
	getchar();		
}

Последний раз редактировалось NiCola999; 07.03.2010 в 12:28.
NiCola999 вне форума Ответить с цитированием
Старый 07.03.2010, 12:51   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Спасибо большое, сейчас потестю
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 07.03.2010 в 15:41.
Sparky вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си шарп..) Метод рекурсии. Вычисление определителя матрицы произвольного размера. Sneginka* Помощь студентам 1 03.03.2010 20:14
Вычисление определителя матрицы StudentofSUSU Microsoft Office Excel 2 07.01.2010 21:05
вычисление определителя по схеме Гаусса Ника__ Помощь студентам 1 15.08.2009 16:49
Вычисление определителя матрицы Ирёнок Помощь студентам 6 21.02.2009 01:10
Вычисление определителя n-го порядка gool Паскаль, Turbo Pascal, PascalABC.NET 1 11.12.2008 10:59