このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1197620454/543
#  C#の宿題助けてくださしあ><お願いします。 
#  Visual Studio 2005使用です。 
#  問題文などはzipの中に入っています。説明不足等がありましたら補足します。 
#  http://ime.nu/uproda11.2ch-library.com/11213069.zip.shtml
#  DLキーは2chです。 

# 問い1
# ・二次元配列arrayを使ってユーザーのログインページを作りなさい。
# ・ユーザー名、パスワードのエラーメッセージを表示させること
# 問い2
# 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること
# あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。
# ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。
# つまり残り7枠を登録さればよい。
# プログラムはfor、while、do whileのどれかひとつでよい。
# ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。
# デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。
# slnファイルの名前がフォルダ名と違っていますが気にしないでください。
# 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければと思います。

ttylogin :-
    write('\nlogin: '),
    get_line(_ユーザー名),
    write('password: '),
    system('stty -echo raw'),
    get_char(X),put_char('*'),
    パスワードを得る(X,Password),
    system('stty echo -raw'),
    ユーザ管理(_ユーザー名,Password,_診断),
    assertz(ログイン情報(_ユーザー名,Password,_診断)),
    シェル(_ユーザー名,_診断),
    ttylogin.

パスワードを得る('\r',[]) :- !.
パスワードを得る(C,[C|R]) :-
    get_char(C2),
    put_char('*'),
    パスワードを得る(C2,R).

ユーザ管理(_ユーザー名,Password,ok) :-
    concat_atom(Password,PasswordAtom),
    カエサル暗号(17,PasswordAtom,_暗号文),
    user_password(_ユーザ名,_暗号文),!.
ユーザ管理(_ユーザー名,Password,'UserPassword Error') :-
    user_passwork(_ユーザー名,_),!.
ユーザ管理(_ユーザー名,Password,S) :-
    concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!.

user_password(tama,'Jrslif').

シェル(_,S) :- \+(S==ok),!.
シェル(_,_) :- system.

adduser :-
    write('username : '),get_line(_ユーザー名),
    rawmode,write('password : '),get_char(Char),put_char(*),
    パスワードを得る(Char,Password),norawmode,
    write('Retype Password : '),get_char(Char2),put_char(*),
    パスワードを得る(Char2,Password2),
    パスワードは一致する(Password,Password2),
    定義枠の限界を越えていない,
    ユーザー登録(_ユーザー名,Password),

パスワードは一致する(A,A) :- !.
パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail.

ユーザー登録(_ユーザー名,Password) :-
    concat_atom(Password,PasswordAtom),
    カエサル暗号(17,PasswordAtom,PasswordAtom2),
    assertz(user_password(_ユーザ-名,PasswordAtom2)).

定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!.
定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail.

定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F).