课程设计c++手机通讯录

来源:互联网 发布:淘宝买lol王者账号流程 编辑:程序博客网 时间:2024/04/25 07:06

 

 

程序实训报告

 

 

 

 

 

  题    目: 手机名片管理系统

  姓名学号: xx xxxxxxxx

  专    业: 计算机科学与技术专业

  班    级: 计科xx

  指导教师: xxx

 

 

 

 

 

 

 

           2 0 1 3   年 7   月 10   

 

 

                          

目录

目录 2

任务书 3

【摘要】 4

1.程序主要功能 5

2. 程序总体设计 5

1)文件结构 5

2) 主要类 6

 3)结构体  7  

 4) 程序结构 8

3. 程序详细设计 9

3.1主菜单函数(main): 9

3.2添加函数(insert): 10

3.3创建链表...11

3.4编辑函数(edit) 12

3.5删除函数(delete) 14

3.6查找函数(query):: 15

3.7显示函数(show) 17

 3.8分类保存(save).18

4. 运行结果 18

5. 附录:(代码) 24

 


任务书

课程名称

程序实训

设计题目

          手机名片管理系统

指导教师

X X

时间

201307.01——2013.07.06

一、教学要求

1. 巩固和加深学生对C++语言课程的基本知识的理解和掌握

2. 掌握C++语言编程和程序调试的基本技能

3. 利用C++语言进行基本的软件设计

4. 掌握书写程序设计说明文档的能力

5. 提高运用C++语言解决实际问题的能力

二、设计资料及参数

每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。

手机名片管理系统题目,包括以下功能:

通过计算机对数据文件的存储和读取,实现名片的输入,输出,查找,修改,删除,分类存储等功能。最大可以管理300张名片。

    要求:

     命令行界面, 有输入功能,有删除条目功能,有输出功能

      有显示列表功能,有根据某一特点的查找功能, 有分类存储功能

三、设计要求及成果

1. 分析课程设计题目的要求

2. 写出详细设计说明

3. 编写程序代码,调试程序使其能正确运行

4. 设计完成的软件要便于操作和使用

5. 设计完成后提交课程设计报告

四、进度安排

第一天  选择课程设计题目,分析课题的要求,设计程序结构

第二天  编程

第三天  编程

第四天  编程

第五天 写报告

第六天  提交课程设计报告(打印稿及电子稿)

五、评分标准

1. 根据平时上机考勤、表现和进度,教师将每天点名和检查

2. 根据课程设计完成情况,必须有可运行的软件。

3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。

六、建议参考资料

1.《C++ primer plus,XXX,XXXXXX出版社

2.《C++大学教程》,XXXX,XXXXX出版社

                 【摘要】

这一次课程设计我们选到了编程达到手机通信录管理的目的,之前对于C++学习,编程题目只限于课本上量很小的编程题目,并没有实际应用价值,只是为了掌握知识而编写程序,这次课设作业让我们将所有知识运用到实际程序之中,

首先我们需要全面的分析课设题目的要求,需要实现的功能,并此为基础思考更多内容来完善未曾提及的要求来丰富程序功能;要考虑到文件的读写功能,从文件中删除需要用到指针和链表,输入输出运算符的重载,类和结构体的使用,switch()case()语句的多次应用,将所学知识联系起来,还要与同学合作共同完成工程项目,完成报告的书写,这个过程不仅提供给大家提高编程能力的机会,还让大家学会配合,在合作中提高。

 

手机名片管理系统具有以下简单功能:

    命令行界面

    有输入功能

    有删除条目功能

    有输出功能

    有显示列表功能

    有根据某一特点的查找功能

    有分类存储功能

1.程序主要功能

    程序的主要功能包括...

命令行界面,有输入功能,有删除条目功能,有输出功能

有显示列表功能,有根据某一特点的查找功能, 有分类存储功能

 

 

2. 程序总体设计

1)文件结构

     包括1businesscard.dat文件,此主要内容为

   1首先在文件中存入部分联系人信息,在完成添加联系人功能时先判断该联系人是否存在,若不存在则新建

   2,完成编辑功能和删除功能,编辑和删除部分需要首先找到目标对象也就是被删除或编辑的对象,通过链表和指针扫描全部文件筛选匹配联系人,删除时将指针指向下一位置即可完成,编辑时首先显示该联系人全部信息,再通过18选择需要修改的项目,然后将修改部分再输入到指针所指位置,即完成编辑过程,

    3,显示输出功能,将文件中包含的所有联系人信息显示在屏幕上;

4,新建联系人也将存在此文件中,显示文件全部内容也在该文件中完成

5,分类存储功能的实现也在此文件中

 

 

2)主要类/数据结构

     包括类.businesscard,

     此类的成员变量

             string name;

             string birthday;

             string mobilenumber; 

             string telephonenumber;

             string sex;    

             string address;

             string email;

             string relationship;

     

