MFC课程设计报告-一个简单的通讯录应用程序

一、设计目标与内容

1.  了解Windows编程的基础知识,掌握MFC应用程序的基本知识;

2.  基本掌握面向对象程序设计的基本思路和方法;

3.  掌握用VC++开发应用程序的的一般步骤和方法;

4.  能够利用所学的基本知识,设计一个简单的通讯录应用程序,具有以下功能:①用文件来保存通讯录信息(必须实现的功能)②编程实现通讯录记录的添加、删除、修改、浏览和查询(必须实现的功能)。

二、设计要求

1.  用VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;

2.  提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。

总体设计

  通讯录应用程序,是一个基于单文档单视图的应用程序。我们在基于但文档视图开发的同时,通过对文档菜单的操作和相应函数的响应实现一个简单的通讯录功能。在通讯录中,我们能够添加学生信息、修改学生信息、删除学生信息、预览学生信息和保存学生信息。进行一系列简单的操作。

详细设计

u 新建工程COM_book2

   新建工程COM_kook2,默认选择单文档应用程序,完成。

在COM_book2View.cpp中初始化文档视图界面

添加函数如下:

void CCOM_book2View::OnInitialUpdate()

{

   CListView::OnInitialUpdate();

   CListCtrl &m_ListCtrl=GetListCtrl();

   CString strHeader[5]={"姓名","专业","电话","QQ","生日"};

   int nLong[]={150,200,250,200,200};

   for(int nCol=0;nCol<5;nCol++)

   m_ListCtrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,nLong[nCol]);

   UpdateData(FALSE);

}

程序运行后,界面如下

u 程序运行主界面

                            图1-1

   在这里,我们可以看到通过我们单文档视图中菜单“通讯录操作”可以进行相应的学生信息的添加、删除、修改、查询、浏览、保存和打开。

  而这里,下来菜单中的每一个选项我们将通过对话框的形式进行呈现。

为了便于对学生信息进行操作和保存,我们这里用到了数组集合类。先给工程添加一个学生信息类,用来保存学生的信息。类定义如下:

                      

u 学生信息添加对话框

                           图1-2

  给工程添加一个对话框,然后给该对话框建立类向导

添加CStudentInfoDlg类

  然后为菜单选项中“添加”选项添加响应函数OnStuinfoAdd() 。

代码如下:

void CCOM_book2Doc::OnStuinfoAdd()

{

   CStudentInfoDlg dlg;

   BOOL flag=true;

   if(dlg.DoModal()!=IDOK) return;

   for(int i=0;i<m_stuObArray.GetSize();i++)

   {

      CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

      if(p->strName==dlg.m_add_name)

      {

        flag=false;

        AfxMessageBox("该学生已存在!");

      }

   }

   if(flag)

   {

    CStudentInfo* pStudent=new CStudentInfo(dlg.m_add_name,dlg.m_add_special,dlg.m_add_phone,dlg.m_add_qq,dlg.m_add_birth);

   m_stuObArray.Add(pStudent);

// SetModifiedFlag();

   this->UpdateAllViews(NULL,1,pStudent);

   } 

}

u 学生信息删除对话框

   由于删除学生信息前要查询这个学生是否存在,所以这里我们要添加一个对话框类Del_StudentInfoDlg

运行时对话框如图

                            图1-3

  根据学生姓名来查询看学生是否存在,若存在则进行删除,若不存在则提示该学生不存在

为菜单选项中的“删除”添加相应函数OnStuinfoDel()

代码如下:
void CCOM_book2Doc::OnStuinfoDel()

{

   CDel_StudentInfoDlg dlg1;

   BOOL flag=true;

   if(dlg1.DoModal()!=IDOK) return;

   for(int i=0;i<m_stuObArray.GetSize();i++)

   {

      CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

      if(p->strName==dlg1.m_stu_del)

      {

        delete m_stuObArray.GetAt(i);

        flag=false;

      }

   }

   if(flag)

      AfxMessageBox("学生不存在,不能进行删除!");

   if(flag==false)

   {

      for(int i=0;i<m_stuObArray.GetSize();i++)

      {

        CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

        p->k=i+1;

        this->UpdateAllViews(NULL,2,p);

      }

   }

}

