CS 372 Spring 2016  >  Assignment 2


CS 372 Spring 2016
Assignment 2

Assignment 2 is due at 5 pm Tuesday, February 16. It is worth 20 points.

Procedures

This assignment is to be done individually.

Turn in answers to the exercise below on the UAF Blackboard Learn site, under Assignment 2 for this class.

Exercises (20 pts total)

General

In each of the following exercises, you are to write a C++ function or function template. All functions & function templates are to be in the file fa2.h.

Code must be readable and of high quality.

You may include any other functions or classes that you wish in file fa2.h. These will not be tested.

Test Program

A single test program for all of the exercises is available: fa2_test.cpp. If you compile and run this program (unmodified!) with your code and the catch.hpp header, then it will test whether your code works properly.

The catch.hpp header holds the Catch C++ unit-test framework. A link to the GitHub page for Catch is on the main CS 372 webpage.

Do not turn in the test program.

Note: The test program cannot check all the requirements of this assignment. For example, it cannot check whether you use the C++11 random-number generation functionality in Exercise A or whether you use std::async calls in Exercise B. I will check these by looking at your code.

Exercise A — Generating Random Numbers

Purpose

In this exercise you will write code to use C++11 pseudorandom-number generation functionality.

Instructions

Write a C++ function normRand, prototyped as follows.

[C++]

inline vector<double> normRand(size_t n);

Calling normRand(n) returns a vector of size n, containing random numbers generated according to a normal distribution with mean \(100.0\) and standard deviation \(15.0\). The random numbers must be generated by an appropriate C++11/14 Standard Library random-number generator and distribution, from header <random>.

The numbers generated must come from the same sequence of values each time the function is called. For example, suppose that normRand(4) returns a vector containing 120.5, 89.3, 101.2, 91.7. Then normRand(2) must return a vector containing 120.5, 89.3.

You may assume that parameter n is nonnegative. But your code must place no arbitrary limits on the value of parameter n.

Exercise B — Asynchronous Computation

Purpose

In this exercise, your will write code to do asynchronous computation using std::async calls.

Instructions

Write a C++ function asyncSquares, prototyped as follows.

[C++]

inline vector<int> asyncSquares(size_t n);

Calling asyncSquares(n) returns a vector of size n, in which item \(i\) has the value \(i^2\). So the items should be \(0\), \(1\), \(4\), \(9\), \(16\), \(25\), etc.

The values in the vector much be computed asynchronously. Each item must be computed using a separate std::async call with launch policy std::launch::async, and retrieved using a get on its return value. The std::async calls should all be done before any get calls are made.

You may assume that parameter n is nonnegative. But your code must place no arbitrary limits on the value of parameter n.

Exercise C — Iterating a Function

Purpose

In this exercise you will write code to deal with a function or function-like object using C++11 features.

Below, the term function object refers to a function or function-like object: a function (pointer), a lambda function, a bind expression, a std::function object, or anything that is callable using the same syntax as a C++ function.

Instructions

Write a C++ function or function template repeatFunction. This should take two parameters: a one-parameter function object f and an int n. It returns a function object whose effect is the same as calling f, and then calling f again on the return value, etc., n times.

You may assume that the parameter type and the return type of f are both int, and that n is positive (in particular, it will not be zero).

Appropriate C++11/14 function objects must be used.

For example, consider the following code.

[C++]

int f(int k)
{
    return k+5;
}

auto g = repeatFunction(f, 3);

Now, doing g(k) is the same as doing f(f(f(k))). So g(k) should return ((k+5)+5)+5, that is, k+15.

Here is another example.

[C++]

int ff(int x)
{
    return x*2;
}

auto gg = repeatFunction(ff, 4);

Now, doing gg(x) is the same as doing ff(ff(ff(ff(x)))). So gg(k) should return (((x*2)*2)*2)*2, that is, x*16.