Суммы элементов в матрице |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Суммы элементов в матрице |
Fest |
Сообщение
#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 - |
andriano |
Сообщение
#2
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Если речь идет о матрицах фиксированного и не слишком большого размера, то это наиболее естественное и самое оптимальное решение. А способов можно придумать тысячи. Но оптимальный из них только один - в виде непосредственной суммы.
|
Fest |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Если речь идет о матрицах фиксированного и не слишком большого размера, то это наиболее естественное и самое оптимальное решение. А способов можно придумать тысячи. Но оптимальный из них только один - в виде непосредственной суммы. Спасибо. Интересно, а можно ли сделать какую-нить формулу, чтобы, допустим, считало эти треугольники (и не совсем треугольники, короче элементы, которые не затрагивают диагонали) в диапазоне квадратной матрицы от 5 до 10 допустим? Чтоб считало элементы, которые не лежат на диагоналях те, что вверху, внизу, слева и справа, отдельно от других "треугольников". |
andriano |
Сообщение
#4
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Можно, конечно.
Ручками (и глазками) ты ведь это можешь посчитать? Вот опиши подробно, как ты это делаешь - и будет тебе алгоритм. |
Fest |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Можно, конечно. Ручками (и глазками) ты ведь это можешь посчитать? Вот опиши подробно, как ты это делаешь - и будет тебе алгоритм. Я вроде пытался, но у меня не особо получается что-то. Математик из меня, как гений из маразматика :\ У меня с этим очень туговато... Можно хотя б какие-нить примеры?.. Чтоб можно было понять, как это вообще делать(на той стадии, когда массив заполняется значениями) , какие операции над циклом производить и тд. и тп. |
andriano |
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Забудь пока о массивах и циклах. Представь, что перед тобой на бумаге несколько матриц разного размера. Как бы ты стал подсчитывать сумму?
|
klem4 |
Сообщение
#7
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
на самом деле решение этой задачи не однократно выкладывалось, но не в таком виде как я щас сделал (я по крайней мере такого решения не припомню), проверок получается больше, но зато всего в 2 цикла все уместилось
это конечно медленнее чем в несколько двойных циклов подсчитывать, но зато кода меньше, хоть это никаких плюсов и не дает ... uses crt; -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Fest |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Забудь пока о массивах и циклах. Представь, что перед тобой на бумаге несколько матриц разного размера. Как бы ты стал подсчитывать сумму? Стал бы тупо складывать нужные элементы Другое дело сделать тоже самое в цикле, чтобы уже считало нужные элементы автоматически, с помощью какой-нить формулы. Например, чтобы нужные элементы считались, при этом не трогая диагоналей. У меня в голове это как-то не укладывается :\ Пытаюсь в мозгу вывести картинку, как это все происходит, но что-то не получается. To Klem4: Спасибо большое, но я похоже очень тупой :\ Можешь объяснить, как работает вот это: for i := 1 to n do Что здесь с чем сравнивается?.. Что отнимается? Почему? Можешь прокомментировать, если не сложно?.. Желательно поподробей. |
klem4 |
Сообщение
#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 |
Сообщение
#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 |
Сообщение
#11
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Цитата Как перевернуть матрицу на 90 градусов? Решалось тоже, вроде даже в FAQ было, поищи. -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
мисс_граффити |
Сообщение
#12
|
просто человек Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Цитата Делаю я вот так a[i,j]:=a[j,i]; где тут ошибка? _здесь_ ошибки нет а вот какие значения i и j ты берешь - загадка... вообще - поиск (или FAQ) по слову транспонирование -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Fest |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
_здесь_ ошибки нет а вот какие значения i и j ты берешь - загадка... вообще - поиск (или FAQ) по слову транспонирование Прошу прощения за непонятные "феномены" И огромное спасибо за слово "транспонирование"... А то я тут ищу "перевернутые матрицы", "градусы" и прочую лабудень |
andriano |
Сообщение
#14
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
|
andriano |
Сообщение
#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 |
Сообщение
#16
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Fest |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 21 Пол: Мужской Реальное имя: Сектант Репутация: 0 |
Всем большое спасибо! Особенно Andriano! Помог разобраться, объяснил Поставил бы +, если бы мог Сеня последняя полная луна в этом году ;) Все проясняется, щас лучшее время для свершения чего либо)
|
Michael_Rybak |
Сообщение
#18
|
Michael_Rybak Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: 32 |
Цитата Поставил бы +, если бы мог ok |
Текстовая версия | 11.01.2025 4:59 |