Заблокирован
1

Определить симметричность матрицы испльзуя указатели

23.05.2014, 23:31. Показов 1801. Ответов 23
Метки нет (Все метки)

Задание, определить симметричность матрицы с помощью указателей.
Не могу никак разобраться с указателями, но что-то написала (просьба не смеяться )
Меня интересует как обратится к элементам матрицы что бы сравнить их.
p.s. Программа не работает, все время пишет что матрица симметрична.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <conio.h>
 
using namespace std;
int main()
{
 
 setlocale(LC_ALL, "");     
 int m[4][4]; 
 int *p=&m[0][0];;
 for (int i=0; i<4; i++)
     {  
          for (int j=0; j<4; j++)
              {
                   cout <<i <<""<<j<< ": ";
                   cin >> m[i][j] ;                         
              }
     }
 cout << "Ââîä îêîí÷åí"<< endl;
cout << "Ìàòðèöà èìååò âèä: " << endl;
 for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
           { cout << m[i][j] << "\t";
            }
            cout << endl;
    }    
 if (p[1]!=p[4] & p[2]!=p[8] & p[3]!=p[12] & p[6]!=p[9] & p[7]!=p[13] & p[11]!=p[14])
 cout << "Íå ñèììåòðè÷íà";  
    else cout<< "Ñèììåòðè÷íà";
    
 _getch();
 return 0;   
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2014, 23:31
Ответы с готовыми решениями:

Определить симметричность матрицы относительно главной диагонали
Дан массив размером n x n. Необходимо выяснить, является ли этот массив симметричным, относительно...

Определить симметричность каждой матрицы относительно главной диагонали
Написать и отладить программы с применением подпрограммы процедуры с параметрами. Даны две целые...

Определить симметричность квадратной матрицы относительно побочной диагонали
Может кто помочь , сделать прогу, на языке низкого уровня ? Заранее спасибо

Симметричность матрицы
Дана квадратная матрица А(N, N).Составьте программу, определяющую, является ли данная матрица...

23
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
23.05.2014, 23:53 2
только что проверял, вводил цифры от 0 до 9 и обратно, пишет не симметрична
0
Заблокирован
23.05.2014, 23:54  [ТС] 3
Q1, да, перепутала. Пишет что не симметрична в любом случае.
0
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
23.05.2014, 23:56 4
заполните матрицу так, чтоб элемент 0,1 был равен элементу 1,0, 0,2 = 2,0 и так далее, мне пишет симметрична, всё Вы правильно разобрались)
0
Заблокирован
23.05.2014, 23:57  [ТС] 5
Q1, она почему-то по разному пишет. Теперь с единицами симметрична, а дальше ввожу разные числа и опять - симметрична.
0
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
24.05.2014, 00:15 6
вроде бы после замены 28 сроки на
C++
1
if (*(p+1)!=*(p+4) || *(p+2)!=*(p+8) || *(p+3)!=*(p+12) || *(p+6)!=*(p+9) || *(p+7)!=*(p+13) || *(p+11)!=*(p+14) )
всё работает верно
1
Заблокирован
24.05.2014, 00:18  [ТС] 7
Q1, спасибо огромадное!!!! Думала у меня совсем все плохо.
0
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
24.05.2014, 00:19 8
т.е. у Вас ошибка была даже не в указателях, а в цикле if, который выдавал что матрица несимметрична только тогда, когда выполнялись все условия оператора, но матрица несимметрична даже если одно из неравенст не выполняется
0
Заблокирован
24.05.2014, 00:39  [ТС] 9
Q1, да, когда Вы мне написали, только тогда увидела ошибку.

Добавлено через 4 минуты
Q1, а вот если саму проверку написать функцией в отдельном файле, нужно там написать только 28-30 строку?
Просто таким образом опять ничего не работает.
0
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
24.05.2014, 01:12 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int proverka(int *mas){
    if ( *(mas+1)!=*(mas+4) || *(mas+2)!=*(mas+8) || *(mas+3)!=*(mas+12) || *(mas+6)!=*(mas+9) || *(mas+7)!=*(mas+13) || *(mas+11)!=*(mas+14) )
        cout << "Не симметрична";
    else cout<< "Симметрична";
    return 0;
}
 
 
using namespace std;
int main()
{
 
 setlocale(LC_ALL, "");
 int m[4][4];
 int *p=&m[0][0];
 for (int i=0; i<4; i++)
     {
          for (int j=0; j<4; j++)
              {
                   cout <<i <<""<<j<< ": ";
                   cin >> m[i][j] ;
              }
     }
 cout << "Ввод окончен"<< endl;
cout << "Матрица имеет вид: " << endl;
 for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
           { cout << m[i][j] << "\t";
            }
            cout << endl;
    }
    proverka(p);
 getchar();
 return 0;
}
0
Заблокирован
24.05.2014, 01:27  [ТС] 11
Q1, имею ввиду если эту функцию в другой файл записать.

Добавлено через 1 минуту
Это записана функция в другом файле
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <conio.h>
 
using namespace std;
 int m[4][4]; 
 int *p=&m[0][0];
bool sym=true;
void proverka()
{
 setlocale(LC_ALL, ""); 
 
    if (*(p+1)!=*(p+4) || *(p+2)!=*(p+8) || *(p+3)!=*(p+12) || *(p+6)!=*(p+9) || *(p+7)!=*(p+13) || *(p+11)!=*(p+14) )
     sym=false;
             if (sym) cout <<"симметрична";
             else cout <<"не симметрична";
}
А это уже вызов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <conio.h>
#include "111.cpp"
using namespace std;
 
 
int main()
{
 setlocale(LC_ALL, "");     
 
    bool sym=true;
     int m[4][4]; 
  int *p=&m[0][0];
 for (int i=0; i<4; i++)
     {  
          for (int j=0; j<4; j++)
              {
                   cout <<i <<""<<j<< ": ";
                   cin >> m[i][j] ;                         
              }
     }
 cout << "Ввод окончен"<< endl;
cout << "Матрица имеет вид: " << endl;
 for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
           { cout << m[i][j] << "\t";
            }
            cout << endl;}
proverka(); 
 _getch();
 return 0;   
}
Добавлено через 3 минуты
Q1, вот понять не могу это в скобках параметр указан? (6 строчка)
Просто если разбить Ваш код, то все работает.
0
Q1
2 / 2 / 3
Регистрация: 07.06.2013
Сообщений: 14
24.05.2014, 01:54 12
Да, это параметр, если можете, покажите, что получилось
0
Заблокирован
24.05.2014, 05:57  [ТС] 13
Q1, вот сама функция в файле:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <conio.h>
 
using namespace std;
int proverka(int *mas){
    if ( *(mas+1)!=*(mas+4) || *(mas+2)!=*(mas+8) || *(mas+3)!=*(mas+12) || *(mas+6)!=*(mas+9) || *(mas+7)!=*(mas+13) || *(mas+11)!=*(mas+14) )
        cout << "Не симметрична";
    else cout<< "Симметрична";
    return 0;
}
А это сама программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <conio.h>
#include "111.cpp"
using namespace std;
 
 
int main()
{
 setlocale(LC_ALL, "");     
 
     int m[4][4]; 
  int *p=&m[0][0];
 for (int i=0; i<4; i++)
     {  
          for (int j=0; j<4; j++)
              {
                   cout <<i <<""<<j<< ": ";
                   cin >> m[i][j] ;                         
              }
     }
 cout << "Ввод окончен"<< endl;
cout << "Матрица имеет вид: " << endl;
 for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
           { cout << m[i][j] << "\t";
            }
            cout << endl;}
proverka(p); 
 _getch();
 return 0;   
}
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.05.2014, 06:09 14
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
int *p=&m[0][0];
У тебя вроде только одна матрица. Зечем тебе указатель на матрицу? И что за дикая размерность [0][0]?

Добавлено через 7 минут
Цитата Сообщение от Q1 Посмотреть сообщение
Да, это параметр, если можете, покажите, что получилось
Ничего подобного. Это размерность.
0
Заблокирован
24.05.2014, 09:31  [ТС] 15
taras atavin, в таком случае, лучше объяснить почему "дикая" размерность, что именно не так. Тема была создана для того чтобы помочь исправить ошибки и неправильное понимание о указателях, а не для констатации факта в неправильности.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
У тебя вроде только одна матрица. Зечем тебе указатель на матрицу?
Да, одна. Указатель нужен для написания проверки симметричности матрицы. В этом и суть задания.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.05.2014, 09:42 16
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
taras atavin, в таком случае, лучше объяснить почему "дикая" размерность, что именно не так.
Потому что массив массивов, не содержащий ни одного массива-элемента, каждый из которых не содержит ни одного элемента.
0
Заблокирован
24.05.2014, 09:49  [ТС] 17
taras atavin, как запутано. Как тогда нужно его указать?
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.05.2014, 10:06 18
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
Указатель нужен для написания проверки симметричности матрицы. В этом и суть задания.
Во-первых указатель на единичное данное не нужен. А во-вторых если ты с помощью указателя адресуешь всю матрицу, но к элементам её обращаешься по индексам, то это всё равно не использование указателя для проверки матрицы. Указатель в этом случае используется в части программы, реализующей алгоритм, одной из операций которого является проверка матрицы. В вызывающей части программы, если соблюсти декомпозицию. Но не непосредственно для проверки. Чтоб использовать указатель для проверки массива, будь то матрица, вектор, тензор третьего порядка..., надо указывать на элементы и перебирать указатель в цикле.
0
Заблокирован
24.05.2014, 10:12  [ТС] 19
taras atavin, но в программе же вроде не индекс написан. От указателя смещение на n-ое кол-во элементов, смотря какие элементы использовать. А на счет цикла я пыталась сделать, но там никакой закономерности нет.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.05.2014, 10:14 20
Симметрична матрица, совпадающая со своей транспонированной версией. В индексной арифметике это
C++
1
2
3
4
5
6
7
8
9
10
for (flag=true, i=0; i<n; ++i)
{
 for (j=0; j<n; ++j)
 {
  if (a[i][j]!=a[j][i])
  {
   flag=false;
  }
 }
}
.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2014, 10:14
Помогаю со студенческими работами здесь

Симметричность матрицы
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include...

Указатели: определить количество столбцов символьной матрицы, не содержащих ни одной буквы 'Q'
Сформировать массив типа char размером в 5х10х7 элементов. Проинициализировать его случайными...

Проверка матрицы на симметричность
Помогите с лабой. Двумерный динамический массив нужно заполнить случайными числами и вывести...

проверка на симметричность матрицы
uses crt; const n=10; var a: array of integer; i,j,s,s1:integer; procedure zapoln; begin...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru