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