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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2014, 00:04   #1
Xezon
Mazafaka stenograf
Форумчанин
 
Аватар для Xezon
 
Регистрация: 12.01.2012
Сообщений: 229
По умолчанию Динамическое выделение памяти для массива[C++]

Ребят, для закрепления практики по использованию указателей сделал прогу для перемножения матриц любого порядка с использованием самих указателей для выделения и очистки памяти, все по логике вроде верно, но результат кривоватый получается
Например при перемножении матриц А[2х3] и B[3x3], у которых все ячейки равны 10, результат получается всех ячеек равен 200-м, а не 300. Вот гамнокодъ:
Код:
#include <iostream>
#include <conio.h>

using namespace std;

int main(){
	
	int aN, bN, rN, aM, bM,rM;

	//Указываем диапазон матриц A и B
	cout<<"Enter A matrix size A[N][M]: ";
	cin >> aN >> aM;
	cout<<"Enter B matrix size B[N][M]: ";
	cin >> bN >> bM;
	
	rN = aN; rM = bM;//Диапазон результатирующей матрицы
	
	//Проверяем на правило перемножения матриц
	if(aM < bN || aM > bN){
		while(aM != bN){
			cout<<"\n*Error!!! Mistake in matrix size. Try again!*\n\n";
		    cout<<"Enter A matrix size A[N][M]: ";
	        cin >> aN >> aM;
	        cout<<"Enter B matrix size B[N][M]: ";
	        cin >> bN >> bM;
		}
	
	}
	
	
	//Указываем все матрицы
	int **A_matrix = new int*[aN];//Матрица А
	for(int i(0); i < aN; i++){
    	A_matrix[i] = new int[aM];
        }
        int **B_matrix = new int*[bN];//Матрица В
	for(int i(0); i < bN; i++){
    	B_matrix[i] = new int[bM];
        }
        int **R_matrix = new int*[rN];//Результатирующая матрица
	for(int i(0); i < rN; i++){
    	R_matrix[i] = new int[rM];
        }    
    
	cout<<"\n\nEnter A matrix value: \n";
	//Вводим матрицу А
	for(int i(0); i < aN; i++){
		for(int j(0); j < aM; j++){
			cin>>A_matrix[i][j];
		}
	}
	cout<<"\n\nEnter B matrix value: \n";
	//Вводим матрицу B
	for(int i(0); i < bN; i++){
		for(int j(0); j < bM; j++){
			cin>>B_matrix[i][j];
		}
	}
	cout<<endl;
	
	//обнуляем результатирующую матрицу
	for(int row(0); row < rN; row++){
		for(int col(0); col < rM; col++){
			R_matrix[row][col] = 0;
		}
	}
	
	
	//Выводим матрицу А
	cout<<"\n*A matrix:*\n";
	for(int row(0); row < aN; row++){
		for(int col(0); col < aM; col++){
			cout<<A_matrix[row][col]<<' ';
		}
		cout<<endl;
	}
	//Выводим матрицу В
	cout<<"\nB matrix:*\n";
	for(int row(0); row < bN; row++){
		for(int col(0); col < bM; col++){
			cout<<B_matrix[row][col]<<' ';
		}
		cout<<endl;
	}
	
	//Перемножаем матрицы
	cout<<"\t\t***RESULT***\n\n";
	for(int row(0); row < rN; row++){
		for(int col(0); col < rM; col++){
			for(int inner(0); inner < rN; inner++){
				R_matrix[row][col] += A_matrix[row][inner] * B_matrix[inner][col];
			}
		}
	}
	for(int row(0); row < rN; row++){
		for(int col(0); col < rM; col++){
			cout<<R_matrix[row][col]<<" ";
		}
		cout<<endl;
	}
	
	//Чистим память от всех матриц
	for(int i(0); i < aN; i++){
    	delete [] A_matrix[i];
        }
	for(int i(0); i < bN; i++){
    	delete [] B_matrix[i];
        }
	for(int i(0); i < rN; i++){
    	delete [] R_matrix[i];
        }     
        delete [] A_matrix;
        delete [] B_matrix;
        delete [] R_matrix;
        /*Значения ячеек матриц удалены*/   
	_getch();
	return 0;
}

Последний раз редактировалось Xezon; 12.10.2014 в 00:16.
Xezon вне форума Ответить с цитированием
Старый 12.10.2014, 00:11   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Поверь, в С++ можно делать свои функции, а не пихать 100500 строк говнокода в main().
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.10.2014, 00:14   #3
Xezon
Mazafaka stenograf
Форумчанин
 
Аватар для Xezon
 
Регистрация: 12.01.2012
Сообщений: 229
По умолчанию

min@y™, Я прошу прощения, да я знаю про это, но я еще не дошел до функций(то бишь не изучил еще). =(
Xezon вне форума Ответить с цитированием
Старый 12.10.2014, 00:19   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
не изучил еще
Изучи, пожалуйста, а то километровые полотенца кода трудно читать. А отлаживать - ваще пипец как неудобно.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.10.2014, 03:35   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

Нормальный код. Без развертки циклов нельзя написать вообще. А на ассемблере все эти циклы развертываются goto джампом (jmp / je, jne, ja, jae, jb, jbe и т.п). Ассемблер понимает goto.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 12.10.2014, 05:17   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Программа перемножения матриц любой размерности.

Код:
#include<iostream.h>
#include<math.h>
#include<stdlib>
using namespace std;
typedef unsigned int uint;   // Новое имя целочисленного неотрицательного типа
struct index{uint col, row;};// Структура индексов обрабатываемого массива

//************* Вспомогательные цункции *****************
// Создание динамической матрицы
double **CreateMatrix(index x)
{
  double **A = new double *[x.row];
  for(uint i=0; i<x.row; i++) A[i] = new double[x.col];
  return A;
}
//.......................................................
// Удаление динамической матрицы
  void DeleteMatrix(double **A, index x)
  {
      for(uint i=0; i<x.row; i++) delete[] A[i];
      delete[] A;
  }
//........................................................
// Вывод элементов матрицы на экран
void PrintMatrix(double **A, index x)
{
  for(uint i=0; i<x.row; i++)
  {
    for(uint j=0; j<x.col; j++)
      printf("%g \t",A[i][j]);
    cout << "\n";
  }
}
//----------------------------------------------------------
// Заполнение матрицы из строки.
double **FillingMatrixString(double **A, string s, index x)
{
  string m;
  uint k=0;
  for(uint i=0; i<x.row; i++)
  {
    for(uint j=0; j<x.col; j++)
    {
      m = "";
      while(s[k] == ' ' && k != s.length()) k++;
      while(s[k] != ' ' && k != s.length())
      {
        m += s[k++];
      }
      A[i][j] = atof(m.c_str());
    }
  }
  return A;
}
//*******************************

// Умножение матриц M*N и N*L
double **MatrixMulti(double **A, double **B, index a, index b, index &z)
{
  uint m = a.row;
  uint n = a.col;
  uint l = b.col;
  z.row = m; z.col = l;
  double s;
  double **C = CreateMatrix(z);
  for(uint k=0; k < m; k++)
    for(uint j=0; j < l; j++)
    {
      s = 0;
      for(uint i=0; i < n; i++)
        s = s + A[k][i] * B[i][j];
      C[k][j] = s;
    }
  return C;
}
//........................................................


int main()
{
  index matrix, X, Y;
  matrix.row = 5; matrix.col = 5;
// Создание динамических матриц
  double **A = CreateMatrix(matrix);
  double **B = CreateMatrix(matrix);
//........................................................
  cout << "Умножение матриц M*N и N*L\n";
  X.row = 4; X.col = 5;// Размерность массива А
  Y.row = 5; Y.col = 3;// Размерность массива В
  A = FillingMatrixString(A, "1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2", X);
  B = FillingMatrixString(B, "1 2 3 1 2 3 1 2 3 1 2 3 1 2 3", Y);
  index Z;
  double **R = MatrixMulti(A, B, X, Y, Z);// Создаём выходной массив
  PrintMatrix(R, Z);                      // Обрабатываем его
  DeleteMatrix(R, Z);                     // и уничтожаем
  cout << "\n";

  // Удаление динамической матрицы
  DeleteMatrix(B, matrix);
  DeleteMatrix(A, matrix);

  cout << "\n";
  system("pause");
  return 0;
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 12.10.2014 в 05:20.
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.10.2014, 09:26   #7
Xezon
Mazafaka stenograf
Форумчанин
 
Аватар для Xezon
 
Регистрация: 12.01.2012
Сообщений: 229
По умолчанию

Smitt&Wesson, ого 0_0, пока это для меня тяжеловато, но понимается =) Я все же разобрался, что и где не так. Вот в этом участки кода:
Код:
        //Перемножаем матрицы
	cout<<"\t\t***RESULT***\n\n";
	for(int row(0); row < rN; row++){
		for(int col(0); col < rM; col++){
			for(int inner(0); inner < bN; inner++){
				R_matrix[row][col] += A_matrix[row][inner] * B_matrix[inner][col];
			}
		}
	}
Заместо оператора bN(который указывает на количество строк 2-й матрицы), у меня стояло rN(К которому присваивалось значение количества строк 1-й матрицы), из-за этого матрица просто тупо недомножалась)
Xezon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ ДЛЯ ДВУМЕРНЫХ МАССИВОВ Svetka.beam Общие вопросы C/C++ 1 26.05.2014 20:46
Динамическое выделение памяти! Bantom Помощь студентам 1 07.04.2014 12:48
Динамическое выделение памяти Bantom Помощь студентам 0 02.04.2014 22:35
Динамическое выделение памяти Devdev12 Общие вопросы C/C++ 13 02.08.2013 10:25
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44