このディレクトリの索引

% 以下のサイトは # 入力ファイルを読み込み、顧客別売上明細書を出力する # # ・支店が変われば、支店合計を印字し改ページをする # ・顧客が変われば、顧客合計を印字し、1行空白を印字する # ・入力ファイルはソートされているものとする # ・入力ファイル、出力ファイルはコマンドライン引数で受け取る # ・20行を超える場合は、改ページする #  ただし、合計出力途中の場合は20行を超えていても出力する # ・金額出力時のカンマ編集をする # # ・例外処理は、コマンドライン引数が正しくない場合、入力・出力ファイルがオープンできない場合、入力ファイルにデータがない場合の4種類 # # ・突合せ処理(コントロールブレイク>)を使用する # # ・入力ファイルの支店コードから売上金額までクラス分けをする # (クラス分けがよく解りませんが、Cの構造体のようなものを使用せよと言われました) # # ・例外処理を書いたメインメソッド、突合せ処理メソッド、ヘッダメソッドの3つに分ける # # 下記の処理をヘッダメソッドとする # ここから # 帳票明細 # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # ここまで # # # # ☆入力ファイル例 # ?支店コード ?支店名 ?販売日 ?販売先コード ?販売先名 ?売上金額 # # # 001 東京 20090601 0001 田中商店  1000 # 001 東京 20090602 0001 田中商店  5000 # 001 東京 20090603 0001 田中商店  10000 # 001 東京 20090601 0002 山田スーパー  3000 # 002 沖縄 20090604 0001 沖縄商店  7000 # ☆出力ファイル例 # # 帳票明細 # # 001 東京 支店 出力日6月21日(出力した日)  P.1 # (空白行 1行) # 販売先 販売日 販売金額 # --------------------------------------------------------------- # 0001 田中商店 6月1日 1,000 # 0001 田中商店 6月2日 5,000 # 0001 田中商店 6月3日 10,000 # ---------------------------------------------------------------- # 販売合計 件数 3 16,000 # (空白行 1行) # 0002 山田スーパー 6月1日 3,000 # ---------------------------------------------------------------- # 販売合計 件数 1 3,000 # (空白行 1行) #    **支店合計 件数 4 19,000 # # # # # 帳票明細 # 002 沖縄 支店 出力日6月21日(出力した日)  P.2 # (空白行 1行) # 販売先 販売日 販売金額 # ---------------------------------------------------------------- # 0001 沖縄商店 6月4日 7,000 # ---------------------------------------------------------------- # 販売合計 件数 1 7,000 # (空白行 1行) #    **支店合計 件数 1 7,000 #    ***総合計 件数 5 26,000 # # # # 入力ファイルを以下のように変更しましょう。 顧客別売上明細書を出力する :- 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3), コントロールブレイク(L1,L2,L3,0,0,0,0,0,0,0). 入力ファイルを読み込む(F1,F2,F3,L1,L2,L3) :- get_lines(F1,L1), get_lines(F2,L2), get_lines(F3,L3). コントロールブレイク([L1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(6,L1,[],L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), write('---------------------------------------------------------------\n'), 改頁制御(_頁1,_頁2,_行1,_行2,L2,L3), 販売先合計表示(_行2,_行3,CX5,SX5), 改頁制御(_頁2,_頁3,_行3,_行4), 支店合計表示(_行4,_行5,CX4,SX4), 改頁制御(_頁3,_頁4,_行5,_行6), 総合計表示(_行3,_,CX3,SX3),!. コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(1,L1,L12,L2,L3), 合計加算(L1,SX1,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,[K|R11],L2,L3), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁1,_行1,CX4,CX5,CX6,SX4,SX5,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(2,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細行表示(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行1,_行2,CX5,SX5), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁2,_行2,CX,0,CX6,SX4,0,SX6). コントロールブレイク([L1,L12|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(3,L1,L12,L2,L3), 合計加算(L1,SX,SX2,SX3,SX4,SX5,SX6), 明細印刷(_頁,_頁1,_行,_行1,L1,L2,L3), 販売先合計表示(_頁1,_頁2,_行2,_行3,CX5,SX5), 支店合計表示(_頁2,_頁3,_行4,_行5,CX4,SX4), コントロールブレイク([L12|R1],[L2|R2],[L3|R3],_頁3,0,0,0,CX3,0,0,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(4,L1,_,L2,L3), コントロールブレイク([L1|R1],R2,[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3),!. コントロールブレイク([L1|R1],[L2|R2],[L3|R3],_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3) :- コントロールブレイクパターン(5,L1,_,L2,L3), コントロールブレイク([L1|R1],[L2|R2],R3,_頁,_行,CX1,CX2,CX3,SX1,SX2,SX3). コントロールブレイクパターン(1,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(2,L1,L12,L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(売上明細,L12,[KL1,KL12|_]), not(KL11=KL12), 鍵項目(支店名L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. コントロールブレイクパターン(3,L1,L12,_,_) :- 鍵項目(売上明細,L1,[KL1,_|_]), 鍵項目(売上明細,L12,[KL12,_|_]), not(KL1=KL12),!. コントロールブレイクパターン(4,L1,_,L2,_) :- 鍵項目(売上明細,L1,[KL1|_]), 鍵項目(支店名,L2,[KL2|_]), KL1 @> KL2,!. コントロールブレイクパターン(5,L1,_,_,L3) :- 鍵項目(売上明細,L1,[_,KL11|_]), 鍵項目(販売先名,L3,[KL3|_]), KL11 @> KL3,!. コントロールブレイクパターン(6,L1,[],L2,L3) :- 鍵項目(売上明細,L1,[KL1,KL11|_]), 鍵項目(支店名,L2,[KL1|_]), 鍵項目(販売先名,L3,[KL11|_]),!. 鍵項目(売上明細,[_支店コード,_,_販売先コード|_],[_支店コード,_販売先コード]). 鍵項目(支店名,[_支店コード|_],[_支店コード]). 鍵項目(販売先名,[_販売先コード|_],[_販売先コード]). 明細行表示(_頁,_次の頁,0,_次の行,L1,L2,L3) :- 鍵項目(支店名,L2,[_支店コード,_支店名|_]), 今日(_今日), sub_atom(_今日,4,2,_,_月), sub_atom(_今日,6,2,_,_日), 支店名見出し(_支店コード,_支店名,_月,_日,_頁), 明細行表示(_頁,_頁,0,6,L1,L2,L3),!. 明細行表示(_頁,_次の頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 > 20, _頁1 is _頁 + 1, 明細行表示(_頁1,_次の頁,1,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3),!. 明細行表示(_頁,_頁,_行,_次の行, [_支店コード,_支店名,_販売日,_販売先コード,_販売先名,_売上金額], L2,L3) :- _行 < 20, sub_atom(_販売日,4,2,_,_月), sub_atom(_販売日,6,2,_,_日), カンマの挿入(10,_売上金額,_カンマ付き売上金額), write_formatted('%4d %-30s%2d月%2d日 %t\n',[_販売先コード,_販売先名,_月,_日,_カンマ付き販売金額]), _次の行 is _行 + 1,!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 支店合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 支店合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' **支店合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 販売先合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _頁1 is _頁 + 1, 販売先合計表示(_頁1,_次の頁,1,_次の行,_件数,_合計),!. 販売先合計表示(_頁,_頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計金額,_カンマ付き合計金額), write(' 販売合計 件数 %2d %t\n',[_件数,_カンマ付き合計金額]),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 > 20, 改頁, _次の頁 is _頁 + 1, 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計),!. 総合計表示(_頁,_次の頁,_行,_次の行,_件数,_合計) :- _行 =< 20, _次の行 is _行 + 1, カンマの挿入(10,_合計,_カンマ付き合計), write_formatted(' 総合計 %t\n',[_カンマ付き合計]). 帳票明細見出し :- write('\n 帳票明細\n'). 支店名見出し(_支店コード,_支店名,_月,_日,_頁) :- write_formatted('\n%t %t 出力日%2d月%2d日 P.2d\n\n',[_支店コード,_支店名_月,_日,_頁]), write(' 販売先 販売日 販売金額\n'). write('---------------------------------------------------------------\n'). 明細行項目(L1,_支店コード,_販売日,_販売先コード,_売上金額) :- sub_atom(L1,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L1,3,8,A2),A2 = _販売日, sub_atom(L1,11,6,A3),atom_to_term(A3,_販売先コード), sub_atom(L1,19,8,A4),atom_to_term(A4,_売上金額). 支店名項目(L2,_支店コード,_支店名) :- sub_atom(L2,0,3,A1),atom_to_term(A1,_支店コード), sub_atom(L2,3,10,_支店名). 販売先名項目(L3,_販売先コード,_販売先名) :- sub_atom(L3,0,6,A),atom_to_term(A3,_販売先コード), sub_atom(L3,6,30,_販売先名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% カンマの挿入(_表示桁数,_数値,_表示文字列) :- number(_数値), number_codes(_数値,Codes), atom_codes(_数値文字列,Codes), カンマの挿入(_表示桁数,_数値文字列,_表示文字列),!. カンマの挿入(_表示桁数,_数値文字列,_表示文字列) :- atom_chars(_数値文字列,_数値文字ならび), 正数部の長さ(_数値文字ならび,_数値桁数), カンマの挿入の二(_数値桁数,_数値文字ならび,_空白のない数値ならび), length(_空白のない数値ならび,_空白のない数値ならびの桁数), _空白数 is _表示桁数 - _空白のない数値ならびの桁数, 空白文字を連結する(_空白数,_空白のない数値ならび,_表示文字列),!. カンマの挿入の二(0,X,X) :- ! . カンマの挿入の二(1,X,X) :- ! . カンマの挿入の二(N,[-|R],[-|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[ |R],[ |R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A,,|R1]) :- M is N - 1, 0 is M mod 3, カンマの挿入の二(M,R,R1),! . カンマの挿入の二(N,[A|R],[A|R1]) :- M is N - 1, カンマの挿入の二(M,R,R1),! . 正数部の長さ([],0) :- !. 正数部の長さ([.|_],0) :- !. 正数部の長さ([_|R],N) :- 正数部の長さ(R,M), N is M + 1,!. 空白文字を連結する(N,[_|R],_表示文字列) :- N < 0, M is N + 1, 空白文字を連結する(M,R,_表示文字列),!. 空白文字を連結する(0,_表示文字ならび,_表示文字列) :- 文字列の結合(_表示文字ならび,_表示文字列),!. 空白文字を連結する(N,_表示文字ならび,_表示文字列) :- M is N - 1, 空白文字を連結する(M,[' '|_表示文字ならび],_表示文字列),!. 改頁 :- char_code(C,12), write_formatted('%c',[C]),!. % 以下のサイトは % *** user: '暫定税率版軽油引取税' / 5 *** 暫定税率版軽油引取税(_顧客番号,_日付下限,_日付上限,_軽油数量合計,_軽油引取税) :- 日付範囲に変数が来たら出荷日と単一化([_日付下限,_日付上限],_出荷日), findsum(_数量, ( 売上('A','1',_出荷日,_顧客番号,_商品番号,_数量,_単価,_金額,_入力時刻), _出荷日 @>= _日付下限, _出荷日 @=< _日付上限, 暫定税率適用期間(_出荷日), member(_商品番号,['0004','0014'])), _軽油数量合計), '1L当たり軽油引取税'(_出荷日,_1L当たり軽油引取税), 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税). 暫定税率版軽油引取税(_顧客番号,_日付下限,_日付上限,0.0,0.0). 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税) :- 軽油引取税切り捨て計算顧客(_顧客番号), _軽油引取税 は 切り捨て(_軽油数量合計 * _1L当たり軽油引取税). 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税) :- \+(軽油引取税切り捨て計算顧客(_顧客番号)), _軽油引取税 は 四捨五入(_軽油数量合計 * _1L当たり軽油引取税). 暫定税率適用期間(_日付) :- _日付 @< '20080401',!. 暫定税率適用期間(_日付) :- _日付 @> '20080430',!. '1L当たり軽油引取税'(_日付,32.1) :- _日付 @>= '19931201'. '1L当たり軽油引取税'(_日付,25.3) :- _日付 @=< '19931130'. 日付範囲に変数が来たら出荷日と単一化([],_) :- !. 日付範囲に変数が来たら出荷日と単一化([A|R],_出荷日) :- var(A), A=_出荷日, 日付範囲に変数が来たら出荷日と単一化(R,_出荷日). 日付範囲に変数が来たら出荷日と単一化([A|R],_出荷日) :- \+(var(A)), 日付範囲に変数が来たら出荷日と単一化(R,_出荷日). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1245853701/764 # [1] 授業単元:プログラミング入門 # [2] 問題文(含コード&リンク): # 問3:1週間の売り上げ一覧を表示するプログラムを作成せよ。 #    実行例  野菜の1週間の売り上げた合計数量と合計金額 #                             合計  合計 #         種類 単価 月 火 水 木 金 土 日 数量  金額 #         レタス 150 50 55 60 65 70 75 80 455  68250 #         トマト  50 20 25 30 35 40 45 50 245  12250 #         もやし  20 10 15 20 25 30 35 40 175  3500 #         ナスビ  40 5  10 15 20 25 30 35 140  5600 週計表(_起点日付,_起点曜日,_終点日付,_終点曜日) :- 週計表見出し表示(_起点日付,_起点曜日,_終点日付,_終点曜日), 週計表商品表示順(_商品名), 週計表明細表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日), fail. 週計表(_,_,_,_). 週計表見出し表示(_起点日付,_起点曜日,_終点日付,_終点曜日) :- write('種類 単価'), 曜日見出し文字列(_起点日付,_起点曜日,_終点日付,_終点曜日,_曜日文字列), writef('%t 数量合計 金額合計\n',[_曜日文字列]). '数量・金額合計と平均単価を得る'(_商品名,_起点日付,_終点日付,_数量合計,_金額合計,_平均単価) :- 商品別数量合計(_商品名,_起点日付,_終点日付,_数量合計), \+(_数量合計 = 0), 商品別金額合計(_商品名,_起点日付,_終点日付,_金額合計), _平均単価 is truncate(round(_金額合計 / _数量合計)),!. 週計表明細表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日) :- '数量・金額合計と平均単価を得る'(_商品名,_起点日付,_終点日付,_数量合計,_金額合計,_平均単価), writef('%10s %4d ',[_商品名,_平均単価]), 曜日別数量表示(_商品名,_起点日付,_起点曜日,_終点日付,_終点曜日), writef('%6d %6d\n',[_数量合計,_金額合計]),!. 曜日別数量表示(_商品名,_日付,_曜日,_日付,_曜日) :- !. 曜日別数量表示(_商品名,_日付,_曜日,_終点日付,_終点曜日) :- 日計売上(_日付,_商品名,_数量), writef('%4d ',[_数量]), '前日・今日'(_日付,_曜日,_翌日,_翌日の曜日), 曜日別数量表示(_商品名,_翌日,_翌日の曜日,_終点日付,_終点曜日). 商品別数量合計(_起点日付,_終点日付,_数量合計) :- findsum(_数量,( 日計売上(_商品名,_日付,_数量), _日付 @>= _起点日付, _日付 @=< _終点日付)), _数量合計浮動小数点数), _数量合計 is truncate(_数量合計浮動小数点数). 商品別金額合計(_起点日付,_終点上限,_金額合計) :- findsum(_金額,( 日計売上(_商品名,_日付,_数量), _日付 @>= _起点日付, _日付 @=< _終点日付), 単価取得(_商品名,_日付,_単価), _金額 is _数量 * _単価)), _金額合計浮動小数点数), _金額合計 is truncate(_金額合計浮動小数点数). 単価取得(_商品名,_商品名,_日付,_単価) :- 単価(_商品名,_日付下限,_日付上限,_単価), _日付 @>= _日付下限, _日付 @=< _日付上限,!. 単価取得(_商品名,_商品名,_日付,_単価) :- 既定単価(_商品名,_単価). 曜日見出し文字列(_終点日付,_終点曜日,_終点日付,_終点曜日,_文字列) :- concat_atom([' ',_終点曜日,' '],_文字列),!. 曜日見出し文字列(_日付,_曜日,_終点日付,_終点曜日,_文字列) :- concat_atom([' ',_曜日,' '],文字列1), '前日・今日'(_日付,_曜日,_翌日,_翌日の曜日), 曜日見出し文字列(_翌日,_翌日の曜日,_終点日付,_終点曜日,_文字列2). concat_atom([_文字列1,_文字列2],_文字列). 日計売上(2009 / 6 / 29,もやし,10). 日計売上(2009 / 6 / 29,トマト,20). 日計売上(2009 / 6 / 29,ナスビ,5). 日計売上(2009 / 6 / 29,レタス,50). 日計売上(2009 / 6 / 30,もやし,15). 日計売上(2009 / 6 / 30,トマト,25). 日計売上(2009 / 6 / 30,ナスビ,10). 日計売上(2009 / 6 / 30,レタス,55). 日計売上(2009 / 6 / 30,ルッコラ,10). 日計売上(2009 / 7 / 1,もやし,20). 日計売上(2009 / 7 / 1,トマト,30). 日計売上(2009 / 7 / 1,ナスビ,15). 日計売上(2009 / 7 / 1,レタス,60). 日計売上(2009 / 7 / 2,もやし,25). 日計売上(2009 / 7 / 2,トマト,35). 日計売上(2009 / 7 / 2,ナスビ,20). 日計売上(2009 / 7 / 2,レタス,65). 日計売上(2009 / 7 / 2,ルッコラ,5). 日計売上(2009 / 7 / 3,もやし,30). 日計売上(2009 / 7 / 3,トマト,40). 日計売上(2009 / 7 / 3,ナスビ,25). 日計売上(2009 / 7 / 3,レタス,70). 日計売上(2009 / 7 / 4,もやし,35). 日計売上(2009 / 7 / 4,トマト,45). 日計売上(2009 / 7 / 4,ナスビ,30). 日計売上(2009 / 7 / 4,レタス,75). 日計売上(2009 / 7 / 5,もやし,40). 日計売上(2009 / 7 / 5,トマト,50). 日計売上(2009 / 7 / 5,ナスビ,35). 日計売上(2009 / 7 / 5,レタス,80). 週計表商品表示順(レタス). 週計表商品表示順(トマト). 週計表商品表示順(ルッコラ). 週計表商品表示順(ルバーブ). 週計表商品表示順(ナスビ). 週計表商品表示順(もやし). 単価(レタス,2009/6/1,2009/6/30,150). 単価(レタス,2009/7/1,2009/7/10,120). 単価(トマト,2009/6/1,2009/7/3,50). 単価(トマト,2009/7/4,2009/7/10,60). 単価(もやし,2009/6/1,2009/7/10,20). 単価(ナスビ,2009/6/1,2009/7/10,40). 単価(ルッコラ,2009/6/1,2009/7/3,80). 単価(ルッコラ,2009/7/4,2009/7/10,100). 単価(ルバーブ,2009/6/1,2009/7/10,120). 既定単価(レタス,150). 既定単価(トマト,50). 既定単価(もやし,20). 既定単価(ナスビ,40). 既定単価(ルッコラ,80). 既定単価(ルバーブ,120). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '前日・今日'(_前日の年 / 12 / 31,_前日の曜日,_年 / 1 / 1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / 2 / 29,_前日の曜日,_年 / 3 / 1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / 2 / 28,_前日の曜日,_年 / 3 / 1,_曜日) :- \+('うるう年'(_年)), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _前月 / 30,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _前月 / 31,_前日の曜日,_年 / _月 / 1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_年 / _月 / _前日,_前日の曜日,_年 / _月 / _日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. '前日・今日'(_前日の年 / 12 / 31,_年 / 1 / 1) :- 一つ違い(_前日の年,_年),!. '前日・今日'(_年 / 2 / 29,_年 / 3 / 1) :- 'うるう年'(_年),!. '前日・今日'(_年 / 2 / 28,_年 / 3 / 1) :- \+('うるう年'(_年)),!. '前日・今日'(_年 / _前月 / 30,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]),!. '前日・今日'(_年 / _前月 / 31,_年 / _月 / 1) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]),!. '前日・今日'(_年 / _月 / _前日,_年 / _月 / _日) :- 一つ違い(_前日,_日),!. 一つ違い(M,N) :- integer(M), !, N is M + 1 . 一つ違い(M,N) :- integer(N), !, M is N - 1 . 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/689 # [2] 問題文(含コード&リンク): POSデータ解析システムを作ってみよう # K氏は、3つのコンビニエンスストア(X店、Y店、Z店)をチェーン店に持つオーナーです。コンビ # ニエンスストアの経営において、売れ筋商品と死に筋商品の的確な把握は死活問題に直結する重要な業務 # です。そこでK氏は、チェーン店に、毎日どんな商品がどれくらい売れたのかといった販売情報を、CS # Vファイルとして送るように指示していました。しかし、送られてくるデータファイルは膨大であり、そ # れらを統合して、全店を通して最も売れた商品はどれで、何が売れていないかを把握することは困難でし # た。つまり、送られてくるデータを適切に活用できないでいました。そこで、K氏はあなたに、こういっ # たことを解決するシステム(POSデータ解析システム)を開発するように頼みました。K氏は、毎日送 # られてくるX、Y、Z店の個別の販売情報を合計した一括データを入手したいそうです。 # <第1ステップ> # まず、あなたは、各店舗から送ってもらうCSV ファイル名を以下のようにするよう、お願いしました。 # X店=data-x.csv Y店=data-y.csv Z店=data-z.csv # また、商品名(全100 品種)は必ず以下の形式で入力するように指示しました。 # 「 Item-00 」から「 Item-99 」までの半角7文字 # さらに、各店から送られてくるレコードのフィールドは、以下の項目にして、売上時刻順に並べてもら # うよう、お願いしました。以下のようなCSV ファイルが送られてくることになります。 # 売上時刻 商品名 売上個数 # 0:12,Item-42,2 # 0:12,Item-03,1 # 0:49,Item-92,3 # ・ # ・ # 23:38,Item-80,1 # また、毎日送られてくるCSVファイルとは別に、単価情報が格納された tanka.csv ファイルを作りま # した。このファイルのレコードのフィールドは、次のようになっていて、商品名順に並んでいます。 # 商品名 単価 # Item-00,150 # Item-01,120 # ・ # Item-99,230 # 最後に、K 氏に提供する統合ファイル(data-all.csv)のレコードの中身は以下のようにして、商品名 # の小さい順にレコードを作りました。 # 商品名 単価 総売上個数 売上高 # ここで、大事なことは、売上情報を統合することです。例えば、単価150 円のItem-23 という商品が、 # X 店では15 個、Y 店では、25 個、Z 店では10 個売れたとすると、以下のようになっているということです。 # Item-23,150,50,7500 # また、全店舗を通して1 個も売れなかった商品情報は載せないことにしました。 # # # <第2ステップ> # K氏から、data-all.csv のレコードの中身を以下のように変更し、レコードを並べる順番も、これまで # の商品名順ではなく、売上順位の高い順にして欲しいと要望がありました。 # 売上順位 商品名 単価 総売上個数 売上高 全売上高にしめる割合(%) # 全売上高とは、全商品の売上高の合計です。全売上高にしめる割合の有効数字は4 桁(10%未満の場合は # 3 桁)にします。例えば、全売上高が100 万円で、該当商品の売上高が12,345 円だとすると、割合(%) # は 1.23 となります。 # 売上順位は、同じ売上高の場合は同一順位とします。 # 例えば、data-all.csv ファイルは次のようになります。 # 1,Item-23,150,50,7500,10.71 # 2,Item-52,240,30,7200,10.28 # 2,Item-53,360,20,7200,10.28 # 4,Item-14,230,30,6900,9.85 # ・ t589_1 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第1ステップ(XL,YL,ZL,TL,_集約ならび), _集約情報から統合ファイル出力(_集約ならび). t589_2 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第2ステップ(XL,YL,ZL,TL,_集約ならび), 集約情報から金額順位順統合ファイル出力(_集約ならび). 基礎情報を得る(TL,XL,YL,ZL) :- get_split_lines('tanka.csv',[',',' '],TL), get_split_lines('data-x.csv',[',',' '],XL), get_split_lines('data-y.csv',[',',' '],YL), get_split_lines('data-z.csv',[',',' '],ZL),!. '3つのコンビニエンスストアの情報を集約する第1ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならび). '3つのコンビニエンスストアの情報を集約する第2ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならびの一), rsort(_集約ならびの一,_金額合計で整列した集約ならび), 総売上金額を得る(_集約ならびの一,_総売上金額), 順位売上比率付き集約ならび(1,1,_金額合計で整列した集約ならび,_集約ならび). 総売上金額を得る(_集約ならびの一,_総売上金額) :- findsum(_金額合計,member([_金額合計,_,_,_],_集約ならびの一),_総売上金額). 順位売上比率付き集約ならび(_,_,_,[],[]) :- !. 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D],[A|R2]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(M,N2,[[A|R2]|R3],R4). 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(N2,N2,R3,R4). 集約情報から統合ファイル出力(L) :- open('data-all.csv',write,Output), ( member([_商品名,_単価,_数量,_金額],L), concat_atom([_商品名,_単価,_数量,_金額],',',S), write_formatted(Output,'%t\n',[S]), fail; close(Output), ),!. 集約情報から金額順位順統合ファイル出力([]). 集約情報から金額順位順統合ファイル出力([[A,B,C,D,E,F]|R]) :- F2 is round(F * 100.0) / 100, write_formatted_atom(S,'%t,%t,%t,%t,%t,%.2f',[A,B,C,D,E,F2]), write_formatted('%t\n',[S]), 集約情報から金額順位順統合ファイル出力(R). 商品合計数量を得る(_商品名,_合計数量) :- findsum(_数量,member([_,_商品名,_数量],_合計数量). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 売上の存在する商品名を得る(L1,_商品名ならび), member(_商品名,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member([_商品名,_単価],TL), member([_,_商品名,_数量],L1), _金額 is _数量 * _単価), _集約ならび). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 商品名のみ選択([],[]) :- !. 商品名のみ選択([[_,A,_]|R1],[A|R2]) :- 商品名のみ選択(R1,R2). rsort(L,L2) :- sort(L,L1), reverse(L1,L2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/157 # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- get_split_lines(_ファイル名,[','],L), L = [[_,A,_,_,_]|_], 不整合が生じた行(L,A,_それ以前のならび,_不整合が生じた行,_それ以後のならび), reverse(_それ以前のならび,_逆順のそれ以前のならび), _不整合が生じた行 = [_,_前月繰越高,_,_,_], 不整合が生じる以前の行を遡って修正(_前月繰越高,_逆順のそれ以前のならび,[],L2), append(L2,[_不整合が生じた行|_それ以後のならび],_整合されたならび), 書き戻し(_ファイル名,_整合されたならび). 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高2,[],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],R1) :- \+(_前月繰越高2 = _前月繰越高),!. 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3) :- _当月繰越高 is _前月繰越高 - _当月入金高 + _当月売上高, 不整合が生じた行(R1,_当月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3). 不整合が生じる以前の行を遡って修正(_,[],L,L) :- !. 不整合が生じる以前の行を遡って修正(_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],L1,L2) :- _前々月繰越高 is _前月繰越高 - 当月売上高 + _当月入金高, 不整合が生じる以前の行を遡って修正(_前々月繰越高,[[_顧客名,_前々月繰越高,_当月入金高,_当月売上高,_締め日付]|L1],L2). 書き戻し(_ファイル名,_整合されたならび) :- tmpnam(TMPNAMFILE), open(TMPNAMFILE,write,Output), 仮ファイルに書く(Output,_整合されたならび), close(Output), cp(TMPNAMFILE,_ファイル名). 仮ファイルに書く(Output,_整合されたならび), member(L,_整合されたならび), concat_atom(L,',',S), write_formatted(Output,'%t\n',[S]), fail. 仮ファイルに書く(_,_). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/754 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 入力されたデータをもとに売上明細を作成して表示する。 # 入力データは商品名と金額で、最大20件とし、^zで終了する。 # 入力されたデータは構造体配列に記録し、 # 入力終了後金額を集計して合計を表示する。 # <構造体メンバ> # 商品名:char型10桁 # 金額:long型 # <実行結果> # ^z # 商品名    金額 # パソコン   248500 # ラジオ     3200 # テレビ    120500 # オーディオ  314000 # レイゾウコ   65800 # クーラー    79000 # 合計    831000 # 入力されたデータをもとに売上明細を作成して表示する :- 売上データの収集(_収集されたデータ), findsum(_金額,member([_,_金額],_収集されたデータ),_金額合計), write('商品名 金額\n'), 明細表の印刷(_収集されたデータ,_金額合計),!. 売上データの収集(_収集されたデータ) :- write('商品名と金額をカンマで区切って入力してください\n'). findall([A2,B], ( for(1,N,10),get_line(Line), ( Line=end_of_file,!,fail; split(Line,[','],[A,B]), '10桁の文字列'(A,A2))),_収集されたデータ),!. 明細表の印刷([],_金額合計) :- write_formatted('%10s %10d\n',[金額合計,_金額合計]). 明細表の印刷([[_商品名,_金額]|R],_金額合計) :- write_formatted('%10s %10d\n',[_商品名,_金額]), 明細表の印刷(R,_金額合計). '10桁の文字列'(_文字列,_10桁の文字列) :- atom_chars(_文字列,Chars), length(L,10), apend(Chars,L1,L), all(L1,' '), atom_chars(_10桁の文字列,L),!. '10桁の文字列'(_文字列,_10桁の文字列) :- sub_atom(_文字列,0,10,_,_10桁の文字列). % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1252492296/599 # 以下のSQLで最新日の2000円以上の売上があった商品を抽出しているんですが、 # SELECT * FROM SALES WHERE uriage >= 2000 AND date = (select max(date) from SALES) # 「その商品の前回売上があった日の売上額」と「前回の売上と比べてどれだけ増えたのかの増加率」 # を出したい場合どうしたらいいでしょう? # # 商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率 # 3 | 1267714800 | 2500 | ????? | ????? # 4 | 1267714800 | 2800 | ????? | ????? # # [日付の形式はunixtimeで、データ登録の際は日付だけ変更させ、時間と秒は常に統一させています] # [mysql 5.1] # 前回売上との比較売上表(_年/_月/_日) :-     findall(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび), sort(_売上のあった商品IDならび     member(_商品ID2,_売上のあった商品IDならび),     当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),     前回売上があった日(_商品ID2,_日付,_前回売上があった日),     前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),     売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),     fail. 前回売上との比較売上表(_,_,_). 前回売上があった日(_商品ID,_日付,_前回売上があった日) :-     localtime(_日付,_年1,_月1,_日1,_,_,_,_),     findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日). 前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計). 当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計). 売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-     write_formatted('%8d | %2d/%2d/%2d | %12.0f\n',[_商品ID2,_年/_月/_日,_売上金額計]),!. 売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-     _売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,     write_formatted('%8d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!. % 以下のサイトは http://pc11.2ch.net/test/read.cgi/db/1252492296/922 # 売上データベースがあって、主テーブルの項目は、売上番号、得意先名、日付。 # 明細テーブルの項目は、明細番号、売上番号、商品、個数。売上番号で1対多でリンクしています。 # 商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力したいです。 # ただし得意先名は同名を1とカウントしたいのです。 # SELECT 明細.商品, Sum(明細.個数) AS 個数計, Count(主.得意先) AS 得意先計 # FROM 主 INNER JOIN 明細 ON 主.売上番号 = 明細.売上番号 # WHERE 主.日付 Between '5/1/2010' And '5/4/2010' # GROUP BY 明細.商品 # HAVING 明細.商品='えんぴつ' or 明細.商品='筆'; # とすると、得意先計が複数カウント(同名は1とならない)してしまいます。 # どのように書いたらよいのでしょうか。 # '商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力する'(_商品ならび,_日付下限,_日付上限,X) :- findall([_商品,_個数,_得意先名],(主(_売上番号,_得意先名,_日付),明細(_明細番号,_売上番号,_商品,_個数),member(_商品,_商品ならび),_日付@>=_日付下限,_日付@=<_日付上限),_選択ならび), findsetof([_商品,_得意先名],member([_商品,_個数,_得意先名],_選択ならび),_鍵ならび), findall([_商品,_個数計,_得意先名],(member([_商品,_得意先名],_鍵ならび),findsum(_個数,member([_商品,_個数,_得意先名],_選択ならび),_個数計)),X). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/364 # 商品コード|売上店舗|売上個数 # # というテーブルから、 # 店舗毎の売上をまとめた列を追加した以下のようなテーブルを作りたいです。 # # 商品コード|店舗a売上個数|店舗b売上個数|店舗c売上個数| # # 現在は店舗毎の売上を集計したテーブルを別に作って、それを結合させて作っていますが、それ以外で単一のsqlで書く場合どうなるでしょうか? # # 簡単かと思ったら思いつきません。。 # お願いします。 # # # '商品コード|店舗a売上個数|店舗b売上個数|店舗c売上個数|'(_商品番号・売上店舗別売上合計ならび) :- findsetof(_商品番号,商品売上(_商品番号,_,_),L1), findall([_商品番号|_店舗別売上合計ならび],( member(_商品番号,L1), findall(_店舗別売上合計ならび,( member(_売上店舗,[a,b,c]), findsum(_売上個数, 商品売上(_商品番号,_売上店舗,_売上個数), _店舗別売上合計ならび))), _商品番号・売上店舗別売上合計ならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1272006124 # <問題> # 全社員が売上を記録した日を求めよ。 # これを Prolog プログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). '全社員が売上を記録した日を求めよ。'(_全社員が売上を記録した日) :- findsetof(_日,売上(_,_日),L), member(_全社員が売上を記録した日,L), forall(社員(_社員),売上(_社員,_全社員が売上を記録した日)). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L) . % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1272006124 # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 全社員が売上を記録した日を求めよ(_日) :- count(社員(_社員),_社員人数), findsetof(_日,売上(_社員,_日,_データ),L1), append(_,[_日|R],L1), findsetof(_社員,社員(_社員,_日,_データ),L2), length(L2,_社員人数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). ならび加算([],L,L) :- !. ならび加算(L,[],L) :- !. ならび加算([A|R],[B|R1],[C|R2]) :- C is A + B, ならび加算(R,R1,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1272006124 # <問題> # 全社員が売上を記録した日を求めよ。 # これを SEQUEL プログラムとして表現しなさい。    URIAGE  ( SYAIN ) HIZUKE   S#  S# % 以下のサイトは http://hibari.2ch.net/test/read.cgi/db/1274791771/607 # MySQLServer5.1(WinXP)です。 # # 下記のような3種類のテーブルがあります。 # これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 # # こんな感じに。 # # +--+--------+----------+-------+-----+ # | id | username| date   | access | sales | # +--+--------+----------+-------+-----+ # | 1 | admin | 2010-11-13 |   2 | 5000 | # | 1 | admin | 2010-11-14 |   2 | 5000 | # | 1 | admin | 2010-11-15 |  1 | 20000 | # +--+--------+----------+-------+-----+ # # # SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales # FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id # WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; # とやってみたのですがダメでした;; # # # ■ユーザー情報テーブル # mysql> select id,username from user; # +--+---------+ # | id | username | # +--+---------+ # | 1 | admin   | # +--+---------+ # # ■アクセスログテーブル # mysql> select * from access_log; # +--+-------+--------+------------------+ # | id | user_id | ip     | created_at      | # +--+-------+--------+------------------+ # | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | # +--+-------+--------+------------------+ # # ■売上げ金額テーブル # mysql> select * from sales; # +--+-------+------+------------------+ # | id | user_id | amount| created_at      | # +--+-------+------+------------------+ # | 1 | admin  |  5000 | 2010-11-13 21:56:54 | # | 2 | admin  |  5000 | 2010-11-14 21:56:54 | # | 3 | admin  |  5000 | 2010-11-15 21:56:54 | # | 4 | admin  |  5000 | 2010-11-15 21:56:54 | # +--+-------+------+------------------+ # # '下記のような3種類のテーブルがあります。これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。'(_username) :- user(_id,_username), アクセスログテーブル_date(_username,_アクセスログ_dateならび), 売上げ金額テーブル_date(_username,_売上金額テーブル_dateならび), 共通部分(_アクセスログ_dateならび,_売上金額テーブル_dateならび,_date_共通部分), write('+--+-------+--------+------------------+ \n'), write('| id | user_id | amount| created_at      | \n'), write('+--+-------+------+------------------+ \n), append(L0,[_date|R],_date_共通部分), length(L0,Len0), _id is Len0 + 1, count(( access_log(_,_user_id,_ip,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _access), findsum(_amount,( sales(_,_user_id,_amount,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _sales), write_formatted('| %t | %t | %t | %t | %t |\n',[_id,_username,_date,_access,_sales]), R = [], write('+--+-------+------+------------------+\n'). アクセスログテーブル_date(_user_id,_dateならび) :- findsetof(_date,( access_log(_,_user_id,_,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). 売上げ金額テーブル_date(_user_id,_dateならび) :- findsetof(_date,( sales(_,_user_id,_amount,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1296387672/580 # [1]授業単元:プログラミング # [2]問題文 # 担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。 # [3]環境 #  [3.1]OS:Windows #  [3.2]コンパイラ名 Borland C++ compiler 5.5 #  [3.3]言語:C # [4]期限:無期限 # '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。' :- abolish(担当者別売上/2), 担当者名と売上を入力する(_担当者名,_売上), '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名,_売上),!. '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。' :- 担当者別売上合計の表示, 売上合計の表示. 担当者名と売上を入力する(_担当者名,_売上) :- write('担当者名を入力してください : '), get_line(_担当者名), \+(_担当者名 = 'END'), write('売上を入力してください : '), get_integer(_売上),!. '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名,売上) :- assertz(担当者別売上(_担当者名,_売上)), 担当者名と売上を入力する(_担当者名2,_売上2), '担当者名が"end"になる迄、担当者名と売上を入力する。売上合計を求める。'(_担当者名2,売上2). 担当者別売上合計の表示 :- findsetof(_担当者,( 担当者別売上(_担当者,_)), _担当者ならび), append(_,[_担当者|R],_担当者ならび), findsum(_売上,担当者別売上(_担当者,_売上),_担当者別売上合計), wr('担当者:%t,売上合計:%t\n',[_担当者,_担当者別売上合計]), R = []. 売上合計の表示 :- findsum(_売上,担当者別売上(_,_売上),_売上合計), write_formatted('総売上合計は %t です。\n',[_売上合計]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1200175247/927 # n=12 # x=[2,6,20,15,8,21,8,22,15,20,1,15] # y=["Jan","Feb","Mar","Apr","Mey","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] # sx=0 # upper=0 # middle=0 # lower=0 # xmax=0 # xmin=0 # best_x=0 # worst_x=0 # # for i in 0..n-1 # sx=sx+x[i] # end # xave=sx/n # print "Sipments:Total=",sx," Average=",xave,"\n" # puts # for i in 0..n-1 # if x[i] >= xave*1.5 then # upper = upper + 1 # elsif x[i] <= xave*1.5*0.5 # middle = middle + 1 # else x[i] <= xave/2 # lower = lower + 1 # end # end # print "Sales:Upper=",upper," Middle=",middle," Lower=",lower,"\n" # puts # xmax=x[0] # xmin=x[0] # for i in 0..n-1 # if xmax >= x[i] then # best_x = best_x + 1 # else xmin <= x[i] # worst_x = worst_x + 1 # end # end # print "Best Month:",best_x, " Worst Month:",worst_x,"\n" # puts # 出力結果 # Sipments:Total=153 Average=12 # Sales:Upper=4 Middle=5 Lower=3 # Best Month:2 Worst Month:10 # 本当はBest Month:Aug、Worst Month:Novとしたいんですけど、どうしたらいいですか? # やっぱり変数がおかしいんですか?それとも条件の書き方ですか?? 値([2,6,20,15,8,21,8,22,15,20,1,15]). 月表示(['Jan','Feb','Mar','Apr','Mey','Jun','Jul','Aug','Sep','Oct','Nov','Dec']). 月毎の売上分析 :- 値(_値ならび), 月表示(_月表示ならび), 値と月表示を対にする(_値ならび,_月表示ならび,_値・月表示ならび), sum(_値ならび,_合計値), avg(_値ならび,_平均値), 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下), max(_値・月表示ならび,[_Max,_最良月]), min(_値・月表示ならび,[_Min,_最悪月]), writef('合計値=%t,平均値=%t\n',[_合計値,_平均値]), writef('上=%t,中の上=%t,中の下=%t,下=%t\n',[_上,_中の上,_中の下,_下]), writef('最良月=%t,最悪月=%t\n',[_最良月,_最悪月]),!. 値と月表示を対にする([],[],[]). 値と月表示を対にする([_値|R1],[_月表示|R2],[[_値,_月表示]|R3]) :- 値と月表示を対にする(R1,R2,R3). 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下) :- count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5),_上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5 / 2,_値 < _平均値 * 1.5),_中の上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 0.5,_値 < _平均値 * 1.5 / 2),_中の下), count((append(_,[_値|_],_値ならび),_値 < _平均値 * 0.5),_下). % 以下のサイトは # 売上高はお客様の喜びの総和。 # 売上高はお客様の喜びの総和。(_売上高) :- お客様の喜びの総和(_喜びの総和), お客様の喜びの総和それが売上高だ(_喜びの総和,_売上高). お客様の喜びの総和(_喜びの総和) :- お客様の喜びを集める(_お客様の喜びの集まり), 喜びの総和(_お客様の喜びの集まり,_喜びの総和). お客様の喜びを集める(_お客様の喜びの集まり) :- findall(_喜び,( お客様(_お客様), 来場(_お客様), 喜び(_お客様,_喜び)), _お客様の喜びの集まり). 喜びの総和(_お客様の喜びの集まり,_喜びの総和) :- 何らかの集約(_お客様の喜びの集まり,_喜びの総和). お客様の喜びの総和それが売上高だ(_喜びの総和,_売上高) :- 深淵なる関係(_喜びの総和,_売上高). %% 以後は事実上未定義 何らかの集約(X,X). 深淵なる関係(X,X). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/897 # [1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): # 次の表のデータを構造体(shouhin)に格納して、商品コードを入力し、 # 該当する商品が見つかった場合には、その商品のコード、商品名、価格、販売数、販売額(価格×販売数)を # 実行結果のように表示するプログラムを作成せよ。 # なお、該当する商品があ見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する # # ┏━━━━━━┯━━━━━━━━┯━━━━━┯━━━━━┓ # ┃商品コード     │商品名          │価格      │販売数    ┃ # ┃code        │name          │price       │number      ┃ # ┃            │                │          │          ┃ # ┃fm1       │フラッシュメモリ     │1500      │27        ┃ # ┃hu2            │ハブ          │23000        │8            ┃ # ┃mo3          │マウス           │2560      │12        ┃ # ┗━━━━━━┷━━━━━━━━┷━━━━━┷━━━━━┛ # # [実行結果] # 商品コードを入力:hu2(キーボードからの入力) # 商品コード 商品名 価格  販売数 販売額 # ---------------------------------------------- # hu2 ハブ 23000 8 184000 # # '商品コードを入力し、該当する商品が見つかった場合には、その商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。該当する商品が見つからなかった場合のみ「見つかりませんでした」と表示して終了する' :- 商品コードを入力し(_商品コード), write('商品コードを入力: '), get_line(_商品コード), '該当する商品が見つかった場合には、その商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。該当する商品が見つからなかった場合のみ「見つかりませんでした」と表示して終了する'(__商品コード). '該当する商品が見つかった場合には、その商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。該当する商品が見つからなかった場合のみ「見つかりませんでした」と表示して終了する'(_商品コード) :- findall([_商品コード,_商品名,_価格,_販売数,_販売額],( 商品(_商品コード,_商品名,_価格,_販売数), _販売額 is _価格 * _販売数), _商品売上ならび), \+(_商品売上ならび=[]), write('商品コード  商品名  価格 販売数 販売額\n'), write('----------------------------------------------------------\n'), append(_,[[_商品コード,_商品名,_価格,_販売数,_販売額]|R],_商品売上ならび), writef('%8r %10r %8r %8r %10r\n',[_商品コード,_商品名,_価格,_販売数,_販売額]), R = [],!. '該当する商品が見つかった場合には、その商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。該当する商品が見つからなかった場合のみ「見つかりませんでした」と表示して終了する'(_商品コード) :- write('見つかりませんでした\n'). yes. ?- % 以下のサイトは # ・DBMS名とバージョン : SQL-Server 2008 # # 売り上げ # ID | AMOUNT     | # --+---------------------- # 1,200 # 1,300 # 1,400 # 2,100 # 4,100 # 5,200 # 5,300 # 6,400 # # 得意先マスタ # ID | NAME     | OYA_CODE # --+----------------------+-------------- # 1,abc商事 本店,1 # 2,abc商事 い支店,1 # 3,abc商事 う支店,1 # 4,def工務店 本店,4 # 5,def工務店 い支店,4 # 6,ghiサービス,6 # 7,jklシステム,7 # # ・欲しい結果 # 1,abc商事 本店,900 # 4,def工務店 本店,600 # 6,ghiサービス,6 # 7,jklシステム,400 # # ・説明 # 会社ごとに、売り上げ合計を出したいです。 # 得意先マスタに親会社コードを持っているので、親会社がある場合は親会社に合算したいです。 # 自分が親会社の場合は自らのコードが入っています。 # '会社ごとに、売り上げ合計を出す' :- 親会社ならび(_親会社ならび), 親会社ごとの合計ならび(_親会社ごとの合計ならび), 表示する(_親会社ごとの合計ならび). 親会社ならび(_親会社ならび) :- findall(_OYA_CODE,( 得意先マスタ(_OYA_CODE,_NAME,_OYA_CODE)), _親会社ならび). 親会社ごとの合計ならび(_親会社ごとの合計ならび) :- findall([_OYA_CODE,_合計],( append(_,[_OYA_CODE|_],_親会社ならび), 親会社の合計(_OYA_CODE,_NAME,_合計)), _親会社ごとの合計ならび). 親会社の合計(_OYA_CODE,_NAME,_合計) :- findall(_ID,( 得意先マスタ(_ID,_NAME,_OYA_CODE)), _子会社ならび), findsum(_AMOUNT,( 売上(_ID,_AMOUNT), member(_ID,_子会社ならび)), _合計). 表示する([]). 表示する([[_OYA_CODE,_,0.0]|R]) :- 表示する(R). 表示する([[_OYA_CODE,_NAME,_合計]|R]) :- \+(_合計=0.0), writef('%t,%t,%t\n',[_OYA_CODE,_NAME,_合計]), 表示する(R). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. % 2.a. 'もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの投資利益率が得られるであろうか。'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が120,000単位であるならば、', 利益額(120000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 利益額(_販売量,_平均単価価格,_利益額) :- _売上額 is _平均単価価格 * _販売量, 変動費(_変動費), 固定費(_固定費), _利益額 id _売上額 - _変動費 - _固定費. % 2.b. 'もし販売数量が80,000単位ならばどうか'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が80,000単位であるならば、', 利益額(80000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 'もし販売量が120,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(120000)). 'もし販売数量が80,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(80000)). 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # 売上('20120416',トマト,3000). # 売上('20120417',ナス,1000). # 売上('20120416',トマト,1500). # 売上('20120417',ナス,2200). # # の時に、日付ごとの合計売上が欲しい。 # # ?- 集約加算(_集約値,[_日付,_集約値],[_日付],[_金額],売上(_日付,_品目,_金額),_解). # # _解 = [['20120416',4500],['20120417',3200]] # 集約加算(_集約解変数指定,_選択項,_鍵項,_集約項,P,_解) :- findsetof(_鍵項,P,L1), findkeysort(_選択項,_鍵項,( member(_鍵項,L1), findsum(_集約項,P,_集約解変数指定)), _解_1), 集約加算の解を平坦化する(_解_1,_解). 集約加算の解を平坦化する(_解_1,_解) :- findall(L3,( member(L2,_解_1), 平坦化(L2,L3)), _解) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findkeysort(Select,Keys,P,List) :- append(Keys,Select,Keys2), findall(Keys2,P,List1), sort(List1,List2), findall(Select,member(Keys2,List2),List). 平坦化(_深いならび,_平坦化されたならび) :- 差分ならびによる平坦化(_深いならび,_平坦化されたならび - []) . 差分ならびによる平坦化([_項|_残りならび],_差分ならび頭部 - _差分ならび尾部) :- 差分ならびによる平坦化(_項,_差分ならび頭部 - _不完全な差分ならび), 差分ならびによる平坦化(_残りならび,_不完全な差分ならび - _差分ならび尾部) . 差分ならびによる平坦化([],_差分ならび頭部 - _差分ならび尾部) :- _差分ならび頭部 = _差分ならび尾部 . 差分ならびによる平坦化(_項,[_項|_差分ならび尾部] - _差分ならび尾部) :- \+(list(_項)),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/547 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 次の表のデータを構造体(shouhin)に格納して、商品コードを入力し、該当する商品が # 見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を # 実行結果のように表示するプログラムを作成せよ。なお該当商品が見つからなかった場合 # のみ「見つかりませんでした」と表示してプログラムを終了する。 # # 商品コード  商品名      価格    販売数 # (code)    (name)      (price)  (number) # fm1     フラッシュメモリ  1500   27 # hu2     ハブ        23000   8 # mo3     マウス       2560   12 # # [実行結果・例] # 商品コードを入力:hu2 # 商品コード  商品名  価格  販売数  販売額 # -------------------------------------------------- # hu2     ハブ   23000   8    184000 # 商品売上(fm1,フラッシュメモリ,1500,27). 商品売上(hu2,ハブ,23000,8). 商品売上(mo3,マウス,2560,12). '商品コードを入力し、該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を実行結果のように表示する。なお該当商品が見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。' :- 商品コードを入力し(_商品コード), '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード). 商品コードを入力し(_商品コード) :- write('商品コード : '), get_line(_商品コード). '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を表示する'(_商品コード), 商品コードを入力し(_商品コード_2), '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード_2). '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- '見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード),!. '該当する商品が見つかった場合はその商品のコード、商品名、価格、販売数、販売額(価格×販売数)を表示する'(_商品コード) :- 商品売上(_商品コード,_商品名,_価格,_販売数), _販売額 is _価格 * _販売数, writef('%10r %10r %10r %10r %10r\n',[_商品のコード,_商品名,_価格,_販売数,_販売額]). '商品コードが見つからなかった場合のみ「見つかりませんでした」と表示してプログラムを終了する。'(_商品コード) :- \+(商品売上(_商品コード,_,_,_)), write('見つかりませんでした\n'),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/607 # [1] 授業単元:プログラミング演習 # [2] 問題文: # 品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5}; # と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。 # このとき、品目別の売上高を求めるプログラムをポインタ配列を用いて作成せよ。 # 品目(品目1). 品目(品目2). 品目(品目3). 品目(品目4). 売値(品目1,1300). 売値(品目1,2000). 売値(品目3,2500). 売値(品目4,3300). 売り上げ個数(品目1,25). 売り上げ個数(品目2,18). 売り上げ個数(品目3,8). 売り上げ個数(品目4,5). '品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5};と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。このとき、品目別の売上高を求める'(_品目,_売上高) :- 品目別売上高を求める(_品目,_売上高). 品目別売上高を求める(_品目,_売上高) :- 品目(_品目), 売値(_品目,_売値), 売り上げ個数(_品目,_売り上げ個数), _売上高 is _売値 * _売り上げ個数. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/607 # [1] 授業単元:プログラミング演習 # [2] 問題文: # 品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5}; # と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。 # このとき、品目別の売上高を求めるプログラムをポインタ配列を用いて作成せよ。 # 品目(品目1). 品目(品目2). 品目(品目3). 品目(品目4). 売値(品目1,1300). 売値(品目1,2000). 売値(品目3,2500). 売値(品目4,3300). 売り上げ個数(品目1,25). 売り上げ個数(品目2,18). 売り上げ個数(品目3,8). 売り上げ個数(品目4,5). '品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5};と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。このとき、品目別の売上高を求める'(_品目,_売上高) :- 品目ならびを得る(_品目ならび), 売値ならびを得る(_品目ならび,_売値ならび), 売り上げ個数ならびを得る(_品目ならび,_売り上げ個数ならび), 品目別売上高を求める(_品目ならび,_売値ならび,_売り上げ個数ならび,_品目,_売上高). 品目ならびを得る(_品目ならび) :- findall(_品目,( 品目(_品目)), _品目ならび). 売値ならびを得る(_品目ならび,_売値ならび) :- findall(_売値,( member(_品目,_品目ならび), 売値(_品目,_売値)), _売値ならび). 売り上げ個数ならびを得る(_品目ならび,_売り上げ個数ならび) :- findall(_売り上げ個数,( member(_品目,_品目ならび), 売り上げ個数(_品目,_売り上げ個数)), _売り上げ個数ならび). 品目別売上高を求める(_品目ならび,_売値ならび,_売り上げ個数ならび,_品目,_売上高) :- between(0,3,Nth0), nth0(Nth0,_品目ならび,_品目), 売上高を求める(Nth0,_売値ならび,_売り上げ個数ならび,_売上高). 売上高を求める(Nth0,_売値ならび,_売り上げ個数ならび,_売上高) :- nth0(Nth0,_売値ならび,_売値), nth0(Nth0,_売り上げ個数ならび,_売り上げ個数), _売り上げ高 is _売値 * _売り上げ個数. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/607 # [1] 授業単元:プログラミング演習 # [2] 問題文: # 品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5}; # と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。 # このとき、品目別の売上高を求めるプログラムをポインタ配列を用いて作成せよ。 # 品目(品目1). 品目(品目2). 品目(品目3). 品目(品目4). 売値(品目1,1300). 売値(品目1,2000). 売値(品目3,2500). 売値(品目4,3300). 売り上げ個数(品目1,25). 売り上げ個数(品目2,18). 売り上げ個数(品目3,8). 売り上げ個数(品目4,5). '品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5};と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。このとき、品目別の売上高を求める'(_品目,_売上高) :- 品目別売上高を求める(_品目,_売上高). 品目別売上高を求める(_品目,_売上高) :- 品目(_品目), 売値(_品目,_売値), 売り上げ個数(_品目,_売り上げ個数), _売り上げ高 is _売値 * _売り上げ個数. % ここで示したいことは、これまで二つ示した如何にプログラムがナンセンスな設計であったかだ。 % ならびとして定義したもの % 単位節で定義したがならびとして一旦取り込んで処理するもの % % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/72 # [1] 授業単元:C言語演習 # [2] 問題文: # 以下のデータは、3つの商品A、B、Cのある月の売り上げ個数と単価である。 # 以下のリストの< >の処理をコメントに従って埋め、商品A、B、Cの売り上げをそれぞれ計算するプログラムを作成せよ。 # <売り上げデータ> # 商品  個数 単価[円] # 商品A 32  500 # 商品B 27  700 # 商品C 12  1200 # # <リスト> # http://ime.nu/ime.nu/codepad.org/2VWOcUPS # #include # struct SYOHIN # { # int kosu; # int tanka; # int uriage; # }; # # void keisan(struct SYOHIN *x); # # int main(void) # { # struct SYOHIN a, b, c; # //<商品別の個数と単価の代入> # kaisan(&a); printf("商品Aの売り上げは%d円 \n",a.uriage); # kaisan(&b); printf("商品Bの売り上げは%d円 \n",b.uriage); # kaisan(&c); printf("商品Cの売り上げは%d円 \n",c.uriage); # } # # void keisan(struct SYOHIN *x) # { # //<商品xの売り上げの計算> # } # 商品売上(A,32,500,_). 商品売上(B,27,700,_). 商品売上(C,12,1200,_). '商品A、B、Cの売り上げをそれぞれ計算する' :- 'Aの商品売上を再定義する', 'Bの商品売上を再定義する', 'Cの商品売上を再定義する'. 'Aの商品売上を再定義する' :- retract(商品売上(A,_数量,_単価,_)), '商品売り上げを計算する'(_数量,_単価,_売上金額), assertz(商品売上(A,_数量,_単価,_売上金額)), writef('Aの商品売上は %t です\n',[_売上金額]). 'Bの商品売上を再定義する' :- retract(商品売上(B,_数量,_単価,_)), '商品売り上げを計算する'(_数量,_単価,_売上金額), assertz(商品売上(B,_数量,_単価,_売上金額)), writef('Bの商品売上は %t です\n',[_売上金額]). 'Cの商品売上を再定義する' :- retract(商品売上(C,_数量,_単価,_)), '商品売り上げを計算する'(_数量,_単価,_売上金額), assertz(商品売上(C,_数量,_単価,_売上金額)), writef('Cの商品売上は %t です\n',[_売上金額]). '商品売り上げを計算する'(_数量,_単価,_売上金額) :- _売上金額 is _単価 * _数量. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/107 # [1] 授業単元:C言語プログラム # [2] 問題文: # 以下のファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、 # それらの結果を画面表示するとともに、ファイルodata2.txtに書き込むプログラムを作成せよ。 # 但し、以下の内容のデータファイルsdata.txtをemacsであらかじめ作成しておくこと。 # [sdata.txtの内容](商品名、単価、売り上げ個数) # coffee 250 75 # tea 270 52 # milk 300 22 # juice 350 54 # coke 300 36 # 'ファイルsdata.txtに入っている商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、ファイルodata2.txtに書き込む' :- open('sdata.txt',read,Instream), open('odata2.txt',write,Outstream), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream), close(Outstream), close(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- at_end_of_stream(Instream). 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream) :- '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高), 'Instreamから商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め、それらの結果を画面表示するとともに、Outstreamに書き込む'(Instream,Outstream). '商品名、単価、売り上げ個数を1件ずつ読み込んで商品別の売上高を求め'(Instream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- get_line(Instream,Line), split(Line,[' '],[_商品名,_単価,_売り上げ個数]), _商品別の売上高 is _単価 * _売上個数. 'それらの結果を画面表示するとともに、Outstreamに書き込む'(Outstream,_商品名,_単価,_売り上げ個数,_商品別の売上高) :- writef('%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]), writef(Outstream,'%t %t %t %t\n',[_商品名,_単価,_売り上げ個数,_商品別の売上高]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/db/1316769778/984 # ・SQL Server2008R2Express # テーブルデータ # ・2012-08-01 11:35:00, りんご, 1 # ・2012-08-01 16:22:00, みかん, 2 # ・2012-08-02 13:54:00, りんご, 2 # ・2012-08-02 14:32:00, りんご, 1 # ・2012-08-04 16:22:00, みかん, 3 # # ・欲しい結果 # 2012-08-01 # 2012-08-02 # 2012-08-04 # # ・説明 # 件数に関係なく売り上げがあった日だけのリストが欲しいのですが # うまい方法あるでしょうか # # 件数に関係なく売り上げがあった日(_売上のあった日) :- 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト), member(_売上のあった日,_売上のあった日だけのリスト). 件数に関係なく売り上げがあった日だけのリスト(_売上のあった日だけのリスト) :- findsetof(_年月日,( 売上(_日付,_品名,_件数), _件数 > 0, sub_atom(_日付,0,10,_,_年月日)), _売上のあった年月日ならび). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値(L,_最大値) :- 第一要素を現在の最大値と置いて最大値を走査(L,_最大値). 第一要素を現在の最大値と置いて最大値を走査([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- 'A @> B の場合はBをAに差し替える'([A|R],B,_最大値). 最大値([A|R],B,_最大値) :- 'A @=< B の場合はBに変化なし'([A|R],B,_最大値). 'A @> B の場合はBをAに差し替える'([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 'A @=< B の場合はBに変化なし'([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値(L,_最大値) :- 第一要素を現在の最大値と置いて最大値を走査(L,_最大値). 第一要素を現在の最大値と置いて最大値を走査([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値). 'AがBを上回った場合はBをAに差し替え、それ以外はそのまま検索する'([A|R],B,_最大値) :- それ以外はそのまま検索する([A|R],B,_最大値). 'AがBを上回った場合だけ差し替える'([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). それ以外はそのまま検索する([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出典::SQL質疑応答スレ 13問目 #43 # 質問:「指定条件に一番近い最大値を持つレコード」でテーブル結合したい # 環境:postgresql 9.0 # # 価格変動テーブル # kakaku_datetime name price # 2012-08-01 10:00:00 トマト 100円 # 2012-08-01 10:00:00 バナナ 200円 # 2012-08-10 10:00:00 バナナ 180円 # 2012-08-15 10:00:00 トマト 150円 # # 売上履歴テーブル # uriage_datetime name # 2012-08-01 12:00:00 トマト # 2012-08-05 18:00:00 トマト # 2012-08-08 15:00:00 バナナ # 2012-08-16 19:00:00 トマト # # を結合させて、以下のように「その時にいくらだったか?」を含めたテーブルにしたいです。 # uriage_datetime name price # 2012-08-01 12:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-05 18:00:00 トマト 100円 ←kakaku_datetime = 2012-08-01 10:00:00 のトマトの価格を取ってくる # 2012-08-08 15:00:00 バナナ 200円 ←kakaku_datetime = 2012-08-01 10:00:00 のバナナの価格を取ってくる # 2012-08-16 19:00:00 トマト 150円 ←kakaku_datetime = 2012-08-15 10:00:00 のトマトの価格を取ってくる # # よろしくお願いします。 # # '「指定条件に一番近い最大値を持つレコード」でテーブル結合したい'(_uriage_datetime,_name,_price) :- 売上履歴テーブル(_uriage_datetime,_name), findmax([_kakaku_datetime,_price],( 価格変動テーブル(_kakaku_datetime,_name,_price), _uriage_datetime @>= _kakaku_datetime),[_kakaku_datetime,_price]). findmax(T,P,Max) :- findall(T,P,L), 最大値(L,Max). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 最大値([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # # 出典: http://blog.livedoor.jp/beziehungswahn/archives/37228198.html # % '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(_順位,_薬剤,_売上米ドル金額). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(1,'Abilify',6460215394). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(2,'Nexium',6135667614). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(3,'Humira',5549996855). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(4,'Crestor',5310818889). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(5,'Cymbalta',5219860418). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(6,'Advair Diskus',5121312668). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(7,'Enbrel',4681201645). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(8,'Remicade',4098233242). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(9,'Copaxone',3697182238). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(10,'Neulasta',3580364758). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(11,'Rituxan',3288614045). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(12,'Lantus Solostar',3005681663). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(13,'Spiriva Handihaler',2998207542). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(14,'Atripla',2856818557). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(15,'Januvia',2843496907). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(16,'Avastin',2688414938). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(17,'Lantus',2556825619). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(18,'Oxycontin',2534909675). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(19,'Lyrica',2415254835). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(20,'Epogen',2280696834). # 2位 Nexium(ネキシウム)、$6,135,667,614、プロトンポンプ阻害剤であり、逆流性食道炎に使用します。アメリカ人はフライドポテトとか脂っこいものを食べ過ぎなんでしょうね。酒も度数が強いものをストレートで飲むし。そりゃ、胃を壊して胸やけがするはずです。 # 出典: http://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%BD%E3%83%A1%E3%83%97%E3%83%A9%E3%82%BE%E3%83%BC%E3%83%AB % 以下のサイトは # # インタプリタトップから売上伝票を入力する # _出荷日+_伝票番号+_顧客番号+_商品番号+_数量+_内税金額 :- 内税金額を外税金額と消費税に分解する(_内税金額,_外税金額,_消費税), _売上 =.. [売上,_出荷日,_伝票番号,_顧客番号,_商品番号,_数量,_外税金額,_消費税], assertz(_売上). 消費税率(19970401,20140331,5). 消費税率(20140401,99999999,8). 内税金額を外税金額と消費税に分解する(_内税金額,_外税金額,_消費税) :- 消費税率を選択(_出荷日,_消費税率), _消費税 is truncate(_内税金額 * _消費税率 / ( 100 + _消費税率) + 0.5), _外税金額 is _内税金額 - _消費税. 消費税率を選択(_出荷日,_消費税率) :- 消費税率(_消費税率適用起点日,_消費税率適用終了日,_消費税率), _出荷日 >= _消費税率適用起点日, _出荷日 =< _消費税率適用終了日. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- findsetof(_担当者,member([_担当者,_],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\n',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/808 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売 # 上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。 # ________________________________ # 担当者  売上  比率 # --------------------- # 山田  12000  30.0% # 鈴木   8000  20.0% # 井上  20000  50.0% # 合計  40000  100.0% # ===================== # '担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。' :- '担当者はなん人でも構わない、担当者名と売上を入力する。', '売上合計を求める。'(_売上合計), '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'. '担当者はなん人でも構わない、担当者名と売上を入力する。' :- 担当者名と売上を入力(_担当者名,_売上), 担当者と売上を追加定義する(_担当者名,_売上), '担当者はなん人でも構わない、担当者名と売上を入力する。',!. '担当者はなん人でも構わない、担当者名と売上を入力する。'. 担当者名と売上を入力(_担当者名,_売上) :- 担当者名の入力(_担当者名), \+(_担当者名=''), 売上の入力(_売上). 担当者名の入力(_担当者名) :- write('担当者名を入力して下さい : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る(売上,integer(_売上),_売上). 担当者と売上を追加定義する(_担当者,_売上) :- assertz('担当者・売上'(_担当者,_売上)). 売上合計を得る(_売上合計) :- findall(_売上,( '担当者・売上'(_,_売上)), _売上ならび), sum_list(_売上ならび,_売上合計). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_売上合計) :- write('担当者  売上  比率 \n'), forall('担当者・売上'(_担当者名,_売上),'各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計)), write('===================== \n'). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計) :- \+(_売上合計 = 0), _比率 is _売上 / _売上合計 * 100, '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率). '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率) :- format('~w ~0f ~1f%\n',[_担当者名,_売上,_比率]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 整列した_日付_売上ならび(_整列した_日付_売上ならび), 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日), 一定額を越えた(_一定額,_日々の売上の合計),!. 整列した_日付_売上ならび(_整列した_日付_売上ならび) :- findall([_日付,_売上],売上(_日付,_売上),_日付_売上ならび), sort(_日付_売上ならび,_整列した_日付_売上ならび). 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_一定額を越えた日) :- append(LL1,_,_整列した_日付_売上ならび), findsum(_売上,member([_,_売上],LL1),_日々の売上の合計), last(LL1,[_一定額を越えた日,_]). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 >= _一定額,!. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum).