PDA

Просмотр полной версии : Учусь программировать :)



Nobless
29.01.2007, 15:57
Задача :Дан двухмерный, квадратный массив размерностью n на n (я беру 5х5). Заполняю массив слуайными цифрами. дальше надо найти макс. значение элементов массива. Это тоже делаю. Далее нада найти макс. значение но определённой области массива (см. ниже, область отмечена единицами)
1 1 1 1 1
0 1 1 1 1
0 0 1 1 1
0 0 0 1 1
0 0 0 0 1
это тоже делаю :)

Но теперь нада найти макс. значение в следущей области :
1 1 1 1 1
0 1 1 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
и тут тупик, пользовался до этого циклом в цикле (for). Думаю что в этом случае такой же нужно пользоваться системой, только не могу понять как заставить его смотреть первую строку все элементы а потом на 2 меньше, на 4 меньше и так далее (если у меня будет массив 10 на 10)....

Кто что подскажет :)

maxx™
29.01.2007, 16:07
Один массив - исходный. Второй вспомогательный - такой же только содержит нули или единицы как ты написал. Если в вспомогательном массиве элемент равен 1, то соответствующий элемент основного массива учавствует в поиске. Перебираешь их в цикле да и все.
Это если не думать такое решение, все остальное возможно и будет быстрее, но не так очевидно.

Nobless
29.01.2007, 16:12
Один массив - исходный. Второй вспомогательный - такой же только содержит нули или единицы как ты написал. Если в вспомогательном массиве элемент равен 1, то соответствующий элемент основного массива учавствует в поиске. Перебираешь их в цикле да и все.
Это если не думать такое решение, все остальное возможно и будет быстрее, но не так очевидно.

не понял ничего:)
я заполняю массив случайными числами, ну допустим я сделаю второй массив, но в него нужно записать именно нужные мне значения, тоесть их всёравно нада "найти" в первом массиве , ик тому же второй массив должен быть динамичесским, которого по задумке я ещё не знаю (не учили пока) :)

Ginger
29.01.2007, 16:28
не понял ничего:)
я заполняю массив случайными числами, ну допустим я сделаю второй массив, но в него нужно записать именно нужные мне значения, тоесть их всёравно нада "найти" в первом массиве , ик тому же второй массив должен быть динамичесским, которого по задумке я ещё не знаю (не учили пока) :)
Ужос, какие вспомогательные массивы!!!
Правильно организуй цикл по этой матрице
i индекс по строкам
j индекс по столбцам
k=0 вспомогательный индекс
По строкам иди от 0 до i/2
Для i/2 поставь округление до наибольшего целого, т.е. если у тебя i/2 = 2.5, чтоб округляло до 3

По столбцам иди от j+k до j-k, просто в в цикле for поставь ещё один инкремент для вспомогательного k

Ну и стандартный поиск максимума

End по столбцам
End по строкам

Удачи!!!

Elfio
29.01.2007, 16:50
Кто что подскажет :)

Учись алгоритмически мыслить, а только потом программировать.
Короче - малюй блок-схемы алгоритмов и будит тибе счастие.

maxx™
29.01.2007, 17:13
не понял ничего:)
я заполняю массив случайными числами, ну допустим я сделаю второй массив, но в него нужно записать именно нужные мне значения, тоесть их всёравно нада "найти" в первом массиве , ик тому же второй массив должен быть динамичесским, которого по задумке я ещё не знаю (не учили пока) :)
У тебя есть массив -
1 1 1 1 1
0 1 1 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

Вот это и есть содержание вспомогательного массива.

maxx™
29.01.2007, 17:16
Ужос, какие вспомогательные массивы!!!

Он тебе в следующем посте предложит еще какую-то другую область,
например такую:

1 1 0 1 1
0 1 1 1 0
0 0 1 0 0
1 1 0 1 1
0 0 1 0 0

Ты тоже будешь изворачиваться с циклами и округлениями?

Ginger
29.01.2007, 17:43
только не могу понять как заставить его смотреть первую строку все элементы а потом на 2 меньше, на 4 меньше и так далее (если у меня будет массив 10 на 10)....

Кто что подскажет :)

:stop: Я написала для вот этого случая.

А если нужно искать максимум только из мн-ва позиций, где он рандомом ставит 1, то самый простой способ, это вставить иф перед сравнением элемента с максимумом, хотя можно и "соптимизить":)

Ginger
29.01.2007, 18:07
А вообще, можно исходную матрицу и матрицу позиций поэлементно умножить. Получится матрица с ненулевыми значениями только на местах, где были 1.
Другой вопрос, если исходная содержала отрицательные числа.......))))

Nobless
29.01.2007, 19:37
Так так я вижу я вас запутал своими единицами :)

нулями и единицами я просто отметил область ,вместо них разные числа от 0 до 100,
и подобных комбинаций
1 1 0 1 1
0 1 1 1 0
0 0 1 0 0
1 1 0 1 1
0 0 1 0 0
мне не нужно :) мне нужно только треугольнички внутри квадрато в разных полежениях :) сейчас попробую со вспомогательным индексом, хотя толком не понял что от меня требуется :)

Ginger
29.01.2007, 19:41
Так так я вижу я вас запутал своими единицами :)
мне не нужно мне нужно только треугольнички внутри квадрато в разных полежениях сейчас попробую со вспомогательным индексом, хотя толком не понял что от меня требуется
:laugh:
Попробуй четко сформулировать задачу:)
У тебя область для поиска максимума фиксирована или получается после волшебных слов "аааааап"?:)
Слу, а ты где "учишься программировать"?
Что-то у тебя соображалка и воображалка пока не оч натренирована

Nobless
29.01.2007, 19:42
млин :) ща скрин кину

Nobless
29.01.2007, 19:46
вот....1-е задание сделал :)
во 2-м а и б сделал :) дальше идут те самые треугольники

В шаге учусь :) можно сказать с нуля...до этого пару раз всего слышал слово алгоритм (и то из-за угла)

Ginger
29.01.2007, 19:48
Да не надо твоих скринов:)
Просто чётко и грамотно опиши в чём трабл.
Если тебе нужно только по таким треугольникам, то без вспомогательного индекса никак:) (если матрица не всегда квадратная)

Ginger
29.01.2007, 19:52
Ну вот, а тут на форуме такие бла-бла разводят по поводу универов ,высшего образования в принципе и шага.....:rtfm:
А вышку где-то получаешь?
Мда...там делать нефик.
Тебе катострофически не хватает той самой соображалки:)
Ты только не исчи максимум сразу, а попробуй сделать цикл и выводи матрицу из 0 и 1. Пусть 1 ставит там, где потом будешь искать максимум:)

pavlentus
29.01.2007, 19:52
Да не надо твоих скринов:)
Просто чётко и грамотно опиши в чём трабл.
Если тебе нужно только по таким треугольникам, то без вспомогательного индекса никак:) (если матрица не всегда квадратная)

Иногда круглая (матрица) :)

Nobless
29.01.2007, 19:52
Да не надо твоих скринов:)
Просто чётко и грамотно опиши в чём трабл.
Если тебе нужно только по таким треугольникам, то без вспомогательного индекса никак:) (если матрица не всегда квадратная)
Матрица всегда квадратная, трабл наверное в отсутсвии соображаловки и этого факин индекса :)

Яр
29.01.2007, 19:53
Но теперь нада найти макс. значение в следущей области :
1 1 1 1 1
0 1 1 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0


можно попробовать запустить что-небудь подобное по всем элементам показанного выше единицами треугольника:


for (int i = 0; i<N; i++)
for (int j = i ; j<N-i; j++)
{
// сравниваем A[i][j] c чем-то там..
}

Nobless
29.01.2007, 19:54
Ну вот, а тут на форуме такие бла-бла разводят по поводу универов ,высшего образования в принципе и шага.....:rtfm:
А вышку где-то получаешь?
Мда...там делать нефик.
Тебе катострофически не хватает той самой соображалки:)
Ты только не исчи максимум сразу, а попробуй сделать цикл и выводи матрицу из 0 и 1. Пусть 1 ставит там, где потом будешь искать максимум:)
вышку пока не получаю, пока получаю что могу, на что времени хватает :)
Да и насчёт там разговоров не разговоров, мне многие советовали не идти туда учится. но я доволен, я на полустационаре, занятия 1 раз в неделю по полтора часа на урок ,сами понимаете что и как....за то мизерное время что нам уделяют я хоть чемуто научился
Для Яр
не канает, уже пробовал, он считает все элементы кроме последнего столбца, если ян е ошибаюсь :)

