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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 22:54   #1
papercut
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 16
По умолчанию Описать функцию Compare

Очень извиняюсь за наглость, но финальная задача, заданая мне преподом, меня вообще вырубила...

Описать функцию Compare(A,B,n), возвразающую 1, если можно преобразовать квадратную матрицу А размером n x n
в матрицу B, отражениями относительно главной и побочной диагонали, и 0 в обратном случае.


Кто чем может подскажите, во вторник уже сдавать, а вообще не в зуб ногой... Код приветствуется. Заранее спасибо.
papercut вне форума
Старый 24.05.2009, 23:06   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
отражениями относительно главной и побочной диагонали
Отражениями чего? Половин матрицы?
Вот есть матрица А:
Код:
1 2 3
4 5 6
7 8 9
Отражением относительно главной диагонали будет такая?
Код:
1 4 7
2 5 8
3 6 9
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 24.05.2009, 23:14   #3
papercut
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 16
По умолчанию

Насколько я понимаю именно половин:

Код:
1 2 3
4 5 6 
7 8 9

Код:
1 4 7
2 5 8
3 6 9

Код:
9 8 7
6 5 4
3 2 1

Последний раз редактировалось papercut; 24.05.2009 в 23:17.
papercut вне форума
Старый 24.05.2009, 23:22   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Тогда можно создать еще 2 дополнительные функции. Первая будет отражать матрицу относительно главной диагонали, а вторая - относительно побочной.
И в функции compare нужно перебрать разные комбинации вызовов этих функций, постоянно сравнивая полученную матрицу с матрицей B. Если вдруг совпало, то возвращаем 1.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 24.05.2009, 23:26   #5
papercut
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 16
По умолчанию

Хотя я в своем изучении С++ пока до функции не дополз все равно спасибо, буду разбираться, если кто-нибудь что-то хочет добавить или помочь буду рад
papercut вне форума
Старый 26.05.2009, 09:09   #6
papercut
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 16
По умолчанию

Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#include <iostream.h>
//---------------------------------------------------------------------------
#pragma argsused
 
// функция отражающая матрицу относительно главной диагонали
void glavOtrazh(int **A, int n)
{
 int tmp;
 for(int i=0; i<n; i++)
  for(int j=i; j<n; j++)
   {
        tmp = A[i][j];
        A[i][j] = A[j][i];
        A[j][i] = tmp;
   }
}
 
 
main () {
int n=2;
 
//создаем и заполняем матрицу В, которая не будет изменятся
int** B = new int*[n];
 
for(int i = 0; i < n; ++i)
  B[i] = new int[n];
 
  for(int i = 0; i < n; ++i)
  for(int j = 0; j < n; ++j){
        cout << "B[" << i + 1 << "][" << j + 1 << "]= ";
         cin >> B[i][j];
        }
 
  for(int i = 0; i < n; ++i){
 
for(int j = 0; j < n; ++j)
  cout << B[i][j] <<" ";
 
        cout << endl;
  }
 
// создаем и заполняем матрицу А
int** A = new int*[n];
 
for(int i = 0; i < n; ++i)
  A[i] = new int[n];
 
  for(int i = 0; i < n; ++i)
  for(int j = 0; j < n; ++j){
        cout << "A[" << i + 1 << "][" << j + 1 << "]= ";
         cin >> A[i][j];
        }
 
  for(int i = 0; i < n; ++i){
 
for(int j = 0; j < n; ++j)
  cout << A[i][j] <<" ";
 
        cout << endl;
  }
 
//отражаем матрицу А относительно главной диагонали
glavOtrazh(A,n);

Подскажите, как теперь описать требуемую функцию Compare, котарая сравнит полученную матрицу А с В ?

Пожалуйста, мне через 3 часа уже сдавать....
papercut вне форума
Старый 26.05.2009, 12:38   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Не знаю, все ли здесь комбинации учитываются, но раз вы сами не хотите думать, то я уж тем более за вас это делать не буду.

Код:
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;

// функция отражения относительно главной диагонали
void glavOtrazh(int **matr, int n)
{
 int tmp;
 for(int i=0; i<n; i++)
  for(int j=i; j<n; j++)
   {
    tmp = matr[i][j];
    matr[i][j] = matr[j][i];
    matr[j][i] = tmp;
   }
}

// относительно побочной
void pobochOtrazh(int **matr, int N)
{
 int tmp;
 for(int i=0; i<N; i++)
  for(int j=0; j<N-i; j++)
   {
    tmp = matr[i][j];
    matr[i][j] = matr[N-j-1][N-i-1];
    matr[N-j-1][N-i-1] = tmp;
   }
}

// копирование матрицы
void copyMatr(int **A, int **source, int n)
{
 for(int i=0; i<n; i++)
  for(int j=0; j<n; j++)
   A[i][j] = source[i][j];
}
//-----------------

// сравнивает две матрицы
bool CompareIt(int **A, int **B, int n)
{
int i,j;
for(i=0; i<n; i++)
 for(j=0; j<n; j++)
  if(A[i][j]!=B[i][j]) return false;
return true;
}

// очищает память под матрицу
void freeTmp(int **tmp, int n)
{
 for(int i=0; i<n; i++)
  delete[] tmp[i];
 delete[] tmp;
}

// выводит матрицу
void printMatr(int **A, int n)
{
for(int i=0; i<n; i++)
 {
  for(int j=0; j<n; j++)
   {
    cout.width(4);
    cout<<A[i][j];
   }
   cout<<endl;
 }
cout<<"-----\n";
}

// та самая функция
int compareMatr(int **A, int **B, int n)
{
int i,j;
int **tmp = new int*[n];
for(i=0; i<n; i++)
 {
  tmp[i] = new int[n];
  for(j=0; j<n; j++)
   tmp[i][j] = A[i][j];
 }
// сохранили исходную матрицу

//-----------
// смотрим разные комбинации и сверяем
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }

copyMatr(A,tmp,n);

pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
freeTmp(tmp,n);
return 0;
}

