计算机科学与应用系课程设计设计并实现简单的通讯录.docx
《计算机科学与应用系课程设计设计并实现简单的通讯录.docx》由会员分享,可在线阅读,更多相关《计算机科学与应用系课程设计设计并实现简单的通讯录.docx(23页珍藏版)》请在冰豆网上搜索。
![计算机科学与应用系课程设计设计并实现简单的通讯录.docx](https://file1.bdocx.com/fileroot1/2023-4/21/dc4cb413-66ad-43bb-8be4-016d9f84bef1/dc4cb413-66ad-43bb-8be4-016d9f84bef11.gif)
计算机科学与应用系课程设计设计并实现简单的通讯录
《计算机科学与应用系程序类课程设计》
设计报告书
题目:
设计并实现简单的通讯录
指导教师:
姓名:
学号:
日期:
2012年5月27日
计算机科学与应用系2011-2012学年第二学期
1、需求分析
设计简单通讯录,对人员的姓名和电话号码进行存储,文件保存,和进行不同的操作,有增加、删除、查询、显示等,对人员进行管理。
输入部分,根据程序运行的目录提示,选择要进行的操作,1~8是对通讯录的操作,0是退出系统。
程序执行具体步骤时,会根据所选内容,调用不同的执行函数,然后根据,不同函数的提示,进行具体操作。
每执行了不同函数,按任意键继续,系统会自动进行清屏处理,再进行选择操作,便于操作。
想退出系统时,可以选择0,便可退出系统。
二、系统主要功能
1.增加记录
2.删除一条记录
3.显示所有记录
4.按姓名查找并显示一条记录
5.按号码查找并显示一条记录
6.按姓名查找并修改一条记录
7.从文件中添加数据到库表中
8.将库表中的数据写入文件
1.退出系统
3、流程图
程序流程图如下图所示:
4、数据结构和类设计
为了设计并实现简单的通讯录,要求使用数组实现,设计了数组元素的类型,数据元素类型即Node,封装了姓名和号码以及对其操作的函数;数组这个类即array,封装了node即Node[1000],和计算数据
元素个数的计数变量len,以及对其操作的各个函数。
其中的函数都为接口函数,要实现具体的功能,在主函数中还要要点用具体的自定义函数。
1.数据元素类型即Node
程序大概代码如下(附有解释):
classNode
{private:
charname[10],number[20];//分别存储姓名和号码
public:
Node(char*p="",char*q="")//构造函数
{
strcpy(name,p);
strcpy(number,p);
}
char*getname()//得到姓名
{
returnname;
}
char*getnumber()//得到号码
{
returnnumber;
}
voidsetname(char*p)//建立姓名
{
strcpy(name,p);
}
voidsetnumber(char*p)//建立号码
{
strcpy(number,p);
}
voiddisplay()//显示信息
{
cout<}
friendclassarray;//友元函数
};
typedefNodenode[1000];//新定义Node为node[1000]
2保存个人信息的类array
程序关键代码如下(附有解释):
classarray
{
private:
nodeInfo;
public:
intlen;//标记信息个数
array(intl=0):
len(l){}//初始化
voidadd(char*p="",char*q="");//添加人员
char*getname(inti);//返回指定人的名字地址
char*getnumber(inti);//返回指定人的姓名地址
voidsetname(inti,char*p);//修改成员姓名
voidsetnumber(inti,char*p);//修改成员号码
intlocatename(char*p);//按姓名定位
intlocatenumber(char*p);//按号码定位
voiddelate(inti);//删除成员
voidshowone(inti);//显示指定人信息
voidshowall();//显示所有人信息
};
要将array类声明成为Node类的友元类,因为在array类中有Node类型的成员,需要声明才能才能调用Node类中的函数。
在初始化时要将len为零,因为那时没有存储数据,len是标记存储数据个数的。
其中intlocatename(char*p);intlocatenumber(char*p);这两个定位函数对于信息的查找、修改和删除至关重要,在查找时,需要对存储信息的数组进行遍历,返回要查找信息的编号,来确定信息的位置,然后利用函数voidshowone(inti)显示指定人的姓名和号码的信息;用函数voiddelate(inti)删除指定的成员;用voidsetname(inti,char*p)和voidsetnumber(inti,char*p)函数对指定人进行信息的修改。
其中在将输入的信息进行文件保存时,因为个人的名字和号码为私有成员,不能直接访问,就需要接口函数char*getname(inti);char*getnumber(inti);得到个人信息,才能进行存储。
voidshowall()函数是将存储的所有信息输出。
以上功能的实现,也离不开类Node中定义的函数,因为在实现类array中的函数功能时,利用了类Node中对应的函数。
如:
char*getname()和char*name(inti),char*getnumber()和char*getnumber(inti);voidsetname(char*p)和voidsetname(inti,char*p),voidsetnumber(char*p)和voidsetnumber(inti,char*p)等等
5.主要调用函数代码
5.1、选择函数
为了选择方便构造了选择函数。
程序代码如下:
intmenu_select()//选择函数
{
char*m[9]={"1.增加记录",
"2.删除一条记录",
"3.显示所有记录",
"4.按姓名查找并显示一条记录",
"5.按号码查找并显示一条记录",
"6.按姓名查找并修改一条记录",
"7.从文件中添加数据到库表中",
"8.将库表中的数据写入文件",
"0.退出系统"};
inti;
charc;
do{
system("cls");//清屏方便操作
cout<<"\n\n======欢迎使用通讯录管理系统======\n\n";
for(i=0;i<9;i++)
cout<cout<<"\n==================================\n";
cout<<"请选择(1-8,0):
";
cin>>c;
}while(c<'0'||c>'8');
return(c-'0');//因为返回值为int型
}
5.2、增加记录函数
增加记录函数Add有点用了array中的add()接口函数。
具体代码如下:
voidAdd(array&list)//1.增加记录
{
charp[10],q[20];
intn,m=0;
cout<<"请输入要添加的人数:
";
cin>>n;
cout<<"请输入:
\n姓名号码\n";
for(m;m{
cin>>p>>q;
list.add(p,q);
}
cout<<"添加成功!
\n";
}
5.3、删除一条记录函数
此函数有调用了array类中的delate()接口函数。
具体程序代码如下:
voidDel(array&list)//2.删除一条记录
{
inti;
charp[10];
cout<<"请输入要删除人的姓名:
";
cin>>p;
i=list.locatename(p);
if(i!
=-1)
{list.delate(i);
cout<<"删除成功!
"<}
}
5.4、按姓名查找并显示一条记录函数
此函数又调用了类array中的接口函数locatename()函数和showone()函数。
具体程序代码如下:
voidlocnameshow(array&list)//4.按姓名查找并显示一条记录
{inti;
charp[10];
cout<<"请输入要查找人的姓名:
";
cin>>p;
i=list.locatename(p);
if(i!
=-1)
list.showone(i);
}
5.5、按号码查找并显示一条记录函数
此函数又调用了类array中的接口函数locatenumber()函数和showone()函数。
具体程序代码如下:
voidlocnumbershow(array&list)//5.按号码查找并显示一条记录
{
inti;
charp[20];
cout<<"请输入要查找号码:
";
cin>>p;
i=list.locatenumber(p);
if(i!
=-1)
list.showone(i);
}
5.6、.按姓名查找并修改一条记录
此函数调用了类array中的接口函数locatename()函数和setname()函数和setnumber()。
具体程序代码如下:
voidmodify(array&list)//6.按姓名查找并修改一条记录
{
inti,t;
charp[10];
cout<<"请输入要查修改人的姓名:
";
cin>>p;
i=list.locatename(p);
if(i!
=-1)
{
cout<<"请选择要修改的内容:
1.姓名2.号码\n";
cin>>t;
if(t==1)
{cout<<"请输入修改后的姓名:
";
cin>>p;
list.setname(i,p);
cout<<"修改姓名成功!
";
}
else
if(t==2)
{cout<<"请输入修改后的号码:
";
cin>>p;
list.setnumber(i,p);
cout<<"修改姓名成功!
";
}
else
cout<<"选择错误!
重新操作\n";
}
}
5.7、从文件中添加数据到库表函数
此函数是为了从文件中读取保存的信息。
具体代码如下:
voidreadfile(array&list)//7.从文件中添加数据到库表中
{
charfname[20];
cout<<"请输入要读取的文件名:
";
cin>>fname;
ifstreaminf(fname,ios:
:
in|ios:
:
binary);
if(!
inf)
cerr<<"openerror"<inti,j,t;
charname[10],number[20];
inf>>j;
t=list.len;
for(i=0;i{
inf>>name>>number;
list.setname(t+i,name);
list.setnumber(t+i,number);
}
list.len=list.len+j;
cout<<"添加成功!
\n";
inf.close();
cin.get();
}
5.8、库表中的数据写入文件函数
此函数是为了将输入的信息存入文件。
具体程序代码如下:
voidwritefile(array&list)//8.将库表中的数据写入文件
{
inti;
charfname[20];
cout<<"请输入要写入的文件名:
";
cin>>fname;
ofstreamoutf(fname,ios:
:
out|ios:
:
binary);
if(!
outf)
{cout<<"不能打开"<"<return;
}
outf<for(i=0;i{
outf<}
cout<<"添加成功";
outf.close();
cin.get();
}
6、系统运行结果样例
头文件:
#include
#include
#include
#include
#include
usingnamespacestd;
主函数如下:
intmain()
{
arraybook;
for(;;)
{
switch(menu_select())
{
case1:
Add(book);
system("pause");
break;
case2:
Del(book);
system("pause");
break;
case3:
book.showall();
system("pause");
break;
case4:
locnameshow(book);
system("pause");
break;
case5:
locnumbershow(book);
system("pause");
break;
case6:
modify(book);
system("pause");
break;
case7:
readfile(book);
system("pause");
break;
case8:
writefile(book);
system("pause");
break;
case0:
exit
(1);
}
}
return1;
}
程序截屏如下:
又再次运行程序:
7、结语
大一下学的C++,现在无论是自己编写实现些简单函数体,还是参考相关资料上的稍大点的函数结构,都有点模糊了,甚至有时会弄不懂这个函数到底什么作用。
这次课程实践,又让我温习了用起来相当灵活的C++,对c++的封装、继承、多态有了更好地了解,同时也得到了应用,锻炼了自己的动手能力,实际独立处理些问题的能力。
但在具体操作中,有很多的细节问题,需要自己认真把握。
指导老师评语:
成绩:
签名: