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

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

Форум «Всё о Паскале» _ Задачи _ формирование вектора чередованием элементов

Автор: 18192123 5.01.2007 19:55

Дана квадратная матрица порядка n. Сформировать вектор х, где чередуются положительные и отрицательные элементы из матрицы (вектор х начинается с отрицательного элемента)

(задача решается только с использованием массивов, процедур)

Я думаю вначале нужно найти первый отрицательный элемент, тогда в векторе х положительные элементы будут занимать чётные позиции ( а как реализовать насчёт позициий - не знаю)

И ещё: число положительных и отрицательных не во всех случаях равно, эти варианты то же нужно учесть или этого можно избежать?

Подскажите пожалуйста!!!

Автор: volvo 5.01.2007 20:16

Ну, начать-то наверное, надо с того, что посчитать количество отрицательных элементов матрицы... Тогда ты сможешь сделать один простой цикл (пройти по матрице, в случае положительного элемента увеличивая индекс положительных, четный, на 2 или 1 в зависимости от количества отрицательных элементов в матрице; аналогично - для отрицательных индексов...)

Объяснить - гораздо сложнее чем сделать, но все же попробуй понять, что тут написано, и реализовать это... Вся программа (с выводом результата) заняла у меня всего 30 строк...

Автор: 18192123 5.01.2007 20:44

Цитата(volvo @ 5.01.2007 16:16) *

в случае положительного элемента увеличивая индекс положительных, четный, на 2 или 1 в зависимости от количества отрицательных элементов в матрице


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

Автор: volvo 5.01.2007 20:51

Цитата
(Я так рассуждала - если, например количество положительных больше ,то оставшиеся из них просто будут приписывать в конец вектора....)
yes2.gif Именно это и будет происходить в случае, который я тебе описывал... Смотри, вот основной цикл:


i_neg := 1; { <--- Начальная позиция, с которой пишем отриц. элементы }
i_pos := 2; { <--- Начальная позиция, с которой пишем положит. элементы }
for i := 1 to n do
for j := 1 to n do
if mx[i, j] > 0 then begin
vec[i_pos] := mx[i, j];
{
Если i_pos < 2*neg, то i_pos увеличить на 2, иначе на 1,
ибо больше отриц. эл-тов уже нет
}
inc(i_pos, 1 + byte(i_pos < 2 * neg));
end
{ То же самое, только для отрицательных эл-тов }
else begin
vec[i_neg] := mx[i, j];
inc(i_neg, 1 + byte(i_neg < 2 * pos));
end;


У меня
neg - число отриц. эл-тов в матрице
pos - число положит. эл-тов (pos := N*N - neg)

Автор: 18192123 5.01.2007 21:10

Цитата(volvo @ 5.01.2007 16:51) *




+ byte(i_pos < 2 * neg);



именно эта конструкция позволяет увеличивать i_pos на два если i_pos < 2 * neg? Я правильно поняла?

Автор: volvo 5.01.2007 21:15

yes2.gif Поскольку если i_pos < 2 * neg есть True, а значение Byte(True) = 1, и Byte(False) = 0, то вот такая конструкция:

inc(i_pos, 1 + byte(i_pos < 2 * neg)); 

аналогична:
if i_pos < 2 * neg then inc(i_pos, 1 + 1) else inc(i_pos, 1 + 0)

(а если результат одинаков - зачем набирать больше текста? rolleyes.gif )

Автор: 18192123 5.01.2007 21:36

Большое спасибо! Насчёт заполнения вектора - я всё поняла (урааа!!! yes2.gif )

Но у меня возник очень глупый вопрос: а как вывести элементы сформированного вектора? ( ведь когда заполняем вектор отрицательными элементами использовали vec[i_neg], а с положительными vec[i_pos]

Автор: volvo 5.01.2007 21:41

Ну, и что? Это ведь ты для заполнения использовала эти индексы... А после заполнения просто проходи от 1 до N*N и распечатывай все подряд...

Автор: 18192123 5.01.2007 21:54

Цитата(volvo @ 5.01.2007 17:41) *

Ну, и что? Это ведь ты для заполнения использовала эти индексы... А после заполнения просто проходи от 1 до N*N и распечатывай все подряд...

а, точно! Всё, теперь всё ясно! Ещё раз большое спасибо!!!