Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
LamyFromSafari
0 / 0 / 1
Регистрация: 07.04.2017
Сообщений: 8
1

Массив: Нужна помощь в реализации кода для ввода симметричной матрицы.

06.02.2018, 15:02. Просмотров 838. Ответов 5
Метки нет (Все метки)

Здравствуйте! Есть программа, которая позволяет пользователю вводить матрицу смежности графа, а так же редактировать её. Так же, выполняется поиск компонент связности. Однако, существует одна проблема: матрица смежности должна вводиться сразу симметричной . В связи с этим, я хотел бы обратиться за помощью в реализации кода для ввода симметричной матрицы, или советом.

Заранее благодарю всех откликнувшихся!


Сам код:

Pascal
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
program lab5;
 
uses crt;
 
const max = 50;
 
type iArray = array [1..max, 1..max] of Byte;
     bArray = array [1..max] of boolean;
     ccArray = array [1..max] of integer;
 
var
    matrix: iArray;
    checked: bArray;
    cc: ccArray;
    {Число вершин и компонент связности}
    vNum, ccNum: integer;
    vk: char;
 
{Процедура поиска в глубину} 
procedure DFS (v: integer);
var i: integer;
begin
     checked[v]:= true;
     cc[v]:= ccNum;
     for i:= 1 to vNum do
     begin
         if (not checked[i]) and (matrix[v,i] = 1) then
         begin
              DFS(i);
         end;
     end;
end;
 
{Процедура поиска компонент связности}
procedure CCSearch;
var v, count, temp: integer;
begin
     for v:= 1 to vNum do
     begin
         if not checked[v] then
         begin
              inc(ccNum);
              DFS(v);
         end;
     end;
     writeln('Общее число компонент связности: ', ccNum);
     writeln;
     writeln('Вершины распределены следующим образом: ');
     if ccNum > 0 then
     begin
          count:= 0;
          temp:= 0;
          for v:= 1 to vNum do
              if cc[v] = temp then write(v, ' ')
              else
              begin
                   temp:= cc[v];
                   inc(count);
                   writeln;
                   write('Компонент ', count, ' содержит: ', v, ' ');
              end;
     end;
     writeln;
     writeln;
end;
 
{Процедура вывода матрицы}
procedure MatrixOutput;
var i, j: integer;
begin
        writeln('Матрица смежности матрицы:');
        writeln;
    for i:= 1 to vNum do
        begin
            for j:= 1 to vNum do
                write(matrix[i,j]:2, ' ');
            writeln;
        end;
        writeln;
        CCSearch;
end;
 
{Создание матрицы, ввод}
procedure CreateMatrix;
var i, j: integer;
    k: byte;
begin
 
        for i:= 1 to vNum do
            checked[i]:= false;
    write('Введите число вершин: ');
    Reset(Input);
        while not SeekEoln do
        begin
 
            read(vNum);
    end;
        writeln;
        writeln('Ввод значений связности');
    for i:= 1 to vNum do
        begin
        for j:= 1 to vNum do
        begin
 
        write('Вершины ',i,' и ',j,' связные?(1- да, 0- нет): ');
 
                read(k);
        matrix[i,j]:= k;
        end;
                writeln;
        end;
end;
 
{Режим редактирования: добавление, удаление}
procedure Edit;
var i, j: integer;
begin
     writeln('Режим редактирования(удалить/добавить)!');
     write('Введите строку матрицы: ');
     read(i);
     write('Введите столбец матрицы: ');
     read(j);
     if matrix[i,j] = 0 then matrix[i,j]:= 1
     else matrix[i,j]:= 0;
     MatrixOutput;
     for i:= 1 to vNum do
         checked[i]:= false;
end;
 
 
 
 
 
procedure Menu;
begin
    ClrScr;
 
    writeln;
        writeln('Меню:');
        writeln;
    writeln;
    writeln('1.Создать матрицу смежности неориентированного графа');
    writeln('2.Редактировать матрицу смежности');
    writeln('ESC.Выход');
    writeln;
        if vNum> 0 then MatrixOutput;
        ccNum:= 0;
    repeat
                vk := ReadKey;
                case vk of
                          '1': begin
                                    CreateMatrix;
 
                                    Menu;
 
                                    Exit;
 
                               end;
                          '2': begin
                                    Edit;
                                    Menu;
                                    Exit;
                               end;
                end;
          until vk = #27;
end;
 
Begin
    Menu;
End.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2018, 15:02
Ответы с готовыми решениями:

Нужна помощь с выводом матрицы...
Нужно из двух массивов по 5 элементов сформировать матрицу ( 5 столбцов и 2...

нужна помощь в составлении программы(матрицы)
Даны матрицы: A(N,K), B(K,N). для каждой матрицы найти сумму положительных и ...

Задача на двумерный массив. Очень нужна ваша помощь.
Дан двумерный массив. Определить: а) сумму чётных элементов массива; б)...

Нужна адаптация кода для TMT Pascal
нужно переделать код из турбо паскаля в тмт паскаль. есть какой то общий...

ПОМОГИТЕ БЛОК-СХЕМУ ввода в массив и вывода на экран матрицы 8*16
БЛОК-СХЕМУ ввода в массив и вывода на экран матрицы 8*16 :wall:

5
Cyborg Drone
Модератор
5296 / 3174 / 2442
Регистрация: 17.08.2012
Сообщений: 10,189
06.02.2018, 15:38 2
Лучший ответ Сообщение было отмечено LamyFromSafari как решение

Решение

Pascal
100
101
102
103
104
105
106
107
108
109
110
    for i:= 1 to vNum do
        begin
        for j:= i to vNum do //от i, а не от 1
        begin 
        write('Вершины ',i,' и ',j,' связные?(1- да, 0- нет): ');
                read(k);
        matrix[i,j]:= k; //выше или на главной диагонали
        if i<>j then matrix[j,i]:= k; //ниже главной диагонали
        end;
                writeln;
        end;
Если граф не имеет петель, ввод главной диагонали можно убрать:
Pascal
100
101
102
103
104
105
106
107
108
109
110
111
112
    for i:= 1 to vNum - 1 do
        begin
        matrix[i,i]:= 0; //на диагонали
        for j:= i+1 to vNum do //от i+1
        begin 
        write('Вершины ',i,' и ',j,' связные?(1- да, 0- нет): '); 
                read(k);
        matrix[i,j]:= k; //выше главной диагонали
        matrix[j,i]:= k; //ниже главной диагонали
        end;
                writeln;
        end;
        matrix[vNum,vNum]:= 0; //последний элемент диагонали
1
LamyFromSafari
0 / 0 / 1
Регистрация: 07.04.2017
Сообщений: 8
09.02.2018, 17:05  [ТС] 3
Cyborg Drone, спасибо вам огромное за ответ! Я хотел бы попросить вас о помощи еще раз, не сочтите за наглость, конечно: в некоторых случаях, как на скриншоте, вершины, содержащиеся в компонентах связности отображаются неправильно (однако, в общем, программа отображает вершины в компонентах корректно). Пожалуйста, если вас не затруднит, не могли бы вы мне сказать, с чем это может быть связано, может, имеется ошибка в коде?
0
Миниатюры
Массив: Нужна помощь в реализации кода для ввода симметричной матрицы.  
Cyborg Drone
Модератор
5296 / 3174 / 2442
Регистрация: 17.08.2012
Сообщений: 10,189
09.02.2018, 22:39 4
На скриншоте вершина 2 изолированная. Граф не связный. Так и должно быть?
0
LamyFromSafari
0 / 0 / 1
Регистрация: 07.04.2017
Сообщений: 8
10.02.2018, 07:07  [ТС] 5
Да, вершина 2 изолирована и образует отдельную компоненту связности. А еще в данном графе есть еще один компонент(компонент 1), который содержит вершины 1 и 3. Однако, программа отображает вершины 1 и 3 как отдельные компоненты связности, хотя должны быть 2: 1 и 3 + 2 в отдельности.
0
LamyFromSafari
0 / 0 / 1
Регистрация: 07.04.2017
Сообщений: 8
12.02.2018, 14:15  [ТС] 6
Быть может, нужно создать еще один массив, только со всеми вершинами? Я попробовал реализовать вывод вершин в компонентах, но, честно говоря, у меня возник небольшой ступор.

Pascal
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
{Процедура поиска компонент связности}
procedure CCSearch;
var v: integer;
begin
     ccNum := 0;
     writeln('Вершины распределены следующим образом: ');
 
     for v:= 1 to vNum do
 
     begin
         if not checked[v] then
         begin
              inc(ccNum);
              DFS(v);
              write('Компонент ', ccNum, ' содержит: ', );
              writeln;
         end;
     end;
     writeln;
     writeln('Общее число компонент связности: ', ccNum);
     writeln;
 
    
 
     writeln;
     writeln;
end;
0
12.02.2018, 14:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2018, 14:15

Нужна помощь в построении симметричной матрицы 9x9...
Необходимо создать квадратную матрицу целых чисел размером 9х9. По условию...

Помощь в реализации кода
Есть код, помогите реализовать его в приложение windows forms. using System;...

Нужна помощь с текстом кода в Access (для выборки и обновления таблицы)
Добрый день! Нужна Ваша помощь. Подскажите, пожайлуста, что в моем коде...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru