定义一个有关人信息的类B:
数据成员包括账号(整型)、姓名(字符串)、生日(类型A,试题A定义的类));
成员函数包括一组get函数、重载输入/输出运算符。
定义一操作类BOp:
数据成员至少包括B类对象向量;
成员函数包括:构造函数(从键盘输入一组B类对象并存入B类对象向量,账号输入-1时表示结束)、显示函数(按姓名升序输出向量的所有元素)、计数函数(参数为姓名,统计并返回姓名为指定姓名的对象的个数)
要求:定义操作类对象,依次调用显示函数和计数函数(作为cout的输出项,即输出满足条件的人数)。4 14
输入
一组B类对象数据;
要统计的指定对象的姓名
输出
按姓名升序输出B类对象(每行一个对象信息);
满足条件的对象数目。
样例输入
100 ff 8 20
110 cc 4 14
150 dd 4 30
-1
cc
样例输出
110 cc 4月14日
150 dd 4月30日
100 ff 8月20日
1
#include<bits/stdc++.h>
using namespace std;
class Date
{
int month;
int day;
public:
Date(int month,int d);
Date();
int getMonth()
{
return month;
}
int getDay()
{
return day;
}
friend ostream&operator<<(ostream&os,const Date&d);
friend istream&operator>>(istream&is,Date&d);
void displayDate();
};
Date::Date(int m,int d)
{
month=m;
day=d;
}
Date::Date()
{
month=day=0;
}
ostream&operator<<(ostream&os,const Date&d)
{
os<<d.month<<"月"<<d.day<<"日"<<endl;
return os;
}
istream&operator>>(istream&is,Date&d)
{
while(1)
{
is>>d.month>>d.day;
if(d.month==0&&d.day==0)
return is;
if(d.month==1||d.month==3||d.month==5||d.month==7||d.month==8||d.month==10||d.month==12)
if(d.day>=1&&d.day<=31)
return is;
if(d.month==4||d.month==6||d.month==9||d.month==11)
if(d.day>=1&&d.day<=30)
return is;
if(d.month==2)
if(d.day>=1&&d.day<=28)
return is;
}
}
void Date::displayDate()
{
cout<<month<<"月"<<day<<"日"<<endl;
}
class Student
{
int id;
string name;
Date date;
public:
Student(int i,string n,Date d):date(d)
{
id=i;
name=n;
date=d;
}
Student():date(0,0)
{
id=0;
name="0";
}
int getId()
{
return id;
}
string getName()
{
return name;
}
Date getDate()
{
return date;
}
void displayStudent();
friend ostream&operator<<(ostream&os,const Student&s);
friend istream&operator>>(istream&is,Student&s);
};
void Student::displayStudent()
{
cout<<id<<" "<<name<<" "<<date<<endl;
}
ostream&operator<<(ostream&os,const Student&s)
{
os<<s.id<<" "<<s.name<<" "<<s.date<<endl;
return os;
}
istream&operator>>(istream&is,Student&s)
{
is>>s.id;
if(s.id==-1)
return is;
is>>s.name>>s.date;
return is;
}
bool cmp(Student a,Student b)
{
return a.getName()<b.getName();
}
class Sop
{
vector<Student>v1;
vector<Student>::iterator it1;
multimap<string,int>m1;
multimap<string,int>::iterator mit1;
public:
Sop()
{
int i=0;
cout<<"请按照学号,姓名,生日输入学生信息:"<<endl;
while(1)
{
Student s;
cin>>s;
v1.push_back(s);//将学生信息存入向量数组中
if(v1[i].getId()==-1)
break;
i++;
}
}
void display()
{
sort(v1.begin(),v1.end()-1,cmp);//按姓名升序排序
for(int i=0;i<v1.size()-1;i++)
{
cout<<v1[i]<<endl;
}
}
void count()
{
int k=0;
cout<<"请输入要统计的学生的姓名"<<endl;
string name;
cin>>name;
for(int i=0;i<v1.size()-1;i++)
if(v1[i].getName()==name)
k++;
cout<<k<<endl;
}
};
int main()
{
//测试时间
/*Date d;
while(1)
{
cin>>d;
if(d.getMonth()==0&&d.getDay()==0)
break;
cout<<d;
}
*/
//测试学生类
/*Student s;
while(1)
{
cin>>s;
if(s.getId()==-1)
break;
cout<<s;
}
*/
//测试操作类
Sop s;
s.display();
s.count();
}
注意事项:
1,在第三个学生操作类中,题目说的是构造函数输入数据,所以要在构造函数中写入输入数据。因为这个类是用的vector向量数组,所以再输入数据的时候,要用到push_back将数据加到vector数组中。
2,vector向量的元素是从第0个开始的,所以在for循环中,要在最后一个元素的位置-1,
3,结束程序的语句要写在while循环里面,在主函数中,不需要输入数据,数据是由构造函数那里输入。
4 ,count计数,自己写的函数,不是原来stl标准库含有的。