IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Одномерный массив - нужна ПОМОЩЬ, сортировка элементов массива
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Задали написать программу при помощи массива. Я что-то "похимичил", дальше не могу сообразить что надо делать.

Вот: дана последовательность 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. Вообще, в условии сказано, что прогу нужно писать модифицированным методом выбора. Т.е. нужно просматривать весь массив, отыскивается наименьшее число (ведь нам же нужно расположить их по возрастанию), помещаем это число на первую позицию, тем самым обменивая его с элементом, который до этого занимал эту самую первую позицию. Но опять же мы просматриваем лишь только положительные элементы последовательности, которые стоят только на нечётных местах - остальные в расчёт и перестановку не берём, они, возможно, останутся на прежних местах.

Помогите... может быть я неправильно рассуждаю...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Это всё, что я смог сделать
Ошибаешься... Это - не все, что ты должен был сделать. Подними глаза на красную рамочку и прочитай фразу рядом с цифрой 3. Сколько можно уже делать одно и то же?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Ну, смотри:
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.

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 14:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name