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

Тема в разделе "C/C++/C#", создана пользователем Rivass, 12 ноя 2010.

  1. Rivass

    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
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    проверьте расстановку }
    мне кажется, что предпоследнюю надо вынести до цикла вывода - до 2х последних for
     
  3. Rivass

    Rivass Гость

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

    acorn PHP Developer

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот, более или менее постарался расписать:

    Код (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);

    }
     
  6. Rivass

    Rivass Гость

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

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот так...
    Код (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]);
    }
    }
     
  9. Rivass

    Rivass Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Не всегда ;-) В каждом методы есть свои плюсы и свои минусы ;-)) При форматированном вводе например, метод C - просто незаменим :)
     
  11. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    Не, этот язык называется "набросок"

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

    Rivass Гость

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

    Rivass Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

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

    Код (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; //Текущий минимальный элемент сравнения
     
  15. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    хм, а я не понимаю где тут моё недовольство :whoareyou?:
     
Загрузка...

Поделиться этой страницей