Предварительно записать в файле квадратичную матрицу 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
|
|
|