MOOC清华《面向对象程序设计》第7章:统计考试及格率v4.0(定义抽象结构)
2017-09-13 16:50
393 查看
视频中的PPT有两处错误,本代码已更正。
本次Debug经验:定义函数与调用函数时,务必注意类型匹配,有一丝差别都会出现错误。
//main.cpp
#include <iostream>
#include <cstdlib>
#include "ArrayCollection.h"
#include "LinkedListIterator.h"
#include "LinkedListCollection.h"
#include "Score.h"
using namespace std;
template <class _iterator>
void analyze(_iterator begin, _iterator end){
int passed = 0, count = 0;
for(_iterator p = begin; p != end; p++){
if(*p >= 60)
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);
analyze(collection3.begin(), collection3.end());
analyze(collection4.begin(), collection4.end());
system("PAUSE");
return EXIT_SUCCESS;
}
本次Debug经验:定义函数与调用函数时,务必注意类型匹配,有一丝差别都会出现错误。
//main.cpp
#include <iostream>
#include <cstdlib>
#include "ArrayCollection.h"
#include "LinkedListIterator.h"
#include "LinkedListCollection.h"
#include "Score.h"
using namespace std;
template <class _iterator>
void analyze(_iterator begin, _iterator end){
int passed = 0, count = 0;
for(_iterator p = begin; p != end; p++){
if(*p >= 60)
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);
analyze(collection3.begin(), collection3.end());
analyze(collection4.begin(), collection4.end());
system("PAUSE");
return EXIT_SUCCESS;
}
//Score.h #ifndef Score_h #define Score_h #include <iostream> using namespace std; struct Score{ float value[3]; Score(){} Score(float f1, float f2, float f3){ value[0] = f1; value[1] = f2; value[2] = f3; } Score& operator=(const Score& s){ value[0] = s.value[0]; value[1] = s.value[1]; value[2] = s.value[2]; return *this; } bool operator>=(float pass){ return (value[0] >= pass && value[1] >= pass && value[2] >= pass); } }; ostream& operator<<(ostream& out, const Score& s){ out << '{' << s.value[0] << ',' << s.value[1] << ',' << s.value[2] << '}'; return out; }//注意这个流运算符重载不在类Score的内部定义,而要拿到外面来 #endif
//ArrayCollection.h #ifndef ArrayCollection_h #define ArrayCollection_h template <class T> class ArrayCollection{ T* _data; int _size; public: ArrayCollection():_size(10){ _data = new T[_size]; } ArrayCollection(int size):_size(size){ _data = new T[_size]; } ArrayCollection(int size, T* data):_size(size){ _data = new T[_size]; for(int i = 0; i < size; i++) *(_data + i) = *(data + i); } ~ArrayCollection(){ delete[] _data; } T* begin(){ return _data; } T* end(){ return (_data + _size); } }; #endif
//LinkedListIterator.h #ifndef LinkedListIterator_h #define LinkedListIterator_h template <class T> struct LinkedListNode{ T _data; LinkedListNode *_next; LinkedListNode():_next(NULL){} LinkedListNode(T data):_data(data), _next(NULL){} LinkedListNode(T data, LinkedListNode<T>* next):_data(data), _next(next){} //注意上面这一行的第二个形参,其类型必须是LinkedListNode<T>*,否则 //将与 LinkedListCollection::addFirst(T&) 中的_head的类型不匹配,编译器会报错! }; template <class T> struct LinkedListIterator{ LinkedListNode<T> *pointer; LinkedListIterator(LinkedListNode<T> *p):pointer(p){} LinkedListIterator(const LinkedListIterator<T>& it):pointer(it.pointer){} LinkedListIterator<T>& operator++(){ pointer = pointer->_next; return *this; } const LinkedListIterator<T> operator++(int){ LinkedListIterator<T> temp = *this; pointer = pointer->_next; return temp; } T& operator*() const{ return pointer->_data; } T* operator->() const{ return &(pointer->_data); } bool operator!=(const LinkedListIterator<T> &other){ return pointer != other.pointer; } bool operator==(const LinkedListIterator<T> &other){ return pointer == other.pointer; } }; #endif
//LinkedListCollection.h #ifndef LinkedListCollection_h #define LinkedListCollection_h template <class T> class LinkedListCollection{ LinkedListNode<T>* _head; public: LinkedListCollection():_head(NULL){} ~LinkedListCollection(){clear();} bool empty(){return (_head == NULL);} void addFirst(const T& data){ _head = new LinkedListNode<T>(data, _head); } bool removeFirst(){ if(_head != NULL){ LinkedListNode<T>* p = _head; _head = _head->_next; delete p; return true; } else{ return false; } } T* getFirst(){ return (_head != NULL) ? &(_head->_data) : NULL; } LinkedListNode<T>* lastNode(){ LinkedListNode<T>* p; for(p = _head; p->_next != NULL; p = p->_next) ; return p; } void addLast(const T& data){ if(_head != NULL){ lastNode()->_next = new LinkedListNode<T>(data); } else{ _head = new LinkedListNode<T>(data); } } T* getLast(){ return (_head != NULL) ? &(lastNode()->_data) : NULL; } bool removeLast(){ if(_head != NULL){ if(_head->_next != NULL){ LinkedListNode<T>* p; for(p = _head; p->_next != NULL; p = p->_next) ; delete p->_next; p->_next = NULL; return true; } else{ delete _head; _head = NULL; return true; } } else return false; } void clear(){ while(removeFirst()) ; } LinkedListIterator<T> begin(){ return LinkedListIterator<T>(_head); } LinkedListIterator<T> end(){ return LinkedListIterator<T>(NULL); } }; #endif
相关文章推荐
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.1(“记住”及格分数线)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.2(用文件输入及格线)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.4(单科及格与总分及格)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v1.0(采用迭代器模式)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v3.0(自定义数据类型)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.0(某科及格线不是60分)
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.3(采用函数对象)
- MOOC清华《程序设计基础》第7章:统计活跃用户数
- MOOC清华《面向对象程序设计》第3章编程题第2题:重载下标运算符以统计分段人数
- MOOC清华《面向对象程序设计》第7章:负载监视器的设计v2.0(采用基于模板的策略模式)
- MOOC清华《程序设计基础》第7章:统计在线时长
- MOOC清华《面向对象程序设计》第4章:函数模板的特化实验
- MOOC清华《面向对象程序设计》第4章:强制类型转换实验
- MOOC清华《面向对象程序设计》第3章:对象组合实验
- MOOC清华《面向对象程序设计》第8章:栈的实现(基于数组)
- MOOC清华《面向对象程序设计》第8章:装饰模式实验
- MOOC清华《面向对象程序设计》第2章:auto变量实验
- MOOC清华《面向对象程序设计》第2章:函数重载实验
- MOOC清华《面向对象程序设计》第3章:流运算符重载实验
- MOOC清华《面向对象程序设计》第3章:下标运算符重载实验