u 学生信息修改

  由于在修改学生信息之前我们要先查询学生是否存在,若存在我们对其信息进行修改,这时候要重新调用另一个对话框来对学生信息进行修改。这是需添加两个对话框对话框对话框MOD_StudentInfoDlg1和MOD_StudentInfoDlg2并为它们建立相应的类CMOD_StudentInfoDlg1和CMOD_StudentInfoDlg2

   添加菜单选项中“修改”的响应函数OnStuinfoMod() ,先调用对话框MOD_StudentInfoDlg1来判断该学生是否存在,若存在则调用对话框MOD_StudentInfoDlg2对学生信息进行修改若不存在则提示该学生不存在。

代码如下:

void CCOM_book2Doc::OnStuinfoMod()

{

   CMOD_StudentInfoDlg1 dlg2;

   CMOD_StudentImfoDlg2 dlg3;

   BOOL flag=true;

   CStudentInfo *p1,*p2;

   if(dlg2.DoModal()!=IDOK) return;

   for(int i=0;i<m_stuObArray.GetSize();i++)

   {

      p1=(CStudentInfo *)m_stuObArray.GetAt(i);

      if(p1->strName==dlg2.m_mod_name1)

      {

     

        if(dlg3.DoModal()!=IDOK) return;

        p1->strName=dlg3.m_name2;

        p1->strSpecial=dlg3.m_spe2;

        p1->strQQ=dlg3.m_qq2;

        p1->strPhone=dlg3.m_phone2;

        p1->strBirth=dlg3.m_birth2;

        p2=p1;

        flag=false;

      }

   }

   if(flag)

      AfxMessageBox("学生不存在!");

   if(flag==false)

   {

      this->UpdateAllViews(NULL,3,p2);

      AfxMessageBox("修改成功!");

   } 

}

u 学生信息查询对话框

   学生信息查询对话框和删除学生信息对话框基本上是一样的,都是通过查询学生是否存在,若存在则显示该学生的信息,若不存在则提示学生不存在。

   为菜单选项中的“查询”添加相应函数OnStuinfoSer()

代码如下:

void CCOM_book2Doc::OnStuinfoSer()

{

   CSER_StudentInfoDlg dlg4;

   BOOL flag=true;

   CStudentInfo *p3;

   if(dlg4.DoModal()!=IDOK) return;

   for(int i=0;i<m_stuObArray.GetSize();i++)

   {

      CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

      if(p->strName==dlg4.m_ser_name)

      {

        p3=(CStudentInfo *)m_stuObArray.GetAt(i);

        flag=false;

      }

   }

   if(flag==false)

      this->UpdateAllViews(NULL,3,p3);

   else

      AfxMessageBox("学生不存在!");

}

u 学生信息查预览

  学生信息预览,顾名思义就是显示现有全部学生的信息。这里添加菜单选项中“预览”的函数响应OnStuinfoLook()

代码如下:

void CCOM_book2Doc::OnStuinfoLook()

{

   for(int i=0;i<m_stuObArray.GetSize();i++)

      {

        CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

        p->k=i+1;

        this->UpdateAllViews(NULL,2,p);

      }

}

u 学生信息查保存和打开

  虽然我们使用了数组集合类,系统能够自动的为我们保存添加过的学生信息,但是他本村的时候是乱码,所以这里我又重新写了函数进行学生信息的保存

  为菜单选项中的“保存”和“打开”添加相应的函数响应OnStuinfoSave1() 和OnStuinfoOpen1()

  代码如下:

void CCOM_book2Doc::OnStuinfoSave1()

{

   //设置保存的文件,后缀名txt

   CFileDialog dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.TXT)|*.txt|All Files|*.*||",NULL);

   //如果公共类对话框为确定

   if(dlg.DoModal()==IDOK)

   //获取文件名

   dlg.GetFileName();

   //否则,退出

   else

      return;

   CStdioFile file;

   //如果有问题,退出

if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeText)==0)

   {

      AfxMessageBox("save error!");

      return;

   }

   for(int i=0;i<m_stuObArray.GetSize();i++)

      {

        CStudentInfo *p=(CStudentInfo *)m_stuObArray.GetAt(i);

         file.WriteString(p->strName);

        file.WriteString(p->strSpecial);

        file.WriteString(p->strPhone);

        file.WriteString(p->strQQ);

        file.WriteString(p->strBirth);

        file.WriteString("\n");

      }

   file.Close();

}

void CCOM_book2Doc::OnStuinfoOpen1()

{

   CFileDialog dlg(TRUE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.TXT)|*.wzq|All Files|*.*||",NULL);

   if(dlg.DoModal()==IDOK)

      dlg.GetFileName();

   else

      return;

   CStdioFile file;

   CStudentInfo *P;

   int i,j;

   CString str;

   if(file.Open(dlg.GetFileName(),CFile::modeRead)==0)

   {

      AfxMessageBox("open error!");

      return;

   }     

   CArchive ar(&file,CArchive::load);

   for(i=0;i<10;i++)

   {

      for(j=0;j<5;j++)

      {

        ar.ReadString(str);

        if (j==0) {P->strName=str;}

        if (j==1) {P->strSpecial=str;}

        if (j==2) {P->strPhone=str;}

        if (j==3) {P->strQQ=str;}

        if (j==4) {P->strBirth=str;}       

      }

      this->UpdateAllViews(NULL,1,P);

   }

      file.Close();

      ar.Close();

}

u 文档和在视图的关联

在Windows程序设计中,文档和视图的关联是很重要的,所以我们要弄明白他们之间互动的机制。在这个程序中,我们每一次在文档类里更改学生信息都要把信息传递到视图里面进行更新,在这里我们会用到UpdateAllViews()函数通过这个函数把信息的改变传递给视图,然后对视图进行更新。

UpdateAllViews函数的原型如下:

void UpdateAllViews(CView *pSender,LPARAM lHint=0L,CObiect *pHint=NULL);

其中,参数pSender表示试图指针,若在派生文档类的成员函数中调用该函数,侧此参数应为NULL,若被派生视图中的成员函数调用,侧此参数应为this。lHint表示更新视图是发送的相关消息,pHint表示存储信息的对象指针。

当UpdateAllViews函数被调用时,如果参数pSender指向某个特定的试图对象,那么除了该指定的视图之外,文档的所有其他视图的OnUpdate函数就会被调用。


 

第二篇:c++ 简单通讯录管理系统 课程设计 报告

C++面向对象程序设计

设计题目: 简单通讯录管理系统 学生学号: 00000000 学生姓名: 专业班级: 2010级 飞行器设计专业 指导教师: ***

航空宇航学院

2011-6-21

1

课程设计报告

一. 设计需求分析******************

二. 主要数据结构*******************

三. 特色**********************

四. 源代码*************************

五. 参考文献*************************

一、 设计需求分析

2

实现以下功能:

1) 通讯录编辑(输入、储存、添加、删除、显示); void SetHomePhone(int h);//修改住宅电话

void SetMobilePhone(char *m);//修改手机号码 void SetEMail(char *e);//修改email地址

2) 按不同的项进行查找;

3) 对已存在的通讯录按不同的项排序; 4) 将通讯录写入文件; 5) 从文件读入通讯录。

二、 主要数据结构

class Node {

char Name[10];//姓名

int OfficePhone;//办公室电话 int HomePhone;//住宅电话

char MobilePhone[15];//手机号码 char EMail[20];//email地址 Node *Next;//下一结点指针 public:

Node(char *pname=NULL, int ophone=0, int *pmphone=NULL, char *pemail=NULL); void Show();//显示结点数据

void SetName(char *name);//修改姓名

void SetOfficePhone(int o);//修改办公室电话

hphone=0,char friend class AddrList;//将AddrList类说明为友元类

friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数

friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数 };

class AddrList {

Node *HeadPtr;//链表首指针 Node *TailPtr;//链表尾指针 int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序

public: //成员函数

AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1

void AddTail(Node *p)//将p指向的结点加入到链表尾部

void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中

Node *LookUp(char *name)//按姓名查找结点,返回该结点指针 void del(char *name)//删除指定姓名的结点

void Sort(int tag)//按tag指定的关键字重新排序 void ShowAll()//显示全部结点,每10个显示一屏 void SetTag(int t)//置Tag值

3

int GetTag()//取tag值

Node *GetHeadPtr()//取首指针 ~AddrList()//释放链表空间

void CreateList(char *filename)//从二进制文件中读入数据,//构造链表

void WriteToFile(char *filename)//将链表中数据//写入指定的二进制文件

};

三、 特色

对于本程序来说,最有特色的地方就是使用了类,还有链表来共同完成对于通讯录信息的记录还有各方面的操作。 由于建立的是动态链表,可以自由使用

四、 源代码

#include <fstream.h> #include <iostream.h> #include <iomanip.h> #include <string.h> #include <stdlib.h>

class Node {

char Name[10];//姓名

int OfficePhone;//办公室电话

int HomePhone;//住宅电话

char MobilePhone[15];//手机号码 char EMail[20];//email地址 Node *Next;//下一结点指针 public:

Node(char *pname=NULL, int ophone=0, int hphone=0, char *pmphone=NULL, char *pemail=NULL) {

if(pname) strcpy(Name, pname); else strcpy(Name, " "); OfficePhone=ophone; HomePhone=hphone;

if(pmphone) strcpy(MobilePhone, pmphone); else strcpy(MobilePhone, " "); if(pemail) strcpy(EMail, pemail); else strcpy(EMail, " "); }

void Show()//显示结点数据 {

cout<<Name<<setw(10)<<OfficePhone<<"(O)"<<setw(11)<<HomePhone<<"(H)"<<setw(11)<<MobilePhone<<"(M)"<<setw(14)<<EMail<<"(E)"<<'\n'; }

void SetName(char *name)//修改姓名 {

4

strcpy(Name,name);

}

void SetOfficePhone(int o)//修改办公室电话 {

OfficePhone=o; }

void SetHomePhone(int h)//修改住宅电话 {

HomePhone=h;

}

void SetMobilePhone(char *m)//修改手机号码 {

strcpy(MobilePhone,m); }

void SetEMail(char *e)//修改email地址 {

strcpy(EMail,e); }

friend class AddrList;//将AddrList类说明为友元类

friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数

friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数 };

//链表类

class AddrList

{

Node *HeadPtr;//链表首指针 Node *TailPtr;//链表尾指针

int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序 public: //成员函数

AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1 {

HeadPtr=head; TailPtr=tail; Tag=tag; }

void AddTail(Node *p)//将p指向的结点加入到链表尾部 {

if(HeadPtr==NULL) {

HeadPtr=p; TailPtr=p; p->Next=NULL; } else {

TailPtr->Next=p; p->Next=NULL; TailPtr=p;

5

} }

void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中 {

Node *p1, *p2;

if(Tag==1)//按姓名排序 {

if(HeadPtr==NULL)//如果插入前原始链表为空链表 {

HeadPtr=p; TailPtr=p; p->Next=NULL; } else {

if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部 {

p->Next=HeadPtr; HeadPtr=p; }

else//插在链表中间或尾部 {

p1=HeadPtr; p2=HeadPtr;

while(p2->Next&&(strcmp(p2->Name, p->Name)<0))//

查找待插入位置

{p1=p2; p2=p2->Next;}

if(strcmp(p2->Name, p->Name)<0)//插在链表尾部 {p2->Next=p; p->Next=NULL; TailPtr=p;} else//插在链表中间,p2之前 {p->Next=p2; p1->Next=p;} } } }

else//按办公室电话排序 {

if(HeadPtr==NULL)//如果插入前原始链表为空链表 {

HeadPtr=p; TailPtr=p; p->Next=NULL; } else {

if((p->OfficePhone-HeadPtr->OfficePhone)<=0)//插在链表首部

{

p->Next=HeadPtr; HeadPtr=p; }

else//插在链表中间或尾部

6

{

p1=HeadPtr; p2=HeadPtr;

while(p2->Next&&((p2->OfficePhone-p->OfficePhone)<0))//查找待插入位置

{p1=p2; p2=p2->Next;}

if((p2->OfficePhone-p->OfficePhone)<0)//插在链表尾部

{p2->Next=p; p->Next=NULL; TailPtr=p;} else//插在链表中间,p2之前 {p->Next=p2; p1->Next=p;} } } } }

Node *LookUp(char *name)//按姓名查找结点,返回该结点指针 {

Node *p; p=HeadPtr; while(p!=NULL) {

if(strcmp(p->Name, name)==0) return p; p=p->Next; }

return NULL;

}

void del(char *name)//删除指定姓名的结点 {

Node *p1, *p2;

if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点 {

p1=HeadPtr;

HeadPtr=HeadPtr->Next; delete p1;

cout<<"删除了联系人"<<endl; system("pause"); }

else//删除其他结点 {

p1=HeadPtr; p2=HeadPtr;

while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL) {

p1=p2;

p2=p2->Next; }

if(strcmp(p2->Name, name)==0) {

p1->Next=p2->Next; delete p2;

cout<<"删除了一个联系人的信息!"<<endl;

7

system("pause"); } } }

void Sort(int tag)//按tag指定的关键字重新排序 {

Node *p1, *p2; Tag=tag; p2=HeadPtr; HeadPtr=NULL; TailPtr=NULL; while(p2) {

p1=p2->Next; AddSort(p2); p2=p1; }

TailPtr->Next=NULL; }

void ShowAll()//显示全部结点,每10个显示一屏 {

int n=0; Node *p;

if(HeadPtr==NULL) {

cout<<"链表为空,没有记录可显示!"<<endl;

}

else for(p=HeadPtr; p!=NULL; p=p->Next) {

p->Show(); n++;

if(n%10==0) {cout<<"按任意键显示下一屏:"<<endl; } } }

void SetTag(int t)//置Tag值 {Tag=t;}

int GetTag()//取tag值 {return Tag;}

Node *GetHeadPtr()//取首指针 {return HeadPtr;}

~AddrList()//释放链表空间 {

Node *p;

if(HeadPtr==NULL) ; else {

while(HeadPtr) {

p=HeadPtr;

8

HeadPtr=HeadPtr->Next; delete p; } } }

void CreateList(char *filename)//从二进制文件中读入数据,//构造链表 {

ifstream infile(filename, ios::in|ios::binary|ios::nocreate);

if(!infile) {cout<<"文件"<<endl;return;}//如果文件不存在,直接返回,空表 else {

infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag

int n;

infile.read((char *)&n, 4);//读出记录数 Node *p;

for(int i=0; i<n;i++) {

p=new Node;

infile.read((char *)p, sizeof(Node)); AddTail(p); } }

infile.close();

cout<<"数据从二进制文件加载成功!"<<endl; }

void WriteToFile(char *filename)//将链表中数据 //写入指定的二进制文件 {

ofstream outfile;

outfile.open(filename, ios::out|ios::binary); outfile.write((char *)&Tag, 4); Node *p, *p1; int n=0;

for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++; outfile.write((char *)&n, 4); p=HeadPtr; while(p) {

outfile.write((char *)p, sizeof(Node)); p=p->Next; }

cout<<"成功导出二进制文件"<<endl; outfile.close(); } };

void DisplayMenu()//主菜单 {

9

cout<<"现在进入简单通讯录管理系统:"<<endl; cout<<"Hello!Welcome!:"<<endl; char *menu[]= {

" 1.add record", " 2.delete record",

" 3.dispaly all record", " 4.query by name", " 5.modify record",

" 6.add from a text file", " 7.write to a text file", " 8.sort", " 9.quit", NULL };

for(int i=0;menu[i];i++) cout<<menu[i]<<'\n';

cout<<"请选择请输入1—9序号:"<<'\n'; };

//功能5有子菜单:

void ShowModiMenu() {

char *submenu[]={"(1) 修改姓名", "(2) 修改办公室电话",

"(3) 修改住宅电话", "(4) 修改手机号码", "(5) 修改email地址\n", "(0) 不修改,返回主菜单", NULL};

for(int i=0; submenu[i]; i++) {

cout<<submenu[i]<<endl; }

cout<<"请输入选择:"; }

//以下为处理函数

void add(AddrList &addrlist)//增加记录,按Tag排序 {

cout<<"请输入姓名、办公室电话、住宅电话、手机号码、email地址:"<<endl;

char name[10], m[15],e[20]; int o,h;

cin>>name>>o>>h>>m>>e; Node *p;

p=new Node(name, o, h, m, e); p->Show();

addrlist.AddSort(p);

cout<<"添加成功!是否继续添加?[y/n]"; char t; cin>>t;

10

if(t=='y'||t=='Y') add(addrlist); }

void del(AddrList &addrlist)//删除记录 {

if(addrlist.GetHeadPtr()==NULL) {

cout<<"链表为空,没有记录可删!"<<endl; }

cout<<"请输入要删除的联系人的姓名:"; char n[10]; cin>>n; Node *p;

p=addrlist.LookUp(n); if(p==NULL) {

cout<<"链表上没有联系人"<<endl; } else

p->Show();

cout<<"确认删除?[y/n]"; char t; cin>>t;

if(t=='y') addrlist.del(n); }

void showall(AddrList &addrlist)//显示所有记录 {

addrlist.ShowAll(); system("pause"); }

void query(AddrList &addrlist)//按姓名查找并显示一条记录{

if(addrlist.GetHeadPtr()==NULL)

{cout<<"链表为空,没有联系人可查找!"<<endl; } else {

cout<<"请输入要查找的联系人的姓名:"; char n[10]; cin>>n; Node *p;

p=addrlist.LookUp(n); if(p==NULL) {

cout<<"没有"<<endl; } else {

cout<<"该联系人的记录为:"; p->Show();

11

}

system("pause"); } }

void modify(AddrList &addrlist)//按姓名修改一条记录{

if(addrlist.GetHeadPtr()==NULL) {

cout<<"链表为空,没有记录可修改!"<<endl; } else {

cout<<"请输入要修改的联系人的姓名:"; char n[10]; cin>>n; Node *p;

p=addrlist.LookUp(n); if(p==NULL) {

cout<<"没有"<<endl; } else {

cout<<"该联系人的记录为:"; p->Show();

}

ShowModiMenu(); int m, state;

state=cin.rdstate(); if(state) {

char str[80]; cin.clear(); cin.getline(str, 80); }

cin>>m;

if(m==1)//修改姓名 {

cout<<"请输入修改后的姓名:"; char n[10]; cin>>n;

p->SetName(n);

cout<<"修改成功!新的记录为:"; p->Show();

if(addrlist.GetTag()==1)

addrlist.Sort(1);//判断是否需要重新排序 system("pause"); }

else if(m==2)//修改办公室电话 {

cout<<"请输入修改后的办公室电话:"; int o; cin>>o;

12

p->SetOfficePhone(o);

cout<<"修改成功!新的记录为:"; p->Show();

if(addrlist.GetTag()==2)

addrlist.Sort(2);//判断是否需要重新排序 system("pause"); }

else if(m==3)//修改住宅电话 {

cout<<"请输入修改后的住宅电话:"; int h; cin>>h;

p->SetHomePhone(h);

cout<<"修改成功!新的记录为:"; p->Show();

system("pause"); }

else if(m==4)//修改手机号码 {

cout<<"请输入修改后的手机号码:"; char m[15]; cin>>m;

p->SetMobilePhone(m); cout<<"修改成功!新的记录为:"; p->Show();

system("pause"); }

else if(m==5)//修改email地址 {

cout<<"请输入修改后的email地址:"; char e[20]; cin>>e;

p->SetEMail(e);

cout<<"修改成功!新的记录为:"; p->Show();

system("pause"); }

else if(m==0)//不修改,返回主菜单 {return;} } }

void addfromtxtfile(AddrList&addrlist) {

char filename[10], name[10],email[20],mobilephone[15]; int officephone,homephone; ifstream infile;

cout<<"input filename"<<endl; cin>>filename;

infile.open(filename); int n; infile>>n;

13

for(int i=0;i<n;i++) {

Node*p=new Node; infile>>name; p->SetName(name); infile>>officephone;

p->SetOfficePhone(officephone); infile>>homephone;

p->SetHomePhone(homephone); infile>>mobilephone;

p->SetMobilePhone(mobilephone); infile>>email;

p->SetEMail(email); addrlist.AddSort(p); }

infile.close(); }

void writetotxtfile(AddrList &addrlist)//将库表中的数据导出到正文文件 {

cout<<"请输入目标文件的文件名(扩展名为txt):"; char filename[80]; cin.get();

cin.getline(filename, 80); ofstream out;

out.open(filename); if(!out) {

cout<<"创建文件失败!"<<endl; exit(2); } else {

Node *p;

p=addrlist.GetHeadPtr(); while(p) {

out<<p->Name<<'

'<<p->OfficePhone<<"(O)"<<p->HomePhone<<"(H) "<<p->MobilePhone<<"(M) "<<p->EMail<<endl; p=p->Next; } }

out.close();

cout<<"成功导出正文文件!"<<endl; }

void sort(AddrList &addrlist)//排序库表 {

if(addrlist.GetHeadPtr()==NULL)

14

{

cout<<"链表中没有记录可排序!"<<endl; }

else if(addrlist.GetTag()==1) {

cout<<"当前排序关键字为姓名,是否将其改为办公室电话?[y/n]"; char t; cin>>t;

if(t=='y') {addrlist.SetTag(2); addrlist.Sort(2);} else return; }

else if(addrlist.GetTag()==2) {

cout<<"当前排序关键字为办公室电话,是否将其改为姓名?[y/n]";

char t; cin>>t; if(t=='y') {

addrlist.SetTag(1); addrlist.Sort(1); }

else return; }

cout<<"排序完成!"<<endl; }

void quit(AddrList &addrlist)//退出系统,内部做结尾工作 {

addrlist.WriteToFile("addrlist.dat"); system("pause"); exit(0); }

void main()//主函数 {

int choice=0, state; AddrList addrlist;

addrlist.CreateList("addrlist.dat");//从二进制文件中读入数据, //构建链表

while(choice!=9)//循环菜单处理 {

system("cls");

DisplayMenu();//显示主菜单 cin>>choice;

state=cin.rdstate(); if(state) {

char str[80];cin.clear();cin.getline(str,80);choice=10; }

15

switch(choice) {

case 1: add(addrlist); break; case 2: del(addrlist); break; case 3: showall(addrlist); break; case 4: query(addrlist); break; case 5: modify(addrlist); break;

case 6: addfromtxtfile(addrlist); break; case 7: writetotxtfile(addrlist); break; case 8: sort(addrlist); break; case 9: quit(addrlist); break; default : ;

} } }

五、 编程体会

课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++

语言课程设计是十分必要的。

通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说类,链表,指针……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C++语言的一次实践作业,自己进步的证明。

在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的

16

过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!

六、 参考文献

C++程序设计教程 张志航,王珊珊著 机械工业出版社 C++面向对象程序设计 陈维兴 林小茶 编著 中国铁道出版社

17

相关推荐