为了让“及格分数线”能够被记住,可调用Score类的对象并赋初值。只有main函数修改了,其余代码段与前一篇博文一样。
//main.cpp
#include <iostream>
#include <cstdlib>
#include "ArrayCollection.h"
#include "LinkedListIterator.h"
#include "LinkedListCollection.h"
#include "Score.h"
using namespace std;
Score pass(70, 60, 60);
template <class _Iterator>
bool isPass(const _Iterator& p){
return (p->value[0] >= pass.value[0] &&
p->value[1] >= pass.value[1] &&
p->value[2] >= pass.value[2]);
}//注意:这个isPass的实现是有缺陷的,只适合于Score类型
template <class _iterator>
void analyze(_iterator begin, _iterator end, bool (*isPass)(const _iterator&)){
int passed = 0, count = 0;
for(_iterator p = begin; p != end; p++){
if(isPass(p))
passed++;
count++;
}
cout << "passing rate = " << (float)passed / count << endl;
}
int main(int argc, char** argv) {
Score sarray[3];
sarray[0] = Score(60, 60, 60);
sarray[1] = Score(70, 70, 70);
sarray[2] = Score(50, 80, 80);
ArrayCollection<Score> collection3(3, sarray);
LinkedListCollection<Score> collection4;
for(int i = 0; i < 3; i++)
collection4.addFirst(sarray[i]);
analyze(sarray, sarray + 3, isPass<Score*>);
analyze(collection3.begin(), collection3.end(), isPass<Score*>);
analyze(collection4.begin(), collection4.end(), isPass<LinkedListIterator<Score>>);
system("PAUSE");
return EXIT_SUCCESS;
}