From 4225398c1cbb99808ddd1777b3c920731cd3d008 Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 3 Jun 2009 19:43:22 +0200 Subject: fixing asserts adding mean_mark.hpp implementation don't use STL in array (required) --- ue5/array.hpp | 36 ++++++++++++++++++++---------------- ue5/mean_mark.hpp | 42 ++++++++++++++++++++++++++++++++++++++---- ue5/verwendung.cpp | 23 +++++++++++++---------- 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/ue5/array.hpp b/ue5/array.hpp index 37a33b4..279ad7d 100644 --- a/ue5/array.hpp +++ b/ue5/array.hpp @@ -4,35 +4,39 @@ #undef SOLVED_2 #define SOLVED_2 -/* TODO: - * Angabe: Im Gegensatz zu den Beispielen bis jetzt ist die Verwendung - * der STL und Boostuntersagt! - */ #include // for std::move #include // for std::out_of_range -#include // for std::fill_n + std::swap_ranges namespace Ti { - template + template struct array { typedef T& reference; typedef const T& const_reference; typedef T* iterator; typedef const T* const_iterator; - typedef size_t size_type; + typedef std::size_t size_type; static_assert(N != 0, "array not allowed"); - void fill (const T& u) + void fill(const T& u) { - std::fill_n(begin(), size(), u); + for(size_type i = 0; i < size(); ++i) + m_data[i] = u; + /* std::fill_n(begin(), size(), u); */ } - void swap (array & other) + /* range check not necessary. N must be the same in other */ + void swap(array & other) { - std::swap_ranges(begin(), end(), other.begin()); + for(size_type i = 0; i < size(); ++i) + { + T x(m_data[i]); + m_data[i] = other[i]; + other[i] = x; + } + /* std::swap_ranges(begin(), end(), other.begin()); */ } iterator begin() @@ -70,12 +74,12 @@ namespace Ti return false; /* size() == 0 */ } - reference operator[] (size_type n) + reference operator[](size_type n) { return m_data[n]; } - const_reference operator[] (size_type n) const + const_reference operator[](size_type n) const { return m_data[n]; } @@ -87,7 +91,7 @@ namespace Ti return m_data[n]; } - const_reference at (size_type n) const + const_reference at(size_type n) const { if (n >= size()) throw std::out_of_range("array::at"); @@ -103,8 +107,8 @@ namespace Ti T m_data[N]; }; - /* TODO: was macht std::move() genau?! :) */ - template + /* std::move returns lvalue as rvalue */ + template array&& make_array() { return std::move(array()); diff --git a/ue5/mean_mark.hpp b/ue5/mean_mark.hpp index f35910c..ba5a230 100644 --- a/ue5/mean_mark.hpp +++ b/ue5/mean_mark.hpp @@ -2,19 +2,53 @@ #define MEAN_MARK_H #undef SOLVED_3 -//#define SOLVED_3 +#define SOLVED_3 namespace Ti { template - double mean_mark(Iter first, Iter last); + double mean_mark(Iter first, Iter last) + { + double result = 0; + unsigned count = 0; + for(; first != last; ++first) + { + result += (*first)->mark(); + ++count; + } + return (count == 0) ? 0 : result / count; + } template - double mean_mark_student(Iter first, Iter last); + double mean_mark_student(Iter first, Iter last) + { + double result = 0; + unsigned count = 0; + for(; first != last; ++first) + { + if (typeid(*(*first)) != typeid(Student)) + continue; + result += (*first)->mark(); + ++count; + } + return (count == 0) ? 0 : result / count; + } template - ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark); + ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark) + { + ForwardIterator result = first; + for (; first != last; ++first) + { + if ((*first)->mark() <= mark) + { + *result = *first; + ++result; + } + } + return result; + } } diff --git a/ue5/verwendung.cpp b/ue5/verwendung.cpp index 9e10326..8a20e6c 100644 --- a/ue5/verwendung.cpp +++ b/ue5/verwendung.cpp @@ -2,6 +2,7 @@ #include // for assert #include // for std::move #include // for std::out_of_range +#include //TODO struct Person { @@ -153,22 +154,24 @@ int main() a1.swap(a2); assert(a1[0] == 4); assert(a2[2] == 3); + + for(array::iterator it = a2.begin(); it != a2.end(); ++it) + std::cout << (*it) << std::endl; #endif #ifdef SOLVED_3 double mean = mean_mark(a.begin(), a.end()); - assert (mean >= 3.1 || mean <= 3.3); + assert (mean >= 3.1 && mean <= 3.3); double mean_student = mean_mark_student(a.begin(), a.end()); - assert (mean_student >= 3.1 || mean_student <= 3.3); + assert (mean_student >= 3.1 && mean_student <= 3.3); sarray::iterator end = remove_greater(a.begin(), a.end(), 3); double mean2 = mean_mark(a.begin(), end); - assert (mean2 >= 1.4 || mean2 <= 1.6); + assert (mean2 >= 1.4 && mean2 <= 1.6); #endif } - { typedef array, 5> parray; parray m; @@ -180,14 +183,14 @@ int main() #ifdef SOLVED_3 double mean = mean_mark(m.begin(), m.end()); - assert (mean >= 2.3 || mean <= 2.5); + assert (mean >= 2.3 && mean <= 2.5); double mean_student = mean_mark_student(m.begin(), m.end()); - assert (mean_student >= 3.6 || mean_student <= 3.8); + assert (mean_student >= 3.6 && mean_student <= 3.8); parray::iterator end = remove_greater(m.begin(), m.end(), 3); double mean2 = mean_mark(m.begin(), end); - assert (mean2 >= 0.9 || mean2 <= 1.1); + assert (mean2 >= 0.9 && mean2 <= 1.1); #endif } @@ -201,17 +204,17 @@ int main() #ifdef SOLVED_3 double mean = mean_mark(m.begin(), m.end()); - assert (mean >= 2.3 || mean <= 2.5); + assert (mean >= 2.3 && mean <= 2.5); double mean_student = mean_mark_student(m.begin(), m.end()); - assert (mean_student >= 3.6 || mean_student <= 3.8); + assert (mean_student >= 3.6 && mean_student <= 3.8); assert(m.size() == 5); m.erase(remove_greater(m.begin(), m.end(), 3), m.end()); assert(m.size() == 3); double mean2 = mean_mark(m.begin(), m.end()); - assert (mean2 >= 0.9 || mean2 <= 1.1); + assert (mean2 >= 0.9 && mean2 <= 1.1); #endif } -- cgit v1.2.3