(12-1)[C] 演習1解答例

問 1

以下にループによるCコード例を示す.

1 xをyで割った商を求める関数 shou(x,y)を引き算を使って定義せよ.

int shou(int x, int y) {
  int s;
  for(s=0; x >= y; s = s + 1, x = x - y) ;
  return s;
}

2 xをyで割ったあまりを求める関数 amari(x,y)を引き算を使って定義せよ.

int amari(int x, int y) {
  for(; x >= y; x = x - y) ;
  return x;
}

3 1からnまでの自然数のk乗の和を求める関数sigmaN(k,n)を書け.

int sigmaN(int k, int n) {
  int s;
  for(s=0; n > 0; s = s + power(n,k), n--) ;
  return s;
}

このコードでは,以前定義したpower関数を使用している.使用しない場合は,以下のようなコードを書けばよい.

int sigmaN2(int k, int n) {
  int s, p, i;
  for(s=0; n > 0; n--) {
    for(p = 1, i = 1; i <= k; p = p * n, i++) ;
    s = s + p;
  }
  return s;
}

4 初項A(0)がa公差がbの等差数列のn番目の項 A(a,b,n)を求める関数を書け.

int A(int a, int b, int n) {
  int i;
  for(i = 0; i < n; a = a + b, i++) ;
  return a;
}

5 初項B(0)がa公比がbの等比数列のn番目の項 B(a,b,n)を求める関数を書け.

int B(int a, int b, int n) {
  int i;
  for(i = 0; i < n; a = a * b, i++) ;
  return a;
}

6 初項C(0)がa漸化式 C(n) = b + c * C(n - 1)のn番目の項を求める関数を書け.

int C(int a, int b, int c, int n) {
  int  i;
  for(i = 0; i < n; a = b + c * a, i++) ;
  return a;
}

テストコード.

main() {
  printf("shou(30,4):%d\n", shou(30,4));
  printf("amari(30,4):%d\n", amari(30,4));
  printf("sigmaN(4,2):%d\n", sigmaN(4,2));
  printf("sigmaN2(4,2):%d\n", sigmaN2(4,2));
  printf("A(2,3,4):%d\n", A(2,3,4));
  printf("B(2,3,4):%d\n", B(2,3,4));
  printf("C(2,3,4,2):%d\n", C(2,3,4,2));
}

テスト結果.以上のコードを(以前定義したpower関数とともに)ファイルex1-1.cに書き出しコンパイル実行すると,以下のような結果が得られるはずである.

C:\SMLSharpAndC\c>gcc ex1-1.c
gcc ex1-1.c

C:\SMLSharpAndC\c>a.exe
a.exe
shou(30,4):7
amari(30,4):2
sigmaN(4,2):17
A(2,3,4):14
B(2,3,4):162
C(2,3,4,2):47

問2

Cコードの例とそのテストコードの例を示す.

1. xをyで割った商を求める関数 shou(x,y)を引き算を使って定義せよ.

int shou(int x, int y) {
  if(x < y) {
    return(0);
  else{
    return(1 + shou(x - y, y);
  }
}

2 xをyで割ったあまりを求める関数 amari(x,y)引き算を使って定義せよ.

int amari(int x, int y){
  if (x < y){
    return(x);
  } else {
    return (amari(x - y, y));
  }
}

3 1からnまでの自然数のk乗の和を求める関数sigmaN(k,n)を書け.

int sigmaN (int k, int n) {
  if (n < 1) {
    return(0);
  } else {
    return(sigmaN (k, n - 1) + power(n, k));
  }
}

4 初項A(0)がa公差がbの等差数列のn番目の項 A(a,b,n)を求める関数を書け.

int A (int a, int b, int c) {
  if (c == 0) {
    return(a);
  } else {
    return(b + A (a, b, n - 1));
  }
}

5 初項B(0)がa公比がbの等比数列のn番目の項 B(a,b,n)を求める関数を書け.

int B (int a, int b, int c) {
  if (c == 0) {
    return(a);
  } else {
    return(b * B (a, b, n - 1));
  }
}

6 初項C(0)がa漸化式 C(n) = b + c * C(n - 1)のn番目の項を求める関数を書け.

int C (int a, int b, int c. int d) {
  if (d == 0) {
    return(a);
  } else {
    return(b + c * C (a, b, c. n - 1));
  }
}

問3

int fun (int n) {
 if (n == 0 || n == 1) {
  return(1);
 } else {
   return(fib (n - 1) + fib (n - 2));
 }
}

問4

int fib (int n) {
 int A, B, T;
 for (A = 1, B = 1; n > 0; T = A, A = A + B, B = T,n--) ;
 return (A);
}

[ トップ | 目次 | 前ページ | 次ページ ]