⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 telphone.cpp

📁 这个程序的功能不是很全,如果你有更好的建议,please contact me.请多多指教哦
💻 CPP
字号:
/*-------------------------------------------------------
课程设计----电话簿管理
--------------------------------------------------------*/
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>
#include <iomanip.h>
#include <fstream.h>

void DispalyMenu()//显示主菜单
{	char *menu[]={	"   1. 增加记录",
				"   2. 删除记录",
				"   3. 显示所有记录",
				"   4. 查找显示(按姓名)",
				"   5. 查找修改记录(按姓名)",
				"   6. 从正文件中添加数据到库表",
				"   7. 将库表中的数据写入正文文件",
				"   8. 排序",
				"   9. 退出",
				NULL
				};
	cout<<"\n\n =====通讯录管理程序===== \n\n";
    for(int i=0; menu[i]!=NULL; i++)	cout<<menu[i]<<endl;
	cout<<"\n======================================= \n";
	cout<<"请选择: ";
}



class Node								//通讯录记录格式类
{
	char Name[10];						//姓名
	int OfficePhone;					//办公室电话
	int HomePhone;						//住宅电话
	char MobilePhone[15];				//手机号码
	char Email[20];						//email地址
	Node *Next;							//下一结点指针
public:
	Node(char na[10]="mao",int op=0,int hp=0,char 
		mp[15]="6",char em[20]="66")     //带缺省值的构造函数        
	{
		strcpy(Name,na);
		OfficePhone=op;
		HomePhone=hp;
		strcpy(MobilePhone,mp);
		strcpy(Email,em);
	}
	void Show()							//显示结点数据
	{	
		cout<<setw(10)<<Name<<setw(11)<<OfficePhone<<"(O)"

			<<setw(11)<<HomePhone<<"(H)"<<setw(14)<<MobilePhone
			<<"(M)"<<setw(10)<<Email<<endl;
	}
	void SetName(char na[])				//修改姓名
	{	strcpy(Name,na);	}
	void SetOfficePhone(int op)			//修改办公室电话
	{	OfficePhone=op;	}
	void SetHomePhone(int hp)			//修改住宅电话
	{	HomePhone=hp;	}
	void SetMobilePhone(char mp[])		//修改手机号码
	{	strcpy(MobilePhone,mp);	}		//修改email地址
	void SetEmail(char em[])
	{	strcpy(Email,em);	}			//将AddrList类说明为友元类
	friend class AddrList;
	friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
	friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
class AddrList							//链表类
{
	Node *HeadPtr;						//链表首指针
	Node *TailPtr;						//链表尾指针
	int Tag;
public:
	AddrList()							//构造函数,产生空链表,将Tag的值置为1              
	{
		HeadPtr=NULL;
		TailPtr=NULL;
		Tag=1;							/*排序状态标志,当Tag=1时,表示按姓名排序
														当Tag=2时,表示按办公室电话排序*/			
	}	
	void AddTail(Node *p);				//将p指向的结点加入到链表尾部
	void AddSort(Node *p);				//将p指向的结点按Tag值指定的顺序插入到链表中
	Node *LookUp(char *name);			//按姓名查找结点,返回结点指针	
	void Delete(char *name);			//删除指定姓名的结点
	void Sort(int tag);					//按Tag指定的关键字重新排序
	void ShowAll();						//显示全部结点,每十个显示一屏					
	void SetTag(int t)					//置tag的值			
	{	Tag=t;	}
	int GetTag()						//取tag的值		
	{	return Tag;	}
	Node *GetHeadPtr()					//取首指针
	{	return HeadPtr; 	}
	~AddrList()							//释放链表空间
	{
		Node *p1;
		while(HeadPtr)
		{
			p1=HeadPtr;
			HeadPtr=HeadPtr->Next;
			delete p1;
		}
	}

	void CreatList(char *filename); 	 //从二进制文件中读入数据,构造链表
	void WriteToFile(char *filename);	 //将链表中数据写入指定的二进制文件
};
void AddrList::AddTail(Node *p)
{   if(HeadPtr==NULL)
	{HeadPtr=TailPtr=p;p->Next=NULL;}
	else
	{   
		for(Node *p1=HeadPtr;p1;p1=p1->Next)
		{
			TailPtr->Next=p;
			TailPtr=p;
			TailPtr->Next=NULL;
		}
	}
}
void AddrList::AddSort(Node*p)			 //将P指向的结点按Tag指定的顺序插入到链表中(待改正)
{
	Node*p1,*p2;	
	if(Tag==1)									//当Tag=1时,按姓名顺序插入
	{	
		if(HeadPtr==NULL)						//链表为空的时候
		{p->Next=NULL;HeadPtr=TailPtr=p;}
		else if(strcmp(HeadPtr->Name,p->Name)>0)//插在首部
		{p->Next=HeadPtr;HeadPtr=p;}
		else if(strcmp(TailPtr->Name,p->Name)<0)//插在尾部
		{TailPtr->Next=p;p->Next=NULL;TailPtr=p;}
		else									//插在中间
		{
			p2=HeadPtr;
			while(p2&&strcmp(p->Name,p2->Name)>0)//找到应该插入的位置
			{p1=p2;p2=p2->Next;}
			p->Next=p2;p1->Next=p;
		}
	}
	else										//按办公室电话插入
	{
		if(HeadPtr==NULL)						//链表为空的时候
		{p->Next=NULL;HeadPtr=TailPtr=p;}
		else if(HeadPtr->OfficePhone>p->OfficePhone)//插在首部
		{p->Next=HeadPtr;HeadPtr=p;}
		else if(TailPtr->OfficePhone<p->OfficePhone)//插在尾部
		{TailPtr->Next;p->Next=NULL;TailPtr=p;}
		else										 //插在中间
		{
			p2=HeadPtr;
			while(p2&&((p->OfficePhone)>(p2->OfficePhone)))//找到应该插入的位置
			{p1=p2;p2=p2->Next;}
			p->Next=p2;p1->Next=p;							//插在链表中间
		}
	}
}
void AddrList::Sort (int Tag)
{  
	if(HeadPtr)
	{
		int num=0;
		Node*p=HeadPtr;
		while(p)
		{
			num++;
			p=p->Next;
		}													//获取链长(num)
	Node**po;
	po=new Node*[num];										//指针数组
	p=HeadPtr;
	for(int i=0;i<num;i++)
	{
		po[i]=p;
		p=p->Next;
	}														//给数组赋值
	
    switch(Tag)         
	{
	case 1:int i;char s[12];                        
		for(i=1;i<num;i++)
		{       
		      Node*pp=po[i];       
				strcpy(s,po[i]->Name);
		      int j=i-1;               
		      while(j>=0&&strcmp(s,po[j]->Name)<=0)
			  {
				  po[j+1]=po[j];
				  j--;
			  }
		      po[j+1]=pp;
		}
	       break;
	case 2:int ii,office;          
	    for(ii=1;ii<num;ii++)
		{
               Node*pp=po[ii];
		       office=po[ii]->OfficePhone;
		       int j=ii-1;while(j>=0&&(office-po[j]->OfficePhone)<=0)
			   {
				   po[j+1]=po[j];j--;
			   }
		       po[j+1]=pp;
		}
 	       break;
	} 
       for(int k=0;k<num-1;k++)
	   {
        	po[k]->Next=po[k+1];
	   }
	   po[num-1]->Next=NULL;
       HeadPtr=po[0];
	   TailPtr=po[num-1];
	   delete []po;
	}
}

Node* AddrList::LookUp(char *name)
{
	Node*p;
	p=HeadPtr;
	while(p!=NULL)
	{
		if(strcmp(p->Name,name)==0)return p;//找到结点,返回该结点指针
		p=p->Next;
	}
	return NULL;
}
void AddrList::Delete(char *name)
{
	Node *p1,*p2;
	p1=HeadPtr;
	while(p1&&strcmp(p1->Name,name))
	{
		p2=p1;
		p1=p1->Next;
	}
	if(strcmp(p1->Name,name)) cout<<"无此记录!"<<endl;
	else
	{
		if(strcmp(HeadPtr->Name,name)==0)
		{p1=HeadPtr;HeadPtr=HeadPtr->Next;delete p1;cout<<"已删除!\n";	}
		else 
		{
			p2->Next=p1->Next;
			delete p1;
			cout<<"已删除!\n";
		}
	}
}

void AddrList::ShowAll()
{
	Node *p;
	p=HeadPtr;
	while(p)
		{   
			system("cls");
			for(int j=0;j<10;j++)
			{
				p->Show();p=p->Next;
				if(p==NULL) break;
			}
			system("pause");
		}
	cout<<endl;
}


#define LEN sizeof(class Node)
void AddrList::CreatList(char *filename)	//从二进制文件中读入数据,构建链表
{
	int tag;int n;Node*p;
	fstream infile(filename,ios::in|ios::binary);
	if(!infile)
	{cout<<"Can not open input file"<<filename<<endl;exit(1);}
	infile.read((char*)&tag,sizeof(int));	//读入Tag值
	infile.read((char*)&n,sizeof(int));		//读入记录数
	Tag=tag;
	for(int i=0;i<n;i++)
	{
		p=new Node;
		infile.read((char*)p,LEN);
		AddTail(p);
	}
	infile.close();
}
void AddrList::WriteToFile(char*filename)   //将链表中数据写入指定的二进制文件中
{
	fstream outfile;
	outfile.open(filename,ios::out|ios::binary);
	if(!outfile)
		{cout<<"Can not open output file:"<<filename<<endl;exit(2);}
	Node*p,*p1;
	p=HeadPtr;p1=HeadPtr;
	int i=0;
	while(p){i++;p=p->Next;}				//计算出记录数
	outfile.write((char*)&Tag,sizeof(int));
	outfile.write((char*)&i,sizeof(int));
	for(int j=0;j<i;j++)
	{outfile.write((char*)p1,LEN);p1=p1->Next;}
	outfile.close();
}

void add(AddrList &addrlist)
{
	char na[10],mp[15],em[20];
	int op,hp;
	char ch='y';	
	while(ch=='y')
	{
		Node *p,*p1;
		p=new Node;
		cout<<"请输入你要添加的人的姓名\n";
		cin>>na;
		p1=addrlist.LookUp(na);
		if(p1)
		{
			cout<<"此人已经存在!\n";
			p1->Show();
		}
		else
		{
			cout<<"此人不存在,可以添加!\n";
			p->SetName(na);
			cout<<"请输入你要添加的人的办公室号码:\n";
			cin>>op;p->SetOfficePhone(op);
			cout<<"请输入你要添加的人的住宅号码:\n";
			cin>>hp;p->SetHomePhone(hp);
			cout<<"请输入你要添加的人的手机号码:\n";
			cin>>mp;p->SetMobilePhone(mp);
			cout<<"请输入你要添加的人的email地址:\n";
			cin>>em;p->SetEmail(em);
			addrlist.AddSort(p);
			cout<<"添加成功!\n";
			p->Show();
		}
		cout<<"是否继续添加?是(y)否(n)";
		cin>>ch;
	}
	system("pause");

}
void del(AddrList &addrlist)
{
	char na[10],ch='y',c;
	Node *p;
	while(ch=='y')
	{
		cout<<"请输入你要删除的人的姓名:\n";
		cin>>na;
		p=addrlist.LookUp(na);				//找到结点位置
		if(!p) cout<<"没有此人记录:\n";
		else
		{  
			p->Show();
			cout<<"你确认要把"<<na<<"删除吗?是(y) 否(n)\n";
			cin>>c;		
			if(c=='y') 
			{
				addrlist.Delete(na);
				cout<<"已删除!\n";
			}

		}
		cout<<"时否继续删除?是(y)否(n)\n";
		cin>>ch;
	}
	system("pause");
}


void showall(AddrList &addrlist)
{	
	if(addrlist.GetHeadPtr()==NULL)
	{
		cout<<"电话簿不存在!"<<endl;
	    system("pause");
	}
	addrlist.ShowAll();

}


void query(AddrList &addrlist)					//按姓名查找并显示记录
{   
	char na[10],ch='y';

	while(ch=='y')
	{
		Node *p;
		cout<<"请输入你要查找的人的姓名:";
		cin>>na;
		p=addrlist.LookUp(na);					//找到结点位置
		if(!p) cout<<"查无记录!";				//结点不空的时候输出数据
		else p->Show();
		cout<<"是否继续查找?是(y)否(n)\n";
		cin>>ch;
	}
 	system("pause");
}

void modify(AddrList &addrlist)
{
	char name[10],ch='y';	
	while(ch=='y')
	{
		Node *p;
		p=new Node;
		char c,na[10],mp[15],em[20];
		int op,hp;
		cout<<"请输入您要修改的人的姓名:\n";
		cin>>name;
		p=addrlist.LookUp(name);
		if(!p)
		{	
			cout<<"没有此人记录!\n"; 
			cout<<"是否继续修改?是(y)否(n)\n";
			cin>>ch;
		}
		else
		{
			p->Show();
			cout<<"是否继续修改?是(y)否(n)\n";
			cin>>c;
			if(c=='y')
			{		
			system("cls");
			cout<<"\n\n\t===========修改记录!==============\n\n";
			cout<<"\t\t(1)修改姓名\n"<<"\t\t(2)修改办公室电话\n";
			cout<<"\t\t(3)M修改住宅电话\n"<<"\t\t(4)修改手机\n";
			cout<<"\t\t(5)修改Email\n";
			cout<<"\t\t(6)退出\n";
			cout<<"\n\t==================================\n";
			cout<<"请选择:";
			int choice,state;
			cin>>choice;
			state=cin.rdstate();
			if(state)							//处理非法输入
			{
				char str[80];
				cin.clear();
				cin.getline(str,80);
				cout<<str<<"错误!请重新选择\n";
				cin>>choice;
			}
			switch(choice)
			{
				case 1:{	
					cout<<"请输入新的姓名:";
					cin>>na;
					p->SetName(na);				//修改姓名
					if(addrlist.GetTag()==1)
					{
						cout<<"**"<<endl;
						addrlist.Delete(na);
						cout<<""<<endl;
						addrlist.AddSort(p);
					}
					   };break;
												//修改后若Tag值为1,重新排序;
				case 2:{	
					cout<<"请输入新的办公室号码:";
					cin>>op;p->SetOfficePhone(op);//修改办公室电话													
					if(addrlist.GetTag()==2)	  //若Tag值为2,重新排序
					{addrlist.Delete(na);addrlist.AddSort(p);}
						};break;
				case 3:{
					cout<<"请输入新的住宅号码:";
					cin>>hp;p->SetHomePhone(hp);
					   };break;					 //修改住宅电话												
				case 4:{
					cout<<"请输入新的手机号码:";
					cin>>mp;p->SetMobilePhone(mp);
					   };break;					//修改手机号码												
				case 5:{
					cout<<"请输入新的人的Email:";
					cin>>em;p->SetEmail(em);
					   }break;					//修改email地址
				case 6:break;
				default:;
			}
			}
			cout<<"修改成功!\n";
			p->Show();
			cout<<"是否继续修改?是(y)否(n)\n";
			cin>>ch;
		}
	}
	system("pause");
}



void addfromtxtfile(AddrList &addrlist) 
{
	char filename[80];int n;
	Node *p;
	cout<<"输入源数据的文本文件的名称";
	cin>>filename;
	fstream file;
	file.open(filename,ios::in|ios::nocreate);
	if(!file) {  cout<<"无法打开"<<filename<<endl;	}
	else
	{   file>>n;
		for(int i=0;i<n;i++)					//循环地读入数据
		{	p=new Node;
			file>>p->Name;
			file>>p->OfficePhone;
			file>>p->HomePhone;
			file>>p->MobilePhone;
			file>>p->Email;
			addrlist.AddSort(p);
		}
		cout<<"记录已经被读入库表中!\n";
	}
	file.close();
	system("pause");
}
void writetotxtfile(AddrList &addrlist)
{ 
	char filename[80];
	cout<<"输入想要输出数据的文本文件名称";
	cin>>filename;
	fstream outfile(filename,ios::out);
	if(!outfile)
	{cout<<"无法打开"<<filename<<endl;}
	else
	{	Node *p1=addrlist.GetHeadPtr();
		while(p1)								//导出数据
		{
			outfile<<setw(10)<<p1->Name<<setw(11)<<p1->OfficePhone
				  <<"(O)"<<setw(11)<<p1->HomePhone<<"(H)"<<setw(14)
				  <<p1->MobilePhone<<"(M)"<<setw(10)<<p1->Email<<endl;
			p1=p1->Next;
		}
		cout<<"记录已经加入到文件中!\n";
	}
}
void sort(AddrList &addrlist)                  
{
	int choice;
	cout<<"1.按姓名排序\n"<<"2.按办公室电话排序\n"<<"请选择:";
	cin>>choice;
	if(cin.rdstate())
	{
		char str[80];cin.clear();cin.getline(str,80);
		cout<<str<<"非法输入,请重新输入!\n";cin>>choice;
	}
	switch(choice)
	{
	case 1:{addrlist.Sort(1);cout<<"排序完成!\n";}break;
	case 2:{addrlist.Sort(2);cout<<"排序完成!\n";}break;
	default:;
	}
}
void quit(AddrList &addrlist)
{
	
	addrlist.WriteToFile("040510222毛明川.dat");//把数据存放到addrlist.dat文件中,退出系统
	exit(9);
}






void main()  
{	 
	int choice=0, state;
	AddrList addrlist;
	while(choice!=9)       
	{ 	
		system("cls");
		DispalyMenu();
		cin>>choice;
		state = cin.rdstate();		  
		if(state||choice<0||choice>9)     // 处理非法输入,如输入一个字符
		{ 	
			cerr<<"Choose again:";
            if(state)
		    {   
				char str[80]; cin.clear(); cin.getline(str,80);  }
				cin>>choice; 
				state=cin.rdstate(); 
			}
			switch(choice)
			{	
				case 1: add(addrlist); break;
				case 2: del(addrlist); break;
				case 3: showall(addrlist); break;
				case 4: query(addrlist); break;
				case 5: modify(addrlist); break;
				case 6: addfromtxtfile(addrlist); break;
				case 7: writetotxtfile(addrlist); break;
				case 8: sort(addrlist); break;
				case 9: quit(addrlist); break;
	 			default: ;
			}
	}
}
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -