Exercise: RandomSensor_nopoly (Non-Polymorphic)

Requirement

Implement a sensor class RandomSensor_nopoly which does not access any real hardware, but rather returns a random temperature within a given range.

#include <gtest/gtest.h>
#include <sensor-random-nopoly.h>

TEST(sensor_random_suite, basic)
{
    RandomSensor_nopoly rs(36.4, 42.3);                // <--- give measurements between lo and hi

    double t = rs.get_temperature();
    ASSERT_GE(t, 36.4);                                // <--- greater equal to lo
    ASSERT_LE(t, 42.3);                                // <--- less equal to hi

    ASSERT_FLOAT_EQ(rs.low(), 36.4);                   // <--- RandomSensor specific interface
    ASSERT_FLOAT_EQ(rs.high(), 42.3);                  // <--- RandomSensor specific interface
}

Implementation Hint: Randomicity In C++

  • The following program demonstrates how to generate uniformly distributed random double values in a specified range.

#include <random>
#include <iostream>

int main()
{
    // setup how we want our random numbers to be created (think:
    // object initialization)
    double lo = 36.1;
    double hi = 42.7;

    // object state. think: what does the object need during runtime?
    std::random_device rd;                                       // <--- /dev/random, used to obtain a seed
    std::default_random_engine engine(rd());                     // <--- init (and seed) RNG
    std::uniform_real_distribution<double> distribution(lo, hi); // <--- tailor desired distribution

    // draw 10 random numbers (think: measure temperature)
    for (int i=0; i<10; i++) {
        double number = distribution(engine);                    // <--- use uniform_real_distribution to 
                                                                 //      draw a number from engine
                                                                 //      and bend it to desired range
                                                                 
        std::cout << number << std::endl;
    }

    return 0;
}

Implementation Hint: Initializer Lists

See Constructors: Member Initialization for how to initialize members in an initializer list.

Topics Covered

cluster_cxx C++: Miscellaneous Live-Hacking cluster_cxx_exercises C++ Exercises cluster_cxx03 C++ cluster_cxx03_data_encapsulation Data Encapsulation cluster_linux Linux cluster_linux_basics Linux Basics cluster_linux_basics_shell The Shell (Bash - “Bourne Again Shell”) cluster_linux_basics_intro Introduction: Concepts and Terminology cluster_linux_toolchain Toolchain, And Cross Development cluster_c The C Programming Language cluster_c_introduction Introduction cxx_exercises_sensor_random_nopoly Exercise: RandomSensor_nopoly (Non-Polymorphic) cxx_exercises_sensor_const_nopoly Exercise: ConstantSensor_nopoly (Non-Polymorphic) cxx_exercises_sensor_random_nopoly->cxx_exercises_sensor_const_nopoly cxx03_data_encapsulation_classes_objects Classes and Objects cxx_exercises_sensor_random_nopoly->cxx03_data_encapsulation_classes_objects cxx03_data_encapsulation_initializer_list Constructors: Member Initialization cxx_exercises_sensor_random_nopoly->cxx03_data_encapsulation_initializer_list linux_toolchain_cmake_local CMake: Local Build cxx_exercises_sensor_random_nopoly->linux_toolchain_cmake_local cxx_exercises_sensor_const_nopoly->cxx03_data_encapsulation_classes_objects cxx_exercises_sensor_const_nopoly->linux_toolchain_cmake_local cxx03_introduction Introduction c_introduction_installation Installation cxx03_introduction->c_introduction_installation cxx03_data_encapsulation_ctor_custom Custom Constructor cxx03_data_encapsulation_ctor_custom->cxx03_data_encapsulation_classes_objects cxx03_data_encapsulation_c Object Oriented Programming In Good Ol’ C cxx03_data_encapsulation_c->cxx03_introduction cxx03_data_encapsulation_classes_objects->cxx03_introduction cxx03_data_encapsulation_classes_objects->cxx03_data_encapsulation_c cxx03_data_encapsulation_initializer_list->cxx03_data_encapsulation_ctor_custom linux_basics_shell_paths Absolute and Relative Paths linux_basics_shell_commandline Commandline linux_basics_shell_paths->linux_basics_shell_commandline linux_basics_shell_cwd Current Working Directory linux_basics_shell_cwd->linux_basics_shell_paths linux_basics_shell_cwd->linux_basics_shell_commandline linux_basics_intro_process Processes, Scheduling, Address Spaces linux_basics_shell_cwd->linux_basics_intro_process linux_basics_shell_file_dir_create_rm Creating And Removing Files and Directories linux_basics_shell_file_dir_create_rm->linux_basics_shell_paths linux_basics_shell_file_dir_create_rm->linux_basics_shell_cwd linux_basics_intro_overview Overview linux_basics_shell_commandline->linux_basics_intro_overview linux_basics_intro_process->linux_basics_intro_overview linux_toolchain_static_library Object Code Archives/Static Libraries linux_toolchain_separate_compilation Zooming In: Separate Compilation, and Linking Statically linux_toolchain_static_library->linux_toolchain_separate_compilation linux_toolchain_cmake_local->linux_toolchain_static_library linux_toolchain_basics Toolchain: Basics linux_toolchain_separate_compilation->linux_toolchain_basics linux_toolchain_basics->linux_basics_shell_file_dir_create_rm