#include "task2.hpp" // count_gt|count_lt|select_gt|select_lt|select_gt_and_lt|mean|median|minmax #include /// @todo Include standard library headers as needed /// @brief Counts how many values in a sequence are greater than (gt) a reference value /// @param data Sequence of values /// @param ref Reference value /// @return Number of values in the sequence, which are greater than than ref int count_gt(std::vector data, double ref) { int count = 0; for (int i = 0; i < data.size(); i++) { if (data[i] > ref) { count++; } } return count; } /// @brief Counts how many values in a sequence are less than (lt) a reference value /// @param data Sequence of values /// @param ref Reference value /// @return Number of values in the sequence, which are less than than ref int count_lt(std::vector data, double ref) { int count = 0; for (int i = 0; i < data.size(); i++) { if (data[i] < ref) { count++; } } return count; } /// @brief Selects values from a sequence which are greater than (gt) a reference value /// @param data Sequence of values /// @param ref Reference value /// @return Sequence of selected (copied) values in the order of occurence in the original sequence std::vector select_gt(std::vector data, double ref) { std::vector selected; for (int i = 0; i < data.size(); i++) { if (data[i] > ref) { selected.push_back(data[i]); } } return selected; } /// @brief Selects values from a sequence which are less than (lt) a reference value /// @param data Sequence of values /// @param ref Reference value /// @return Sequence of selected (copied) values in the order of occurence in the original sequence std::vector select_lt(std::vector data, double ref) { std::vector selected; for (int i = 0; i < data.size(); i++) { if (data[i] < ref) { selected.push_back(data[i]); } } return selected; } /// @brief Selects values from a sequence which are bounded by two reference values /// @param data Sequence of values /// @param lower Lower bound /// @param upper Upper bound /// @return Sequence of selected (copied) values in the order of occurence in the original sequence std::vector select_gt_and_lt(std::vector data, double lower, double upper) { std::vector selected; for (int i = 0; i < data.size(); i++) { if (data[i] > lower && data[i] < upper) { selected.push_back(data[i]); } } return selected; } /// @brief Calculates the mean for a sequence of values /// @param data Sequence of values; assertion: data.size() >= 1 /// @return Mean value (arithmetic mean) double mean(std::vector data) { double sum = 0; for (int i = 0; i < data.size(); i++) { sum += data[i]; } return sum / data.size(); } /// @brief Calculate the median for a sequence of numbers /// @param data Sequence of values; assertion: data.size() >= 1 /// @return Median value: /// - if the length of the sequence is odd, the median value is "the middle value", else /// - if the length of the sequence is even, the median value is the avarage of the "two middle values" double median(std::vector data) { std::sort(data.begin(), data.end()); if (data.size() % 2 == 0) { return (data[data.size() / 2 - 1] + data[data.size() / 2]) / 2; } else { return data[data.size() / 2]; } } /// @brief Finds the minimum and maximum value /// @param data Sequence of values; assertion: data.size() >= 1 /// @return Tuple with the minimum and maximum value (in this order) std::tuple minmax(std::vector data) { double min = data[0]; double max = data[0]; for (int i = 1; i < data.size(); i++) { if (data[i] < min) { min = data[i]; } if (data[i] > max) { max = data[i]; } } return std::make_tuple(min, max); }