Помощь - Поиск - Пользователи - Календарь
Полная версия: Одномерный массив - нужна ПОМОЩЬ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Белый
Задали написать программу при помощи массива. Я что-то "похимичил", дальше не могу сообразить что надо делать.

Вот: дана последовательность a1, a2, ..., a20. Расположить положительные элементы последовательности, стоящие на нечётных местах, по возрастанию.


У меня вот такое вот начало получилось:

program Elementy;
uses crt;
var
M: array [1..20] of integer;
I: integer;

begin
RANDOMIZE;
clrscr;
WriteLn('Исходный массив:');
for i:=1 to 20 do
begin
M[i]:=random(40)-20;
Write(M[I]:3,' ');
end;
WriteLn;




Это всё, что я смог сделать. Ну, в начале название проги пишем, потом объявляем массив и сам индекс (i). Заполнять массив будем случайным методом - Рандомайс. Взял я так, что колебаться он будет в пределах 40 чисел, т.е. будет любое из сорока, а 20 будет отниматься всегда, в независимости от того, отрицательное ли число будет случайным из 40 либо ли оно будет положительным. Тем самым мы добъёмся того, что сам массив будет состоять как из положительных так и отрицательных элементов. Как я понял, сначала нам нужно вывести на экран наш исходный массив, который получится случайным методом, далее (ниже) будет массив конечный, который будет состоять из положительных элементов, которые стоят в исходном массиве на нечётных местах, т.е. 1, 3, 5, 7 и так далее. Значит нам нужно проверить и должны выполнять два условия одновременно: число положительно, т.е. больше нуля и оно стоит на нечётном месте в массиве. А нечётное место мы можем проверить так - берём число и делим на два, если при делении в остатке получается единичка, то место - нечётное. mod 2 = 1. Вообще, в условии сказано, что прогу нужно писать модифицированным методом выбора. Т.е. нужно просматривать весь массив, отыскивается наименьшее число (ведь нам же нужно расположить их по возрастанию), помещаем это число на первую позицию, тем самым обменивая его с элементом, который до этого занимал эту самую первую позицию. Но опять же мы просматриваем лишь только положительные элементы последовательности, которые стоят только на нечётных местах - остальные в расчёт и перестановку не берём, они, возможно, останутся на прежних местах.

Помогите... может быть я неправильно рассуждаю...
volvo
Цитата
Это всё, что я смог сделать
Ошибаешься... Это - не все, что ты должен был сделать. Подними глаза на красную рамочку и прочитай фразу рядом с цифрой 3. Сколько можно уже делать одно и то же?
volvo
Ну, смотри:
const
n = 20;
Type
arrType = Array[1 .. n] Of Integer;

{ Немного изменяем ту процедуру Bubble, которая есть в FAQ-е }
Procedure OddBubble(Var ar: arrType; n: integer);
Var i, j, T: Integer;
Begin
For i := 1 To n Do
For j := n DownTo i+2 Do begin { i+2 для того, чтобы не вылететь за нижнюю границу массива...
Мы же должны работать только с нечетными индексами... }

{
Если индекс J - not odd: НЕ нечетный (т.е. является четным)
или он нечетный, но элемент, там находящийся - отрицательный,
то нам на этой итерации делать нечего - переходим к следующей итерации...
}
if (not odd(j)) or (ar[j] < 0) then continue;

{
Вот тут смотри внимательно:
ищем индекс предыдущего НЕотрицательного элемента, стоящего на НЕчетной позиции
(если таковых нет, то pred_j будет хранить 1, как первый нечетный индекс)
}
pred_j := j - 2;
while (ar[pred_j] < 0) and (pred_j >= 3) do dec(pred_j, 2);

{ Ну, и сам цикл "пузырька" - только сравниваем не #J с #J-1, а #J с #pred_j }
If odd(j) and (ar[pred_j] > ar[j]) Then Begin
T := ar[pred_j]; ar[Pred_j] := ar[j]; ar[j] := T;
End

end;
End;

const
{ Ввод данных у тебя уже организован, а я удобства задам массив сразу }
arr: arrType = (
20, 19, -18, 17, 16, 15, -14, 13, 12, 11,
10, 9, 8, 7, 6, 5, 4, 3, 2, 1
);
var
i: integer;

begin
for i := 1 to 20 do
write(arr[i]:3);
writeln;

OddBubble(arr, n);

for i := 1 to 20 do
write(arr[i]:3);
writeln;

end.

Что имеем в результате? Все элементы, стоявшие на четных позициях, остаются на местах, положительные с нечетными индексами сортируются по возрастанию, отрицательные - тоже остаются на местах... Очень сложно?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.