| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7589 人关注过本帖, 2 人收藏
标题:[经验]通讯录管理系统
只看楼主 加入收藏
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏(2)
 问题点数:0 回复次数:8 
[经验]通讯录管理系统

中南大学

课程设计II》设计报告

题 目 用VC++.Net开发通讯录管理系统

学生姓名 张祖锦

学 号 1301030106

专业班级 数学与应用数学0301班

指导老师 郑洲顺

数学科学与计算技术学院

200512

通讯录管理系统开发设计报告

[实验地点] 数学院机房

[实验时间] 2005-12-15~2005-12-30

[实验环境] Microsoft Visual C++.Net 2003

[指导老师] 郑洲顺

[实验目的]

1. 通过两周的实践,初步掌握Visual C++.Net的基本操作,加深面向对象编程的理解.

2. 亲自动手,开发有一定意义的软件系统.

[系统实现]

1. 总体分析和设计思想

利用MFC连接数据库有很多方法,选择一个比较适中的方法——利用MFCODBC类来制作通讯录管理系统。建立对话框应用程序,为其添加菜单实现登陆和密码修改功能,添加MFCODBC连接数据库实现对数据的操作:添加(Insert)、修改(Modify)、删除(Delete)、查找(Find)功能。

具体实现细节:建立对话框应用程序,并为它添加菜单,管理员登陆和密码修改都在此实现;建立两个MFCODBC类,一个连接个人信息表,一个连接管理员密码表;通过连接,使主界面能够显示数据库的数据;编写程序实现添加、修改、删除、查找功能,其中查找用到了一般数据库常用的SQL语言,一为其结构简单,二为其运行节省内存资源;通过模糊查找,可以统计出许多有用资料:男生有多少,女生有多少,姓张的有多少,姓王的有多少,江西的有多少,湖南的有多少等等。

此系统一般为单机服务,用户把自己认识的同学或好友添加进去,每到一处删除原来的,建立新的数据库,对于变动特别大的很实用。加上查询功能可以算是很好了,本来想对记录添加两个字段:生日和头像,可惜学的不够,不能实现。

一般的,可以移植到各个机器,只要用户配置好数据源即可使用。

2. 流程图

按地址

主菜单

登陆,mima

添加记录

修改记录

删除记录

查询记录

按学号

按姓名

按性别

按地址

刷新记录

查询记录

按学号

按姓名

按性别

刷新记录


成功


不成功

3. 算法与程序实现

u 准备工作 建立Access数据库Address.mdb,于中见表inforpwd,字段如下:

u 建立基本框架和设计视图 建立基于对话框的MFC应用程序,为它添加菜单,分别建立对话框LoginDlg, PwdChangeDlg, AddDlg, EditDlg, SearchDlg来分别实现登录,密码修改,添加记录,修改记录,查询记录功能,并分别为各个控件添加相应的变量(值变量,控制变量)。下面分别是各个界面:

搜索更多相关主题的帖子: FONT 通讯录 quot 中南大学 face 
2005-12-30 00:08
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

u 具体实现代码

a. AddressDlg.h中引入各个类,并为它们分别建立对象:

// 添加自己定义的类

#include "Login.h" // 密码框

#include "infor.h" // 数据源

#include "pwd.h" // 密码源

#include "Add.h" // 添加对话框

#include "EditData.h" // 修改对话框

#include "Search.h" // 查询对话框

#include "PwdChange.h" // 密码修改框

// 定义类的对象

CLogin logindlg;

Cinfor m_inforset;

Cpwd m_pwdset;

CAdd adddlg;

CEditData editdlg; // 本来想用Edit类的可惜那个已经是系统的了

CSearch searchdlg;

CPwdChange pwdchangedlg;

b. 登录

void CAddressDlg::Onlogin()

{

CLogin logindlg;

if(logindlg.DoModal( )==IDOK)

{

if(!m_pwdset.IsOpen( )) // 打开密码数据库

m_pwdset.Open( );

m_pwdset.MoveFirst( );

if(strcmp(logindlg.m_pwd,m_pwdset.m_pwd))

AfxMessageBox("密码错误,不能添加,修改,删除功能!");

else

{

// 管理员可以添加、修改、删除记录

m_addbtn.EnableWindow(true);

m_modifybtn.EnableWindow(true);

m_deletebtn.EnableWindow(true);

}

}

}

