7-8 集合的模拟实现(类模板) (40 分)
我们可以用一个类来模拟集合及集合运算,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用类模板实现集合及集合运算,包括集合元素的增加、删除和查找的等基本功能。
集合模板类MySet包括数据如下:
T data[100];//用数组来存放所有的集合元素,最多不超过100个元素
int count;//表示目前集合中有多少个元素
包括成员函数如下:
构造函数若干个,集合运算函数如下:
int addSet( T elem)
int deleSet(T elem)
int findElem(T elem)
其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。
主函数有如下数据成员 :
MySet<int> intSet;(反斜杠是转义字符,使用时去掉)
MySet<double> douSet;
MySet<string> strSet;
分别是int类型、double类型、String的集合。
完成上述类模板和主函数,主函数根据输入的信息,建立初始的三种不同类型的空集合对象,调用成员函数分别对intSet、douSet和StrSet执行相应的操作,并输出对应的集合信息。
输入格式:
每一行为一个集合操作,每行的第一个数字为集合元素类型,1为整型元素,2为浮点型元素,3为String类型,第二个数字为集合操作类型,1为插入,2为删除,3为查找,第三个为集合元素,集合元素类型视第一个数字给定的集合元素类型而定。输入0时标志输入结束。
输出格式:
输出当前操作的执行位置(插入位置、删除位置和存在位置)
删除操作时,如果元素X不存在,输出“X is not exist!”。
插入操作时,如果集合已满,输出“Full Set.”若元素已存在,输出“X is already exist!”
查找操作时,如果找不到元素,输出“X is not exist!”。
输入:
1 1 1
1 1 2
1 3 1
1 2 1
1 2 3
1 3 1
2 1 1.1
2 1 2.2
2 1 3.3
2 3 1.1
2 2 2.2
2 2 2.2
3 1 abc
3 1 bcd
3 3 abc
3 2 abc
3 3 abc
0
输出:
0
1
0
0
3 is not exist!
1 is not exist!
0
1
2
0
1
2.2 is not exist!
0
1
0
0
abc is not exist!
代码
#include<iostream>
#include<string>
using namespace std;
template<class T>
class MySet{
private:
T data[100];
static int count;
public:
MySet(){}
int addSet(T elem);
int deleSet(T elem);
int findElem(T elem);
};
template<class T>
int MySet<T>::count=0;
template<class T>
int MySet<T>::addSet(T elem)
{
if(count==100)
{
cout<<"Full Set."<<endl;
return 0;
}
for(int i=0;i<count;i++)
{
if(data[i]==elem)
{
cout<<elem<<" is already exist!"<<endl;
return 0;
}
}
cout<<count<<endl;
data[count++]=elem;
return 0;
}
template<class T>
int MySet<T>::deleSet(T elem)
{
int flag=0;
int i;
for(i=0;i<count;i++)
{
if(data[i]==elem)
{
cout<<i<<endl;
flag=1;
count--;
break;
}
}
if(flag==0) cout<<elem<<" is not exist!"<<endl;
else
{
for(int j=i;j<=count-1;j++)
{
data[j]=data[j+1];
}
}
return 0;
}
template<class T>
int MySet<T>::findElem(T elem)
{
int flag=0;
for(int i=0;i<count;i++)
{
if(data[i]==elem)
{
cout<<i<<endl;
flag=1;
}
}
if(flag==0) cout<<elem<<" is not exist!"<<endl;
return 0;
}
int main()
{
int n;
cin>>n;
MySet<int>intSet;
MySet<double>douSet;
MySet<string>strSet;
while(n)
{
if(n==1)
{
int a,b;
cin>>a>>b;
switch(a)
{
case 1:intSet.addSet(b);break;
case 2:intSet.deleSet(b);break;
case 3:intSet.findElem(b);break;
}
}
else if(n==2)
{
int a;//a要注意还是整型,否则后面switch会报错,因为switch接收的只能是字符型或整型
double b;
cin>>a>>b;
switch(a)
{
case 1:douSet.addSet(b);break;
case 2:douSet.deleSet(b);break;
case 3:douSet.findElem(b);break;
}
}
else if(n==3)
{
int a;
string b;
cin>>a>>b;
switch(a)
{
case 1:strSet.addSet(b);break;
case 2:strSet.deleSet(b);break;
case 3:strSet.findElem(b);break;
}
}
cin>>n;
}
}
注意点
-
在用switch时,要注意switch(a)中a的类型,因为switch只能接受整型或字符型
-
在用template</class T>时,如果成员函数在类外,则在每一次写成员函数前都要加一个template</class T>,并且在类名后要加< T>
- 类外给static型赋值时,格式为
int 类名<T>::count=0;
- 类外写成员函数时
int 类名<T>::成员函数名(T elem)
-
类的实例化
格式:类名<数据类型>变量名 如此题的: MySet<int> intSet; MySet<double> douSet; MySet<string> strSet;
6-6 各省总销量及最高销量(对象数组) (10 分)
某手机厂商对其在n个城市的销量进行统计分析,现依次输入n个城市的省份名称、城市名称及销量,题目保证同一省份的数据将连续输入,要求输出各省的总销量及各省销量最高的城市名称及其销量,请根据给出的部分代码及输入输出的要求,按照注释中的任务提示,将代码补充完整。
裁判测试程序样例:
#include <iostream>
using namespace std;
class Sale {
private:
string prov,city;//省份,城市
double volume; //销量
public:
void setProv(string p);
void setCity(string c);
void setVolume(double v);
string getProv();
string getCity();
double getVolume();
};
int main() {
int n;//城市个数
cin>>n;
Sale s[n];
string prov;
string city;
double volume;
for(int i=0; i<n; i++) {
cin>>prov>>city>>volume;
s[i].setProv(prov);
/* 请根据下面的任务提示将代码补充完整,你的代码将被嵌入这里*/
//1.输入各城市的销量
//2.获取各省的总销量及最高销量的城市名称及其销量
//3.在主函数外,补充Sale类中各函数的定义
输入样例:
第一行为城市总数,从第2行开始,将依次输入各城市的销量,格式为 "省份名称 城市名称 销量",同一省份的数据将在连续的几行中输入,如下所示:
5
gd foshan 8.5
gd guangzhou 13.6
gd shenzhen 10.5
zj hangzhou 11.3
zj jiaxing 12.3
输出样例:
以如下的格式输出各省的总销量及最高销量的城市名称和该城市的销量。
gd sum=32.6 max=guangzhou,13.6
zj sum=23.6 max=jiaxing,12.3
c++中sort函数的使用方法
- 头文件:
#include<algorithm>
- sort模板有三个参数 sort(a,a+n,cmp)
第一个参数first:是要排序的数组的起始地址
第二个参数last:是要排序的数组的结束地址
第三个参数cmp是排序的方法,默认升序,但也可以认为降序
数组元素排序
- 若要使数组元素从大到小排序,则可自定义函数
bool cmp(int a,int b)
{
return a>b;
}
结构体元素排序
//不完全代码
struct STU{
string name;
int math;
int english;
}stu;
bool cmp(STU a,STU b)
{
if(a.math>b.math)
return a.math<b.math;
else if(a.math==b.math)
return a.english>b.english;
}
int main()
{
struct STU stu[4];
sort(stu,stu+4,cmp);
}