Lab 05 - C++

Author

George G. Vega Yon, Ph.D.

Published

September 19, 2024

Modified

September 16, 2024

Learning goals

  • Practice class programming in C++.
  • Be able to map R functions to C++.
  • Practice your GitHub skills.

Lab description

For this lab, we will implement a class representing a binomial distribution:

\[ \Pr{\left(Y=k; n, p\right)} = {n \choose k}p^k(1-p)^{n-k} \]

Implement the following class representing a binomial distribution:

class Binom {
private:
  int n;
  double p;
  
public:
  // Binom(int n_, double p_) : n(n_), p(p_) {};
  Binom(int n_, double p_) {
    n = n_;
    p = p_;
  };
  int factorial(int k) const;
  double choose(int a, int b) const;
  double dbinom(int k) const;
  void print(int k) const;
};

Remember that to implement the function, you have to use the following pattern:

inline [return type] [class name]::[function name]([arguments]) {
    // Your code here
}

Exercise 1: Factorial

Write a program that implements the factorial function. It should match the following results in R

factorial(1:10)
 [1]       1       2       6      24     120     720    5040   40320  362880
[10] 3628800

You can use the following code to test your function:

Binom b(10, 0.5);
for (int i = 0; i < 10; i++) {
    std::cout << b.factorial(i) << std::endl;
}

Exercise 2: Choose

Write a program that implements the choose function. It should match the following results in R

choose(10, 1:10)
 [1]  10  45 120 210 252 210 120  45  10   1

You can use the following code to test your function:

Binom b(10, 0.5);
for (int i = 0; i < 10; i++) {
    std::cout << b.choose(10, i) << std::endl;

}

Exercise 3: implement the binom

Write a program that implements the dbinom function. It should match the following results in R

dbinom(0:10, 10, 0.5)
 [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250
 [6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250
[11] 0.0009765625

You can use the following code to test your function:

Binom b(10, 0.5);
for (int i = 0; i < 10; i++) {
    std::cout << b.dbinom(i) << std::endl;
}

Exercise 4: Print

Write a program that implements the print function. It should match the following results in R

sprintf(
  "P(Y=%-2d; n=%d, p=%.2f) = %.4f",
  0:10, 10, 0.5, dbinom(0:10, 10, 0.5)
  ) |>
  cat(sep = "\n")
P(Y=0 ; n=10, p=0.50) = 0.0010
P(Y=1 ; n=10, p=0.50) = 0.0098
P(Y=2 ; n=10, p=0.50) = 0.0439
P(Y=3 ; n=10, p=0.50) = 0.1172
P(Y=4 ; n=10, p=0.50) = 0.2051
P(Y=5 ; n=10, p=0.50) = 0.2461
P(Y=6 ; n=10, p=0.50) = 0.2051
P(Y=7 ; n=10, p=0.50) = 0.1172
P(Y=8 ; n=10, p=0.50) = 0.0439
P(Y=9 ; n=10, p=0.50) = 0.0098
P(Y=10; n=10, p=0.50) = 0.0010