C语言通讯录程序课程设计.docx
《C语言通讯录程序课程设计.docx》由会员分享,可在线阅读,更多相关《C语言通讯录程序课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
C语言通讯录程序课程设计
C语言通讯录程序课程设计
3.6实例6通讯录程序
本实例希望设计一个通讯录程序,要求实现通讯录信息的录入,并具有添加、查询、删除、显示等功能;使用结构体存储通讯录中记录信息;使用链表来实现通讯录信息的添加、删除、查询及显示等操作;通讯录程序可实现文件读写,在通讯录信息录入结束之后,可存入文件中,在下次程序运行时可将通讯录中的记录读取到程序中。
通讯录程序可采用基于Win32控制台程序构建或采用基于MFC应用向导.EXE的应用程序,下面对这两种方法进行详细介绍。
3.6.1.设计目的
1、掌握结构体的基本工作原理和工作方式。
2、熟悉结构体与链表的使用方法。
3、熟悉C语言下数据的输入与输出。
4、掌握C语言下对TXT文件的读写操作。
5、熟悉函数的设计方法及调用方法。
3.6.2.基本要求
1、本实例要求实现对通讯录信息的查找、添加、删除、显示等功能,每个功能模块均能实现随时从模块中退出,可以通过键盘对功能进行选择,完成一个通讯录管理系统的运
5、mydelete()函数------删除链表节点
函数根据用户输入通讯录中人名,在已有的链表中查找该人名信息存放的节点,如找到该节点,则删除该节点,并对链表结构重新链接;如未找到该人名信息的节点,则提示用户不存在。
6、mydisplay()函数------显示所有用户记录
函数用来遍历所有节点,并向屏幕上输出所有节点的通讯录中的详细信息。
7、displaymenu()函数-------显示菜单函数
函数向屏幕上输出,用户可以选择的选项菜单,给用户提示信息,给用户选择做出提示。
8、mysearch()函数-------查找学生信息
函数用来查找通讯录中人名信息存在与否,如不存在则提示用户,如存在返回该人名的链表节点。
3.6.4.程序执行流程图
功能模块图
3.6.5基于Win32控制台的C语言程序设计详细步骤
步骤1:
建立一个工程
在VisualC++6.0的集成开发环境下,单击File(文件)菜单项,之后选择其子菜单项New(新建),如下图所示。
屏幕上回弹出New(新建)对话框,如下图所示。
单击对话框上方的Projects(工程)选项卡,在其下方列表中选择Win32ConsoleApplication选项,在右侧的Projectname(工程名)框中输入工程名Address,在Location(目录)中输入工程文件存放的目录C:
\Student,之后单击OK按钮。
单击OK按钮后,会弹出如下图所示的界面,为了方便编程,选择Asimpleapplication,之后单击Finish按钮。
之后,弹出如下图所示界面。
界面中包含了建立此工程文件的头文件及路径等信息。
单击OK按钮,则进入了一个简单的C语言Win32控制台程序集成开发界面,如下图所示。
左侧窗口为工程管理窗口,选择FileView选项卡,通过点击“+”可打开工程的文件及目录列表,工程的很多操作都需要通过此窗口进行。
同时通过双击列表中的Address.cpp文件名,可在中央的编辑窗口中打开其文件,如下图所示,此文件中只包含有一个主函数main()框架。
步骤2:
添加程序头文件,在打开的Address.cpp文件上部,添加如下代码。
#include
#include
#include
#include
步骤3:
在主函数上面添加函数定义、变量定义以及结构体定义,如下所示。
structstu
{
charname[20];/*姓名*/
chartelephone[20];/*电话*/
charsex[4];/*性别*/
charcompany[20];/*公司*/
structstu*next;/*链表节点*/
};
typedefstructstuSTU;
STU*mycreate();/*创建节点*/
voidmydisplay(STU*head);/*显示节点*/
voidmyadd(STU*head);/*增加记录*/
STU*mysearch(STU*head,charname[20]);/*查找记录*/
voidmydelete(STU*head,charname[20]);/*删除记录*/
voiddisplaymenu();/*显示所有记录*/
位置如下图所示:
步骤4:
添加main()函数的实现部分以及其它功能函数,在main()主函数中添加代码内容如下:
intmain(intargc,char*argv[])/*主函数*/
{
STU*head=NULL,*p;
charname[20];
intselect;
while
(1)
{
displaymenu();//显示功能菜单
printf("请选择一个功能:
");
scanf("%d",&select);
switch(select)
{
case1:
//录入通讯记录
//getchar();
head=mycreate();
mydisplay(head);
break;
case2:
//添加通信记录
//getchar();
myadd(head);
mydisplay(head);
break;
case3:
//查找通信记录
printf("请输入要查找的人的姓名:
");
scanf("%s",name);
p=mysearch(head,name);
if(p!
=NULL)
printf("%s%s%s%s",p->telephone,p->name,p->sex,p->company);
else
printf("没找到!
");
break;
case4:
//删除通信记录
printf("请输入要删除的人的姓名:
");
scanf("%s",&name);
mydelete(head,name);
mydisplay(head);
break;
case5:
//显示通讯记录
mydisplay(head);
break;
case9:
//退出系统
exit(0);
default:
//输入错误的功能选项
printf("选择功能错误,请重新选择。
\n");
break;
}//endofswitch
printf("按任意键继续......\n");
getch();
}//endofwhile
return0;
}
STU*mycreate()/*创建链表*/
{
STU*head,*p,*q;
head=(STU*)malloc(sizeof(STU));
q=head;
printf("请输入:
电话号码姓名性别单位:
\n");
p=(STU*)malloc(sizeof(STU));
scanf("%s%s%s%s",p->telephone,p->name,p->sex,p->company);
q->next=p;
q=p;
q->next=NULL;
returnhead;
}
voidmyadd(STU*head)/*添加记录*/
{
STU*p;
p=(STU*)malloc(sizeof(STU));
printf("请输入:
电话号码姓名性别单位:
\n");
scanf("%s%s%s%s",&p->telephone,p->name,p->sex,p->company);
p->next=head->next;
head->next=p;
}
voidmydelete(STU*head,charname[20])/*删除记录*/
{
STU*p,*q;
q=head;
p=head->next;
while(p!
=NULL)
{
if(strcmp(p->name,name)==0)
{
q->next=p->next;
free(p);
break;
}
q=p;
p=p->next;
}
return;
}
STU*mysearch(STU*head,charname[20])/*查找记录*/
{
STU*p;
p=head->next;
while(p!
=NULL)
{
if(strcmp(p->name,name)==0)
break;
p=p->next;
}
returnp;
}
voidmydisplay(STU*head)/*显示记录*/
{
STU*p;
p=head->next;
while(p!
=NULL)
{
printf("%s%s%s%s\n",p->telephone,p->name,p->sex,p->company);
p=p->next;
}
}
voiddisplaymenu()/*显示菜单*/
{
system("cls");
printf("**************MENU**************\n\n");
printf("1.创建通讯录\n");
printf("2.添加通讯录\n");
printf("3.查找通讯录\n");
printf("4.删除通讯录\n");
printf("5.显示通讯录\n");
printf("6.退出通讯录系统\n");
printf("**************MENU**************\n\n");
}
至此所有代码输入工作完成。
步骤5.程序调试
单击VisualC++6.0环境下的工具条中快捷执行按钮
或(Ctrl+F5),按照提示菜单输入选择键就可以进行相应操作,程序执行结果如下所示。
3.6.6基于MFC应用向导.EXE的应用程序设计详细步骤
步骤1:
建立一个工程
在VisualC++6.0的集成开发环境下,单击File(文件)菜单项,之后选择其子菜单项New(新建),如下图所示。
屏幕上回弹出New(新建)对话框,如下图所示。
单击对话框上方的Projects(工程)选项卡,在其下方列表中选择MFCAppWizard(exe)选项,在右侧的Projectname(工程名)框中输入工程名Address,在Location(目录)中输入工程文件存放的目录C:
\Address,之后单击OK按钮。
如下图所示:
单击OK按钮后,会弹出MFC程序创建向导,如下图所示的界面,选择基于对话框的选项(Dialogbased),之后单击Finish按钮。
之后,弹出如下图所示界面。
界面中包含了建立此工程文件的头文件及路径等信息。
单击OK按钮,则进入了一个简单的C语言MFC应用向导.EXE的应用程序集成开发界面,如下图所示。
由于MFC程序含有用户界面,因此在编写代码前,可以设置用户的界面,通过单击左侧工程管理窗口中的ResourceView选项卡,Dialog下的IDD_ADDRESS_DIALOG选项,则界面显示在在集成开发环境中间的编辑区域。
采用右侧工具箱进行界面设计,工具箱中提供了常用的界面应用控件,可点击控件图标之后在界面上画出控件对象,如创建多个相同的控件对象,可在创建第一个后,采用复制黏贴的方式创建其它多个相同的控件对象。
构建界面时,删除上图中界面中已有控件,并使用其中的
StaticText控件(用于显示文字信息)、
EditBox控件(用作输入框)和、
Button控件(用作按钮),构建界面如下图所示。
要求七个
Button控件连续创建,创建好第一个按钮,其它的可采用复制的方式,这样按钮的ID会连续;之后在按钮上单击鼠标右键,选择Properties菜单项,之后改变其Caption属性(按钮的显示属性),七个按钮的Caption属性分别设置为“添加记录”、“删除记录”、“查找记录”、“显示记录”、“写入文件”、“读取文件”、“退出系统”。
选中七个按钮,在VisualC++环境下菜单中的Layout下的指令,可对按钮进行排列操作。
按照同样的方法,按照顺序从上到下依次创建五个
EditBox控件,五个
StaticText控件,之后单独创建一个
EditBox控件放在右侧。
五个StaticText控件Caption属性分别设为“姓名:
”、“电话:
”、“性别:
”、“单位:
”、“爱好:
”。
构建的界面如下图所示。
之后在右侧的
EditBox控件上单击鼠标右键,选择Properties菜单,之后选择Styles选项卡,在Multiline左侧方框内勾选对号,用来多行显示记录信息。
之后在界面空白处,单击鼠标右键,选择Properties菜单,之后改变窗口Caption属性值为“通讯录系统”,其窗口标题栏会做相应改变,至此界面创建完毕,下面添加程序代码及控件变量。
为添加控件变量,即与输入文本框
EditBox控件所对应的变量,方法为:
单击菜单中的“View”->“ClassVizard”,弹出对话框如下图所示,选择“MemberVariables”选项卡,选择IDC_EDIT1,之后单击“AddVariable”按钮。
在弹出的对话框中添加变量名为“m_Name”,如下图所示。
之后按照如上方法,选择IDC_EDIT2至IDC_EDIT6,之后单击“AddVariable”按钮。
在弹出的对话框中添加变量,对应变量名如下图所示。
定义变量时注意变量字母大小写。
之后单击“OK”按钮,至此界面创建及控件变量设计完毕,下面来添加程序代码。
步骤2:
在“AddressDlg.h”文件中添加代码。
在VisualC++环境下,单击左侧工程窗口中的FileView选项卡,单击“+”,打开文件列表。
双击“AddressDlg.h”文件,打开其文件,在文件上部,在代码行classCAddressDlg:
publicCDialog上部,添加如下代码:
structstu
{
charname[8];
chartelephone[13];
charsex[2];
charcompany[20];
charinterest[20];
structstu*next;
};
typedefstructstuSTU;
在代码行classCAddressDlg:
publicCDialog下部,public:
处添加如下代码:
STU*mycreate();
voidmydisplay(STU*head);
voidmyadd();
STU*mysearch(STU*head,charname[8]);
voidmydelete(STU*head,charname[8]);
voidwritedata(CStringm_Display);
voidreaddata();
STU*head,*p;
STU*curent;
charname[8];
LPCTSTRm_lpszPathName;
CFilem_file;
CFileExceptionm_fe;
charbuf[1000];
在代码行DECLARE_MESSAGE_MAP()上部,添加代码如下:
afx_msgvoidOnButtonClicked(UINTnID);
上面代码所加位置如图所示:
步骤3:
在“AddressDlg.cpp”文件中添加代码。
双击“AddressDlg.cpp”文件,打开其文件,在文件上部,添加头文件如下:
#include
#include
#include
之后在后面的消息映射中添加代码,在消息映射行BEGIN_MESSAGE_MAP(CAddressDlg,CDialog)下部添加代码如下:
ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON7,OnButtonClicked)
位置如下图所示:
之后在“AddressDlg.cpp”文件中找到如下代码行:
CAddressDlg:
:
CAddressDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CAddressDlg:
:
IDD,pParent)
在其内部添加初始化调用函数如下所示:
head=mycreate();
位置如下图所示:
步骤4:
在“AddressDlg.cpp”文件中添加函数代码,在空白处添加函数代码如下所示:
voidCAddressDlg:
:
OnButtonClicked(UINTnID)/*按钮相应事件*/
{
intnIndex=nID-IDC_BUTTON1;
switch(nIndex)
{
case0:
//添加通讯录
myadd();
mydisplay(head);
m_Name=_T("");
m_Telephone=_T("");
m_Sex=_T("");
m_Company=_T("");
m_Interest=_T("");
UpdateData(FALSE);
break;
case1:
//删除通讯录
UpdateData(TRUE);
strcpy(name,m_Name);
mydelete(head,name);
mydisplay(head);
m_Name=_T("");
m_Telephone=_T("");
m_Sex=_T("");
m_Company=_T("");
m_Interest=_T("");
UpdateData(FALSE);
break;
case2:
//查找通讯录
UpdateData(TRUE);
strcpy(name,m_Name);
p=mysearch(head,name);
if(p!
=NULL)
{
m_Display.Format("姓名:
%8.8s电话:
%13.13s性别:
%2.2s单位:
%20.20s爱好:
%20.20s",p->name,p->telephone,p->sex,p->company,p->interest);
UpdateData(FALSE);
}
else
{
m_Display="没找到记录!
";
UpdateData(FALSE);
}
break;
case3:
//显示通讯录
mydisplay(head);
break;
case4:
writedata(m_Display);
break;
case5:
readdata();
UpdateData(FALSE);
break;
case6:
//退出通讯录系统
exit(0);
default:
break;
}
}
voidCAddressDlg:
:
myadd()/*在链表中增加一条记录*/
{
STU*p;
p=(STU*)malloc(sizeof(STU));
UpdateData(TRUE);
strcpy(p->name,m_Name);
strcpy(p->telephone,m_Telephone);
strcpy(p->sex,m_Sex);
strcpy(p->company,m_Company);
strcpy(p->interest,m_Interest);
curent->next=p;
p->next=NULL;
curent=p;
}
STU*CAddressDlg:
:
mycreate()/*创建链表头*/
{
STU*head;
head=(STU*)malloc(sizeof(STU));
curent=head;
curent->next=NULL;
returnhead;
}
voidCAddressDlg:
:
mydelete(STU*head,charname[8])/*在链表中删除一条记录*/
{
STU*p,*q;
inti,j;
BOOLsame=FALSE;
q=head;
p=head->next;
while(p!
=NULL)
{
for(j=0;(p->name[j]=='')&&(j<8);j++)
;
for(i=0;(name[i]=='')&&(i<8);i++)
;
for(;(i<8)&&(j<8);i++,j++)
{
if(p->name[j]!
=name[i])
{
same=FALSE;
break;
}
else
{
same=TRUE;
}
}
if(same==TRUE)
{
q->next=p->next;
free(p);
break;
}
curent=q=p;
p=p->next;
}
return;
}
voidCAddressDlg:
:
mydisplay(STU*head)/*显示链表中所有记录*/
{
CStringstr;
STU*p;
p=head->next;
m_Display="";
UpdateData(FALSE);
while(p!
=NULL)
{
str.Format("姓名:
%8.8s电话:
%13.13s性别:
%2.2s单位:
%20.20s爱好:
%20.20s",p->name,p->telephone,p->sex,p->company,p->interest);
m_Display+=str;
m_Display+="\r\n";
UpdateData(FALSE);
p=p->next;
}
}
STU*CAddressDlg:
: