1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
1

Сумма элементов побочной диагонали

06.11.2014, 21:06. Показов 2127. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В моей программе пока две функции: первая - отделяет каждую строку в матрице, и вторая возвращает n-ый элемент. Потом еще добавлю функцию, которая считает саму сумму. Но пока что в этих двух функциях ошибки.. Программа:

Добавлено через 13 секунд
Haskell
1
2
3
4
5
6
7
matr11 :: [[Int]] -> Int -> [Int] -> Int
matr11 []_ = []
matr11(x:xs)n = seln x n : matr11 xs n 
 
seln :: [Int] -> Int ->Int
seln []_ = 0
seln (y:ys)h = if h==1 then y else seln ys(h-1)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 21:06
Ответы с готовыми решениями:

Сумма элементов побочной диагонали
Помогите, пожалуйста, найти сумму элементов побочной диагонали! Я новичок в Haskell.

Найти минимальный элемент побочной диагонали
Была у меня программа для главной диагонали: vibor :: -> Int -> Int -> Int vibor _ _=0 vibor...

Проверить утверждение: сумма элементов выше побочной диагонали больше суммы элементов ниже побочной диагонали
дана квадратная матрица натуральных чисел получаемая через rand.определить,верно ли утверждение:...

В матрице найти произведение элементов главной диагонали минус сумма элементов побочной диагонали
Задание: дана матрица а, найти B= произведение элементов главной диагонали - (МИНУС) сумма...

20
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.11.2014, 06:15 2
Haskell
1
2
3
4
5
diag2 ys = 
    nx (reverse ys)
    where
        nx ((x : _) : xs) = x : nx (map tail xs)
        nx _ = []
http://ideone.com/9K0Q4M
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
07.11.2014, 12:45 3
Еще вариант (неоптимальный):

Haskell
1
2
sumd2 matr =  sum $ map (\ n -> (matr !! n) !! (k-n-1)) [0..k-1] 
              where k=length matr
0
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
07.11.2014, 14:01 4
Васкеr, функция seln у Вас работает правильно, я в ней только дополнительные пробелы для красоты поставил. Функцию matr11 я поправил. Постарайтесь сами понять что было не так.
И я добавил проверку работы функции matr11.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
matr11 :: [[Int]] -> Int -> Int
matr11 [] _ = 0
matr11 (x:xs) n = seln x n + matr11 xs (n+1) 
 
seln :: [Int] -> Int ->Int
seln [] _ = 0
seln (y:ys) h = if h==1 then y else seln ys (h-1)
 
testdata = [[1,2,3,4,5],[10,20,30,40,50],[100,200,300,400,500],
            [1000,2000,3000,4000,5000],[10000,20000,30000,40000,50000]]
 
main = do
    -- Верхняя побочная диагональ
    print $  matr11 testdata 2
    -- Нижняя побочная диагональ
    print $  matr11 testdata 0
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
07.11.2014, 14:10 5
Опс... А я не ту диагональ суммировал.

Haskell
1
2
sumn2 matr =  sum $ map (\ n -> (matr !! n) !! (n+1)) [0..k-2] 
              where k=length matr
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.11.2014, 14:17 6
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И я добавил проверку работы функции matr11
http://ideone.com/MrLntp ?

Добавлено через 2 минуты
или я путаю определение побочной диагонали?
0
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
07.11.2014, 14:31 7
Значит мы все путаем. Недавно топикстартер здесь начинал такую же тему - Сумма элементов побочной диагонали , ну и все так же и решали. Сейчас посмотрел в википедию - и правда.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
07.11.2014, 15:26 8
А значит я суммировал первый раз именно ту. Побочная идет из правого верхнего в левый нижний.
0
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
07.11.2014, 20:41 9
Catstail, вообще то Вы и ввели в прошлой теме, такие определения как "sumU :: [[Int]] -> Int -- сумма верхней побочной","sumD :: [[Int]] -> Int -- сумма нижней побочной", а я лентяй - не полез в вику проверять что за диагонали такие.

