Форум программистов, компьютерный форум, киберфорум
Наши страницы
Prolog
Войти
Регистрация
Восстановить пароль
 
vikkov7
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
1

Вычисление половинок диагоналей( главной и обратной), которые находятся справа от центра.

21.03.2012, 19:17. Просмотров 484. Ответов 7
Метки нет (Все метки)

Уважаемый, Грымзик!
Помогите, пожалуйста, найти ошибку в программе.
Prolog
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
26
27
28
29
30
31
32
sum(M,D1,D2):-
    length(M,N),
    N1 is N//2,
    N2 is N1+1,
    sum1(M,N2,N,D1),
    sum2(M,1,N2,D2).
 
sum1([],_,_,0).
sum1([[H|T]|Tail],N,N,D1):-
    !,
    N1 is N-1,
    I is N+1,
    sum1([T|Tail],I,N1,Sum1),
    D1 is Sum1+H.
sum1([[]|Tail],_,N,D1):-
    sum1(Tail,N2,N,D1).
sum1([[_|T]|Tail],I,N,D1):-
    I1 is I+1,
    sum1([T|Tail],I1,N,D1).
 
sum2([],_,_,0).
sum2([[H|T]|Tail],N,N,D2 ):-
    !,
    N1 is N2+1,
    I is N+1,
    sum2([T|Tail],I,N1,Sum1),
    D2 is Sum1+H.
sum2([[]|Tail],_,N,D2):-
    sum2(Tail,1,N2,D2).
sum2([[_|T]|Tail],I,N,D2):-
    I1 is I+1,
    sum2([T|Tail],I1,N,D2).
sum1- вычисление половинки обратной диагонали, работает все четко, по вашему примеру,
sum2 - вычисление половинки прямой диагонали, не работает, а где ошибка,не понимаю.
Помогите, пожалуйста! Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2012, 19:17
Ответы с готовыми решениями:

Произведение диагоналей (главной и обратной) в матрице
Ребята никак не решу задачу : Произведение диагоналей(главн и обратной) в...

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

Поменять местами элементы главной и побочной диагоналей, симметричные относительно центра матрицы
Задана квадратичная матрица размером nxn поменять местами элементы главной и...

Обнулить те элементы матрицы, которые находятся по диагонали выше центра
1) Создать двухмерный массив 10 на 10. 2) Заполнить его случайными числами. ...

Заменить нулями элементы матрицы, лежащие одновременно выше главной и обратной диагоналей
Дана квадратная матрица порядка n. Заменить нулями элементы, лежащие...

7
Грымзик
2477 / 1454 / 34
Регистрация: 14.09.2009
Сообщений: 2,742
22.03.2012, 10:57 2
Ну например что у Вас в 24й строке? Используйте swi пролог, и уж такие ошибки точно будут сразу выявляться.
Prolog
1
2
3
4
sum2([],_,_,0).
sum2([_|Tail],I,N2,S):-I<N2,!,I1 is I+1,sum2(Tail,I1,N2,S).
sum2([[H|_]|Tail],I,1,S):-!,I1 is I+1,sum2(Tail,I1,I1,S1),S is S1+H.
sum2([[_|T]|Tail],I,J,S):-J1 is J-1,sum2([T|Tail],I,J1,S).
1
vikkov7
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
22.03.2012, 12:52  [ТС] 3
Может я что-нибудь не так делаю, но вроде бы несколько раз все перепроверила, а на вторую диагональку все равно выдает false?
Может дело в вызове sum2(M,1,N2,S).
Грымзик, помогите, пожалуйста!
0
Грымзик
2477 / 1454 / 34
Регистрация: 14.09.2009
Сообщений: 2,742
22.03.2012, 16:15 4
Если Вы оставили такой же вызов
Prolog
1
2
3
4
5
6
sum(M,D1,D2):-
        length(M,N),
        N1 is N//2,
        N2 is N1+1,
        sum1(M,N2,N,D1),
        sum2(M,1,N2,D2).
То все нормально
?- sum2([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]],1,3,S).
S = 27.
1
vikkov7
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
22.03.2012, 17:33  [ТС] 5
Спасибо огромное! Буду разбираться!
Хочется немножко понять логику, если Вас не затруднит

sum2([],_,_,0). - это если на вход идет пустая матрица

sum2([_|Tail],I,N2,S):-I<N2,!,I1 is I+1,sum2(Tail,I1,N2,S).- это если на вход идет список, первый элемент - любой, повторно вызывается функция только с хвостом списка

sum2([[H|_]|Tail],I,1,S),I1 is I+1,sum2(Tail,I1,I1,S1),S is S1+H. -это вообще не понимаю как

пояснить [[H|_]|Tail]

sum2([[_|T]|Tail],I,J,S):-J1 is J-1,sum2([T|Tail],I,J1,S). - и здесь как в третьей строке

непонятно [[_|T]|Tail]

Может быть посоветуете какую-нибудь книжку, а то в Братко я заданий на матрицы не нашла или плохо искала?
0
Грымзик
2477 / 1454 / 34
Регистрация: 14.09.2009
Сообщений: 2,742
22.03.2012, 17:44 6
Книжку, где бы примеры с матрицами были, не знаю. Тут смысл такой: 1-ый параметр естественно матрица, 2-ой номер текущей строки, 3-ий сначала номер строки, на которое начинается наша половинка диагонали (N//2+1), а потом, когда уже дошли до нее, это будет показывать сколько еще столбцо до диагонального элемента.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
sum2([],_,_,0).
sum2([_|Tail],I,N2,S):-I<N2,!,%если еще не дошли до строки, где начинается диагональ
I1 is I+1,sum2(Tail,I1,N2,S).%то просто пропускаем ее и идем дальше
sum2([[H|_]|Tail],I,1,S):-!,%сюда попадаем, когда уже дошли до нужной половины диагонали
%и если кол-во элементов до диагонального равно 1, то значит мы уже на диагонали
I1 is I+1,sum2(Tail,I1,I1,S1),%поэтом далее вычисляем с оставшимися строками
%при этом когда мы встали на I1-ую строку, автоматически до диагонального
%элемента надо протомать I1 элемент
S is S1+H.%и не забываем прибавить текущий
sum2([[_|T]|Tail],I,J,S):-J1 is J-1,%сюда попадаем, если мы еще не дошли до
%диагонального элемента, поэтому просто считаем, что нужно пропустить
%уже на один элемент меньше, и продолжаем дальше в этой же строке
sum2([T|Tail],I,J1,S).
1
vikkov7
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
23.03.2012, 09:40  [ТС] 7
Я даже не знаю, как Вас благодарить. Ваши объяснения бесценны, сколько рылась в разных книжках, нигде подобного не нашла! Можно понять логику программы. Спасибо огромное!!!

Добавлено через 14 часов 3 минуты
Уважаемый Грымзик!
Таки в программе есть ошибочка, потому что если брать матрицу 4X4, то должны суммироваться элементы 2,7,12 то есть S=21, но не 27.

Добавлено через 46 минут
Ой, нет, все правильно, это я ошиблась, извините!
0
vikkov7
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
30.03.2012, 13:36  [ТС] 8
Все гениальное - просто! Спасибо!
А как на такой же манер, то есть с одной функцией переделать задачу про половинки диагоналей(справа от центра)?
%+Matrix +Counter matrix +Razmer +Polovina +Accumulator -D1VerhPol
sum(M,I,N,K,Acc,S).
Что такое в данном случае аккумулятор я вообще не представляю, какое-то промежуточное накопление что ли?
Это мои потуги, пока успехом не увенчались, а старая с двумя функциями sum1 и sum2 рабочая, но, говорят, неэффективная.
Prolog
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
% +Matrix -D1verhpol -D2nizpol
main(K):-
    matrix_data([R|Rs]),
 
    length(R,N),
    K is N/2,
    sum1([R|Rs],0,1,N,K,0,0).
 
%+Matrix +Counter matrix +Razmer +Polovina +Accumulator -D1VerhPol
sum1([[_|T]|Tail],I,N,K,Acc,D1):-
    IMatr>K,
    I<IMatr,
    I is I+1,
    sum1([T|Tail],I,N,K,Acc,D1).
sum1([[H|_]|Tail],IMatr,I,N,K,Acc,D1):-
    IMatr>K,
    I=IMatr,
    IMatr1 is IMatr+1,
    Acc1 is Acc + H,
    sum1(Tail,IMatr1,I,N,K,Acc1,D1).
sum1([],_,_,_,_,S,S).
sum1([[X|_]|Tail],IMatr,I,N,K,Acc,Sum):-
    I=N-IMatr,
    Acc1 is Acc+X,
    IMatr1 is IMatr+1,
    I1 is 0,
    sum1(Tail,IMatr1,I1,N,K,Acc1,Sum).
sum1([[_|T]|Tail],IMatr,I,N,K,Acc,D1):-
    IMatr=<K,
    I<N-IMatr,
    I1 is I+1,
    sum1([T|Tail],IMatr,I1,N,K,Acc,D1).
 
% +Matrix +NomTekStr +Polovina -D2NizPol
sum2([],_,_,0).
sum2([_|Tail],I,N2,S):-
    I<N2,
    !,
    I1 is I+1,
    sum2(Tail,I1,N2,S).
sum2([[H|_]|Tail],I,1,S):-
    !,
    I1 is I+1,
    sum2(Tail,I1,I1,S1),
 
    S is S1+H.
sum2([[_|T]|Tail],I,J,S):-
    J1 is J-1,
    sum2([T|Tail],I,J1,S).
0
30.03.2012, 13:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2012, 13:36

Подсчитать сумму слева от центра матрицы, в центральном столбце, и справа от центра
Помогите программу написать пжл Подсчитать сумму слева от центра, в...

Найти произведение всех элементов, которые находятся на главной диагонали
Недавно познакомился с такой прекрасной библиотекой как curses.h. И вот...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru