Консультация № 143221
06.09.2008, 18:00
0.00 руб.
0 1 1
Добрый вечер! Помогите, пожалуйста, найти ошибку в решении задачи. Задача следующая: есть два упорядоченных по возрастанию массива, один длины M, другой длины N. Из этих массивов нужно составить новый упорядоченный по возрастанию массив, длины M + N. (соединить два массива в один, а затем его упорядочить нельзя).
Решать эту задачу нам нужно следующим образом: берём первый элемент из одного из массивов (того массива, в котором содержится максимальный элемент из всех чисел, входящих в первый и во второй массивы) и все числа, которые меньше его или равны ему (если есть) переписываем в новый массив, затем берём второй элемент из первого массива и т.д…
Вот код задачи, мне кажется, что у меня ошибка в цикле с while, но исправит не могу.

if arrayM[M] > arrayN[N] then begin
for i:= 1 to M do begin
while arrayM[i] >= arrayN[j]do begin
newarray[k]:= arrayN[j];
inc(k);
inc(j);
end;
end;
newarray[k]:= arrayM[i];
inc(k);
end;

end else begin
for i:= 1 to N do begin
while arrayN[i] >= arrayM[j] do begin
newarray[k]:= arrayM[j];
inc(j);
inc(k);
end;
newarray[k]:= arrayN[i];
inc(k);
end;
end;

Обсуждение

Неизвестный
06.09.2008, 21:46
общий
это ответ
Здравствуйте, Miracle!

Можно поступить так: просматриваем в цикле for первый массив, вложенным циклом While идёт по второму. Сначала выбираем все непросмотренные ещё элементы второго массива, не превосходящие текущий элемент первого. Потом выбираем текущий элемент из первого массива... и так до конца первого. Поскольку есть вероятность, что во втором массиве ещё что-то осталось, отдельным циклом смотрим весь этот остаток. Программа в приложении.

Приложение:
Program Fusien;

Uses Crt;

Const
M = 5;
N = 8;

Type
data_array = array [1..100] of integer;

procedure Exchange (var i, j: integer);
var
temp: integer;
begin
temp:= i;
i:= j;
j:= temp;
end;

procedure Sorting (var a: data_array; X: integer);
var
i, j: integer;
begin
for i:= 1 to X-1 do begin
for j:= i+1 to X do begin
if a[i] > a[j] then begin
exchange(a[i], a[j]);
end;
end;
end;
end;

procedure Inputing (var a: data_array; X: integer);
var
i: integer;
begin
for i:= 1 to X do begin
write(' a[', i, '] = ');
readln(a[i]);
end;
end;

var
ArrM, ArrN, ArrMN: data_array;
i, a, b: Integer;

begin

ClrScr;

writeln('Массив ArrM::');
inputing(ArrM, M);

writeln('Массив ArrN:');
inputing(ArrN, N);

sorting(ArrM, M);
sorting(ArrN, N);

a := 1;
b := 1;

writeln('Собранный массив ArrMN:');
for i := 1 to M do begin
if a <= N then
while (ArrN[a] <= ArrM[i]) and (a <= N) do begin
ArrMN[b] := ArrN[a];
inc(a);
write(ArrMN[b]:4);
inc(b);
end;
ArrMN[b] := ArrM[i];
write(ArrMN[b]:4);
inc(b);
end;
for i := a to N do
begin
ArrMN[b] := ArrN[i];
Write(ArrMN[b]:4);
inc(b);
end;

readln;
end.
Форма ответа