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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2019, 20:56   #1
Evgeny_L
Пользователь
 
Регистрация: 27.10.2018
Сообщений: 31
По умолчанию [C++] Исправить ошибки в коде

Код:
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <iomanip>

using namespace std;

//алгебраическое дополнение к элементу a[row][col] генерация их
double add(double** a, unsigned row, unsigned col, unsigned N, unsigned M)
{
	double b[4][4]; //если матрица очень большая изменить параметры 
	unsigned i, j, bi, bj;

	for (i = 0, bi = 0; i<N; i++)
	{
		if (i != row)
		{
			for (j = 0, bj = 0; j<M; j++)
				if (j != col)
				{
					b[bi][bj] = a[i][j];
					bj++;
				}
			bi++;
		}
	}

	if ((row + col) % 2)
		return b[0][1] * b[1][0] - b[0][0] * b[1][1];
	else
		return b[0][0] * b[1][1] - b[0][1] * b[1][0];
}
//определитель матрицы
double det(double **a, unsigned N, unsigned M)
{
	int i;
	double sum;
	for (i = 0, sum = 0.; i<N; i++)
		sum += a[i][0] * add(a, i, 0, N, M);
	if (sum < 0)
		cout << "ERROR DETERMINANT NOL'";
	return sum;}
//обратная матрица
void inverse(double **a, double d, unsigned N, unsigned M)
{double **a1 = new double*[N];
for (int i = 0; i<N; ++i) {a1[i] = new double[M];}
	double cur;
	unsigned i, j;
	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++)
			a1[i][j] = add(a, i, j, N, M) / d;
	for (i = 0; i < N; i++)
		for (j = i + 1; j < M; j++)
		{	cur = a1[i][j];
			a1[i][j] = a1[j][i];
			a1[j][i] = cur;}
	if (d < 0)
		cout << "Error \n";
	else {cout << "\nobratnya matrix :\n";
		for (i = 0; i <N; i++){
			for (j = 0; j < M; j++)
				cout << setw(7) << a1[i][j];
			cout << "\n";}}}
void Gauss(double **X, double **A[N][N + 1], unsigned N, unsigned M) // cвободные члены 
{
	double **a1 = new double*[N];
	int temp, r; // рабочий массив свободных членов 
	int i, j, k; // рабочие переменные 
	double ** B = new double*[N]; 

				 // копирование в рабочую матрицу A 
	for (i = 0; i < N; i++)
	{
		B[i] = A[i][N]; // копирование свободных членов 
		X[i] = 0;
	}

	// прямой ход 
	for (i = 0; i < N; i++)
	{
		if (A[i][i] != 0)
		{
			// вычитаем строку из последующих 
			for (k = (i + 1); k < N; k++)
			{
				r = A[k][i] / A[i][i];
				for (j = i; j < N; j++) A[k][j] -= A[i][j] * r;
				B[k] -= B[i] * r;
			}
		}
		else
		{
			// ищем не нулевой элемент для строки 
			for (j = (i + 1); j < N; j++)
			{
				if (A[j][i] != 0) break;
			}
			// если не найден то решений нет 

			if (j == N)
			{
				cout<<"reshenia net\n";
				exit(1);
			}


			else // если найден то меняем строки местами 
			{
				// матрица 
				for (k = i; k < N; k++)
				{
					temp = A[i][k];
					A[i][k] = A[j][k];
					A[j][k] = temp;
				}
				// правая часть 
				temp = B[i];
				B[i] = B[j];
				B[j] = temp;
				// понижаем i на единицу чтобы цикл повторил проверки и попал в вычитание строки из последующих 
				i--;
			}
		}
	}

	// обратный ход 
	for (i = N; i >= 0; i--)
	{
		int s = 0;
		for (j = (i + 1); j < N; j++) s += A[i][j] * X[j];
		X[i] = (B[i] - s) / A[i][i];
	}
	// вывод треугольной матрицы 
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < M; j++)
	cout << A[i][j] << " "<<"\n"; 
		cout<< B[i]<<" "<<"\n";
	}
}
//основная функция 
int main()
{
	unsigned N = 0, M = 0; //размерность матрицы
	double determinant; // объявление детерминанта(опеределителя)
	unsigned i, j;
	unsigned b; //свободные коэф
	cout << "n "; cin >> N;
	cout << "m "; cin >> M;
	double ** arr = new double*[N];
	for (i = 0; i < N; i++) {
		arr[i] = new double[M];
		for (j = 0; j < M; j++)
			arr[i][j] = rand() % 10 - 5;
	} //задаем рандом в диапазоне от +10 до -5
	cout << "matrix A:\n";
	for (i = 0; i<N; i++)
	{
		for (j = 0; j<M; j++)
			cout << setw(7) << setprecision(2) << arr[i][j]; //setprecision - сокращение до двух знаков после запятой //setw(7) расстояние между знаками 
		cout << "\n";
	}
	cout << "TRANSPONIROVANNYA MATRIX: \n"; //транспонированная матрица
	double **ar = new double *[N];
	for (i = 0; i < N; i++)
	{
		ar[i] = new double[M];
		for (j = 0; j < M; j++) {
			ar[i][j] = arr[j][i];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cout << setw(7)<< ar[i][j] << " ";
		}
		cout << endl;
	}

	determinant = det(arr, N, M); //передача из функции в главную программу 
	cout << "\ndeterminant: " << determinant << "\n"; //вывод детерминанта 
	if (determinant) inverse(arr, determinant, N, M); //в другом случае
	else cout << "obrantoy matrici net";
	getchar();
	system("pause");
	for (i = 0; i<N; i++)
		delete[] arr[i];
	delete[] ar[i];
	delete[] arr;
	return 0;
}
Изображения
Тип файла: jpg Снимок.jpg (98.3 Кб, 121 просмотров)
Evgeny_L вне форума Ответить с цитированием
Старый 21.02.2019, 08:29   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от Evgeny_L Посмотреть сообщение
double **A[N][N + 1]
- так двухмерный массив не передается. Вот так он передается:
Код:
double **A
Цитата:
Сообщение от Evgeny_L Посмотреть сообщение
B[i] = A[i][N]; //копирование свободных членов
- тут нужно вот так:
Код:
B[i] = A[i];
А что делает функция Gauss()?

Цитата:
Сообщение от Evgeny_L Посмотреть сообщение
temp = A[i][k];
- несколько раз также замечено преобразование double в int, что не есть хорошо. Код слишком корявый, проще новый написать.

Последний раз редактировалось Вадим Мошев; 21.02.2019 в 13:39.
Cuprum5 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Исправить ошибки в коде artilun Общие вопросы C/C++ 3 03.11.2016 10:39
Помогите исправить ошибки в коде lomik222 Общие вопросы C/C++ 5 11.03.2016 09:51
Помогите пожалуйста исправить ошибки в коде Nata Golden rose Общие вопросы C/C++ 6 18.05.2014 23:28
Ошибки в коде. Необходимо исправить. Vladzis Общие вопросы C/C++ 6 06.05.2014 17:28
Треугольная последовательность. Помочь исправить ошибки в коде (C) lmbe Помощь студентам 0 27.12.2013 03:17