Задача: Нахождение композиции матриц

  • Автор темы Rivass
  • Дата начала
R

Rivass

Гость
#1
Задача:
Вводятся две квадратные матрицы одинакового размера, найти их композицию.
Примечание. Композиция находится следующим способом:
- Сравнивается первый элемент первой строки первой матрицы с первым элементом первого столбца второй матрицы,выбирается наименьший, дальше второй со вторым и так далее, из всех наименьших одной строки и столбца выбирается наибольший элемент (ВНИМАНИЕ! одна строка первой матрицы сравнивается со всеми столбцами второй матрицы), он и будет первым элементом новой матрицы. Цикл таким образом должен создать новую матрицу, такого же размера.

Мой код находит элементы, но не выводит их, не могу додуматься как... Кто сможет разобраться пожалуйста подскажите...
C++:
#include<stdio.h>
int main()
{
int n,m;
scanf_s("%d%d",&n,&m); 
int a[50][50];
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
scanf_s("%d",&a[i][j]); //ввод первой матрицы

int b[50][50];
for (int f=0; f<n; f++)
for (int g=0; g<m; g++)
scanf_s("%d",&a[f][g]); //ввод второй матрицы

int c[50][50];

int i=0,j=0,k=0,g,z;
for(g=0;j<n && k<n;i=0,g=0,j++,k++)
{
for(;i<n && g<n;i++,g++)
{
do{
if(a[i][j]>=b[k][g]) // Сначала сравнивается первый элемент с первым
z=b[k][g];
else
z=a[i][g];}
while(i==0);
if(a[i][j]>=b[k][g] && b[k][g]<=z) // Находим наименьший и сравниваем с предыдущим наименьшим
z=a[i][j];
if(a[i][j]<=b[k][g] && a[i][j]<=z) 
z=b[k][g];
c[i][j]=z;
}

for (int i=0; i<n; i++)
for (int j=0; j<m; j++) // Вывод матрицы, но неправельный походу...
printf_s("%d",c[i][j]);
}
}
Попытался изобразить алгоритм схематично на бумаге)
12112010114.jpg
 

hosm

* so what *
18.05.2009
2 442
9
#2
проверьте расстановку }
мне кажется, что предпоследнюю надо вынести до цикла вывода - до 2х последних for
 
R

Rivass

Гость
#3
OKEN
Попробовал, никаких изменений, после ввода программа ничего не делает))
 

acorn

PHP Developer
29.08.2004
585
3
#4
Функции тебе в помощь.. алгоритм слишком запутанный получается с кучей циклов. Вот схематично:

PHP:
//получаем максимальный минимальных
function getElement(first, second)
begin
ans=0;
for i:=1 to N do
for j:=1 to N do
begin
z:=min(a[i][first], b[second][j]);
if z > ans then ans = z;
end;
return ans;
end;

//получаем итоговый элемент
for i:=1 to N do
for j:=1 to N do
c[i][j] = getElement(i,j)
попробуй реализовать, будут проблемы - помогу.
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#5
Вот, более или менее постарался расписать:

C++:
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>
#include <time.h>

using namespace std;

//Функция вывода массива на экран
void PrintArray(int** Arr, int Size)
{
for (int i=0; i<Size; i++)
{
for (int j=0; j<Size; j++)
cout<<Arr[i][j]<<" ";
cout<<endl;
}
}

//Главная функция
void main(void)
{
setlocale(LC_ALL,"Russian");
srand(time(NULL));

int **Arr1, **Arr2, **Arr3; //Наши массивы
int Size;
cout<<"Введите размерность массивов : ";
cin>>Size;
//Выделим память под массивы строки массивов
Arr1 = new int*[Size];
Arr2 = new int*[Size];
Arr3 = new int*[Size];
//Заполним массив 1 и 2 случайными величинами
for (int i=0; i<Size; i++)
{
Arr1[i] = new int[Size]; //Выделим память под столбцы массивов
Arr2[i] = new int[Size];
Arr3[i] = new int[Size];
for (int j=0; j<Size;j++) 
{
Arr1[i][j] = rand()%100;
Arr2[i][j] = rand()%100;
}
}

//Показать заполнение массивов:
cout<<"Массив 1 :"<<endl;
PrintArray(Arr1,Size);
cout<<endl<<"Массив 2 :"<<endl;
PrintArray(Arr2,Size);	
cout<<endl;

//Построим композицию:
for (int i = 0; i<Size; i++) //Перебор строк композиции + перебор строк первой матрицы
{
for (int k = 0; k<Size; k++) //Перебор столбцов композиции + перебор столбцов 2ой матрицы
{
int Max = std::numeric_limits<int>::min(); //Максимальный элемент из сварниваемых
for (int l=0; l<Size; l++) //Перебор Столбцов первой матрицы текущей строки + Перебор строк второй матрицы текущего столбца
{
int Value =0; //Текущий минимальный элемент сравнения
if (Arr1[i][l] > Arr2[l][k]) 
Value = Arr2[l][k];
else Value = Arr1[i][l];
if (Max < Value) //Если текущий максимум меньше, то перезапишим его
Max = Value;
}
Arr3[i][k] = Max; //Определим значение композиции [i]-строку[k]-столбец
}
}

cout<<"Композиция (Массив 3) :"<<endl;
PrintArray(Arr3,Size);

}
 
