summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormanuel <manuel@nc8430.lan>2009-06-03 19:43:22 +0200
committermanuel <manuel@nc8430.lan>2009-06-03 19:43:22 +0200
commit4225398c1cbb99808ddd1777b3c920731cd3d008 (patch)
treee6343dc5781d352dca8d1630d7385e2a121b3dce
parent39b0cb9afeb53e9a1720bad64347e72d318c554a (diff)
downloadooprog-4225398c1cbb99808ddd1777b3c920731cd3d008.tar.gz
ooprog-4225398c1cbb99808ddd1777b3c920731cd3d008.tar.bz2
ooprog-4225398c1cbb99808ddd1777b3c920731cd3d008.zip
fixing asserts
adding mean_mark.hpp implementation don't use STL in array (required)
-rw-r--r--ue5/array.hpp36
-rw-r--r--ue5/mean_mark.hpp42
-rw-r--r--ue5/verwendung.cpp23
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 @@
4#undef SOLVED_2 4#undef SOLVED_2
5#define SOLVED_2 5#define SOLVED_2
6 6
7/* TODO:
8 * Angabe: Im Gegensatz zu den Beispielen bis jetzt ist die Verwendung
9 * der STL und Boostuntersagt!
10 */
11#include <utility> // for std::move 7#include <utility> // for std::move
12#include <stdexcept> // for std::out_of_range 8#include <stdexcept> // for std::out_of_range
13#include <algorithm> // for std::fill_n + std::swap_ranges
14 9
15namespace Ti 10namespace Ti
16{ 11{
17 template<typename T, size_t N> 12 template<typename T, std::size_t N>
18 struct array 13 struct array
19 { 14 {
20 typedef T& reference; 15 typedef T& reference;
21 typedef const T& const_reference; 16 typedef const T& const_reference;
22 typedef T* iterator; 17 typedef T* iterator;
23 typedef const T* const_iterator; 18 typedef const T* const_iterator;
24 typedef size_t size_type; 19 typedef std::size_t size_type;
25 20
26 static_assert(N != 0, "array<T, 0> not allowed"); 21 static_assert(N != 0, "array<T, 0> not allowed");
27 22
28 void fill (const T& u) 23 void fill(const T& u)
29 { 24 {
30 std::fill_n(begin(), size(), u); 25 for(size_type i = 0; i < size(); ++i)
26 m_data[i] = u;
27 /* std::fill_n(begin(), size(), u); */
31 } 28 }
32 29
33 void swap (array<T,N> & other) 30 /* range check not necessary. N must be the same in other */
31 void swap(array<T,N> & other)
34 { 32 {
35 std::swap_ranges(begin(), end(), other.begin()); 33 for(size_type i = 0; i < size(); ++i)
34 {
35 T x(m_data[i]);
36 m_data[i] = other[i];
37 other[i] = x;
38 }
39 /* std::swap_ranges(begin(), end(), other.begin()); */
36 } 40 }
37 41
38 iterator begin() 42 iterator begin()
@@ -70,12 +74,12 @@ namespace Ti
70 return false; /* size() == 0 */ 74 return false; /* size() == 0 */
71 } 75 }
72 76
73 reference operator[] (size_type n) 77 reference operator[](size_type n)
74 { 78 {
75 return m_data[n]; 79 return m_data[n];
76 } 80 }
77 81
78 const_reference operator[] (size_type n) const 82 const_reference operator[](size_type n) const
79 { 83 {
80 return m_data[n]; 84 return m_data[n];
81 } 85 }
@@ -87,7 +91,7 @@ namespace Ti
87 return m_data[n]; 91 return m_data[n];
88 } 92 }
89 93
90 const_reference at (size_type n) const 94 const_reference at(size_type n) const
91 { 95 {
92 if (n >= size()) 96 if (n >= size())
93 throw std::out_of_range("array::at"); 97 throw std::out_of_range("array::at");
@@ -103,8 +107,8 @@ namespace Ti
103 T m_data[N]; 107 T m_data[N];
104 }; 108 };
105 109
106 /* TODO: was macht std::move() genau?! :) */ 110 /* std::move returns lvalue as rvalue */
107 template<typename T, size_t N> 111 template<typename T, std::size_t N>
108 array<T, N>&& make_array() 112 array<T, N>&& make_array()
109 { 113 {
110 return std::move(array<T, N>()); 114 return std::move(array<T, N>());
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 @@
2#define MEAN_MARK_H 2#define MEAN_MARK_H
3 3
4#undef SOLVED_3 4#undef SOLVED_3
5//#define SOLVED_3 5#define SOLVED_3
6 6
7namespace Ti 7namespace Ti
8{ 8{
9 9
10 template <typename Iter> 10 template <typename Iter>
11 double mean_mark(Iter first, Iter last); 11 double mean_mark(Iter first, Iter last)
12 {
13 double result = 0;
14 unsigned count = 0;
15 for(; first != last; ++first)
16 {
17 result += (*first)->mark();
18 ++count;
19 }
20 return (count == 0) ? 0 : result / count;
21 }
12 22
13 template <typename Iter> 23 template <typename Iter>
14 double mean_mark_student(Iter first, Iter last); 24 double mean_mark_student(Iter first, Iter last)
25 {
26 double result = 0;
27 unsigned count = 0;
28 for(; first != last; ++first)
29 {
30 if (typeid(*(*first)) != typeid(Student))
31 continue;
32 result += (*first)->mark();
33 ++count;
34 }
35 return (count == 0) ? 0 : result / count;
36 }
15 37
16 template <class ForwardIterator> 38 template <class ForwardIterator>
17 ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark); 39 ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark)
40 {
41 ForwardIterator result = first;
42 for (; first != last; ++first)
43 {
44 if ((*first)->mark() <= mark)
45 {
46 *result = *first;
47 ++result;
48 }
49 }
50 return result;
51 }
18 52
19} 53}
20 54
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 @@
2#include <cassert> // for assert 2#include <cassert> // for assert
3#include <utility> // for std::move 3#include <utility> // for std::move
4#include <stdexcept> // for std::out_of_range 4#include <stdexcept> // for std::out_of_range
5#include <iostream> //TODO
5 6
6struct Person 7struct Person
7{ 8{
@@ -153,22 +154,24 @@ int main()
153 a1.swap(a2); 154 a1.swap(a2);
154 assert(a1[0] == 4); 155 assert(a1[0] == 4);
155 assert(a2[2] == 3); 156 assert(a2[2] == 3);
157
158 for(array<int,3>::iterator it = a2.begin(); it != a2.end(); ++it)
159 std::cout << (*it) << std::endl;
156#endif 160#endif
157 161
158#ifdef SOLVED_3 162#ifdef SOLVED_3
159 double mean = mean_mark(a.begin(), a.end()); 163 double mean = mean_mark(a.begin(), a.end());
160 assert (mean >= 3.1 || mean <= 3.3); 164 assert (mean >= 3.1 && mean <= 3.3);
161 165
162 double mean_student = mean_mark_student(a.begin(), a.end()); 166 double mean_student = mean_mark_student(a.begin(), a.end());
163 assert (mean_student >= 3.1 || mean_student <= 3.3); 167 assert (mean_student >= 3.1 && mean_student <= 3.3);
164 168
165 sarray::iterator end = remove_greater(a.begin(), a.end(), 3); 169 sarray::iterator end = remove_greater(a.begin(), a.end(), 3);
166 double mean2 = mean_mark(a.begin(), end); 170 double mean2 = mean_mark(a.begin(), end);
167 assert (mean2 >= 1.4 || mean2 <= 1.6); 171 assert (mean2 >= 1.4 && mean2 <= 1.6);
168#endif 172#endif
169 } 173 }
170 174
171
172 { 175 {
173 typedef array<shared_ptr<Person>, 5> parray; 176 typedef array<shared_ptr<Person>, 5> parray;
174 parray m; 177 parray m;
@@ -180,14 +183,14 @@ int main()
180 183
181#ifdef SOLVED_3 184#ifdef SOLVED_3
182 double mean = mean_mark(m.begin(), m.end()); 185 double mean = mean_mark(m.begin(), m.end());
183 assert (mean >= 2.3 || mean <= 2.5); 186 assert (mean >= 2.3 && mean <= 2.5);
184 187
185 double mean_student = mean_mark_student(m.begin(), m.end()); 188 double mean_student = mean_mark_student(m.begin(), m.end());
186 assert (mean_student >= 3.6 || mean_student <= 3.8); 189 assert (mean_student >= 3.6 && mean_student <= 3.8);
187 190
188 parray::iterator end = remove_greater(m.begin(), m.end(), 3); 191 parray::iterator end = remove_greater(m.begin(), m.end(), 3);
189 double mean2 = mean_mark(m.begin(), end); 192 double mean2 = mean_mark(m.begin(), end);
190 assert (mean2 >= 0.9 || mean2 <= 1.1); 193 assert (mean2 >= 0.9 && mean2 <= 1.1);
191#endif 194#endif
192 } 195 }
193 196
@@ -201,17 +204,17 @@ int main()
201 204
202#ifdef SOLVED_3 205#ifdef SOLVED_3
203 double mean = mean_mark(m.begin(), m.end()); 206 double mean = mean_mark(m.begin(), m.end());
204 assert (mean >= 2.3 || mean <= 2.5); 207 assert (mean >= 2.3 && mean <= 2.5);
205 208
206 double mean_student = mean_mark_student(m.begin(), m.end()); 209 double mean_student = mean_mark_student(m.begin(), m.end());
207 assert (mean_student >= 3.6 || mean_student <= 3.8); 210 assert (mean_student >= 3.6 && mean_student <= 3.8);
208 211
209 assert(m.size() == 5); 212 assert(m.size() == 5);
210 m.erase(remove_greater(m.begin(), m.end(), 3), m.end()); 213 m.erase(remove_greater(m.begin(), m.end(), 3), m.end());
211 assert(m.size() == 3); 214 assert(m.size() == 3);
212 215
213 double mean2 = mean_mark(m.begin(), m.end()); 216 double mean2 = mean_mark(m.begin(), m.end());
214 assert (mean2 >= 0.9 || mean2 <= 1.1); 217 assert (mean2 >= 0.9 && mean2 <= 1.1);
215#endif 218#endif
216 } 219 }
217 220