Новые сообщения · Правила  
  • Страница 1 из 1
  • 1
Модератор форума: Berestovskiy  
Форум ПРОГРАММИСТОВ » ПРОГРАММИРОВАНИЕ » Паскаль » Анимация в матрице (Нужно сделать анимацию перемещения элементов)
Анимация в матрице
Предварительно записать в файле квадратичную матрицу A заданного размера NxN. Нужно запустить программу, прочитав матрицу из файла и отрисовав ее на экране. Изменить матрицу требуется по следующему принципу. Переместить строки и столбцы, чтобы поместить самый большой элемент матрицы в левый верхний угол матрицы в поле (1,1). Такое же уравнение следует использовать для подматрицы, полученной из предыдущей, без учета первого столбца и первой строки. Самый большой элемент второй подматрицы должен появиться в поле (2,2). Продолжаем формировать главную диагональ матрицы.
Нужно сделать анимацию перемещения всех элементов строк и столбцов. Я смог сделать анимацию перемещения элементов между строк а вот со столбцами не знаю как и ещё нужно как нибудь по красивее сделать цветовую раскраску. Буду очень благодарен за помощь , заранее спасибо тем кто постарается .Вот код
[code]
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.
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.


5550125555
1 | Автор: Hovo1233 | 2020-10-18, 21:25   |  Репутация: [ + 0 ]
Форум ПРОГРАММИСТОВ » ПРОГРАММИРОВАНИЕ » Паскаль » Анимация в матрице (Нужно сделать анимацию перемещения элементов)
  • Страница 1 из 1
  • 1
Поиск: