C语言通讯录程序课程设计.docx

上传人:b****5 文档编号:8124641 上传时间:2023-01-29 格式:DOCX 页数:16 大小:35.06KB
下载 相关 举报
C语言通讯录程序课程设计.docx_第1页
第1页 / 共16页
C语言通讯录程序课程设计.docx_第2页
第2页 / 共16页
C语言通讯录程序课程设计.docx_第3页
第3页 / 共16页
C语言通讯录程序课程设计.docx_第4页
第4页 / 共16页
C语言通讯录程序课程设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

C语言通讯录程序课程设计.docx

《C语言通讯录程序课程设计.docx》由会员分享,可在线阅读,更多相关《C语言通讯录程序课程设计.docx(16页珍藏版)》请在冰豆网上搜索。

C语言通讯录程序课程设计.docx

C语言通讯录程序课程设计

CompanyDocumentnumber:

WTUT-WT88Y-W8BBGB-BWYTT-19998

 

C语言通讯录程序课程设计

实例6通讯录程序

本实例希望设计一个通讯录程序,要求实现通讯录信息的录入,并具有添加、查询、删除、显示等功能;使用结构体存储通讯录中记录信息;使用链表来实现通讯录信息的添加、删除、查询及显示等操作;通讯录程序可实现文件读写,在通讯录信息录入结束之后,可存入文件中,在下次程序运行时可将通讯录中的记录读取到程序中。

通讯录程序可采用基于Win32控制台程序构建或采用基于MFC应用向导.EXE的应用程序,下面对这两种方法进行详细介绍。

3.6.1.设计目的

1、掌握结构体的基本工作原理和工作方式。

2、熟悉结构体与链表的使用方法。

3、熟悉C语言下数据的输入与输出。

4、掌握C语言下对TXT文件的读写操作。

5、熟悉函数的设计方法及调用方法。

3.6.2.基本要求

1、本实例要求实现对通讯录信息的查找、添加、删除、显示等功能,每个功能模块均能实现随时从模块中退出,可以通过键盘对功能进行选择,完成一个通讯录管理系统的运行。

2、要使用结构体来实现对通讯录信息的存储。

3、使用链表来实现对通讯录信息的查找、添加、删除、浏览显示。

4、使用文件对记录进行存储,程序运行时还可以从文件中读取记录。

5、系统设计完成后应实现类似下图所示界面。

3.6.3设计结构及算法分析

在进行程序设计时,选择一种合理的数据存储结构是非常关键的。

本实例根据题目要求,采用结构体来存放通讯录中的信息,并采用文件存储通讯录中的信息。

1、存储结构

本实例存储数据时,除了采用最常用的基本类型存储外,采用结构体的方式来存储通讯录中的个人信息,结构体如下所示:

structstu

{

charname[20];/*人名*/

chartelephone[20];/*电话*/

charsex[4];/*性别*/

charcompany[20];/*单位*/

structstu*next;/*链表节点*/

};

typedefstructstuSTU;

2、main()主函数

采用模块化设计,功能放在各模块函数中实现。

主函数是程序的入口,在其中采用循环结构,根据用户的键盘输入,依次调用各功能函数。

3、mycreate()函数------创建链表函数

函数根据用户输入的信息,存储到结构体中,并建立链表结构,函数返回链表的头指针。

链表建立完成后,可根据链表的头指针来添加后续指针。

4、myadd()函数------添加学生信息记录函数

函数根据用户输入信息,分配内存,将数据存储到结构体中,并建立新的链表节点,链接到已经建立好的链表尾部。

5、mydelete()函数------删除链表节点

函数根据用户输入通讯录中人名,在已有的链表中查找该人名信息存放的节点,如找到该节点,则删除该节点,并对链表结构重新链接;如未找到该人名信息的节点,则提示用户不存在。

6、mydisplay()函数------显示所有用户记录

函数用来遍历所有节点,并向屏幕上输出所有节点的通讯录中的详细信息。

7、displaymenu()函数-------显示菜单函数

函数向屏幕上输出,用户可以选择的选项菜单,给用户提示信息,给用户选择做出提示。

8、mysearch()函数-------查找学生信息

函数用来查找通讯录中人名信息存在与否,如不存在则提示用户,如存在返回该人名的链表节点。

3.6.4.程序执行流程图

功能模块图

3.6.5基于Win32控制台的C语言程序设计详细步骤

步骤1:

建立一个工程

在VisualC++的集成开发环境下,单击File(文件)菜单项,之后选择其子菜单项New(新建),如下图所示。

屏幕上回弹出New(新建)对话框,如下图所示。