成员函数...

              包括

              重载输入函数

                  istream&operator>>(istream &input,businesscard &card)

                重载输出函数

                  ostream&operator<<(ostream &output,businesscard &card)

    添加insert(),编辑edit(),删除delete(), 查找query(),  显示 show(),分类存储save()函数

                  

3)结构体

包括类以及结构体指针

struct tongxunlu

{

    businesscard card;

    tongxunlu *next;

}; 

4)程序结构

     类,函数之间的关系

类中包含对输入输出函数的重载,将成员函数在类中声明,在类体外进行定义

输入输出函数重载在类体内声明

friend istream & operator>>(istream &input,businesscard &card);

friendostream & operator<<(ostream &output,businesscard &card);

在类外定义

istream & operator>>(istream &input,businesscard &card)

ostream &perator<<(ostream &output,businesscard &card)

例如在类中声明添加函数void insert();

在类体外定义此函数void businesscard::insert()

在类中声明编辑函数void edit();    

在类体外定义此函数void businesscard::editt()

在类中声明删除函数struct tongxunlu* deletet(); 

在类体外定义此函数struct tongxunlu* businesscard::deletet();

在类中声明查找函数void query();   

在类体外定义此函数void businesscard::query()

在类中声明显示函数void show();   

在类体外定义此函数void businesscard::show()

在类中声明分类存储函数void save();

在类体外定义此函数void businesscard::save()

3. 程序详细设计

3.1主菜单函数(main):

主函数首先通过十次循环将

****Welcome to the businesscard system!**显示在屏幕中间位置,此时为显示页面,按任意键则进入选择功能界面

选择功能界面的实现首先设计为一个死循环,for(;;)1-8是功能实现函数,只有0是退出。也就是说每执行完一个函数,他就自动返回主菜单。只有选择0(退出)时才跳出循环。

通过switch()case语句的使用,来选择功能,1-8每一个数字链接到对应函数部分

  int e; 

  cin>>e; 

  switch(e)  

     {

         case(1):bcard.insert();break;  

         case(2):bcard.edit(); break; 

         case(3):bcard.deletet();break;

         case(4):bcard.query();break;

         case(5):bcard.show();break;

         case(6):bcard.save();break;

         case(0):return 0;break;     //退出  }      

当然每选择一次它就自动清空屏幕,所以运行结果更直观,因为使用了getch(),所有可以使结果按任意键继续,返回主菜单

    getch();              //任意键继续 

   system("CLS");          //完成清屏功能  

主函数具有调节文字及显示框颜色功能,并可以调节显示框长宽以满足显示需要 

system("mode con cols=130 lines=50");//改变宽高

  system("color 1e");//改变颜色

 

3.2添加函数(insert)

打开文件,

ifstream fin;     //建立文件流对象

  fin.open(FILE);     //在适当时候打开 

输入要添加联系人姓名,首先判断文件不为空,文件未到达末尾时,此联系人是否存在,若存在则跳出循环并提示此联系人已存在不需再次添加,若不存在,则在文件末尾追加此联系人相关信息,并按特定格式写入文件(全部满足相应位数,不足用空格补位),关闭文件

   ofstream fout(FILE,ios::app);   //追加方式写入文件中 

   fout.setf(ios::left);  //设置输出格式状态为左对齐 

   fout<<setw(11)<<name<<setw(14)<<mobilenumber<<setw(12)<<birthday<<setw(14)<<telephonenumber<<setw(7)<<sex<<setw(8)<<address<<setw(22)<<email<<setw(4) <<relationship<<endl;//控制输出格式,不足用空格补位 

   fout.unsetf(ios::left);   //  终止已设置的输出格式状态 

   fout.close();                       //关闭文件 

 

3.3创建链表

定义指针,申请新结点

struct tongxunlu*creat()

{

   struct tongxunlu *head;

   struct tongxunlu *p1,*p2;

   head=p1=p2=new tongxunlu;//申请结新点 

   p1->next=NULL;//将新结点的指针置空 

   ifstream fin(FILE);//打开文件 

   if(fin)

   while(!fin.eof())      //当文件未到末尾时 

{  

     fin>>p1->card;   //为新结点赋值 

     p1->next=NULL;   // 将新结点指针置空 

     if(p1!=head)

      p2->next=p1;//非空表,链接到表尾 

     p2=p1;

     p1=new tongxunlu;      //申请下一个新结点 

   }

     p1=head;

     while(p1!=NULL)

     {

// cout<<p1->card;若添加此句,会显示所有联系人信息 

p1=p1->next;

     }

   return head;

    

3.4 编辑函数(edit)

先判断联系人是否存在,不存在则添加,若存在,首先输出联系人全部信息,再由

判断需要编辑选项,1-8为功能键,其他字符退出,在编辑部分需要调用链表实现,

struct tongxunlu*head=creat();

打开文件,通过将文件头赋给指针,用链表确定文件中是否有所输入信息相匹配的,如果没有,则输出此联系人不存在,否则找到,将联系人信息输出,再选择需要编辑的部分,

string sign;

    cout<<"输入您需要编辑的联系人姓名"<<endl;

    cin>>sign;

    if(head==NULL)       //链表为空 

    cout<<"list is null"<<endl;

    else                     //非空 

    {

      p1=head;

      while(p1!=NULL) 

                    //若当前结点的姓名与要编辑的结点的姓名不同且未到链表尾 

      {

        if(p1->card.name==sign)

           break;

        p2=p1;

        p1=p1->next;  //跟踪链表的增长,指针后移 

      }    

      if(p1==NULL) 

         cout<<"此联系人不存在"<<endl;

     else if(p1->card.name==sign)//找到要编辑的结点 

        {

          cout<<"原信息如下"<<endl;

cout<<p1->card.name<<p1->card.birthday<<p1->card.mobilenumber<< p1->card.telephonenumber<<p1->card.sex<<p1->card.address

<<p1->card.email<<p1->card.relationship<<endl; 

      cout<<"输入需要修改的项目"<<endl;

选择需要编辑的部分,使用switch()case语句实现

将修改信息输入给指针对应部分,达到修改的目的,并且仍保存在原文件中,其中一个例子为case(1):cout<<"输入姓名";cin>>s;p1->card.name=s;break;

输入s,赋给p1->card.name,并跳出此条语句

3.5删除(delete)

实现删除功能有3种查找联系人方式,分别通过姓名,电话号码,移动电话的方式查找到联系人,若未找到,则输出联系人不存在,若查找到,删除关于此联系人全部项目,删除部分,仍需要调用链表,将指针指向文件首地址,筛选是否与输入信息相匹配的,如若没有,则输出该联系人不存在,若找到,需要判断此联系人存在在文件中的位置,并将指针指向下一位

 

3.6查找(query)

实现查找功能有3种查找联系人方式,分别通过姓名,电话号码,移动电话的方式查找到联系人,若未找到,则输出联系人不存在,若查找到,输出关于此联系人全部项目,用到链表部分

  case(1):

  {

 

  cout<<"输入需要查找的联系人姓名"<<endl; 

  string sign;

  cin>>sign;

  //if(fin)

  

  if(head==NULL)       //链表为空 

    cout<<"list is null"<<endl;

    else                     //非空 

    {

      p1=head;

      while(p1!=NULL) 

                    //若当前结点的姓名与要编辑的结点的姓名不同且未到链表尾 

      {

        if(p1->card.name==sign)

           break;

        p2=p1;

        p1=p1->next;  //跟踪链表的增长,指针后移 

      }    

      if(p1==NULL) 

         cout<<"此联系人不存在"<<endl;

         else if(p1->card.name==sign)//找到要编辑的结点 

        {

          cout<<"原信息如下"<<endl;

         cout<<p1->card.name<<""<<p1->card.birthday

<<""<<p1->card.mobilenumber<<""<<p1->card.telephonenumber<<""<<p1->card.sex<<""<<p1->card.address<<""<<p1->card.email<<"" <<p1->card.relationship<<"  "<<endl; 

        } 

    } 

}break;

 

 

 

 

 

3.7显示(show)

新建临时存储器buffer[ ],将通讯录信息保存,

并逐行输出全部信息void businesscard::show()             {

 cout<<"欢迎进入显示项目"<<endl;         //输出文件中已存在的全部通讯记录

 char buffer[300];         //buffer临时存储器 

 fstream out;

 out.open(FILE,ios::in);   //以输入方式打开 

 while(!out.eof())                //未到文件末尾时 

 {

 out.getline(buffer,300,'\n');//getline(char *,int,char)

  //表示该行字符达到300个或遇到换行就结束

 cout<<buffer<<endl;

  }

 out.close();

 cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了

    

}                    

 

 

3.8分类保存(save):

根据朋友,亲人,同事,朋友四项将联系人保存,保存中只需输入出关系之外的其他信息,系统根据case(e)选项来确定并为关系一项赋予其中之一分类,例如若选择朋友关系,则关系一类会由系统自动定义为朋友,用户只需输入其他信息即可

 

 

 

4. 运行结果

 各运行功能的截图。

首页面

 

任意按键,进入选项页面

 

 

 

 

 

 

 

 

 

 

 

显示原文件中存在的联系人

 

选择1,完成插入功能

 

 

实现插入功能后,显示结果

 

选择2,完成编辑功能

 

编辑之后显示文件中的联系人

 

选择3,完成删除功能

 

删除之后,文件中联系人

 

选择4,完成查询功能

 

 

选择5,完成显示功能

 

 

 

 

 

选择6,完成分类保存功能

 

分类保存后,显示文件中存在的联系人

 

 

 

 

 

5. 附录:(代码)

/****文件名****/

"businesscard.txt"

 

文件内容:

 

小李       15665908567   19930504    78993         男     河南    13439204@qq.com.cn  朋友

李莉       18811302920   19920349    34563         女     内蒙    345924@136.com.cn   亲人

王伟       13456435678   19870923    90988         男     河北    asedk@qq.co                                                              

 

 

 

2 0
原创粉丝点击