资源描述
课程设计任务书
2011—2012学年第1学期
电子与信息工程系 专业 班级
课程设计名称: 数据结构课程设计
设计题目: 简单个人电话号码查询系统
完成期限:自2012 年 1月2日至2012 年 1月 6 日共 1 周
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
在本课程设计过程中要求学生:
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。
(3)学生在接受设计任务后,根据要求认真完成。
(4)认真编写课程设计报告。
三、设计内容
1) 问题描述
人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
2) 基本要求
(1) 在外存上,用文件保存电话号码信息;
(2) 在内存中,设计数据结构存储电话号码信息;
(3) 提供查询功能:根据姓名实现快速查询;
(4) 提供其他维护功能:例如插入、删除、修改等;
(5) 按电话号码进行排序。
3) 设计思想
由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:
const int max=10;
struct TeleNumber
{
string name; //姓名
string phoneNumber; //固定电话号码
string mobileNumber; //移动电话号码
string email; //电子邮箱
} Tele[max];
为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是,在数组中实现插入和删除操作的代价较高。如果记录需频繁进行插入或删除操作,可以考虑采用二叉排序树组织电话号码信息,则查找和维护都能获得较高的时间性能。更复杂地,需要考虑该二叉排序树是否平衡,如何使之达到平衡。
四、参考文献
1.王红梅.数据结构.清华大学出版社
2.王红梅.数据结构学习辅导与实验指导.清华大学出版社
3. 严蔚敏, 吴伟民.数据结构(C语言版). 清华大学出版社
目录
一、需求分析 2
二、总体设计 2
三、详细设计 4
四、调试与测试 9
五、关键源程序清单和执行结果 9
六、感想与体会 17
一、需求分析
1.程序的功能:
能够完成通讯录链表的建立、通讯者的插入、通讯者的查询、显示所有通讯者的信息、通讯录修改除名字外的其他信息、把txt文本中的信息导入到程序中、保存程序中打的信息导出到文本中保存以及通讯录表的退出等功能
2. 输入输出的要求:
程序运行后,给出7个菜单项的内容和输入提示:
1.增加电话号码
2.显示电话号码
3.排序个人电话
4.查找个人电话
5.删除个人信息
6.修改个人信息
7.保存个人信息
二、总体设计
主程序
修改
查找
保存
删除
排序
显示
增加
图一 程序框架图
主程序
是否有电话号码
增加电话号码
N
Y
插入联系人
显示联系人
排序电话号码
查找联系人
删除联系人
修改联系人
图二 程序设计流程图
三、详细设计
(1)先定义结构体:
struct TeleNumber //数据类
{
char name[10]; //姓名
int phoneNumber; //固定电话号码
int mobileNumber; //移动电话号码
int s;
TeleNumber * Next;
void ReadFile(istream & in);
void input();
void display();
} ;
(2)主函数:
输出菜单项,再通过输入1--7这几个数字,利用switch语句实现子函数调用。
int main()
{
bool flag=true;
TeleMessage tele;
char name[20];
while(flag)
{
system("cls");
cout<<"1.增加电话号码"<<endl;
cout<<"2.显示电话号码"<<endl;
cout<<"3.排序个人电话"<<endl;
cout<<"4.查找个人电话"<<endl;
cout<<"5.删除个人信息"<<endl;
cout<<"6.修改个人信息"<<endl;
cout<<"7.保存个人信息"<<endl;
cout<<"请选择:";
cin>>x;
switch(x)
{
case 0:flag=false;break;
case 1:tele.Insert();break;
case 2:tele.Show();break;
case 3:tele.Sort();break;
case 4:
cout<<"请输入欲查找认得姓名"<<endl;
cin>>name;
tele.Search(name);break;
case 5:tele.Remove();break;
case 6:tele.Change();break;
case 7:tele.Save();break;
}
cout<<"输入任意字母返回"<<endl;
cin>>a;
}
return 0;
}
(3)主函数中调用的一些子函数:
A.插入Insert() :
void TeleMessage::Insert() //插入
{
End->input(); //从单链表尾部插入
End->Next=new TeleNumber;
End=End->Next;
cout<<endl<<"插入成功"<<endl;
}
B.删除Remove():
void TeleMessage::Remove() //删除
{
char name[20];
TeleNumber * p=new TeleNumber,*temp=NULL;
cout<<"请输入要删除人的姓名:"<<endl;
cin>>name;
p->Next=Search(name); //先进行查找,找到所要删除的结点
if(Search(name))
{
temp=p->Next;
p->Next=p->Next->Next; //摘链
delete temp;
cout<<"\t\t删除成功!"<<endl;
}
else
{
cout<<"\t\t没有找到!"<<endl;
}
}
TeleNumber * TeleMessage::Search(char * name)
{
for(TeleNumber *p=Head->Next;p!=End;p=p->Next)
if(!strcmp(p->name,name))
{
if(x==4)
{
p->display();
return p;
}
else
return p;
}
if(x==4)
cout<<"查无此人"<<endl;
return 0;
}
C.修改Change():
void TeleMessage::Change() //修改信息
{
char name[20];
cout<<"请输入要修改的人的姓名:";
cin>>name;
if(Search(name))
{
cout<<"\t\t已找到个人的信息,请输入新的信息!"<<endl;
Search(name)->input();
cout<<"修改成功!"<<endl;
}
else
{
cout<<"\t\t没有找到!"<<endl;
}
}
D.显示 Show():
void TeleMessage::Show()
{
TeleNumber * p=Head->Next;
if( p!=End){ for(;p!=End;p=p->Next)
p->display(); }
else cout<<"没有信息,请先输入"<<endl;
}
cout<<"输入任意字母返回"<<endl;
cin>>a;
}
return 0;
}
E.排序Sort():
void TeleMessage::Sort() //起泡排序
{
TeleNumber *p=NULL,*q=NULL;
int exchange=j-1;
int bound;
int i;
while(exchange)
{
bound=exchange;
exchange=0;
for(p=Head->Next,i=1;i<bound;i++,p=p->Next)
if(p->mobileNumber>p->Next->mobileNumber)
{
Swap(p,p->Next); //调用交换函数
exchange=p->s;
}
}
Show();
}
F.保存Save():
void TeleMessage::Save() //保存文件
{
out.open("TeleNumber.txt"); //建立外存文件TeleNumber.txt
for(TeleNumber *p=Head->Next;p!=End;p=p->Next)
out<<p->name<<"\t"<<p->phoneNumber<<"\t"<<p->mobileNumber<<endl; //将数据存到外存文件里
out.close();
cout<<"保存成功!"<<endl;
}
四.调试与测试
在调试过程中,程序没有错误,但是在功能实现的时候,删除功能不能实现,经过查阅书籍和老师的帮助下,最后解决这个问题,使得删除功能可以实现。不能实现的原因是在于对单链表删除概念不是很清晰,指针的知识掌握的不够。
五.关键源程序清单和执行结果
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int x=0;
char a;
int j=1;
struct TeleNumber //数据类
{
char name[10]; //姓名
int phoneNumber; //固定电话号码
int mobileNumber; //移动电话号码
int s;
TeleNumber * Next;
void ReadFile(istream & in);
void input();
void display();
} ;
void TeleNumber::ReadFile(istream & in) //从文件把数据读入到程序
{
in>>name>>phoneNumber>>mobileNumber;
}
void TeleNumber::input() //信息输入
{
cout<<"请输入姓名"<<endl;
cin>>name;
cout<<"请输入固定电话号码"<<endl;
cin>>phoneNumber;
cout<<"请输入移动电话号码"<<endl;
cin>>mobileNumber;
s=j++;
}
void TeleNumber::display() //信息输出
{
cout<<"姓名:"<<name<<'\t'<<"固定号码:"<<phoneNumber<<'\t'
<<"移动电话号码:"<<mobileNumber<<endl;
}
class TeleMessage //功能类
{
public:
TeleMessage(); //构造数据结构
~TeleMessage(); //释放单链表
void Save(); //数据保存到文件
TeleNumber * Search(char *); //信息查找
void Sort(); //排序
void Insert(); //插入
void Remove(); //删除
void Change(); //更改
void Show(); //显示
void Swap(TeleNumber *,TeleNumber *); //两个TeleNumber对象交换数据域
private:
TeleNumber * End,* Head;
ifstream in; //定义读,写文件对象
ofstream out;
};
TeleMessage::TeleMessage()
{
Head=new TeleNumber; //头插法建立单链表
Head->Next=new TeleNumber;
End=Head->Next;
in.open("TeleNumber.txt"); //打开外存文件,看是否有数据存在
if(!in)
cout<<"电话系统中没有任何号码,请输入号码"<<endl;
else
{
while(!in.eof()) //如果有,则打开,并将数据读取到程序
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new TeleNumber;
End=End->Next;
}
in.close();
cout<<"读取电话号码系统成功!"<<endl;
}
cout<<"输入任意字母继续"<<endl;
cin>>a;
}
TeleMessage::~TeleMessage() //释放单链表
{
TeleNumber * temp;
while(Head->Next!=End)
{
temp=Head->Next;
Head=Head->Next;
delete temp;
}
delete Head,End; //删除头尾指针
}
void TeleMessage::Save() //保存文件
{
out.open("TeleNumber.txt"); //建立外存文件TeleNumber.txt
for(TeleNumber *p=Head->Next;p!=End;p=p->Next)
out<<p->name<<"\t"<<p->phoneNumber<<"\t"<<p->mobileNumber<<endl; //将数据存到外存文件里
out.close();
cout<<"保存成功!"<<endl;
}
void TeleMessage::Swap(TeleNumber *p1,TeleNumber *p2) //两个类对象数据域进行交换
{
TeleNumber * temp=new TeleNumber;
strcpy(temp->name,p1->name);
temp->mobileNumber=p1->mobileNumber;
temp->phoneNumber=p1->phoneNumber;
temp->s=p1->s;
strcpy(p1->name,p2->name);
p1->mobileNumber=p2->mobileNumber;
p1->phoneNumber=p2->phoneNumber;
p1->s=p2->s;
strcpy(p2->name,temp->name);
p2->mobileNumber=temp->mobileNumber;
p2->phoneNumber=temp->phoneNumber;
p2->s=temp->s;
}
void TeleMessage::Sort() //起泡排序
{
TeleNumber *p=NULL,*q=NULL;
int exchange=j-1;
int bound;
int i;
while(exchange)
{
bound=exchange;
exchange=0;
for(p=Head->Next,i=1;i<bound;i++,p=p->Next)
if(p->mobileNumber>p->Next->mobileNumber)
{
Swap(p,p->Next); //调用交换函数
exchange=p->s;
}
}
Show();
}
void TeleMessage::Insert() //插入
{
End->input(); //从单链表尾部插入
End->Next=new TeleNumber;
End=End->Next;
cout<<endl<<"插入成功"<<endl;
}
void TeleMessage::Remove() //删除
{
char name[20];
TeleNumber * p=new TeleNumber,*temp=NULL;
cout<<"请输入要删除人的姓名:"<<endl;
cin>>name;
p->Next=Search(name); //先进行查找,找到所要删除的结点
if(Search(name))
{
temp=p->Next;
p->Next=p->Next->Next; //摘链
delete temp;
cout<<"\t\t删除成功!"<<endl;
}
else
{
cout<<"\t\t没有找到!"<<endl;
}
}
TeleNumber * TeleMessage::Search(char * name)
{
for(TeleNumber *p=Head->Next;p!=End;p=p->Next)
if(!strcmp(p->name,name))
{
if(x==4)
{
p->display();
return p;
}
else
return p;
}
if(x==4)
cout<<"查无此人"<<endl;
return 0;
}
void TeleMessage::Change() //修改信息
{
char name[20];
cout<<"请输入要修改的人的姓名:";
cin>>name;
if(Search(name))
{
cout<<"\t\t已找到个人的信息,请输入新的信息!"<<endl;
Search(name)->input();
cout<<"修改成功!"<<endl;
}
else
{
cout<<"\t\t没有找到!"<<endl;
}
}
void TeleMessage::Show()
{
TeleNumber * p=Head->Next;
if( p!=End){ for(;p!=End;p=p->Next)
p->display(); }
else cout<<"没有信息,请先输入"<<endl;
}
int main()
{
bool flag=true;
TeleMessage tele;
char name[20];
while(flag)
{
system("cls");
cout<<"1.增加电话号码"<<endl;
cout<<"2.显示电话号码"<<endl;
cout<<"3.排序个人电话"<<endl;
cout<<"4.查找个人电话"<<endl;
cout<<"5.删除个人信息"<<endl;
cout<<"6.修改个人信息"<<endl;
cout<<"7.保存个人信息"<<endl;
cout<<"请选择:";
cin>>x;
switch(x)
{
case 0:flag=false;break;
case 1:tele.Insert();break;
case 2:tele.Show();break;
case 3:tele.Sort();break;
case 4:
cout<<"请输入欲查找认得姓名"<<endl;
cin>>name;
tele.Search(name);break;
case 5:tele.Remove();break;
case 6:tele.Change();break;
case 7:tele.Save();break;
}
cout<<"输入任意字母返回"<<endl;
cin>>a;
}
return 0;
}
图三 功能显示
图四 显示联系人
图五 排序电话号码
图六 查找联系人
图七 修改联系人
图八 保存成功
六、感想与体会:
这次课程设计加深了对结构体的理解,以及文件流的一些深入理解,但还是不太会把文本文件导入到程序中,而且导出到文件中的内容会形成乱码,所以仍需进一步的学习,以能更加熟练的运用数据结构(C++)来设计系统。刚开始我会发现有些小问题,在运行程序的时候,删除功能不能实现,但在经过老师的指导以及同学的帮助下,我还是很好的完成了任务。
17
展开阅读全文