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

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

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

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

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

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

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

Rivass

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

Мой код находит элементы, но не выводит их, не могу додуматься как... Кто сможет разобраться пожалуйста подскажите...
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
 
H

hosm

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

Rivass

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

acorn

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

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)
попробуй реализовать, будут проблемы - помогу.
 
D

DarkKnight

Вот, более или менее постарался расписать:

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

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

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

Rivass

Но вот появилась еще одна проблема, я никогда не пользовался 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];
}
}
Логически подумал что так будет правильно, но программа работает неправильно после моего редактирования...
 
D

DarkKnight

Вот так...
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

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

DarkKnight

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

acorn

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

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

Rivass

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

Rivass

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

DarkKnight

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

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; //Текущий минимальный элемент сравнения
 
Мы в соцсетях:

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