65,187
社区成员




//#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
template <typename T>
class Array {
T *elements;
int last; //已用最大下标值
int maxSize; //数组容量
public:
Array(int = 2); //为了便于检验,缺省元素数暂为2
~Array();
bool IsFull(); //判容器是否满
void renews(int); //数组容量增加若干个元素
void insertFront(T&); //将数据插入在数组最前面
friend ostream& operator<<(ostream& dest, Array& ar) {
if (ar.last == -1) cout << "暂无信息" << endl;
else for (int i = 0; i <= ar.last; i++) dest << ar.elements[i] << endl;
return dest;
}
};
template <typename T>Array<T>::Array(int maxs) {
//补充代码,创建并初始化数组,如有历史数据,则从文件"Exam6.txt"中读取
maxSize = maxs;
elements = new T[maxSize];
last = -1;
T temp;
ifstream datafile("Exam6.txt");
if (!datafile == 0) {//文件存在,则从文件读取数据
while (!datafile.eof()) {//!datafile.eof()是没有到文件结尾的意思
datafile >> temp;
insertFront(temp);
}
datafile.close();
datafile.clear(0);
}//因为是模板,所以志愿者类的东西都不能出现,实现通用性!!!!!!
}//写模板函数的时候要把它当成最普通的数据类型来写
template <typename T>Array<T>::~Array() {
//补充代码,释放动态数组空间,数据写入文件Exam6.txt
if (last != -1) {
ofstream datafile("Exam6.txt");
if (!datafile) cout << "fail to open." << endl;
else {
for (int i = 0; i <= last; i++) datafile << elements[i] << endl;
datafile.close();
}
}
delete[]elements;
}
template <typename T>bool Array<T>::IsFull() {
return (last == maxSize - 1);
}
template <typename T>
void Array<T>::renews(int augment) {
//完成数组容器增加augment个元素空间
T* temp = elements;
elements = new T[maxSize + augment];
maxSize += augment;
for (int i = 0; i <= last; i++) elements[i] = temp[i];//需重载志愿者类的等于运算符
delete[]temp;
}
template <typename T>void Array<T>::insertFront(T & elem) {
//补充代码,将数据插入到数组第一个位置
if (IsFull()) renews(1);
if (last == -1) elements[last + 1] = elem;
else for (int i = last; i > 0; i--) elements[i] = elements[i - 1];
elements[0] = elem;
last++;
}
class volunteer {
string Name;//志愿者姓名
string No;//身份证号
string Department;//所在院系
string Date;//参加日期
public:
volunteer(string = "", string = "", string = "", string = "");
friend ostream& operator<<(ostream&, volunteer&); //重载插入运算符
friend istream& operator >> (istream&, volunteer&);
// bool operator==(volunteer &);//志愿者姓名为关键字
bool operator<(volunteer &); //志愿者姓名为关键字
bool operator==(volunteer &);
};
istream&operator >> (istream& sour, volunteer& vlt) {//文件流类作为形式参数必须是引用
if (sour == cin) {// 完成键盘输入部分,键盘输入必须有提示
cout << "请输入志愿者姓名、身份证号、所在院系、参加日期(yymmdd,如150920): " << endl;
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
} else { //文件输入不要提示,完成由文件输入部分
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
}
return sour;
}
ostream& operator<<(ostream& dest, volunteer& vlt) //重载插入运算符
{
dest << " " << vlt.Name << " " << vlt.No << " " << vlt.Department << " " << vlt.Date;
return dest;
}
bool volunteer::operator==(volunteer &me) {
return Name == me.Name;
}
volunteer::volunteer(string name, string no, string department, string date) {
//完成构造函数&
Name = name;
No = no;
Department = department;
Date = date;
}
bool volunteer::operator<(volunteer& vlt) {//为按身份证号排序重载关系运算符
//重载==运算符
if (Name < vlt.Name)
return 1;
else return 0;
}
int main() {
Array<volunteer> mylist;
cout << mylist;
volunteer temp;
char ch;
cout << "是否输入新志愿者?Y or N" << endl;
cin >> ch;
while (ch == 'Y' || ch == 'y') {
cin.get();//吸收回车
cin >> temp;
mylist.insertFront(temp);
cout << "是否继续输入? Y or N" << endl;
cin >> ch;
}
cout << mylist;
return 0;
}