MOOC清华《面向对象程序设计》第7章:统计考试及格率v5.4(单科及格与总分及格)

新需求:如何分别统计单科及格的人数和总分及格的人数?这种算法似乎在Microsoft Office. Excel中用得很多。视频中漏掉了一页课件,下载的PPT中有。

//main.cpp

#include <iostream>
#include <cstdlib>
#include "ArrayCollection.h"
#include "LinkedListCollection.h"
#include "Score.h"
#include "isPass.h"
using namespace std;

template <class _iterator, class _isPass>
void analyze(_iterator begin, _iterator end, _isPass isPass){
	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_ForEach<Score*, Score>(Score(70, 60, 60)));
	analyze(collection3.begin(), collection3.end(), 
						IsPass_ForEach<Score*, Score>(Score(50, 60, 60)));
	analyze(collection4.begin(), collection4.end(), 
						IsPass_ForEach<LinkedListIterator<Score>, Score>(Score(60, 60, 60)));
	cout << endl;
	
	analyze(sarray, sarray + 3, IsPass_Total<Score*, Score>(Score(70, 60, 60)));
	analyze(collection3.begin(), collection3.end(), 
						IsPass_Total<Score*, Score>(Score(50, 60, 60)));
	analyze(collection4.begin(), collection4.end(), 
						IsPass_Total<LinkedListIterator<Score>, Score>(Score(60, 60, 60)));
	
	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);
	}
	bool operator>=(Score pass){
		return (value[0] >= pass.value[0] && value[1] >= pass.value[1] && value[2] >= pass.value[2]);
	}
	float getTotal(){
		return value[0] + value[1] + value[2];
	}	
};

ostream& operator<<(ostream& out, const Score& s){
	out << '{' << s.value[0] << ',' << s.value[1] << ',' << s.value[2] << '}';
	return out;
}//注意这个流运算符重载不在类Score的内部定义,而要拿到外面来 

#endif

//IsPass.h

#ifndef IsPass_h
#define IsPass_h

template <class _iterator, class T>
class IsPass_ForEach{
	T _pass;
public:
	IsPass_ForEach(const T& pass):_pass(pass){}
	bool operator()(const _iterator& p){
		return (*p >= _pass);
	}
};

template <class _iterator, class T>
class IsPass_Total{
	T _pass;
public:
	IsPass_Total(const T& pass):_pass(pass){}
	bool operator()(const _iterator& p){
		return (p->getTotal() >= _pass.getTotal());
	}
};

#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

//LinkedListCollection.h

#ifndef LinkedListCollection_h
#define LinkedListCollection_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;
	}
};

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值