Ввод симметричной матрицы - Free Pascal
Формулировка задачи:
Здравствуйте! Есть программа, которая позволяет пользователю вводить матрицу смежности графа, а так же редактировать её. Так же, выполняется поиск компонент связности. Однако, существует одна проблема: матрица смежности должна вводиться сразу
симметричной
. В связи с этим, я хотел бы обратиться за помощью в реализации кода для ввода симметричной матрицы, или советом. Заранее благодарю всех откликнувшихся! Сам код: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.
Решение задачи: «Ввод симметричной матрицы»
textual
Листинг программы
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; //последний элемент диагонали
Объяснение кода листинга программы
В этом коде происходит ввод и обработка данных для задачи на поиск кратчайшего пути во взвешенном графе с помощью алгоритма Дейкстры. Ниже представлен список действий, которые происходят в коде:
- Создается двумерный массив matrix размером vNum x vNum для хранения кратчайших расстояний между вершинами графа.
- Инициализируются все элементы массива matrix значением
бесконечность
, кроме главной диагонали, которая инициализируется нулями. - Выводится сообщение
Вершины i и j связные?(1- да, 0- нет):
и пользователю предлагается ввести число от 0 до 1 для указания, являются ли вершины i и j связными. - Введенное значение сохраняется в переменной k.
- Элементы массива matrix[i,j] и matrix[j,i] присваивается значение k.
- Цикл завершается.
- Последний элемент массива matrix[vNum,vNum] присваивается значение 0. Список переменных и их значений:
- i, j - индексы вершин графа
- vNum - количество вершин графа
- matrix - двумерный массив для хранения кратчайших расстояний между вершинами графа
- k - значение, введенное пользователем для указания, являются ли вершины i и j связными
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д