このディレクトリの索引

# 出典 :: 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 ←最後の行に合計を出力すること /* date03.dat 1 3200 2 2400 3 4800 2 6500 1 10800 2 18200 3 21400 1 890 1 3900 2 6200 */ :- op(700,xfx,は). 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- 全行を空白区切りしながらならびに取る('data03.dat',_入力データならび), ある日のご購入明細表を出力する(_入力データならび). ある日のご購入明細表を出力する(_入力データならび) :- '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表), 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表). '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表) :- '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表), 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表). '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表) :- findall([_会員略号,_購入金額,_支払い金額],( member([_会員種別番号,_購入金額],_入力データならび), '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額)),_ご購入金額表). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,一般会員,_会員略号), '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.1)). '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,特別会員,_会員略号), '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額). '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.3)). '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,非会員,_会員略号), '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額),!. '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _購入金額 = _支払い金額. '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額) :- _購入金額 >= 15000, _支払い金額 は _購入金額 - 1000. 会員種別番号(_会員種別番号,_会員種別,_会員略号) :- 会員種別番号(_会員種別番号,_会員種別), 会員略号(_会員種別,_会員略号). 会員種別番号(1,一般会員). 会員種別番号(2,特別会員). 会員種別番号(3,非会員). 会員略号(一般会員,会). 会員略号(特別会員,特). 会員略号(非会員,非). 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表) :- write('\n種別\t 購入金額(円)\t支払い金額(円)\n'), ご購入金額表明細を10桁右詰めで表示(_ご購入金額表). ご購入金額表明細を10桁右詰めで表示(_ご購入金額表) :- forall( member([_会員略号,_購入金額,_支払い金額],_ご購入金額表), '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額)). '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額) :- '10桁の右詰めの数値文字列に変換'(_購入金額,_支払い金額,_購入金額表示文字列,_支払い金額表示文字列), writef('%w\t%w\t%w\n',[_会員略号,_購入金額表示文字列,_支払い金額表示文字列]). 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表) :- 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計), '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計). '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計) :- '10桁の右詰めの数値文字列に変換'(_購入金額計,_支払い金額計,_購入金額計表示文字列,_支払い金額計表示文字列), writef('-----------------------------------------\n合計\t%w\t%w\n',[_購入金額計表示文字列,_支払い金額計表示文字列]). 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計) :- 購入金額計(_ご購入金額表,_購入金額計), 支払い金額計(_ご購入金額表,_支払い金額計). 購入金額計(_ご購入金額表,_購入金額計) :- findsum(_購入金額,( member([_,_購入金額,_],_ご購入金額表)),_購入金額計). 支払い金額計(_ご購入金額表,_支払い金額計) :- findsum(_支払い金額,( member([_,_,_支払い金額],_ご購入金額表)),_支払い金額計). 全行を空白区切りしながらならびに取る(_ファイル,_ならび) :- open(_ファイル,read,_入力), findall(_空白区切りされた行,( repeat, (at_end_of_stream(_入力),!,close(_入力),fail; 行入力(_入力,_行), 項目区切り(_行,[' '],_空白区切りされた行))),_ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). _答え は _式 :- 関数定義(_式,_答え),!. _答え は _式 :- _答え is _式.  関数定義(四捨五入(_式),_答え) :- _答え_1 は _式, _答え is floor(_答え_1 + 0.5). '10桁の右詰めの数値文字列に変換'(_数値_1,_数値_2,_10桁の右詰めの数値文字列_1,_10桁の右詰めの数値文字列_2) :- n桁の右詰めの数値文字列に変換(10,_数値_1,_10桁の右詰めの数値文字列_1), n桁の右詰めの数値文字列に変換(10,_数値_2,_10桁の右詰めの数値文字列_2). n桁の右詰めの数値文字列に変換(_n桁,_数値,_n桁の右詰めの数値文字列) :- 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列), 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列). 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列) :- 数値を数値文字列に変換して(_数値,_実質数値文字列), 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). 数値を数値文字列に変換して(_数値,_実質数値文字列) :- atom_number(_実質数値文字列,_数値). 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列) :- n桁の空白文字列(_n桁,_n桁の空白文字列), atom_concat(_n桁の空白文字列,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). n桁の空白文字列(_n桁,_n桁の空白文字列) :- length(_全ての要素が空白文字のならび,_n桁), 全ての要素が空白文字(_全ての要素が空白文字のならび), atom_chars(_n桁の空白文字列,_全ての要素が空白文字のならび). 全ての要素が空白文字([' ']) :- !. 全ての要素が空白文字([' '|R]) :- 全ての要素が空白文字(R). 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列) :- sub_atom(_一時的に空白文字列を付加された数値文字列,_,_n桁,0,_n桁の右詰めの数値文字列). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).