c. 密码修改

void CAddressDlg::Onpwdedit()

{

if(pwdchangedlg.DoModal( )==IDOK)

{

if(!m_pwdset.IsOpen( ))

m_pwdset.Open( );

m_pwdset.MoveFirst( );

if(m_pwdset.m_pwd!=pwdchangedlg.m_former)

AfxMessageBox("原密码错误,请重新输入!");

else

{

if(pwdchangedlg.m_new.GetLength( )==0)

AfxMessageBox("请输入新密码!");

else

{

if(pwdchangedlg.m_new==pwdchangedlg.m_certain)

{

m_pwdset.Edit( );

m_pwdset.m_pwd=pwdchangedlg.m_certain;

m_pwdset.Update( );

CString str;

str.Format("密码修改成功,新密码是:%s\n以后就用这个密码登陆了",pwdchangedlg.m_certain);

AfxMessageBox(str);

}

else

AfxMessageBox("新密码和确认密码不符,请重新输入!"); }

}

}

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:10
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

a. 刷新:因为多处要刷新,用List Control组件显示记录,故而从面向对象的观点看,定义一个函数来实现此功能,便可到处利用。

void CAddressDlg::ShowData(void)

{

if(!m_inforset.IsOpen( )) // 打开数据库指针

m_inforset.Open( );

m_addrlist.DeleteAllItems( ); // 删除所有记录

if(m_inforset.IsBOF( ) && m_inforset.IsEOF( )) // 没一条记录

AfxMessageBox("没有数据,如何显示!");

int i=0;

m_inforset.MoveFirst( );

while(!m_inforset.IsEOF( ))

{

m_addrlist.InsertItem(i,m_inforset.m_id,0);// 插入一行,i为行

m_addrlist.SetItemText(i,1,m_inforset.m_name);

m_addrlist.SetItemText(i,2,m_inforset.m_gender);

m_addrlist.SetItemText(i,3,m_inforset.m_address);

m_addrlist.SetItemText(i,4,m_inforset.m_postcode);

m_addrlist.SetItemText(i,5,m_inforset.m_email);

m_addrlist.SetItemText(i,6,m_inforset.m_memo);

i++;

m_inforset.MoveNext( );

}

CString cntstr;

cntstr.Format("%d",m_addrlist.GetItemCount( ));

m_cnt=cntstr; // 获取记录个数

m_addrlist.ShowWindow(SW_SHOW);

m_queryaddrlist.ShowWindow(SW_HIDE);

UpdateData(false); // 更新浏览界面

}

b. 添加记录:定义函数Add实现添加记录

void CAddressDlg::Add(void)

{

if(adddlg.DoModal( )==IDOK)

{

// 设置各个控件的属性

if(adddlg.m_id.GetLength( )==0)

{

AfxMessageBox("学号不能为空,请检查!");

return;

}

else

{

if(!m_inforset.IsOpen( )) // 打开数据链接

m_inforset.Open( );

// 以下程序保证学号不重复,因为学号是关键字

m_inforset.MoveFirst( ); // 移动到第一条记录

int flag=0;

while(!m_inforset.IsEOF( ))

{

if(m_inforset.m_id==adddlg.m_id)

{

flag=1;

break;

}

else

m_inforset.MoveNext( );

}

if(flag==0) // 没有这条记录,可以大胆的添加了

{

m_inforset.AddNew( );

// 以下是各字段的值

m_inforset.m_id=adddlg.m_id;

m_inforset.m_name=adddlg.m_name;

m_inforset.m_gender=adddlg.m_gender;

m_inforset.m_address=adddlg.m_address;

m_inforset.m_postcode=adddlg.m_postcode;

m_inforset.m_email=adddlg.m_email;

m_inforset.m_memo=adddlg.m_memo;

m_inforset.Update( ); // 提交数据

AfxMessageBox("恭喜你,添加成功!");

ShowData( ); // 刷新记录

}

else

AfxMessageBox("学号已存在,不能再添加了!");

}

}

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:12
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

a. 修改记录:定义函数Modify实现添加修改记录

void CAddressDlg::Modify(void)

{

POSITION pos=m_addrlist.GetFirstSelectedItemPosition( ); // 获取所选的记录

if(pos) // 如果选中一行

{

int nItem=m_addrlist.GetNextSelectedItem(pos);

// 将所选的一行数据移植到EditData对话框里

editdlg.m_id=m_addrlist.GetItemText(nItem,0);

editdlg.m_name=m_addrlist.GetItemText(nItem,1);

editdlg.m_gender=m_addrlist.GetItemText(nItem,2);

editdlg.m_address=m_addrlist.GetItemText(nItem,3);

editdlg.m_postcode=m_addrlist.GetItemText(nItem,4);

editdlg.m_email=m_addrlist.GetItemText(nItem,5);

editdlg.m_memo=m_addrlist.GetItemText(nItem,6);

editdlg.DoModal( );

if(!m_inforset.IsOpen( )) // 打开数据连接

m_inforset.Open( );

// 找到相应的记录进行修改

m_inforset.MoveFirst( );

while(!m_inforset.IsEOF( ))

{

if(!strcmp(m_inforset.m_id,editdlg.m_id))

break;

else

m_inforset.MoveNext( );

}

m_inforset.Edit( );

// 以下是修改的数据存入数据库

m_inforset.m_name=editdlg.m_name;

m_inforset.m_gender=editdlg.m_gender;

m_inforset.m_address=editdlg.m_address;

m_inforset.m_postcode=editdlg.m_postcode;

m_inforset.m_email=editdlg.m_email;

m_inforset.m_memo=editdlg.m_memo;

m_inforset.Update( );

AfxMessageBox("恭喜你,修改成功!");

ShowData( ); // 刷新用户界面

}

else

AfxMessageBox("请选择要修改的记录!");

}

b. 删除记录:定义函数Delete实现删除记录

void CAddressDlg::Delete(void)

{

POSITION pos=m_addrlist.GetFirstSelectedItemPosition( ); // 获取所选的记录

if(pos) // 如果选中一行

{

int nItem=m_addrlist.GetNextSelectedItem(pos);

if(AfxMessageBox("真的要删除这条记录么?",MB_YESNO)==IDYES)

// 询问真的要删除

{

if(!m_inforset.IsOpen( )) // 打开数据连接

m_inforset.Open( );

// 找到相应的记录

m_inforset.MoveFirst( );

while(!m_inforset.IsEOF( ))

{

CString str=m_addrlist.GetItemText(nItem,0);

if(!strcmp(m_inforset.m_id,str))

break;

else

m_inforset.MoveNext( );

}

m_inforset.Delete( );

AfxMessageBox("恭喜你,删除成功!");

ShowData( ); // 刷新用户界面

}

}

else

AfxMessageBox("请选择要删除的记录!");

}


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:13
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

a. 查询记录:定义Query实现查询记录,其中包括模糊查询,用了以前Delphi实习时不太熟悉的SQL语言,这是我觉得最精彩的一部分。

void CAddressDlg::Query(void)

{

m_queryaddrlist.DeleteAllItems( );

searchdlg.DoModal( );

if(!searchdlg.m_memoterm.GetLength( ))

AfxMessageBox("请输入查询值!");

else

{

CString strSql,fieldstr,valuestr;

switch(searchdlg.m_queryterm)

{

case 0:

fieldstr="id ";

break;

case 1:

fieldstr="name";

break;

case 2:

fieldstr="gender";

break;

case 3:

fieldstr="address";

break;

}

if(searchdlg.m_chk)

{

valuestr='%'+searchdlg.m_memoterm+'%';

strSql.Format("select * from infor where %s like '%s' ",fieldstr,valuestr);

}

else

strSql.Format("select * from infor where %s = '%s' ",fieldstr,searchdlg.m_memoterm);

if(m_inforset.IsOpen( ))

m_inforset.Close( );

m_inforset.Open(AFX_DB_USE_DEFAULT_TYPE,strSql);

if(!m_inforset.GetRecordCount( ))

AfxMessageBox("对不起,没有找到相应的记录!");

else

ShowQueryData( );

}

}

2. 运行结果

主界面:

查询:


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:16
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

[实践心得]

12月中旬便开始搞VC.Net实习了,经过了两个星期,确有一番感触:

以前觉得VC.Net不是很好,就没怎么学,只是把老师布置的一些作业做了,而其他时间则用来搞ACM了,经过这两个星期,发现VC.Net也不赖阿,特别是它那面向对象的编程思想,以前学Delphi学得还可以,可惜都是在控件下编程。比如有一次做Gauss消元法求解线性方程组,发到网上,别人大家赞赏,也对我提出了更高的要求——定义函数来写!确实这样更能体现类的思想——封装。

这次实习两周,而我真正用在写这个管理系统的时间仅仅是12个小时,而且是最后的12小时。其他时间用来干嘛了呢?用来读网上下载的程序、帮同学解决问题和写相关的程序。怕交不上,先写了个ZooManage的动物园管理系统,不过因为纸张原因而未能写上。再说了,本来想做个QQ2008奥运版来模拟QQ登录,只可惜遇到难题了:基于对话框的应用程序连上第三个对话框时就出错了——CPU占用99%,且不能关闭,去网上发帖,也无人回答,却步而止。

知道的太少,不过也没关系,要的是让不知道的成为知道。通过和几个同学交流,互看程序,互帮互助,很多在头脑中有但不能实现的都可以大概实现了。还有更重要的一点就是同学的鼓励,在很多关键性的点上卡住了,自己的实力和同学的鼓励使它变为踏上更远征途的垫脚石!

技术问题很好玩,也能让人大开眼界,不过过去了,知道了,又没写下,便又没什么说的了,挑几个还记得的而且很重要的写写:

Ø ADO连接数据库:去图书馆翻阅资料,东翻西找,可惜就是不能一本书解决问题,太可惜了。做这个东西一个两个的做,可惜就是不能成功,数据库能连接上,但是读取不可阿。取网上发帖,可惜真正懂得VC.Net的太少,哎呀!放弃,到用之时自然会知道。只可惜不能早点知道,再说了用ADO连接数据库很方便,而且很灵活。

Ø 单机程序移植:由于有了电脑,便有了更多的机会去实习,去观赏程序,写程序,可惜了,有时在机房可以运行,回来便挂了。这是个问题,但是经过几次的经验已经完全可以克服了。比如就拿最后一天来说:晚上600~1200Address的主界面和添加操作搞好了,第二天到机房把修改和删除弄好了,中午回来,好郁闷:明明删了的控件自动加载过来了,而且不能运行(错误信息很模糊),开始我放弃,重新再来。不过发现很难重来,便开始思考:我是为那些控件添加变量了阿,而且有的还编了程,系统如何不能识别,于是便开始了删除工作:先把控件的关联变量删了,然后把DoDataExchange中的关联也删了,最后把用到关联变量的地方也删了,赫赫,真是高兴,没问题了!

Ø 添加类:很多时候因为不熟悉VC.Net而胡乱写程序,直接在控件上编程,但是当我看完了别人写的程序之后便不这样了,就拿加个对话框的例子看,加好了,我不急于为它添加类,而为它添加一个有意义的名字,然后再添加和这个对话框很有联系的类,对于控件也一样。在者,看一开始的包含文件,我先把所有的头文件包含进来,然后定义个全局变量——每个类的都有一个,以后就可以直接调用了,当然这不是一气呵成的,边写边添加的。这很不像以前:要用的时候定义个类的对象,然后调用它的事件。

赫赫,也差不多了,很晚了。以后多多学习,不断丰富自己的编程经验!

[参考书目]

1. 何炜等. Visual C++.Net 2003 程序设计. 北京:冶金工业出版社

2. Davis Chapman. VC++.Net入门. 北京:中国电力出版社

3. 彭海河等. Visual C++.Net 实例入门. 山东:中国青年出版社


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:17
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 
[分享]Address
JpDwdtzA.rar (79.5 KB) [经验]通讯录管理系统


[此贴子已经被作者于2005-12-30 16:48:15编辑过]


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-12-30 00:21
狐狸
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-3-6
收藏
得分:0 
疑问
你做的“通讯录管理系统开发设计报告“所给的程序中为什么没有
*.dsw文件,和*.dsp文件呢?可以加我qq发给我吗?我是一个vc++新学手,想看看你是怎么做的?谢谢!!!我qq是358561862急阿!!
2008-03-06 16:01
冷凝冰
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-2
收藏
得分:0 
真是强啊!

为自己的未来多做点事!
2008-04-02 22:01
快速回复:[经验]通讯录管理系统
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021022 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved