このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/267
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):問題が長いので http://ime.nu/ideone.com/1FVot ここにあげさせてもらいました。 
#  
#  共用体を用いてビット単位で操作できる1バイトの仮想レジスタを定義し、
#  「2進数8桁の文字列」で入力した2つの数値データの、
#  加算、減算、論理積、論理和、排他的論理和、否定の演算結果を
#  2進数8桁で出力するプログラムを作成せよ。
#   
#  という課題がでて以下の様なソースを書いたのですが、エラー処理の方法が
#  よくわかりません。やりたいことは0と1以外の数を入力したら
#  エラーと表示、8桁でなければエラーと表示してもらいたいです。
#  それと先生に出力の書き方が少しおかしいと言われたのですが、このソースで
#  動いてしまいました。プログラミングの授業的になにかまずいことでもあるのでしょうか?
#  それも出来れば教えてもらいたいです。


'1バイトの仮想レジスタ'(加算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        atom_chars(_2進数8桁の文字列_2,L2),
        ビット加算(L1,L2,L),
        atom_chars(_2進数8桁の文字列_3,L).

'1バイトの仮想レジスタ'(減算,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        atom_chars(_2進数8桁の文字列_2,L2),
        ビット減算(L1,L2,L),
        atom_chars(_2進数8桁の文字列_3,L).

'1バイトの仮想レジスタ'(論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        atom_chars(_2進数8桁の文字列_2,L2),
        ビット論理積(L1,L2,L),
        atom_chars(_2進数8桁の文字列_3,L).

'1バイトの仮想レジスタ'(論理和,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        atom_chars(_2進数8桁の文字列_2,L2),
        ビット論理和(L1,L2,L),
        atom_chars(_2進数8桁の文字列_3,L).

'1バイトの仮想レジスタ'(排他的論理積,_2進数8桁の文字列_1,_2進数8桁の文字列_2,_2進数8桁の文字列_3) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        atom_chars(_2進数8桁の文字列_2,L2),
        ビット排他的論理和(L1,L2,L),
        atom_chars(_2進数8桁の文字列_3,L).

'1バイトの仮想レジスタ'(否定,_2進数8桁の文字列_1,_2進数8桁の文字列_2) :-
        atom_chars(_2進数8桁の文字列_1,L1),
        ビット否定(L1,L2),
        atom_chars(_2進数8桁の文字列_2,L2).

ビット加算(L1,L2,L) :-
        ビット加算(L1,L2,[],L).

ビット加算([],[],L1,L) :-
        reverse(L1,L).
ビット加算([A|R1],[B|R2],L1,L) :-
        ビット加算(A,B,C,D),
        桁あがり処理(C,L1,L2),
        ビット加算(R1,R2,[D|L2],L).

ビット加算('0','0','0','0').
ビット加算('0','1','0','1').
ビット加算('1','0','0','1').
ビット加算('1','1','1','0').

桁あがり処理('0',L,L).
桁あがり処理('1',['0'|R],['1'|R]).
桁あがり処理('1',['1'|R1],['0'|R2]) :-
        桁あがり処理('1',R1,R2).

ビット減算(L1,L2,L) :-
        ビット減算(L1,L2,[],L).

ビット減算([],[],L1,L) :-
        reverse(L1,L).
ビット減算([A|R1],[B|R2],L1,L) :-
        ビット減算(A,B,C,D),
        桁あふれ処理(C,L1,L2),
        ビット減算(R1,R2,[D|L2],L).

ビット減算('0','0','0','0').
ビット減算('0','1','1','1').
ビット減算('1','0','0','1').
ビット減算('1','1','0','0').

桁さがり処理('0',L,L).
桁さがり処理('1',['1'|R],['0'|R]).
桁さがり処理('1',['0'|R1],['1'|R2]) :-
        桁さがり処理('1',R1,R2).

ビット論理積([],[],[]).
ビット論理積(['0'|R1],['0'|R2],['0'|R3]) :-
        ビット論理積(R1,R2,R3).
ビット論理積(['0'|R1],['1'|R2],['0'|R3]) :-
        ビット論理積(R1,R2,R3).
ビット論理積(['1'|R1],['0'|R2],['0'|R3]) :-
        ビット論理積(R1,R2,R3).
ビット論理積(['1'|R1],['1'|R2],['1'|R3]) :-
        ビット論理積(R1,R2,R3).

ビット論理和([],[],[]).
ビット論理和(['0'|R1],['0'|R2],['0'|R3]) :-
        ビット論理和(R1,R2,R3).
ビット論理和(['0'|R1],['1'|R2],['1'|R3]) :-
        ビット論理和(R1,R2,R3).
ビット論理和(['1'|R1],['0'|R2],['1'|R3]) :-
        ビット論理和(R1,R2,R3).
ビット論理和(['1'|R1],['1'|R2],['1'|R3]) :-
        ビット論理和(R1,R2,R3).

ビット排他的論理和([],[],[]).
ビット排他的論理和(['0'|R1],['0'|R2],['0'|R3]) :-
        ビット排他的論理和(R1,R2,R3).
ビット排他的論理和(['0'|R1],['1'|R2],['1'|R3]) :-
        ビット排他的論理和(R1,R2,R3).
ビット排他的論理和(['1'|R1],['0'|R2],['1'|R3]) :-
        ビット排他的論理和(R1,R2,R3).
ビット排他的論理和(['1'|R1],['1'|R2],['0'|R3]) :-
        ビット排他的論理和(R1,R2,R3).

ビット否定([],[]).
ビット否定(['0'|R1],['1'|R3]) :-
        ビット否定(R1,R2,R3).
ビット否定(['1'|R1],['0'|R3]) :-
        ビット否定(R1,R2,R3).