Консультация № 191963
02.12.2017, 18:44
0.00 руб.
0 10 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
у меня задача отсортировать массив алгоритмом простого выбора и отразить каждое перемещение элементов графически с помощью graphABC. Массив должен быть изображен в виде диаграммы, элемент - это столбик с высотой пропорциональной значению.
Сортировку сделала по возрастанию, возможности графического модуля изучила, но не могу понять - как собрать эти знания в кучу для выполнения данной задачи. Прошу помощи!
Изучаю Паскаль в ABC.net, работаю под Windows 7...

Обсуждение

давно
Старший Модератор
31795
6196
02.12.2017, 19:56
общий
Адресаты:
Покажите, что у Вас есть, будем допиливать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401172
78
02.12.2017, 21:45
общий
Цитата: Зенченко Константин Николаевич
Покажите, что у Вас есть, будем допиливать.

Вот до чего додумалась:
Код:
uses GRAPHABC;
const
N=5;
type
array1 = array[1..N] of integer;
var
arr: array1;

procedure gist(var arr: array1);
var w: integer;
begin
setwindowsize(600,300);

for i:integer:=1 to n do
begin
write(arr[i]:4);
w:=(windowwidth-20)div n;
Pen.Width := 10;
Pen.Color := clRandom;
line(i*20,100,i*20,100-arr[i]);
end;
write(' ');
end;

procedure sortirovka(var arr: array1);
var
index_max, max: integer;
begin
for i:integer:=n downto 1 do
begin
index_max:=i;
max:=arr[i];
for j:integer:=1 to i-1 do
if arr[j] > max then
begin
index_max:=j;
max:=arr[index_max];
end;
if index_max <> i then
begin
arr[index_max]:=arr[i];
arr[i]:=max;
end;
gist(arr);
end;
end;

begin
Window.Title := 'Сортировка массива';
writeln('Элементы массива: ');
for i:integer:=1 to n do
read(arr[i]);

sortirovka(arr);
writeln;

end.

давно
Посетитель
401172
78
02.12.2017, 21:49
общий
Если выводить программу на выполнение, видно, что картинка печатается на одном и том же месте... по крайней мере, появляются составные разноцветные столбики вместо однотонных.
Как сдвинуть не знаю. Думала привязку к системе координат делать, рассчитала ширину сдвига (w), куда ее прибавлять не понятно.
давно
Старший Модератор
31795
6196
04.12.2017, 13:07
общий
Адресаты:
Простите долго не отвечал.
Все очень даже хорошо у Вас всё написано, мои маленькие изменения увидите.


У Вас есть два варианта решения:
1)чистить окно- недостаток пропадает выводимые данные этапов сортировки(есть в коде //ClearWindow;//);
2)чистить выводимый столбец цветом фона, т.е. белым - предупреждение, если ширина кисти совпадает с шириной выводимого столбика, может появляться ореол, поэтому нужно будет менять ширину кисти на больший;
Добавлена ещё функция задержки, чтобы можно было любоваться работой программы и калибровка выводимых данных-если разница большая, то может быть построен неравномерный график.


[code lang=pascal h=300]uses GRAPHABC;
const
N=5;
type
array1 = array[1..N] of integer;
var
arr: array1;
procedure gist(var arr: array1;arr_max,arr_min:integer);
var w,h: integer;
begin
//ClearWindow;//
w:=windowwidth div 2;
h:=windowheight div 2;
for i:integer:=1 to n do
begin
write(arr[i],' ');
Pen.Width := 15;//
Pen.Color := clWhite;//
line(w+i*20-2,h,w+i*20-2,0);//
Pen.Width := 10;
Pen.Color := clRandom;
line(w+i*20,h,w+i*20,h-round((h div 2)*arr[i]/(arr_max-arr_min)));
end;
writeln;
end;

procedure sortirovka(var arr: array1);
var
index_max, max,imax,imin: integer;
begin
imax:=arr[1];
imin:=arr[1];
for var i:=1 to n do
if imax<arr[i] then imax:=arr[i]
else if imin>arr[i]then imin:=arr[i];
for i:integer:=n downto 1 do
begin
index_max:=i;
max:=arr[i];
for j:integer:=1 to i-1 do
if arr[j] > max then
begin
index_max:=j;
max:=arr[index_max];
end;
if index_max <> i then
begin
arr[index_max]:=arr[i];
arr[i]:=max;
end;
gist(arr,imax,imin);
sleep(2000);
end;
end;
begin
Window.Title := 'Сортировка массива';
setwindowsize(600,300);
writeln('Элементы массива: ');
for i:integer:=1 to n do
read(arr[i]);
sortirovka(arr);
writeln;
end.[/code]

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401172
78
04.12.2017, 14:03
общий
Спасибо за ответ!
Результат работы эффектный , я не подумала, что графику можно не тиражировать в одном окне)))
Я глянула код по быстрому, вроде понятно, но прошу Вас не закрывать пока консультацию, я вечером подробней посмотрю, вдруг вопросы интересные возникнут, а завтра отпишусь в любом случае, возникнут вопросы или нет , можно так?
давно
Старший Модератор
31795
6196
04.12.2017, 14:08
общий
Адресаты:
Состояние: Консультация активна (до закрытия: 3 сут. 04 час. 38 мин.)

Консультация автоматически закроется см. выше, мини-форум, остается активным в любом случае.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401172
78
05.12.2017, 10:18
общий
05.12.2017, 10:27
Вопросов не возникло !
давно
Старший Модератор
31795
6196
05.12.2017, 10:23
общий
это ответ
Здравствуйте, pNod!

У Вас есть два варианта:
1)чистить экран;
2)чистить столбец цветом фона.
Оба они есть в коде:
[code lang=pascal h=300]uses GRAPHABC;
const
N=5;
type
array1 = array[1..N] of integer;
var
arr: array1;
procedure gist(var arr: array1;arr_max,arr_min:integer);
var w,h: integer;
begin
//ClearWindow;//
w:=windowwidth div 2;
h:=windowheight div 2;
for i:integer:=1 to n do
begin
write(arr[i],' ');
Pen.Width := 15;//
Pen.Color := clWhite;//
line(w+i*20-2,h,w+i*20-2,0);//
Pen.Width := 10;
Pen.Color := clRandom;
line(w+i*20,h,w+i*20,h-round((h div 2)*arr[i]/(arr_max-arr_min)));
end;
writeln;
end;

procedure sortirovka(var arr: array1);
var
index_max, max,imax,imin: integer;
begin
imax:=arr[1];
imin:=arr[1];
for var i:=1 to n do
if imax<arr[i] then imax:=arr[i]
else if imin>arr[i]then imin:=arr[i];
for i:integer:=n downto 1 do
begin
index_max:=i;
max:=arr[i];
for j:integer:=1 to i-1 do
if arr[j] > max then
begin
index_max:=j;
max:=arr[index_max];
end;
if index_max <> i then
begin
arr[index_max]:=arr[i];
arr[i]:=max;
end;
gist(arr,imax,imin);
sleep(2000);
end;
end;
begin
Window.Title := 'Сортировка массива';
setwindowsize(600,300);
writeln('Элементы массива: ');
for i:integer:=1 to n do
read(arr[i]);
sortirovka(arr);
writeln;
end.[/code]
Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
05.12.2017, 10:31
общий
Адресаты:
Удачи в программировании!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401172
78
05.12.2017, 10:33
общий
спасибо!
Форма ответа