单击对话框上方的Projects(工程)选项卡,在其下方列表中选择Win32ConsoleApplication选项,在右侧的Projectname(工程名)框中输入工程名Address,在Location(目录)中输入工程文件存放的目录C:

\Student,之后单击OK按钮。

单击OK按钮后,会弹出如下图所示的界面,为了方便编程,选择Asimpleapplication,之后单击Finish按钮。

之后,弹出如下图所示界面。

界面中包含了建立此工程文件的头文件及路径等信息。

单击OK按钮,则进入了一个简单的C语言Win32控制台程序集成开发界面,如下图所示。

左侧窗口为工程管理窗口,选择FileView选项卡,通过点击“+”可打开工程的文件及目录列表,工程的很多操作都需要通过此窗口进行。

同时通过双击列表中的文件名,可在中央的编辑窗口中打开其文件,如下图所示,此文件中只包含有一个主函数main()框架。

步骤2:

添加程序头文件,在打开的文件上部,添加如下代码。

#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();....\n");

getch();

}创建通讯录\n");

printf("2.添加通讯录\n");

printf("3.查找通讯录\n");

printf("4.删除通讯录\n");

printf("5.显示通讯录\n");

printf("6.退出通讯录系统\n");

printf("**************MENU**************\n\n");

}

至此所有代码输入工作完成。

步骤5.程序调试

单击VisualC++环境下的工具条中快捷执行按钮

或(Ctrl+F5),按照提示菜单输入选择键就可以进行相应操作,程序执行结果如下所示。

3.6.6基于MFC应用向导.EXE的应用程序设计详细步骤

步骤1:

建立一个工程

在VisualC++的集成开发环境下,单击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:

在“”文件中添加代码。

在VisualC++环境下,单击左侧工程窗口中的FileView选项卡,单击“+”,打开文件列表。

双击“”文件,打开其文件,在文件上部,在代码行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:

在“”文件中添加代码。

双击“”文件,打开其文件,在文件上部,添加头文件如下:

#include<>

#include<>

#include<>

之后在后面的消息映射中添加代码,在消息映射行BEGIN_MESSAGE_MAP(CAddressDlg,CDialog)下部添加代码如下:

ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON7,OnButtonClicked)

位置如下图所示:

之后在“”文件中找到如下代码行:

CAddressDlg:

:

CAddressDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CAddressDlg:

:

IDD,pParent)

在其内部添加初始化调用函数如下所示:

head=mycreate();

位置如下图所示:

步骤4:

在“”文件中添加函数代码,在空白处添加函数代码如下所示:

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)

{

("姓名:

%电话:

%性别:

%单位:

%爱好:

%",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)

{

("姓名:

%电话:

%性别:

%单位:

%爱好:

%",p->name,p->telephone,p->sex,p->company,p->interest);

m_Display+=str;

m_Display+="\r\n";

UpdateData(FALSE);

p=p->next;

}

}

STU*CAddressDlg:

:

mysearch(STU*head,charname[8])/*在链表中查找一条记录*/

{

STU*p;

BOOLsame=FALSE;

inti,j;

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)

break;

p=p->next;

}

returnp;

}

voidCAddressDlg:

:

writedata(CStringm_Display)/*把字符串写入文件*/

{

m_lpszPathName="";

if(!

(m_lpszPathName,CFile:

:

modeCreate|CFile:

:

modeWrite,&m_fe))

{

AfxMessageBox("文件打不开");

}

else

{

strcpy(buf,(LPCTSTR)m_Display);

(buf,());

();

}

}

voidCAddressDlg:

:

readdata()/*把文件中的数据写入链表中*/

{

STU*p;

m_lpszPathName="";

if(!

(m_lpszPathName,CFile:

:

modeRead,&m_fe))

{

AfxMessageBox("文件打不开");

}

else

{

while()<())

{

//写入链表

p=(STU*)malloc(sizeof(STU));

(buf,5);

memset(buf,0,sizeof(buf));

(buf,8);//读取记录第一条信息

("%8s",buf);

strcpy(p->name,m_Name);

(buf,6);

memset(buf,0,sizeof(buf));

(buf,13);//读取记录第二条信息

("%13s",buf);

strcpy(p->telephone,m_Telephone);

(buf,6);

memset(buf,0,sizeof(buf));

(buf,2);//读取记录第三条信息

("%2s",buf);

strcpy(p->sex,m_Sex);

(buf,6);

memset(buf,0,sizeof(buf));

(buf,20);//读取记录第四条信息

("%20s",buf);

strcpy(p->company,m_Company);

(buf,6);

memset(buf,0,sizeof(buf));

(buf,20);//读取记录第五条信息

("%20s",buf);

strcpy(p->interest,m_Interest);

(buf,2);

curent->next=p;

p->next=NULL;

curent

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1