このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 130代目 #907 # [1] C言語とアルゴリズム # [2] 選択型処理 あるお店では会員制をとっている。会員には一般会員と特別会員があり、 # 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 # 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 # この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 # ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 # [会員種別(1桁) 購入金額] # ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 # 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 # 非会員は「非」と表しなさい。 # # [data03.dat] http://prolog.asia/data/data03.dat # 『実行例』 # 種別  購入金額(円)  支払い金額(円)   # 会     3200        2880    ←一般会員は1割引き # 特     2400        1680    ←特別会員は3割引き # 非     4800        4800    ←非会員は通常割り引かない # 特     6500        4550 # 会     10800 9720 # 特     18200 12740 # 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き # 会     890 801 # 会     3900        3510 # 特     6200        4340 # ----------------------------------------- # 合計    78290        65421 ←最後の行に合計を出力すること 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- 全行を項目区切りしながらならびに取る('data03.dat',[' '],LL), ある日のご購入明細表を出力する(LL). ある日のご購入明細表を出力する(LL) :- ご購入金額表(LL,_ご購入金額表), ご購入金額計(_ご購入金額表,_ご購入金額計,_お支払い金額計), write('種別\tご購入金額(円)\tお支払い金額(円)\n'), ご購入金額表明細表示(_ご購入金額表), writef('-----------------------------------------\n合計\t%t\t%t\n',[_ご購入金額計,_お支払い金額計]). ご購入金額表([],[]). ご購入金額表([[_会員種別番号,_ご購入金額]|R1],[[_会員略号,_ご購入金額,_お支払い金額]|R2]) :- 会員種別コード(_会員種別番号,_会員種別), お支払い金額(_会員種別,_ご購入金額,_お支払い金額), ご購入金額表会員略号(_会員種別,_会員略号), ご購入金額表(R1,R2). ご購入金額表明細表示([]). ご購入金額表明細表示([[_会員略号,_ご購入金額,_お支払い金額]|R]) :- writef('%t\t%t\t%t\n',[_会員略号,_ご購入金額,_お支払い金額]), ご購入金額表明細表示(R). お支払い金額(_会員種別,_ご購入金額,_支払い金額) :- 割引購入(_会員種別,_ご購入金額,_支払い金額),!. お支払い金額(_,_ご購入金額,_お支払い金額) :- _ご購入金額 = _お支払い金額. 会員種別番号(1,一般会員). 会員種別番号(2,特別会員). 会員種別番号(3,非会員). ご購入金額会員略号(一般会員,会). ご購入金額会員略号(特別会員,特). ご購入金額会員略号(非会員,非). 割引購入(一般会員,_ご購入金額,_お支払い金額) :- _お支払い金額 は 四捨五入(_ご購入金額 * 0.1). 割引購入(特別会員,_ご購入金額,_お支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * 0.7). 割引購入(非会員,_ご購入金額,_お支払い金額) :- _ご購入金額 >= 15000, _お支払い金額 は _ご購入金額 - 1000. ご購入金額計(_ご購入金額表,_ご購入金額計,_お支払い金額計) :- findsum([_ご購入金額,_お支払い金額],( member([_,_ご購入金額,_お支払い金額],_ご購入金額表)),[_ご購入金額計,_お支払い金額計]). 全行を項目区切りしながらならびに取る(_ファイル,_区切り文字列ならび,LL) :- open(_ファイル,read,_入力), findall(_項目区切りされた行,( 連続行入力(_入力,_行), (_行 = end_of_file,!,fail;項目区切り(_行,_区切り文字列ならび,_項目区切りされた行))),LL), close(_入力). 連続行入力(_入力,_行) :- repeat, 行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,Codes), 行入力_2(Codes,_行). 行入力_2(end_of_file,end_of_file) :- !. 行入力_2(Codes,_行) :- atom_codes(_行,Codes). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).