#include <iostream>
using namespace std;

// (1)再帰を使って、異なるn個の整数からr個の整数を取り出す組み合わせの数 nCr を求める関数  int combination( int n, int r)を作成せよ
// またこの関数を用いて  5Ｃr  (r=0　～ 5)を出力するプログラムを作成せよ。なお次の関係式を用いること。
// nＣr=n-1Ｃr-1+n-1Ｃr,nＣ0=nＣn=1,nＣ1=n
int combination( int n, int r)
{
  if(r==0)return 1;
  if(n==r)return 1;
  if(r==1)return n;
  return combination(n-1,r-1)+ combination(n-1,r);
}

// (2) ３つのint型整数 n1, n2, n3を昇順( n1 < n2< n3 )に並べ替える関数 void sort3(int *n1, int *n2, int *n3)を作成せよ。　
// この関数を用いて、main内で宣言された３つのint型整数 a1, a2, a3 の値を並べ替え 、その結果を表示するプログラムを作成せよ。  a1, a2, a3の初期値は、 a1=3, a2=1, a3=0とする。
void sort3(int *n1, int *n2, int *n3)
{
  int n[3];

  n[0]=*n1;
  n[1]=*n2;
  n[2]=*n3;
  for(int i=0; i<3; i++) {
    for(int j=i+1; j<3; j++) {
      if(n[i]>n[j]) {
        int t=n[i];
        n[i]=n[j];
        n[j]=t;
      }
    }
  }
  *n1=n[0],  *n2=n[1],  *n3=n[2];
}

// (3)要素数n個のint型配列 a の各成分の値を2倍したものを別の配列bに代入する関数  void atob(int *a, int *b, int n) を作成せよ。ここでa,bにはポインタを用いること。
// この関数を用いてint型配列 va=(1, 2, 1) の各成分の値を２倍したものを別の配列 vbに代入し、vbの各成分を出力するプログラムを作成せよ。
void atob(int *a, int *b, int n)
{
  for(int i=0; i<n; i++)b[i]=a[i]*a[i];
}

int main()
{
  //(1)
  cout << endl << "(1)" << endl;
  for(int r=0; r<=5; r++)
    cout << "r=" << r << ':' << combination(5,r) << endl;

  //(2)
  cout << endl << "(2)" << endl;
  int  a1=3, a2=1, a3=0;
  cout << "before sort = " << a1 << ' '<< a2 << ' ' << a3 << endl;
  sort3(&a1,&a2,&a3);
  cout << "after  sort = " << a1 << ' '<< a2 << ' ' << a3 << endl;

  //(3)
  cout << endl << "(3)" << endl;
  int va[]= {1, 2, 1}, vb[3];
  for(int i=0; i<3; i++)cout << "va(" << i << ")=" << va[i] << endl;
  atob(va,vb,3);
  cout << endl;
  for(int i=0; i<3; i++)cout << "vb(" << i << ")=" << vb[i] << endl;
}