R

Rivass

Гость
#6
Acorn
Большое спасибо, в принципе понятно но мозг не варит, у вас написано на паскале как я понял....

DarkKnight125
Супер!!! Спасибо большое!!! Работает на ура)) Очень понятный код)
 
R

Rivass

Гость
#7
Но вот появилась еще одна проблема, я никогда не пользовался cin и cout...
Не могу разобраться как переделать код так, чтобы первые две матрицы пользователь вводил с клавиатуры....
DarkKnight125
Буду Вам втройне блогодарен, если чуточку подкорректируете код так, чтобы матрицы заполнялись не рандомно, а пользователем.... ;)
C++:
	for (int i=0; i<Size; i++)
{
Arr1[i] = new int[Size]; 
Arr2[i] = new int[Size];
Arr3[i] = new int[Size];
for (int j=0; j<Size;j++) 
{
cin>>Arr1[i][j]; //Ввод пользователем обеих матриц
cin>>Arr2[i][j];
}
}
Логически подумал что так будет правильно, но программа работает неправильно после моего редактирования...
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#8
Вот так...
C++:
//Первая
for (int i=0; i<Size; i++)
{
Arr1[i] = new int[Size]; //Выделим память под столбцы массивов
Arr2[i] = new int[Size];
Arr3[i] = new int[Size];
for (int j=0; j<Size;j++) 
{
cin>>Arr1[i][j];
}
}
//Вторая
for (int i=0; i<Size; i++)
{
for (int j=0; j<Size;j++) 
{
cin>>Arr2[i][j];
}
}
Но все же если тебе удобнее С-методом вводить то никто не запретит сделать так :) :
C++:
	//Первая
for (int i=0; i<Size; i++)
{
Arr1[i] = new int[Size]; //Выделим память под столбцы массивов
Arr2[i] = new int[Size];
Arr3[i] = new int[Size];
for (int j=0; j<Size;j++) 
{
scanf("%d",&Arr1[i][j]);
}
}
//Вторая
for (int i=0; i<Size; i++)
{
for (int j=0; j<Size;j++) 
{
scanf("%d",&Arr2[i][j]);
}
}
 
R

Rivass

Гость
#9
DarkKnight125
Ну ты супер гений)))) Огромное спасибо! Буду стремиться сам разбираться со всем)
Кстати методом С++ гораздо удобнее как я заметил, все кто умеет программировать ими и пользуются, нужно тоже научиться)
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#10
Кстати методом С++ гораздо удобнее как я заметил, все кто умеет программировать ими и пользуются, нужно тоже научиться)
Не всегда ;-) В каждом методы есть свои плюсы и свои минусы ;-)) При форматированном вводе например, метод C - просто незаменим :)
 

acorn

PHP Developer
29.08.2004
585
3
#11
Большое спасибо, в принципе понятно но мозг не варит, у вас написано на паскале как я понял....
Не, этот язык называется "набросок"

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

Rivass

Гость
#12
Acorn
Я понимаю Ваше недовольство, просто для меня эта задача значительно сложнее чем обычно, поэтому моих знаний никак не хватило бы на её решение... Теперь я намного больше разобрался и в дальнейшем думаю смогу разобраться) Не обижайтесь))
 
R

Rivass

Гость
#13
Появился, надеюсь последний вопрос.... А возможно ли сделать так, чтобы программа искала композицию матриц не целочисленного типа, а типа float например или double? :whoareyou?:
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#14
Конечно можно ;-))) Меняешь типы массивов, переменных которые используются для поиска мин. и макс. значений...
Вообщем во всех местах что бы тип-в-тип был и не было случайных конфликтов(типо округлений)
вот привел все замены кода

C++:
  //Выделим память под массивы строки массивов
Arr1 = new double*[Size];
Arr2 = new double*[Size];
Arr3 = new double*[Size];
//Заполним массив 1 и 2 случайными величинами
for (int i=0; i<Size; i++)
{
Arr1[i] = new double[Size]; //Выделим память под столбцы массивов
Arr2[i] = new double[Size];
Arr3[i] = new double[Size];
for (int j=0; j<Size;j++)
C++:
				double Max = std::numeric_limits<int>::double(); //Максимальный элемент из сварниваемых
for (int l=0; l<Size; l++) //Перебор Столбцов первой матрицы текущей строки + Перебор строк второй матрицы текущего столбца
{
double Value =0.0; //Текущий минимальный элемент сравнения