Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Pascal - процедуры и функции

Автор: xxBOBAHxx 18.11.2008 0:09

Создать два одномерных массива А и В различной длины. Рассортировать числа до максимального значения по возрастанию. Результат вывести. Затем рассортировать числа, расположенные после максимального значения по возрастанию и снова вывести. И, наконец, рассортировать весь массив по возрастанию и снова вывести.

ПРИМЕР:
Даны два массива
1) 34 12 54 24 3 6

2) 34 56 67 3 4 0 12

Т.е необходимо:
а)отсортировать массив 1) по возрастанию до МАКСИМАЛЬНОГО ЗНАЧЕНИЯ = 54
таким образом чтобы получился массив 12 34 54 24 3 6
б)После этот же массив 1) необходимо отсортировать по возрастанию но уже ПОСЛЕ максимального элемента массива т.е. получится 34 12 54 3 6 24


Аналогичные опреации проделать с массивом 2)

Вот моя зарисовка.........

program PRIM_2;
const na=5; nb=10;
type mas=array[1..nb] of real;
var a, b:mas;
i:integer;
Procedure SOZD(var d:mas; k:integer);{создание массива}
begin
for i:=1 to k do
d[i]:=random*500;
end;
Procedure VIVOD(d:mas; k:integer; t:string);{вывод массива}
begin
writeln(t);
for i:=1 to k do
write(d[i]:0:0, ' ');
writeln;
end;
function max(d:mas; k:integer):real;{выявление максимального элемента массива}
var i:integer; m:real; c:real;
begin
m:=-maxint;
for i:=1 to k do
if d[i]>m then m:=d[i];
max:=m;
end;
procedure SORT(var d:mas; k:integer);{попытка отсортировать массив до
максимального элемента}
var c:real;
begin
i:=1;
repeat
if d[i]>d[i+1] then
begin
c:=d[i]; d[i]:=d[i+1]; d[i+1]:=c;
if i>1 then dec(i)
end
else inc(i);
until i>=k or d[i]=???;
{так и не понял чему приравнять d[i] чтоб он прекпащал сортировку,
т.е выходил из цикла когда d[i] равнялся бы максимальному значению в массиве}

end;
BEGIN
randomize;
SOZD(a, na); VIVOD(a, na, 'massiv A');
writeln('max_mas A=', max(a, na):0:0);
SORT(a, na); VIVOD(a, na, 'massiv A posle');
SOZD(b, nb); VIVOD(b, nb, 'massiv B');
writeln('max_mas B=', max(b, nb):0:0);
readln
END.

Больше всего меня интересует как отсортировать массив по возрастанию до максимального значения и после максимального значения....

P.S.за ранее благодарен за содействие))

М
Большая просьба: заключай программный код в теги!
Lapp


Автор: samec 18.11.2008 0:41

функция поиска максимального элемента должна возвращать не значение, а порядковый номер этого самого элемента в массиве. Примерно вот так:


function max(d:mas; k:integer):integer;{выявление максимального элемента массива}
var i, nom:integer; m:real;
begin
m:=d[1];
nom:=1;
for i:=2 to k do
if d[i]>m then
begin
m:=d[i];
nom:=i;
end;
max:=nom;
end;


А затем делаешь обычную сортировку, например методом пузырька:
1. начиная от первого элемента массива и до номера максимального элемента (сам элемент не должен входить в сортировку).
2. начиная от номера максимального элемента +1 и до конца массива.
примерно вот так:

procedure SORT(var d:mas; k1,k2:integer);
{k1 - номер с которого начинаем сортировку,
k2 - номер на котором заканчиваем сортировку}
var c:real;
i,k:integer;
begin
for k:=k1 to k2-1 do
for i:=k1 to k2-k1 do
if(d[i]>d[i+1]) then
begin
c:=d[i];
d[i]:=d[i+1];
d[i+1]:=c;
end;
end;



вызывать процедуру сортировки в основной программе нужно так:

SORT(a,1,max(a,na)-1); {сортируем до максимального элемента}
SORT(a,max(a,na)+1,na); {сортируем после максимального элемента}
SORT(a,1,na); {сортируем весь массив}



код набирал прямо здесь, так что могут вкрасться ошибки, но идея должна быть понятнаsmile.gif дерзай smile.gif

Автор: xxBOBAHxx 18.11.2008 2:21

Спасибо огромное, ваши указания и замечания помогли мне, еще раз БОЛЬШОЕ СПАСИБО!!!

Автор: Lapp 18.11.2008 8:02

Цитата(samec @ 17.11.2008 20:41) *
код набирал прямо здесь, так что могут вкрасться ошибки
- это извиняет опечатки и несущественные синтаксические ошибки. Но с пределами циклов в сортировке у тебя бардак явно не синтасического характера..
Исправишь сам? smile.gif

Автор: samec 18.11.2008 19:14

Цитата(Lapp @ 18.11.2008 7:02) *

- это извиняет опечатки и несущественные синтаксические ошибки. Но с пределами циклов в сортировке у тебя бардак явно не синтасического характера..
Исправишь сам? smile.gif

очень спать хотелось smile.gif вот и запутался чуть-чуть.
вот так надо:

procedure SORT(var d:mas; k1,k2:integer);
{k1 - номер с которого начинаем сортировку,
k2 - номер на котором заканчиваем сортировку}
var c:real;
i,k:integer;
begin
for k:=1 to k2-k1 do
for i:=k1 to k2-k do
if(d[i]>d[i+1]) then
begin
c:=d[i];
d[i]:=d[i+1];
d[i+1]:=c;
end;
end;