Вот, довольно кратко получилось
Haskell
1
diag2 = fst . foldr (\ a (s,i) -> (s + a !! i,i+1)) (0,0)
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
07.11.2014, 20:45 10
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Catstail, вообще то Вы и ввели
- мне стыдно, моя вина.
0
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
09.11.2014, 12:04  [ТС] 11
Что значат $ и !!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
09.11.2014, 16:13 12
!! - операция получения элемента списка по его номеру (с нуля). $ - применение функции, позволяющее, к примеру, экономить скобки:

(f x y z) = f $ x y z
1
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
09.11.2014, 16:22 13
(f x y z) = f $ x y z
Ошибочка: f (x y z) то же что и f $ x y z
Да и то не всегда. "qwe" ++ ( take 5 "asdghk") не удастся заменить на "qwe" ++ $ take 5 "asdghk"


Вобщем, $ - это функция одного аргумента возвращающая свой аргумент неизменным. Принцип применения основан на том, что она имеет самый низкий приоритет среди операций.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
09.11.2014, 16:42 14
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Ошибочка: f (x y z)
- а что такое в Haskell f (x y z) ?
0
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
09.11.2014, 16:50 15
f - функция от одного аргумента (или частичное применение с одним аргументом). x,y,z - всё что угодно, так что x y z образует синтаксически правильное выражение. В данном случае, годное дня использования как аргумент функции ($).
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36828 / 20389 / 4230
Регистрация: 12.02.2012
Сообщений: 33,752
Записей в блоге: 13
09.11.2014, 17:21 16
KolodeznyDiver, я был неправ, спасибо!

Добавлено через 11 минут
Пример, который приводит М.Липовача ("Изучай Хаскелл во имя добра"):

Запись без оператора применения:

Haskell
1
sum (filter (>10) (map (*2) [2..10]))
здесь ни одной скобки опустить нельзя: у sum один аргумент - результат filter ... А у filter, в свою очередь, второй аргумент есть результат применения map с функцией (*2) к диапазону [2..10]. С использованием $ эту конструкцию можно записать несколько проще:

Haskell
1
sum $ filter (>10) $ map (*2) [2..10]
Разумеется, я пишу это для ТС.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
09.11.2014, 17:28 17
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
"qwe" ++ ( take 5 "asdghk") не удастся заменить на "qwe" ++ $ take 5 "asdghk"
это потому как ++ используется "неправильно" (как оператор). если писать правильно (как функцию) то все работает
Haskell
1
(++) "qwe" $ take 5 "asdghk"
1
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
09.11.2014, 17:37 18
Да, в инфиксном варианте не работает. Т.е. не всегда (), даже если закрывающая скобка в конце выражения, удастся заменить на $.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,163
Записей в блоге: 24
09.11.2014, 21:38 19
KolodeznyDiver, pycture, там просто скобочек не хватает
Haskell
1
("qwe" ++) $ take 5 "asdghk"
0
Модератор
5050 / 3279 / 528
Регистрация: 01.06.2013
Сообщений: 6,808
Записей в блоге: 9
09.11.2014, 21:49 20
Конечно, к функции одной переменной $ можно применять. А к второму аргументу инфиксной функции нет. Без дополнительных () не обойтись. Либо они ( take 5 "asdghk"), либо (++), либо ("qwe" ++).
Можно сказать, закон сохранения скобок.
0
09.11.2014, 21:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2014, 21:49
Помогаю со студенческими работами здесь

Выяснить, что больше: сумма элементов главной диагонали матрицы или сумма элементов побочной
Выяснить, что больше: сумма элементов главной диагонали матрицы размером 4*4 или сумма элементов ее...

В матрице сумма элементов, стоящих на главной диагонали, равна сумме элементов, стоящих на побочной диагонали
⦁ «В данной матрице сумма элементов, стоящих на главной диагонали, равна сумме элементов, стоящих...

Сумма элементов побочной диагонали
Исправьте программу: Program kh; Var x: Array of Integer; i,j,s: Integer; Begin...

Сумма элементов побочной диагонали
Задайте двумерный массив (матрицу) размером 9х9.Составьте программу для решения задачи: вычислить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru