Суммы элементов в матрице |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Суммы элементов в матрице |
Fest |
23.12.2007 4:25
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Такая вот у меня проблема:
Надо написать прогу, которая считает в квадратной матрице(5х5) суммы элементов треугольников. Треугольниками здесь называется такая вот весчь: Матрица - 1 2 3 4 5 2 2 3 4 5 3 2 3 4 5 4 2 3 4 5 5 2 3 4 5 Вотс, надо вычислить в подобной матрице суммы красных треугольничков и зеленых. Проблема в том, как это сделать... Я пробовал просто складывать нужные элементы(s1:=a[1.2]+a[1.3] и так далее), но это немного не то. Можно ли как-нибудь еще посчитать суммы этих треугольников? Сообщение отредактировано: Fest - 23.12.2007 4:29 |
andriano |
23.12.2007 12:20
Сообщение
#2
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Если речь идет о матрицах фиксированного и не слишком большого размера, то это наиболее естественное и самое оптимальное решение. А способов можно придумать тысячи. Но оптимальный из них только один - в виде непосредственной суммы.
|
Fest |
23.12.2007 17:21
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Если речь идет о матрицах фиксированного и не слишком большого размера, то это наиболее естественное и самое оптимальное решение. А способов можно придумать тысячи. Но оптимальный из них только один - в виде непосредственной суммы. Спасибо. Интересно, а можно ли сделать какую-нить формулу, чтобы, допустим, считало эти треугольники (и не совсем треугольники, короче элементы, которые не затрагивают диагонали) в диапазоне квадратной матрицы от 5 до 10 допустим? Чтоб считало элементы, которые не лежат на диагоналях те, что вверху, внизу, слева и справа, отдельно от других "треугольников". |
andriano |
23.12.2007 19:24
Сообщение
#4
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Можно, конечно.
Ручками (и глазками) ты ведь это можешь посчитать? Вот опиши подробно, как ты это делаешь - и будет тебе алгоритм. |
Fest |
23.12.2007 19:35
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Можно, конечно. Ручками (и глазками) ты ведь это можешь посчитать? Вот опиши подробно, как ты это делаешь - и будет тебе алгоритм. Я вроде пытался, но у меня не особо получается что-то. Математик из меня, как гений из маразматика :\ У меня с этим очень туговато... Можно хотя б какие-нить примеры?.. Чтоб можно было понять, как это вообще делать(на той стадии, когда массив заполняется значениями) , какие операции над циклом производить и тд. и тп. |
andriano |
23.12.2007 20:41
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Забудь пока о массивах и циклах. Представь, что перед тобой на бумаге несколько матриц разного размера. Как бы ты стал подсчитывать сумму?
|
klem4 |
23.12.2007 20:55
Сообщение
#7
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
на самом деле решение этой задачи не однократно выкладывалось, но не в таком виде как я щас сделал (я по крайней мере такого решения не припомню), проверок получается больше, но зато всего в 2 цикла все уместилось
это конечно медленнее чем в несколько двойных циклов подсчитывать, но зато кода меньше, хоть это никаких плюсов и не дает ... uses crt; -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Fest |
23.12.2007 21:59
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Забудь пока о массивах и циклах. Представь, что перед тобой на бумаге несколько матриц разного размера. Как бы ты стал подсчитывать сумму? Стал бы тупо складывать нужные элементы Другое дело сделать тоже самое в цикле, чтобы уже считало нужные элементы автоматически, с помощью какой-нить формулы. Например, чтобы нужные элементы считались, при этом не трогая диагоналей. У меня в голове это как-то не укладывается :\ Пытаюсь в мозгу вывести картинку, как это все происходит, но что-то не получается. To Klem4: Спасибо большое, но я похоже очень тупой :\ Можешь объяснить, как работает вот это: for i := 1 to n do Что здесь с чем сравнивается?.. Что отнимается? Почему? Можешь прокомментировать, если не сложно?.. Желательно поподробей. |
klem4 |
23.12.2007 22:20
Сообщение
#9
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
цикл по всем элемента матрицы
в цикле надо отобрать элементы, принадлежащие либо правому/левому, либо верхнему/нижнему треугольникам. среди этих элементов нету ни одного, лежащего на диагоналях. Это мы и проверяем первым условием: if (i <> j) and (j <> n - i + 1) then begin если текущий элемент mx[i, j] не лежит на диагоналях, то проверим к какому виду треугольников он принадлежит: if ((j > i) and (j < n - i + 1)) or ((j > n - i + 1) and (j < i)) если это условие даст истину, значит элемент лежит верхнем/нижнем треугольниках, иначе, так как мы уже исключили диагонали, он принадлежит правому/левому. чтобы было понятней прогони алгоритм пошагово, анализируя каждый элемент. Объяснять я не мастак, сорри ... -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Fest |
23.12.2007 22:42
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
цикл по всем элемента матрицы в цикле надо отобрать элементы, принадлежащие либо правому/левому, либо верхнему/нижнему треугольникам. среди этих элементов нету ни одного, лежащего на диагоналях. Это мы и проверяем первым условием: if (i <> j) and (j <> n - i + 1) then begin если текущий элемент mx[i, j] не лежит на диагоналях, то проверим к какому виду треугольников он принадлежит: if ((j > i) and (j < n - i + 1)) or ((j > n - i + 1) and (j < i)) если это условие даст истину, значит элемент лежит верхнем/нижнем треугольниках, иначе, так как мы уже исключили диагонали, он принадлежит правому/левому. чтобы было понятней прогони алгоритм пошагово, анализируя каждый элемент. Объяснять я не мастак, сорри ... Спасибо и на этом, попытаюсь вникнуть Еще один маленький вопросик!.. Как перевернуть матрицу на 90 градусов? Вроде надо поменять местами столбцы и строки, но у меня что-то не то получается. Делаю я вот так a[i,j]:=a[j,i]; где тут ошибка? Он у меня какую-то ересь выводит, не то, что надо :\ З.Ы. Если кто-то может объяснить то, что было выше, да так, чтобы даже полный чайник мог понять - никто не будет против, скорее всего все (включая меня) будут - за (+ это потом можно будет кинуть в FAQ ) |
klem4 |
23.12.2007 22:45
Сообщение
#11
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Цитата Как перевернуть матрицу на 90 градусов? Решалось тоже, вроде даже в FAQ было, поищи. -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
мисс_граффити |
23.12.2007 23:05
Сообщение
#12
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Цитата Делаю я вот так a[i,j]:=a[j,i]; где тут ошибка? _здесь_ ошибки нет а вот какие значения i и j ты берешь - загадка... вообще - поиск (или FAQ) по слову транспонирование -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Fest |
23.12.2007 23:30
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
_здесь_ ошибки нет а вот какие значения i и j ты берешь - загадка... вообще - поиск (или FAQ) по слову транспонирование Прошу прощения за непонятные "феномены" И огромное спасибо за слово "транспонирование"... А то я тут ищу "перевернутые матрицы", "градусы" и прочую лабудень |
andriano |
24.12.2007 8:01
Сообщение
#14
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
|
andriano |
24.12.2007 20:17
Сообщение
#15
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Стал бы тупо складывать нужные элементы А как ты определяешь, какие элементы являются нужными, а какие нет? Цитата Другое дело сделать тоже самое в цикле, чтобы уже считало нужные элементы автоматически, с помощью какой-нить формулы. А "формула" и рождается из собственных рассуждений. Вот, скажем, верхний треугольник: начинаешь перебор со второго элемента первой строки, а заканчиваешь предпоследним, так?Соответственно, и цикл можно записать: for j := 1+1 to n-1 do Вторую стоку начинаешь считать на один элемент позже, а заканчиваешь - на 1 раньше: for j := 1+2 to n-2 do Обращаем внимаение на то, что "добавка" в пределах суммирования совпадает с номером стоки По высоте надо просуммировать n div 2 строк для нечетного n (каким и является 5). Если нарисовать для четного, то можно обнаружить, что две средние строки в суммровании не учавствуют, т.е. всего (n-2) div 2 строк. То есть внешний цикл у нас должен суммировать строки от 1 до (n-1) div 2, (эта формула подходит как для четных, так и для нечетных размеров) а во внутреннем надо постепенно сужать строку, отнимая от начала и конца номер текущей строки: for i := 1 to (n-1) div 2 do Цитата Например, чтобы нужные элементы считались, при этом не трогая диагоналей. У меня в голове это как-то не укладывается :\ Пытаюсь в мозгу вывести картинку, как это все происходит, но что-то не получается. А ты увелич размер матрицы до 10-15 - понять будет легче.Цитата To Klem4: Спасибо большое, но я похоже очень тупой :\ Можешь объяснить, как работает вот это: for i := 1 to n do Что здесь с чем сравнивается?.. Что отнимается? Почему? Можешь прокомментировать, если не сложно?.. Желательно поподробей. Это делает как раз то, что описано словами, а именно проводит перебор ПО ВСЕМ элементам, а прибавляет к сумме только нужные. Я, кстати, предложил другой алгоритм: сразу перебирать только нужное. Как видишь, задача может решаться несколькими путями. |
klem4 |
24.12.2007 20:24
Сообщение
#16
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Fest |
25.12.2007 4:09
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Всем большое спасибо! Особенно Andriano! Помог разобраться, объяснил Поставил бы +, если бы мог Сеня последняя полная луна в этом году ;) Все проясняется, щас лучшее время для свершения чего либо)
|
Michael_Rybak |
25.12.2007 4:34
Сообщение
#18
|
Michael_Rybak Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: 32 |
Цитата Поставил бы +, если бы мог ok |
Текстовая версия | 29.04.2024 9:33 |