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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2020, 16:35   #1
SerobGrigoryan
Пользователь
 
Регистрация: 09.10.2020
Сообщений: 16
По умолчанию сложная задача ,анимация изменении матрицы.

Предварительно записать в файле квадратичную матрицу A заданного размера NxN. Нужно запустить программу, прочитав матрицу из файла и отрисовав ее на экране. Изменить матрицу требуется по следующему принципу. Переместить строки и столбцы, чтобы поместить самый большой элемент матрицы в левый верхний угол матрицы в поле (1,1). Такое же уравнение следует использовать для подматрицы, полученной из предыдущей, без учета первого столбца и первой строки. Самый большой элемент второй подматрицы должен появиться в поле (2,2). Продолжаем формировать главную диагональ матрицы. Нужно сделать анимацию перемещения каждых двух элементов между собой (то есть между элементами матрицы должно быть достаточно пространства ,чтобы элементы перемещать по ним использовать, gotoxy и задержку delay).Будет очень классно , если будет цветовое сопровождение и в конце главную диагональ другим цветом .
Код нужен на языке Паскаль.Буду очень благодарен за помощь , если можете то и решение на языке c++ и c тоже сойдёт.
SerobGrigoryan вне форума Ответить с цитированием
Старый 09.10.2020, 17:16   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

С такой постановкой вопроса вам в раздел Фриланс. В этом разделе помогают с конкретными вопросами по имеющимся наработкам, а не пишут с нуля.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.10.2020, 09:34   #3
SerobGrigoryan
Пользователь
 
Регистрация: 09.10.2020
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
С такой постановкой вопроса вам в раздел Фриланс. В этом разделе помогают с конкретными вопросами по имеющимся наработкам, а не пишут с нуля.
Вот она , я практически решил задачу только вот не знаю как анимацию сделать , возможно для анимации понадобится совсем другое решение.
Код:
program Zadanie224project1;
 
uses
  CRT;
const
  size = 20;
  namefile = 'integermatr.dat';
type
  TMatr = array [1..size,1..size] of integer;
  TFileArray = record
    n: integer; { размерность матрицы}
    A: TMatr; { матрица}
  end;
 
 
procedure OutToConsoleMatr(Arr: TFileArray; s1,s2,s3,s4,s5,s6: integer );
{Процедура выводит матрицу, отображая с помощью цвета элемент с наибольшим значением, строку и столбец
в которой находится элемент с наибольшим значением, поле поиска }
var
  i,j: integer;
begin
  for i:= 1 to Arr.n do
      begin
        for j:= 1 to Arr.n do
          begin
 
            if (i = s1) and (j = s2) then
              textcolor(12) {Выделение цветом элемента с наибольшим значением}
            else
              if (i = s4) and (j = s5) then
                textcolor(13){Выделение цветом элемента в главной диагонали, на который будет заменен наибольший элемент}
              else
                textcolor(7);
 
            if ((i >= s6) and (j >= s6)) and ((i = s1) or (j = s2)) then
              textbackGround(1)  {Выделение цветом фона столбца и строки с наибольшим элементом}
            else
              if (i >= s3) and (j >= s3) then
                textbackGround(2) {Выделение цветом фона поле поиска}
              else
                textbackGround(0);
            write(Arr.a[i,j]:5);    { Вывод двумерного массива в консоль.}
          end;
        Writeln;
      end;
    textbackGround(0); { цвет фона под текстом}
    textcolor(7);  { цвет символов текста}
    delay(4000); { задержка демонстрации на экране}
    clrscr; { очистка экрана}
end;
 
 
 
 
var
  f: file of TFileArray; { Файловая переменная для типизированного файла}
  FileArray: TFileArray; { Переменная для хранения значения записи}
  d: integer; { Вспомогательная переменная для выбора ввода информации }
  i,j,h: integer; { Переменные для организации циклов}
  MaxValueElement: integer; { Переменная для хранения значения максимального элемента}
  ind1,ind2: integer; { Переменные для хранения значений индексов максимального элемента}
  temp: integer; { Вспомогательная переменная для организации обмена значениями }
begin
  h:= 1;
  assign(f,namefile);
  writeln('Вы хотите ввести новую информацию в файл или использовать старую?');
  writeln('Введите 1, если хотите ввести новую информацию');
  writeln('Введите 2, если хотите использовать старую информацию');
  Readln(d);
  if d = 2 then
    begin
      reset(f);
      read(f,FileArray);   {Чтение информации из файла}
      close(f);
    end
  else
    if d = 1 then
       begin
         rewrite(f);
         write('Введите значение размерности матрицы (не более ',size,'): ');
         repeat
           Readln(FileArray.n);
           if (FileArray.n < 1) or (FileArray.n > size) then
             writeln('Ошибка ввода! Повторите попытку.')
           else
             break;
         until false;
 
         for i:= 1 to FileArray.n do
           for j:= 1 to FileArray.n do
             begin
               write('Введите значение элемента [',i,',',j,']: ');
               Readln(FileArray.a[i,j]);     { Ввод значений в двумерный массив.}
             end;
        write(f,FileArray); {Информация записывается в файл}
        close(f);
       end;
  clrscr;
  reset(f);
  read(f,FileArray);   { Чтение информации из файла}
  writeln('Исходный массив, хранящийся в файле "',namefile,'": ');
  OutToConsoleMatr(FileArray,0,0,FileArray.n+1,0,0,h);
 
  for h:= 1 to FileArray.n-1 do
    begin
      writeln('Определение области поиска: ');
      OutToConsoleMatr(FileArray,0,0,h,0,0,h);
 
      MaxValueElement:= FileArray.a[h,h];  {ограничение поиска максимального элемента индексом цикла}
      ind1:= h;
      ind2:= h;
      for i:= h to FileArray.n do
        for j:= h to FileArray.n do
          if FileArray.a[i,j] > MaxValueElement then
            begin
              MaxValueElement:= FileArray.a[i,j];
              ind1:= i;   {Нахождение индекса строк максимального элемента}
              ind2:= j;   {Нахождение индекса столбцов максимального элемента}
            end;
      writeln('Нахождение максимального элемента: ');
      OutToConsoleMatr(FileArray,ind1,ind2,h,h,h,h);
 
      for i:= h to FileArray.n do
        begin
          temp:= FileArray.a[h,i];   { Обмен значениями элементов между строкой с максимальным элементом и строкой, которая задана циклом }
          FileArray.a[h,i]:= FileArray.a[ind1,i];
          FileArray.a[ind1,i]:= temp;
        end;
      writeln('Перемещение строки с максимальным элементом: ');
      OutToConsoleMatr(FileArray,h,ind2,h,ind1,h,h);
 
      for j:= h to FileArray.n do
        begin
          temp:= FileArray.a[j,h];  { Обмен значениями элементов между столбцом с максимальным элементом и столбцом, который задана циклом }
          FileArray.a[j,h]:= FileArray.a[j,ind2];
          FileArray.a[j,ind2]:= temp;
        end;
      writeln('Перемещение столбца с максимальным элементом: ');
      OutToConsoleMatr(FileArray,h,h,h,ind1,ind2,h);
    end;
  textcolor(7);
  writeln('Измененная матрица: ');
   for i:= 1 to FileArray.n do
     begin
       for j:= 1 to FileArray.n do
         begin
           if j = i then  {Условие, от которого зависит какие элементы массива будут выделены цветом}
             textcolor(12)
           else
             textcolor(7);
           write(FileArray.a[i,j]:5)
         end;
       writeln;
     end;
  textbackGround(0); {Установка черного цвета фона}
  textcolor(7); {Установка серого цвета символов текста}
  readln;
end.

Последний раз редактировалось BDA; 10.10.2020 в 21:02.
SerobGrigoryan вне форума Ответить с цитированием
Старый 10.10.2020, 09:55   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от SerobGrigoryan Посмотреть сообщение
только вот не знаю как анимацию сделать
)
В Вашей задаче анимация - самая трудоёмкая часть решения..
Black Fregat вне форума Ответить с цитированием
Старый 10.10.2020, 11:08   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

что есть аннимация? ( в постановке задания )
судя по указанию (gotoxy delay)
gotoxy -- частичная перерисовка экрана (только строки/столбцы/элементы) участвующие в "текущем" обмене (требующем отображения).
delay -- почти наверняка такой обмен будет очень частым.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.10.2020, 19:34   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Добавил анимацию обмена строк. По аналогии можно сделать обмен столбцов. И нужно подумать над раскрашиванием, так как сейчас предполагается анимация серого текста на черном фоне (теряется синий и зеленый цвета). Ну и так не получится анимировать матрицы, которые не влезли в экран. Сейчас добавлены пустые строки и столбцы, чтобы было место для анимации.
Код:
program Zadanie224project1;

uses
  CRT;

const
  size = 20;
  namefile = 'integermatr.dat';
  CW = 5;

type
  TMatr = array [1..size, 1..size] of integer;
  TFileArray = record
    n: integer; { размерность матрицы }
    A: TMatr; { матрица }
  end;

procedure OutToConsoleMatr(Arr: TFileArray; s1, s2, s3, s4, s5, s6: integer);
{ Процедура выводит матрицу, отображая с помощью цвета элемент с наибольшим значением, строку и столбец
в которой находится элемент с наибольшим значением, поле поиска }
var
  i, j: integer;
begin
  for i := 1 to Arr.n do
  begin
    Writeln;
    for j := 1 to Arr.n do
    begin
      if (i = s1) and (j = s2) then
        textcolor(12) { Выделение цветом элемента с наибольшим значением }
      else
      if (i = s4) and (j = s5) then
        textcolor(13) { Выделение цветом элемента в главной диагонали, на который будет заменен наибольший элемент }
      else
        textcolor(7);
      
      if ((i >= s6) and (j >= s6)) and ((i = s1) or (j = s2)) then
        textbackGround(1) { Выделение цветом фона столбца и строки с наибольшим элементом }
      else
      if (i >= s3) and (j >= s3) then
        textbackGround(2) { Выделение цветом фона поле поиска }
      else
        textbackGround(0);
      write(' ':CW, Arr.a[i, j]:CW); { Вывод двумерного массива в консоль }
    end;
    Writeln;
  end;
  textbackGround(0); { цвет фона под текстом }
  textcolor(7); { цвет символов текста }
  delay(1000); { задержка демонстрации на экране }
end;

procedure AnimateRowElems(Arr: TFileArray; ci1, ci2, cj: integer);
var
  i, x_offset, y_offset: integer;
begin
  textbackGround(0);
  textcolor(7);
  x_offset := 2 * CW * (cj - 1) + CW + 1;
  gotoxy(x_offset, 2 * ci1 + 1);
  write(' ':CW);
  gotoxy(x_offset, 2 * ci2 + 1);
  write(' ':CW);
  y_offset := 2 * ci1 + 1 + 2 * ci2 + 1;
  for i := 2 * ci1 + 1 to 2 * ci2 + 1 do
  begin
    gotoxy(x_offset - CW, i);
    write(Arr.a[ci1, cj]:CW);
    gotoxy(x_offset + CW, y_offset - i);
    write(Arr.a[ci2, cj]:CW);
    delay(300);
    gotoxy(x_offset - CW, i);
    write(' ':CW);
    gotoxy(x_offset + CW, y_offset - i);
    write(' ':CW);
  end;
  gotoxy(x_offset, 2 * ci1 + 1);
  write(Arr.a[ci2, cj]:CW);
  gotoxy(x_offset, 2 * ci2 + 1);
  write(Arr.a[ci1, cj]:CW);
  delay(300);
end;

var
  f: file of TFileArray; { Файловая переменная для типизированного файла }
  FileArray: TFileArray; { Переменная для хранения значения записи}
  d: integer; { Вспомогательная переменная для выбора ввода информации }
  i, j, h: integer; { Переменные для организации циклов }
  MaxValueElement: integer; { Переменная для хранения значения максимального элемента }
  ind1, ind2: integer; { Переменные для хранения значений индексов максимального элемента }
  temp: integer;{ Вспомогательная переменная для организации обмена значениями }

begin
  clrscr;
  h := 1;
  assign(f, namefile);
  writeln('Вы хотите ввести новую информацию в файл или использовать старую?');
  writeln('Введите 1, если хотите ввести новую информацию');
  writeln('Введите 2, если хотите использовать старую информацию');
  Readln(d);
  if d = 2 then
  begin
    reset(f);
    read(f, FileArray); { Чтение информации из файла }
    close(f);
  end
  else
  if d = 1 then
  begin
    rewrite(f);
    write('Введите значение размерности матрицы (не более ', size, '): ');
    repeat
      Readln(FileArray.n);
      if (FileArray.n < 1) or (FileArray.n > size) then
        writeln('Ошибка ввода! Повторите попытку.')
      else
        break;
    until false;
    for i := 1 to FileArray.n do
      for j := 1 to FileArray.n do
      begin
        write('Введите значение элемента [', i, ',', j, ']: ');
        Readln(FileArray.a[i, j]); { Ввод значений в двумерный массив }
      end;
    write(f, FileArray); { Информация записывается в файл }
    close(f);
  end;
  clrscr;
  writeln('Исходный массив, хранящийся в файле "', namefile, '":');
  OutToConsoleMatr(FileArray, 0, 0, FileArray.n + 1, 0, 0, h);
  clrscr;

  for h := 1 to FileArray.n - 1 do
  begin
    writeln('Определение области поиска:');
    OutToConsoleMatr(FileArray, 0, 0, h, 0, 0, h);
    clrscr;

    MaxValueElement := FileArray.a[h, h]; { ограничение поиска максимального элемента индексом цикла }
    ind1 := h;
    ind2 := h;
    for i := h to FileArray.n do
      for j := h to FileArray.n do
        if FileArray.a[i, j] > MaxValueElement then
        begin
          MaxValueElement := FileArray.a[i, j];
          ind1 := i; { Нахождение индекса строк максимального элемента }
          ind2 := j; { Нахождение индекса столбцов максимального элемента }
        end;
    writeln('Нахождение максимального элемента:');
    OutToConsoleMatr(FileArray, ind1, ind2, h, h, h, h);

    for i := h to FileArray.n do
    begin
      AnimateRowElems(FileArray, h, ind1, i);
      { Обмен значениями элементов между строкой с максимальным элементом и строкой, которая задана циклом }
      temp := FileArray.a[h, i];
      FileArray.a[h, i] := FileArray.a[ind1, i];
      FileArray.a[ind1, i] := temp;
    end;
    clrscr;
    writeln('Перемещение строки с максимальным элементом:');
    OutToConsoleMatr(FileArray, h, ind2, h, ind1, h, h);
    clrscr;

    for j := h to FileArray.n do
    begin
    { Обмен значениями элементов между столбцом с максимальным элементом и столбцом, который задан циклом }
      temp := FileArray.a[j, h];
      FileArray.a[j, h] := FileArray.a[j, ind2];
      FileArray.a[j, ind2] := temp;
    end;
    writeln('Перемещение столбца с максимальным элементом:');
    OutToConsoleMatr(FileArray, h, h, h, ind1, ind2, h);
    clrscr;
  end;
  textcolor(7);
  writeln('Измененная матрица:');
  for i := 1 to FileArray.n do
  begin
    writeln;
    for j := 1 to FileArray.n do
    begin
      { Условие, от которого зависит какие элементы массива будут выделены цветом }
      if j = i then
        textcolor(12)
      else
        textcolor(7);
      write(' ':CW, FileArray.a[i, j]:CW);
    end;
    writeln;
  end;
  textbackGround(0); { Установка черного цвета фона }
  textcolor(7); { Установка серого цвета символов текста }
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.10.2020 в 19:36.
BDA вне форума Ответить с цитированием
Старый 18.10.2020, 18:06   #7
SerobGrigoryan
Пользователь
 
Регистрация: 09.10.2020
Сообщений: 16
По умолчанию

BDA, только вот мне это никогда не решить так как я не понимаю этого , буду чрезмерно благодарен если и спродолжением поможете
SerobGrigoryan вне форума Ответить с цитированием
Старый 19.10.2020, 00:47   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Добавил анимацию обмена столбцов. Но раскраску все еще нужно чинить. Еще есть проблема, что анимация сейчас вызывается даже тогда, когда фактически столбец или строка не меняются ни с кем местами (уже на нужном месте) - перед циклом обмена нужно это проверять. Если вы написали весь остальной код, то это будет нетрудно поправить.
Вложения
Тип файла: txt code.txt (8.0 Кб, 10 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.10.2020, 07:42   #9
SerobGrigoryan
Пользователь
 
Регистрация: 09.10.2020
Сообщений: 16
По умолчанию спс

Цитата:
Сообщение от BDA Посмотреть сообщение
Добавил анимацию обмена столбцов. Но раскраску все еще нужно чинить. Еще есть проблема, что анимация сейчас вызывается даже тогда, когда фактически столбец или строка не меняются ни с кем местами (уже на нужном месте) - перед циклом обмена нужно это проверять. Если вы написали весь остальной код, то это будет нетрудно поправить.
Большое спасибо вам
SerobGrigoryan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Код сложная задача.. Slavatron1984 Microsoft Office Excel 4 01.09.2013 21:41
Сложная задача! Pashok6 Паскаль, Turbo Pascal, PascalABC.NET 10 02.01.2012 00:03
Сложная задача(( альбертоо Паскаль, Turbo Pascal, PascalABC.NET 1 07.12.2011 16:57
Сложная задача asale Microsoft Office Excel 6 07.04.2009 20:36