// функция для теста (заполняет матрицы)
void test(int **A, int **B, int n)
{
 int k=1,l=9;
 for(int i=0; i<n; i++)
  for(int j=0; j<n; j++)
   {
    A[i][j] = k++;
    B[i][j] = l--;
   }
}

int main ()
{
 int n=3,i,j;
 int **A,**B;
 A = new int*[n];
 for(i=0;i<n;i++)
  {
   A[i] = new int[n];
 /*  for(j=0; j<n; j++)
    {
     cout<<"A["<<i<<"]["<<j<<"]: ";
     cin>>A[i][j];
    }*/
  //  cout<<endl;
  }
  cout<<endl;
//pobochOtrazh(A,n);
//cout<<"\nMatrix B:\n";
B = new int*[n];
for(i=0; i<n; i++)
 {
  B[i] = new int[n];
/*  for(j=0; j<n; j++)
   {
    cout<<"B["<<i<<"]["<<j<<"]: ";
    cin>>B[i][j];
   }*/
 }
//--------------------
test(A,B,n);
cout<<"-----------------\n\n";
cout<<"Matrix A:\n";
for(i=0; i<n; i++)
 {
  for(j=0; j<n; j++)
  {
   cout.width(4);
   cout<<A[i][j];
  }
  cout<<endl;
 }
cout<<"\n\nMatrix B:\n";
for(i=0; i<n; i++)
 {
  for(j=0; j<n; j++)
  {
   cout.width(4);
   cout<<B[i][j];
  }
  cout<<endl;
 }
//---------------
cout<<"\n";
if(compareMatr(A,B,n)==1) cout<<"YES\n";
else cout<<"NO\n";


for(i=0; i<n; i++)
 {
  delete[] A[i];
  delete[] B[i];
 }
delete[] A;
delete[] B;
getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 26.05.2009, 18:54   #8
papercut
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Не знаю, все ли здесь комбинации учитываются, но раз вы сами не хотите думать, то я уж тем более за вас это делать не буду.

Код:
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;

// функция отражения относительно главной диагонали
void glavOtrazh(int **matr, int n)
{
 int tmp;
 for(int i=0; i<n; i++)
  for(int j=i; j<n; j++)
   {
    tmp = matr[i][j];
    matr[i][j] = matr[j][i];
    matr[j][i] = tmp;
   }
}

// относительно побочной
void pobochOtrazh(int **matr, int N)
{
 int tmp;
 for(int i=0; i<N; i++)
  for(int j=0; j<N-i; j++)
   {
    tmp = matr[i][j];
    matr[i][j] = matr[N-j-1][N-i-1];
    matr[N-j-1][N-i-1] = tmp;
   }
}

// копирование матрицы
void copyMatr(int **A, int **source, int n)
{
 for(int i=0; i<n; i++)
  for(int j=0; j<n; j++)
   A[i][j] = source[i][j];
}
//-----------------

// сравнивает две матрицы
bool CompareIt(int **A, int **B, int n)
{
int i,j;
for(i=0; i<n; i++)
 for(j=0; j<n; j++)
  if(A[i][j]!=B[i][j]) return false;
return true;
}

// очищает память под матрицу
void freeTmp(int **tmp, int n)
{
 for(int i=0; i<n; i++)
  delete[] tmp[i];
 delete[] tmp;
}

// выводит матрицу
void printMatr(int **A, int n)
{
for(int i=0; i<n; i++)
 {
  for(int j=0; j<n; j++)
   {
    cout.width(4);
    cout<<A[i][j];
   }
   cout<<endl;
 }
cout<<"-----\n";
}

// та самая функция
int compareMatr(int **A, int **B, int n)
{
int i,j;
int **tmp = new int*[n];
for(i=0; i<n; i++)
 {
  tmp[i] = new int[n];
  for(j=0; j<n; j++)
   tmp[i][j] = A[i][j];
 }
// сохранили исходную матрицу

//-----------
// смотрим разные комбинации и сверяем
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }

copyMatr(A,tmp,n);

pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
glavOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
pobochOtrazh(A,n);
if(CompareIt(A,B,n)) { freeTmp(tmp,n); return 1; }
freeTmp(tmp,n);
return 0;
}

// функция для теста (заполняет матрицы)
void test(int **A, int **B, int n)
{
 int k=1,l=9;
 for(int i=0; i<n; i++)
  for(int j=0; j<n; j++)
   {
    A[i][j] = k++;
    B[i][j] = l--;
   }
}

int main ()
{
 int n=3,i,j;
 int **A,**B;
 A = new int*[n];
 for(i=0;i<n;i++)
  {
   A[i] = new int[n];
 /*  for(j=0; j<n; j++)
    {
     cout<<"A["<<i<<"]["<<j<<"]: ";
     cin>>A[i][j];
    }*/
  //  cout<<endl;
  }
  cout<<endl;
//pobochOtrazh(A,n);
//cout<<"\nMatrix B:\n";
B = new int*[n];
for(i=0; i<n; i++)
 {
  B[i] = new int[n];
/*  for(j=0; j<n; j++)
   {
    cout<<"B["<<i<<"]["<<j<<"]: ";
    cin>>B[i][j];
   }*/
 }
//--------------------
test(A,B,n);
cout<<"-----------------\n\n";
cout<<"Matrix A:\n";
for(i=0; i<n; i++)
 {
  for(j=0; j<n; j++)
  {
   cout.width(4);
   cout<<A[i][j];
  }
  cout<<endl;
 }
cout<<"\n\nMatrix B:\n";
for(i=0; i<n; i++)
 {
  for(j=0; j<n; j++)
  {
   cout.width(4);
   cout<<B[i][j];
  }
  cout<<endl;
 }
//---------------
cout<<"\n";
if(compareMatr(A,B,n)==1) cout<<"YES\n";
else cout<<"NO\n";


for(i=0; i<n; i++)
 {
  delete[] A[i];
  delete[] B[i];
 }
delete[] A;
delete[] B;
getch();
return 0;
}
Вы меня извините ради бога, я просто не успел отписаться прежде чем пошел задачки защищать, я уже написал эту с помощью того что вы мне посоветовали + сам подумал)), все правильно получилось!

ОГРОМНОЕ СПАСИБО за помощь!!!))
papercut вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описать функцию Repl(A,B) Babun Общие вопросы C/C++ 6 24.05.2009 21:31
Как правильно описать функцию? аукшщ Общие вопросы C/C++ 2 19.01.2009 11:37
[Pascal] Описать функцию IntFileSize Катуха Помощь студентам 2 24.12.2008 17:20
Описать рекурсивную функцию Palindrom(S) логического типа Master-Sergey Помощь студентам 1 15.12.2008 19:03
Помогите описать функцию pahaig Помощь студентам 2 09.04.2007 22:28