Ввод симметричной матрицы - 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; //последний элемент диагонали

Объяснение кода листинга программы

В этом коде происходит ввод и обработка данных для задачи на поиск кратчайшего пути во взвешенном графе с помощью алгоритма Дейкстры. Ниже представлен список действий, которые происходят в коде:

  1. Создается двумерный массив matrix размером vNum x vNum для хранения кратчайших расстояний между вершинами графа.
  2. Инициализируются все элементы массива matrix значением бесконечность, кроме главной диагонали, которая инициализируется нулями.
  3. Выводится сообщение Вершины i и j связные?(1- да, 0- нет): и пользователю предлагается ввести число от 0 до 1 для указания, являются ли вершины i и j связными.
  4. Введенное значение сохраняется в переменной k.
  5. Элементы массива matrix[i,j] и matrix[j,i] присваивается значение k.
  6. Цикл завершается.
  7. Последний элемент массива matrix[vNum,vNum] присваивается значение 0. Список переменных и их значений:
  8. i, j - индексы вершин графа
  9. vNum - количество вершин графа
  10. matrix - двумерный массив для хранения кратчайших расстояний между вершинами графа
  11. k - значение, введенное пользователем для указания, являются ли вершины i и j связными

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы