Описать процедуру Hill(A, N), меняющую порядок элементов вещественного массива A размера N на следующий - Pascal
Формулировка задачи:
Описать процедуру Hill(A, N), меняющую порядок элементов вещественного массива A размера N на следующий: наименьший элемент массива располагается на первом месте, наименьший из оставшихся элементов — на последнем, следующий по величине располагается на втором месте, следующий — на предпоследнем и т. д. (в результате график значений элементов будет напоминать холм). Массив A является входным и выходным параметром. С помощью этой функции преобразовать массивы A, B, C размера NA, NB, NC соответственно. ПАСКАЛЬ
Решение задачи: «Описать процедуру Hill(A, N), меняющую порядок элементов вещественного массива A размера N на следующий»
textual
Листинг программы
const nmax=100; type mas=array[1..nmax] of real; procedure Vvod(var a:mas;var n:integer;c:char); var i:integer; begin repeat write('Размер массива ',c,' до ',nmax,' n='); readln(n); until n in [1..nmax]; for i:=1 to n do a[i]:=10*random; clrscr; end; procedure Vyvod(a:mas;n:integer;c:string); var i:integer; begin writeln(c); for i:=1 to n do write(a[i]:5:2); writeln; end; procedure Hill(var a:mas;n:integer); var i,j,k,imn,p:integer; x:real; begin k:=n div 2; //количество перестановок for i:=1 to k do begin imn:=i; //найдем 1 минимальный в еще не отсортированных for j:=i+1 to n-i+1 do if a[j]<a[imn] then imn:=j; x:=a[imn];//нашли for p:=imn downto i+1 do //здвинем на него часть массива впереди a[p]:=a[p-1]; a[i]:=x;//вставим элемент на место в первой части массива imn:=i+1;//ищем второй минимальный for j:=i+1 to n-i+1 do if a[j]<a[imn] then imn:=j; x:=a[imn];//нашли for p:=imn to n-i do //сдвинем на него часть массива впереди a[p]:=a[p+1]; a[n-i+1]:=x;//вставим на место во второй части массива end; end; var a,b,c:mas; na,nb,nc:integer; begin randomize; Vvod(a,na,'A'); Vvod(b,nb,'B'); Vvod(c,nc,'C'); Vyvod(a,na,'Исходный массив А'); Hill(a,na); Vyvod(a,na,'Отсортированный массив А'); Vyvod(b,nb,'Исходный массив B'); Hill(b,nb); Vyvod(b,nb,'Отсортированный массив B'); Vyvod(c,nc,'Исходный массив C'); Hill(c,nc); Vyvod(c,nc,'Отсортированный массив C'); end.
Объяснение кода листинга программы
- const nmax=100;
- type mas=array[1..nmax] of real;
- procedure Vvod(var a:mas;var n:integer;c:char); var i:integer;
- begin repeat write('Размер массива ',c,' до ',nmax,' n='); readln(n); until n in [1..nmax]; for i:=1 to n do a[i]:=10*random; clrscr; end;
- procedure Vyvod(a:mas;n:integer;c:string); var i:integer; end; begin writeln(c); for i:=1 to n do write(a[i]:5:2); writeln; end;
- procedure Hill(var a:mas;n:integer); var i,j,k,imn,p:integer; x:real; end; begin k:=n div 2; //количество перестановок for i:=1 to k do begin imn:=i; //найдем 1 минимальный в еще не отсортированных for j:=i+1 to n-i+1 do if a[j]<a[imn] then imn:=j; x:=a[imn];//нашли for p:=imn downto i+1 do //здвинем на него часть массива впереди a[p]:=a[p-1]; a[i]:=x;//вставим элемент на место в первой части массива imn:=i+1;//ищем второй минимальный for j:=i+1 to n-i+1 do if a[j]<a[imn] then imn:=j; x:=a[imn];//нашли for p:=imn to n-i do //сдвинем на него часть массива впереди a[p]:=a[p+1]; a[n-i+1]:=x;//вставим на место во второй части массива end; end; var a,b,c:mas; na,nb,nc:integer; end; begin randomize; Vvod(a,na,'A'); Vvod(b,nb,'B'); Vvod(c,nc,'C'); Vyvod(a,na,'Исходный массив А'); Hill(a,na); Vyvod(a,na,'Отсортированный массив А'); Vyvod(b,nb,'Исходный массив B'); Hill(b,nb); Vyvod(b,nb,'Отсортированный массив B'); Vyvod(c,nc,'Исходный массив C'); Hill(c,nc); Vyvod(c,nc,'Отсортированный массив C'); end.