1 #include <stdio.h> 2 3 int main(void) 4 { 5 int a, b; 6 int r, q; 7 8 a=44; // a <- 44 9 b=13; // b <- 13 10 11 r=a; // r <- a 12 q=0; // q <- 0 13 14 while(r >= b){ 15 r=r-b; 16 q=q+1; 17 } 18 19 printf("quotient=%d\tremainder=%d\n", q, r); 20 21 return 0; 22 }
quotient=3 remainder=5
1 #include <stdio.h> 2 3 int q(int a, int b); // プロトタイプ宣言 4 int r(int a, int b); 5 6 //======================================================================= 7 // メイン関数 8 //======================================================================= 9 int main(void) 10 { 11 int a, b; 12 int quot, remi; 13 14 a=44; // a <- 44 15 b=13; // b <- 13 16 17 quot=q(a,b); 18 remi=r(a,b); 19 20 printf("quotient=%d\tremainder=%d\n", quot, remi); 21 22 return 0; 23 } 24 25 26 //======================================================================= 27 // 商を計算する関数 28 //======================================================================= 29 int q(int a, int b) 30 { 31 32 if(a<b){ 33 return 0; 34 }else{ 35 return q(a-b, b)+1; 36 } 37 38 } 39 40 //======================================================================= 41 // あまりを計算する関数 42 //======================================================================= 43 int r(int a, int b) 44 { 45 46 if(a<b){ 47 return a; 48 }else{ 49 return r(a-b, b); 50 } 51 52 }
quotient=3 remainder=5
C言語では宣言型でプログラムすることはできない.教科書の例は,Prologの記述と思わ れる.
最大値を探索する問題は,
関数型では教科書p.111の下の方のように記述できる.それをC言語で表現すると,リスト
3のようになる.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 #define N 30 6 7 int max(int p, int a[]); 8 void set_rand(int a[]); 9 //============================================================== 10 // main関数 11 //============================================================== 12 int main(void) 13 { 14 int a[N+1], max_int; 15 16 set_rand(a); // a[]に乱数を設定 17 18 max_int = max(N,a); // 1〜Nの最大値探索 19 printf("max=%d\n", max_int); // 最大値を表示 20 21 return 0; 22 } 23 24 //============================================================== 25 // 最大値を探す再帰関数 教科書 p.105 p.111 26 //============================================================== 27 int max(int p, int a[]) 28 { 29 30 if(p==1){ 31 return a[1]; 32 }else{ 33 if(a[p]>max(p-1, a)){ 34 return a[p]; 35 }else{ 36 return max(p-1, a); 37 } 38 } 39 40 } 41 42 //============================================================== 43 // 配列 a[i] に乱数を設定 44 //============================================================== 45 void set_rand(int a[]) 46 { 47 int i; 48 49 srand((unsigned int)time(NULL)); // 乱数の初期値設定 50 51 for(i=1; i<N+1; i++){ 52 a[i]=rand(); // 配列に乱数を代入 53 } 54 55 }
max=2100562050この手続きを分解すると図1のようになる.関数型の処理の順序通りに, 手続き型で表すとリスト4のように記述できる.両者は全く同 じ計算を行っている.
全く同じ計算を行っているが,計算速度が大きく異なる場合がある.この場合だと,手続 き型のプログラムの方が圧倒的に早い.このように,計算に依存して,得手不得手がある.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 #define N 30 6 7 void set_rand(int a[]); 8 //============================================================== 9 // main関数 10 //============================================================== 11 int main(void) 12 { 13 int i, a[N+1], max_int; 14 15 set_rand(a); // a[]に乱数を設定 16 17 max_int = a[1]; 18 for(i=2; i<N+1; i++){ 19 if(max_int < a[i]) max_int = a[i]; 20 } 21 22 printf("max=%d\n", max_int); // 最大値を表示 23 24 return 0; 25 } 26 27 //============================================================== 28 // 配列 a[i] に乱数を設定 29 //============================================================== 30 void set_rand(int a[]) 31 { 32 int i; 33 34 srand((unsigned int)time(NULL)); // 乱数の初期値設定 35 36 for(i=1; i<N+1; i++){ 37 a[i]=rand(); // 配列に乱数を代入 38 } 39 40 }
max=2100562050