Ginger
29.01.2007, 20:00
можно попробовать запустить что-небудь подобное по всем элементам показанного выше единицами треугольника:


for (int i = 0; i<N; i++)
for (int j = i ; j<N-i; j++)
{
// сравниваем A[i][j] c чем-то там..
}
Не пугайте так человека!!!:)
Он долго это будет понимать, а т.к. додумался не сам, то оч скоро забудет:)

Ginger
29.01.2007, 20:02
вышку пока не получаю, пока получаю что могу, на что времени хватает :)
Да и насчёт там разговоров не разговоров, мне многие советовали не идти туда учится. но я доволен, я на полустационаре, занятия 1 раз в неделю по полтора часа на урок ,сами понимаете что и как....за то мизерное время что нам уделяют я хоть чемуто научился
Для Яр
не канает, уже пробовал, он считает все элементы кроме последнего столбца, если ян е ошибаюсь :)
Это уроки по С++, если я не ошибаюсь.
Так там же последняя строка N-1 номер имеет, если не доходит до последнего столбца, то добавь единичку

Яр
29.01.2007, 20:06
GGenius, я всего лишь хотел помочь :)

Nobless

Для Яр
не канает, уже пробовал, он считает все элементы кроме последнего столбца, если ян е ошибаюсь

Допустим такая матрица:


1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Тот код, что я привёл выводит:

1 2 3 4 5 7 8 9 13
Как раз те числа, что соответсвтуют "треугольнику". Найти среди них максимальное или минимальное, думаю, не трудно.

Nobless
29.01.2007, 20:06
Хотя нет %) Яр всётаки правильно сказал, я пока не могу понять по чемун о щазз пойму :)

Nobless
29.01.2007, 20:11
Да да именно так...я уже понял как оно работает :)
Блин всё так просто...почему же я сам не смог до этого додуматься...вроде и не дурак :sad_anim:

lexar
29.01.2007, 20:11
Учись алгоритмически мыслить, а только потом программировать.
Короче - малюй блок-схемы алгоритмов и будит тибе счастие.

А блок схемы - зачем?
Он же не книжку с иллюстрациями пишет,
а программу.

Все правильно - используй дополнительную переменную,
которая сужает внутренний цикл перебора по столбцам.

MrJile
29.01.2007, 20:40
А вообще, можно исходную матрицу и матрицу позиций поэлементно умножить. Получится матрица с ненулевыми значениями только на местах, где были 1.
Другой вопрос, если исходная содержала отрицательные числа.......))))
А подумать? При умножении надо двойной цикл и еще один массив. Давайте еще что-то с массивом сделаем, чтоб проще было. Хотя конечно, оптимизация не моя специальность. :tongue:

Для в) будет что-то типа этого:


целое num = n/2 - округляем по правилам округления, т.е 1,5 - это 2; 2,5 - это 3 и т.д.

for i = 0; i < num; i++ {
for j = i; j <= n - i - 1; j++ {
Твое условие для ( i, j );
}
}


Остальные варианты идентичны. Но сделать ты должен их сам и дойти до всего сам, это конечно, если тебя интересуют знания. Если за тебя кто-то сделает, то ты ничему не научишься.

ЗЫ: Ну раз додумался, то молодец.

Boot
29.01.2007, 21:42
j-цикл по столбцам
i-рядкам
n-кол-во рядков ,столбцов
если выполняется это условие ищи максимум
if((i<n/2&&i<=j&&j<=n-1-i))
для
11111
01110
00100
00000
00000
попробуй ,если не получается обращайся
if(i==j||j==n-1-i||(i<n/2&&i<j&&j<n-1-i)||(i>n/2&&i>j&&j>n-1-i))
для
11111
01110
00100
01110
11111
Дальше продолжать?Выходит?

Ginger
29.01.2007, 22:32
А подумать? При умножении надо двойной цикл и еще один массив. Давайте еще что-то с массивом сделаем, чтоб проще было. Хотя конечно, оптимизация не моя специальность. :tongue:

Ндрюха, ты умница, я не спорю:D Не надо наезжать зря на оптимизицию:)
Просто сначала не было известно, что область поиска максимума ограничена несколькими конечными вариантами(автор оставил это в тайне)!!! Это я предположила для случая, когда матрица позиций для поиска оптимума генерится по запросу "оопля":)
Кста, попробуй придумать математическое преобразование, такое, чтоб


Матрица А Матрица Б Матрица С
2 3 4 5 1 0 0 0 2 0 0 0
3 4 6 7 0 1 0 0 0 3 0 0
6 7 8 9 что-то сделать 1 1 1 1 получилась 2 3 4 5
4 6 3 5 0 1 1 0 0 3 4 0

Только чур математическое преобразование!!!:)

И как мне кажется, то самый простой и понятный вариант для человека, у которого исчо с воображением плохенько, это использовать третий индекс. Он неоптимален с программистской точки зрения, за то более лёгок в понимани. А вот если у автора действительно есть талант к этому делу, он бы потом сел и подумал - А какие значения у меня принимает этот вспомогательный индекс??? А можно ли его выразить через i, j, N???
А вы всё сразу на блюдечке да с каёмочкой..........

Пилигрим
30.01.2007, 11:32
Кста, попробуй придумать математическое преобразование, такое, чтоб
Код:

Матрица А Матрица Б Матрица С
2 3 4 5 1 0 0 0 2 0 0 0
3 4 6 7 0 1 0 0 0 3 0 0
6 7 8 9 что-то сделать 1 1 1 1 получилась 2 3 4 5
4 6 3 5 0 1 1 0 0 3 4 0

Только чур математическое преобразование!!!:-)
поэлементное умноженеим, а не математическое множение матриц, но смысла в этой операции нет (для математики).
З.Ы. накладывать маску путем умножения все равно не есть гут.
Как говорилось ранее - для таких случаев (замкнутые непрерывные области) проще действительно использовать "твое условие для i и j" - та даже и если области более хирые - тоже пойдет.

MrJile
30.01.2007, 11:43
Ндрюха, ты умница, я не спорю:D Не надо наезжать зря на оптимизицию:)
Просто сначала не было известно, что область поиска максимума ограничена несколькими конечными вариантами(автор оставил это в тайне)!!! Это я предположила для случая, когда матрица позиций для поиска оптимума генерится по запросу "оопля":)

Решается проходом по всей сатрице и одной проверкой (Б[i,j]==1 ), но никак не умножением матриц.



Кста, попробуй придумать математическое преобразование, такое, чтоб
....
Только чур математическое преобразование!!!:)


Вот нех.. мне чем заниматься больше. Ты ему еще LU-разложение предложи. Ты представляешь лицо Сереги, если бы ему студент принес такое для поиска максимума матрицы? Но заценил бы точно:laugh:. Я так понял, что человек еще в школе учится.

ЗЫ: Но маладца, матрицы умножать ты умеешь, я ж и не спорю.

Ginger
30.01.2007, 12:53
поэлементное умноженеим, а не математическое множение матриц, но смысла в этой операции нет (для математики).
З.Ы. накладывать маску путем умножения все равно не есть гут.
К
Читайте внимательно!!!!:hysteric:
Я тут (http://www.forum.od.ua/showpost.php?p=931596&postcount=9) не говорила о классическом перемножении матриц!!!


Решается проходом по всей сатрице и одной проверкой (Б[i,j]==1 ), но никак не умножением матриц.

Да пжалста, кому как удобнее и понятнее!!! :pleasantry:
Хотя мальчику в школе лучше ифы ставить вместо матричной маски



Вот нех.. мне чем заниматься больше.
ЗЫ: Но маладца, матрицы умножать ты умеешь, я ж и не спорю.
Ну так чего ты на меня наезжаешь:girl_cray2:
Пы.сы. :girl_sigh:Подожди, я как-нить до тебя доберусь:girl_mad:

pavlentus
06.02.2007, 08:28
Для тех, кто еще учится:

Сборник задач по программированию (http://task00.by.ru/task417_index.htm)