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

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

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

 
 Ответить  Открыть новую тему 
> формирование вектора чередованием элементов
18192123
сообщение 5.01.2007 15:55
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


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

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

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

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

Подскажите пожалуйста!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 16:16
Сообщение #2


Гость






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

Объяснить - гораздо сложнее чем сделать, но все же попробуй понять, что тут написано, и реализовать это... Вся программа (с выводом результата) заняла у меня всего 30 строк...
 К началу страницы 
+ Ответить 
18192123
сообщение 5.01.2007 16:44
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


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

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


вот основного я как раз и не смогла понять....
почему на 1 или 2? (Я так рассуждала - если, например количество положительных больше ,то оставшиеся из них просто будут приписывать в конец вектора....)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 16:51
Сообщение #4


Гость






Цитата
(Я так рассуждала - если, например количество положительных больше ,то оставшиеся из них просто будут приписывать в конец вектора....)
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 17:10
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


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




+ byte(i_pos < 2 * neg);



именно эта конструкция позволяет увеличивать i_pos на два если i_pos < 2 * neg? Я правильно поняла?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 17:15
Сообщение #6


Гость






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 17:36
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


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

Но у меня возник очень глупый вопрос: а как вывести элементы сформированного вектора? ( ведь когда заполняем вектор отрицательными элементами использовали vec[i_neg], а с положительными vec[i_pos]
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 17:41
Сообщение #8


Гость






Ну, и что? Это ведь ты для заполнения использовала эти индексы... А после заполнения просто проходи от 1 до N*N и распечатывай все подряд...
 К началу страницы 
+ Ответить 
18192123
сообщение 5.01.2007 17:54
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


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

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

а, точно! Всё, теперь всё ясно! Ещё раз большое спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 20.07.2025 5:57
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"