このディレクトリの索引

#  配列分からないので助けてください!
#  [1] 授業単元:Cプログラミング(配列)
#  [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt
#  [3] 環境
#   [3.1] Linux
#   [3.2] gcc
#   [3.3] 言語: C
#  問題3:サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り各要素8個を
#  キーボードから入力すると行列の和A+Bの結果を表示する。
#  

'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り各要素8個をキーボードから入力すると行列の和A+Bの結果を表示する。' :-
        'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り'(A,B),
        '各要素8個をキーボードから入力すると'(A,B),
        '行列の和A+Bの結果を'(A,B,_行列の和),
        表示する(_行列の和).

'サイズ2×2の2つの行列A,Bを配列A[2][2] B[2][2]を用いて作り'(A,B) :-
        length(A,2),
        findall(AX,append(_,[AX|_],A),A),
        length(B,2),
        findall(BX,append(_,[BX|_],A),A),!.

'各要素8個をキーボードから入力すると'(A,B) :-
        write('Aの入力をします\n'),
        'Aの入力'([],A),
        write('Bの入力をします\n'),
        'Bの入力'([],B).

'Aの入力'(Ln1,[]) :- !.
'Aの入力'(Ln1,[L|R]) :-
        'Aの入力'(Ln1,[],L),
        'Aの入力'([_|Ln1],R).

'Aの入力'(Ln1,Ln2,[]) :- !.
'Aの入力'(Ln1,Ln2,[A|R]) :-
        length(Ln1,N1),
        length(Ln2,N2),
        write_formatted('A[%t][%t]を入力してください : ',[N1,N2]),
        催促付き数値入力(_催促文,A),
        'Aの入力'(Ln1,[_|L2],R).

'Bの入力'(Ln1,[]) :- !.
'Bの入力'(Ln1,[L|R]) :-
        'Bの入力'(Ln1,[],L),
        'Bの入力'([_|Ln1],R).

'Bの入力'(Ln1,Ln2,[]) :- !.
'Bの入力'(Ln1,Ln2,[B|R]) :-
        length(Ln1,N1),
        length(Ln2,N2),
        write_formatted_atom(_催促文,'B[%t][%t]を入力してください : ',[N1,N2]),
        催促付き数値入力(_催促文,B),
        'Bの入力'(Ln1,[_|L2],R).

催促付き数値入力(_催促文,_値) :-
        write(_催促文),
        get_line(Line),
        数値の入力診断(Line,_値),!.
催促付き数値入力(_催促文,_値) :- 催促付き数値入力(_催促文,_値).

数値の入力診断(Line,_値) :-
        atom_to_term(Line,_値,_),
        number(_値),!.
数値の入力診断(Line,_) :-
        write_formatted('入力された %t からは数値を得られませんでした。再入力をおねがいします。\n',[Line]),
        fail.

'行列の和A+Bの結果を'([],[],[]) :- !.
'行列の和A+Bの結果を'([Aの行|R1],[Bの行|R2],[_加算された行|R3]) :-
        ならび加算(Aの行,Bの行,_加算された行),
        '行列の和A+Bの結果を'(R1,R2,R3).

表示する([]) :- !.
表示する([L|R]) :-
        write_formatted('| %t %t |\n',L),
        表示する(R).