1.实验内容
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:
0 姓名 电话 班级 宿舍 插入一条记录
1 姓名 根据姓名删除一条记录
2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为1到3的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)
3 姓名 根据姓名查找,找到输出1,未找到输出0
4 班级 输出该班级的所有成员的宿舍号的异或值
其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。
2.测试结果
输入:
28
0 Evan 57298577609 1 65
0 WINNIE 37367348390 4 1
3 Evan
4 6
3 WINNIE
1 Evan
4 7
1 WINNIE
3 MARYAM
3 CAMERON
3 TZIVIA
0 OMAR 16447001130 6 55
4 8
4 2
3 JADEN
3 ELIZABETH
2 OMAR 1 79409905568
3 JOSHUA
2 OMAR 1 8978214817
1 OMAR
3 Azaan
3 MARIA
0 HANNAH 94060479192 5 98
3 HEIDY
1 HANNAH
0 Axel 92066832927 3 70
1 Axel
3 TIFFANY
输出:
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
3.源代码
#include<iostream>
#include<string>
using namespace std;
struct student //包含学生4个信息的结构体
{
string name;
string phone;
int grade;
//因"class"为特殊字符,故用grade代表班级
int dorm;
};
template<class T>
void changeLength(T *&a,int oldLength,int newLength)
//改变数组的长度,变长则多余的空间为空,变短则舍弃部分数据
{
T *temp=new T[newLength];
int number=min(oldLength,newLength);
copy(a,a+number,temp);
delete []a;
a=temp;
}
class linearList //线性表类
{
public:
linearList(int n=10) //构造函数,参数为最大容量
{
person=new student[n];
capacity=n;
listSize=0;
}
~linearList() //析构函数
{
delete []person;
}
void insert(string &name,string &phone,int &grade,int &dorm) //插入信息
{
if(capacity==listSize) //最大容量满时扩大容量
{
changeLength(person,capacity,capacity*2);
capacity*=2;
}
person[listSize].name=name;
person[listSize].phone=phone;
person[listSize].grade=grade;
person[listSize].dorm=dorm;
listSize++;
}
void erase(string &name) //删除信息
{
int i=0;
for(i=0;i<listSize;i++) //找到该姓名的位置
if(person[i].name==name)
break;
copy(person+i+1,person+listSize,person+i); //后面的数据前移
person[--listSize].~student(); //释放最后一个位置的数据
}
void editPhone(string &name,string &newPhone) //编辑电话信息
{
int i=0;
for(i=0;i<listSize;i++) //找到该姓名的位置
if(person[i].name==name)
break;
person[i].phone=newPhone; //更新电话信息
}
void editGrade(string &name,int &newGrade)//编辑班级信息
{
int i=0;
for(i=0;i<listSize;i++) //找到该姓名的位置
if(person[i].name==name)
break;
person[i].grade=newGrade; //更新班级信息
}
void editDorm(string &name,int &newDorm)//编辑宿舍信息
{
int i=0;
for(i=0;i<listSize;i++) //找到该姓名的位置
if(person[i].name==name)
break;
person[i].dorm=newDorm; //更新宿舍信息
}
bool search(string &name) //查找是否存在该姓名
{
int i=0;
for(i=0;i<listSize;i++) //找到该姓名的位置
if(person[i].name==name)
return 1; //找到则返回1
return 0; //未找到,返回0
}
int outPut(int &gradeNum) //输出某班级所有人的宿舍号的异或值
{
int index=0;
for(int i=0;i<listSize;i++)
if(person[i].grade==gradeNum) //判断某人是否在该班中
index^=person[i].dorm; //若在,则计算异或值
return index;
}
private:
struct student* person;
int capacity;
int listSize;
};
int main()
{
int n;
cin>>n;
linearList studentArray;
for(int i=0;i<n;i++)
{
int decision;
cin>>decision;
string Name,Phone;
int Grade,Dorm;
switch(decision)
{
case 0: cin>>Name>>Phone>>Grade>>Dorm;
studentArray.insert(Name,Phone,Grade,Dorm);
break;
case 1: cin>>Name;
studentArray.erase(Name);
break;
case 2: cin>>Name;
int editDecision;
cin>>editDecision;
switch(editDecision)
{
case 1: cin>>Phone;
studentArray.editPhone(Name,Phone);
break;
case 2: cin>>Grade;
studentArray.editGrade(Name,Grade);
break;
case 3: cin>>Dorm;
studentArray.editDorm(Name,Dorm);
break;
default:break;
}
break;
case 3: cin>>Name;
cout<<studentArray.search(Name)<<endl;
break;
case 4: int GradeNum;
cin>>GradeNum;
cout<<studentArray.outPut(GradeNum)<<endl;
break;
default:break;
}
}
return 0;
}