このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/48
#  [1] 授業単元:関数ポインタ  
#  [2] 問題文(含コード&リンク):http://codepad.org/O3eDo7F3 
#   
#  以下のプログラムは2つの整数を入力させ,各種処理を選び, 
#  計算した結果をファイルへ出力するものであるが,作成途中である. 
#  下記に従い,プログラムを完成させよ. 
#  ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる. 
#  ・加算:tasu(),除算(商):waru(),除算(剰余):amari(), 
#   最大公約数:yakusu(),最小公倍数:baisu()を用いる. 
#  ・除算は商と剰余を求める. 
#  ・最大公約数は2つの整数で共通の約数のうち最大のもの, 
#   最小公倍数は2つの整数で共通の倍数のうち最小のものである. 
#  ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように 
#   計算式等も含めkekka.txtへ出力する. 
#  
#  #include< stdio.h >
#  #include< stdlib.h >
#  
#  int process(ここを書く);
#  int tasu(ここを書く);
#  int waru(ここを書く);
#  int amari(ここを書く);
#  int yakusu(ここを書く);
#  int baisu(ここを書く);
#  
#  int main()
#  {
#  	FILE *fp; //結果を出力するファイルのファイルポインタ
#  
#  	int a, b; // 入力する2つ整数
#    	int op; // 選択された処理を示す変数
#    	int result1, result2; // 演算結果を格納する変数	
#  
#  	fp = fopen("kekka.txt","w"); // ファイルを開く
#  	if(fp == NULL)
#  	{
#  		printf("ファイルオープンエラー \n");
#  		exit(1);
#  	}
#  
#    	printf("1つめの整数を入力してください:");
#    	scanf("%d", &a);
#    	printf("2つめの整数を入力してください:");
#    	scanf("%d", &b);
#    	printf("1:加算,2:除算,3:最大公約数,4:最小公倍数\n");
#    	do {
#      		printf("演算の番号を入力してください:");
#      		scanf("%d", &op);
#    	} while(op<1 || op>4);
#  	
#  	ここを書く
#  	
#  	fclose(fp); // ファイルを閉じる
#  	return 0;
#  }
#  
#  int process(ここを書く)
#  {
#  	ここを書く
#  }
#  
#  int tasu(ここを書く)
#  {
#  	ここを書く
#  }
#  
#  int waru(ここを書く)
#  {
#  	ここを書く
#  }
#  
#  int amari(ここを書く)
#  {
#  	ここを書く
#  }
#  
#  int yakusu(ここを書く)
#  {
#  	ここを書く
#  }
#  
#  int baisu(ここを書く)
#  {
#  	ここを書く
#  }

'2つの整数を入力させ,各種処理を選び,
計算した結果をファイルへ出力するものである.
下記に従い,プログラムを完成させよ.
・各処理を行う場合は関数ポインタ引数とするをprocess()用いる 
・加算:tasu(),除算(商):waru(),除算(剰余):amari() 
 最大公約数:yakusu(),最小公倍数:baisu()を用いる.
・除算は商と剰余を求める.
・最大公約数は2つの整数で共通の約数のうち最大のもの,
 最小公倍数は2つの整数で共通の倍数のうち最小のものである.
・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように
 計算式等も含めkekka.txtへ出力する.' :-
        open('kekka.txt',write,Outstream),
        二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数),
        演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号),
        \+(between(1,4,_演算番号)),
        close(Outstream).

二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数,_演算番号) :-
         整数を得る('1つめの整数を入力してください',true,_一つ目の整数),
         整数を得る('2つめの整数を入力してください',true,_二つ目の整数),
         整数を得る('演算子番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',between(1,4,_演算番号),_演算番号).

演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :-
        整数を得る('演算番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',true,_演算番号),
        演算処理(_演算番号,_一つ目の整数,_二つ目の整数,_結果文字列),
        writef(Outstream,'%t\n',[_結果文字列]).
演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :-
        演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号).

演算処理(1,_一つ目の整数,_二つ目の整数,_結果文字列) :-
        _結果 is _一つ目の整数 + _二つ目の整数,
        swritef(_結果文字列,'%t + %t = %t',[_一つ目の整数,_二つ目の整数,_結果]).
演算処理(2,_一つ目の整数,_二つ目の整数,_結果文字列) :-
        _商 is _一つ目の整数 //  _二つ目の整数,
        _剰余 is _一つ目の整数 mod  _二つ目の整数,
        swritef(_結果文字列,'%t %% %t = %t 余り %t',[_一つ目の整数,_二つ目の整数,_商,_剰余]).
演算処理(最大公約数,_一つ目の整数,_二つ目の整数,_結果文字列) :-
        最大公約数(_一つ目の整数,_二つ目の整数,_結果),
        swritef(_結果文字列,'%t と %t の最大公約数は %t,[_一つ目の整数,_二つ目の整数,_結果]).
演算処理(4,_一つ目の整数,_二つ目の整数,_結果文字列) :-
        最小公倍数(_一つ目の整数,_二つ目の整数,_結果),
        swritef(_結果文字列,'%t と %t の最小公倍数は %t,[_一つ目の整数,_二つ目の整数,_結果]).
演算処理(N,_,_,'終了します') :-
        \+(between(1,4,N)).

最大公約数(M,N,X) :-
        最大公約数をユークリッドの互除法で求める(M,N,X),!.

最大公約数をユークリッドの互除法で求める(M,N,N) :-
        0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
        Mod is M mod N,
        最大公約数をユークリッドの互除法で求める(N,Mod,X).

最小公倍数(M,N,X) :-
        最大公約数をユークリッドの互除法で求める(M,N,Y),
        X is M * N // Y.