16.12.2009, 22:35
общий
это ответ
Здравствуйте, Benqq.
Вообще-то, нужно задавать по одной задаче в вопросе, поэтому решу только первую.
Тип данных, полагаю, непринципиален, буду использовать word. Поскольку массивы заданы уже отсортированные, то мы можем упростить нахождение одинакового элемента. Покажу на примере:
X: 1 2 3 3 4 6
Y: 1 1 3 4 5
В результате должен получиться массив Z: 1 2 3 4. Выбираем в качестве основного массив с меньшей размерностью, то есть в данном случае Y, идём по нему в цикле. Рассматриваем первый элемент (1), запускаем цикл по X (пока с 1-го элемента, потому что мы зашли в него впервые), на первой же итерации видим совпадение значений, а значит сразу пишем 1 в Z и переводим текущую позицию в массиве X на следующий элемент, чтобы не учесть ещё раз тот же самый. Возвращаемся во внешний цикл, выбираем следующий элемент X - 2. Ищем его в Y, начиная со второго элемента. 1 - не подходит, а 3 - уже больше, чем заданное число, а значит, можно прерывать поиск: учитывая отсортированность массивов, найти нужное число дальше мы уже не сможем. При этом текущую позиция в Y мы не меняем, потому что как бы не знаем, что там хранится. И так далее.
Весь этот процесс для удобства выделим в процедуру.
Код с комментариями - в приложении, если что-то непонятно, спрашивайте.
Удачи!
Приложение:
Type mas = array [1..50] of word; {Тип массива}
Var x, y, z: mas; {Массивы}
i, k, l, m, j: word; {Счётчики, размерности}
procedure CreateZ (var x, y, z: mas; k, l: word; var m: word); {Процедура формирования резулитьрующего массива}
{исходные массивы, результат, размерности исходных массивов, размерность результата}
Var i, j, cur: word; {Счётчики для циклов}
begin
m:= 1; {Размерность массива Z}
cur:= 1;
for i:=1 to k do {Цикл по массиву Х}
begin
for j:=cur to l do {Цикл по массиву У}
if (x[i]=y[j]) then
{Если значение из Х попадается в У}
begin
z[m]:= x[i]; {Копируем его в результат}
inc (m); {Наращиваем размерность}
cur:= j+1; {Переходим на позицию дальше}
break; {Выходим из внутреннего цикла}
end;
if (x[i]>y[j]) then break; {Прерываем цикл, если вышли за значение}
end;
dec (m); {Уменьшаем размерность результата - последний элемент не заполнен}
end;
begin
writeln ('Input k: '); {Ввод данных}
repeat
readln (k);
if (k>50) then writeln ('k is too big!'); {Проверка ввода (массив задан на 50 элементов максимально)}
until k<=50;
writeln ('Input vector X: ');
for i:=1 to k do
readln (x[i]);
writeln ('Input l: '); {Всё аналогично для второго}
repeat
readln (l);
if (l>50) then writeln ('l is too big!');
until l<=50;
writeln ('Input vector Y: ');
for i:=1 to l do
readln (y[i]);
{Вызываем процедуру генерации массива так, чтобы в качестве Х был передан массив с максимальной размерностью}
if (k<l) then CreateZ (x, y, z, k, l, m)
else CreateZ (y, x, z, l, k, m);
writeln ('Result: '); {Выводим результат}
for i:=1 to m do
write (z[i], ' ');
end.