课程名称: 程序设计基础课程设计 学院名称: 计算机科学与工程学院 专 业: 计算机科学与技术课程设计报告 装 订线目录一、绪论 (3)二、设计内容 (4)1、选题 (4)2、系统功能 (4)3、应用到的技术 (4)三、设计要求 (4)四、设计环境 (5)1、操作系统 (5)2、开发工具 (5)3、PC机配置 (5)五、系统结构图 (5)六、功能实现 (6)1、系统运行 (6)2、添加联系人 (6)3、修改联系人 (7)4、删除联系人 (8)5、查找联系人 (8)6、查看所有联系人 (8)7、对联系人在文件中的存储位置进行排序 (9)8、系统运行结束 (9)七、遇到的问题和解决的方法 (9)八、设计心得 (10)九、参考文献 (11)十、附件 (12)1、头文件 (12)2、主函数 (12)3、函数实现文件 (13)需求分析在这个信息化的时代,手机已成为继固话之后最为通俗的交流工具。
在这个人与人关系愈加密切的时代,“通讯”成了生活中的必需品。
这就有这么一个系统记录下人与人之间的多样联系方式——手机通讯系统。
通过系统记录下对方的联系方式,既减轻了大脑的负担,又不在受各种条件的约束,做到便捷随身管理相关的联系信息,摆脱了传统电话簿,名片的累赘。
从长远利益来看,可是意义重大的环保之举。
根据市场需求,手机通讯录管理系统所记录的信息一般分为个人、商业、办公三类。
清晰了机主的联系方向。
针对性的分门别类,使系统具有了方便了机主的存储和快速查阅优势功能,大大减少了在电话簿,名片上机械翻阅查找过程的时间。
于此同时又根据手机随身携带的特殊性,在一定程度上比一般的制作文件又其次,因为手机是随身携带的通讯工具,这与记事本相比将在一定程度上保障联系人信息的安全性,相对避免了个人隐私信息外泄从而带来的损失。
综上所述,手机通讯录管理系统是一个高效、实时、绿色环保的管理系统。
友元重载常函数构造函数析构判断数据链表手机通讯录管理系统一、主要功能模拟手机通信录管理系统,要求:(1)查看功能:选择此功能时,列出下列三类选择:A 办公类B 个人类C 商务类,当选中某类时,依次显示出此类所有数据中的姓名和电话号码(2)增加功能:能录入新数据(包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。
♦当录入了重复的姓名和电话号码时,提示数据录入重复并取消录入;♦通信录容量限定在15条以内。
♦当存储信息超出存储空间,提示存储空间已满,不能再录入新数据;♦录入的新数据能按递增的顺序自动进行条目编号。
(3)拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拔号声音。
(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
1.查看功能2、本系统应具备以下七个功能模块:添加联系人信息、修改联系人信息、删除联系人信息、查询联系人信息、查看所有联系人信息、对联系人信息进行排序,退出保存。
(1) 添加联系人信息:将新得到的联系人信息添加到通讯录中,添加的信息有:序列号、姓名、昵称、性别、手机号码、家里电话、QQ和E-mail。
(2) 修改联系人信息:对已经保存的联系人信息进行修改,可以修改全部的信息也可以选择性的修改其中的某些项目。
(3) 删除联系人信息:对保存在通信录中的联系人信息进行删除。
(4) 查询联系人信息:通过联系人的姓名查询联系人的的全部通讯信息(5) 查看所有联系人信息:本功能将一次性的让机主看到通讯录中保存的所有联系人的所有通讯信息。
(6) 联系人信息排序:依据添加时给定的序列号对通讯录中的联系人信息进行排序。
(7) 保存:将添加的联系人通讯信息以.txt文本的形式保存起来,以备以后查询使用。
3、系统设计具体应用到的技术:(1) 结构、枚举类型的定义与使用;(2) 数组的定义和使用使用;(3) 程序的三种基本控制流程的综合、灵活运用;(4) 普通指针和数组指针的定义和使用;(5) 各类函数的定义和调用;(6) 文件的输入/输出;(7) 程序的调试。
二、设计要求1、在Visual C++控制台应用程序方式下设计课题。
2、设计的程序要求完成本次课程设计所规定的功能。
3、程序应具有一定的健壮性。
即程序必须具有必要的检查和出错处理,如在添加新联系人信息时检查输入的序列号是否相同。
删除、查询联系人信息时检查输入的姓名是否存在等。
三、设计环境1、操作系统:Windows XP Professional;2、开发工具:Microsoft Visual C++ 6.0;3、PC机的配置:CPU:Intel(R)Core(TM)2 T7100 @2.00Ghz;内存:1G;硬盘空间:120GB;显卡:128MB DDR3 NVIDIA(R) GeForce(R) 8400M GS 显卡;四、系统结构图添加联系人信息修改联系人信息删除联系人信息查询联系人信息查看所有联系人信息对联系人进行排序保存退出根据姓名删除根据姓名修改根据姓名修改根据序列号排序主菜单五、功能实现1、系统运行系统运行结果如图所示:2、添加联系人添加联系人信息运行界面如图所示:录入完一位联系人的相关信息后,会立刻给予显示,以供核对。
核对后敲击回车,将回到主菜单。
3、修改联系人修改联系人信息运行界面如图所示:当选择修改联系人信息菜单“2”时,会提示您输入要修改联系人的姓名,如果您姓名输入错误,则提示联系人不存在,如下图所示:此时,需重新选择菜单“2”,然后输入正确的姓名即可对联系人信息进行修改,需要修改的项目,选择菜单“y”不需要修改的项目选“n”,将直接进入下一个项目的修改。
4、删除联系人信息删除联系人信息运行界面如图所示:此时,输入你要删除的联系人的姓名即可,然后系统会提示你是否确认删除,“y”执行删除,“n”取消删除。
5、查询联系人查询联系人信息运行界面如图所示:输入你要查询的联系人的姓名,如果文件book.tet中有这位联系人的信息,将会显示出来;如果文件book.tet中没有这位联系人信息,系统将会提示你“联系人不存在”。
6、显示所有联系人显示所有联系人信息运行界面如图所示:当选择“5”菜单时,将会显示所有保存在book.txt文件中联系人的信息。
7、对联系人在文件中存储位置排序按序列号对联系人在book.txt文件中排序的运行界面如图所示:该功能主要是根据在添加联系人是给定的“序列号”,对保存在book.txt文件中的联系人信息进行排序,序列号小的排到前面,大的排到后面。
8、系统结束运行界面选择菜单“7”系统将提示“Press any key to continue”,此时按任意键系统运行结束。
六、遇到的问题和解决的方法1、不熟悉。
由于在本次课程设计之前长时间没有复习和使用visual C++,很对知识已经记忆模糊,甚至已经淡忘。
对于这种情况我做了这些工作:翻阅以前的课本熟悉本次课程设计所涉及和使用到的相关知识点,比如数组、数据指针、结构体和枚举类型等等。
其次就是在设计的过程中遇到自己不能解决的问题,请教其他同学和到图书馆查阅相关资料。
2、系统首次运行,在添加联系人信息时,联系人信息当中的手机号码、家里电话、地址、QQ和E-mail几个项目是始终显示第一位联系人的信息,而不能显示与姓名对应的联系人的通讯信息。
这个问题在请教老师后得知,是我在设计时忽略了添加新的联系人信息时必须考虑已经保存在文件中的已经添加的联系人信息,于是将代码“GetData(book)”改成“GetData(book+CurNum)”,问题得以解决。
3、当系统完成最初设计,执行修改联系人信息时,显示的是第一个联系人的通讯信息,并不是显示当前联系人的信息。
这个问题在系统最初运行的时候,作为设计人员的我并没有注意到,直到跟一位同学进行系统设计缺陷互查的时候才被发现。
经过仔细检查和查阅资料,发现了其中的错误所在。
显示当前信息的代码是“displayone(book+i)”,而我写成了“displayone(book)”,改正过来的系统成功实现显示当前联系人的通讯信息。
4、当book.txt文件中有联系人信息数据,程序运行,在读book.txt文件中的联系人信息数据时总出错。
研究了很久发现,是因为在最初设计时,我考虑将保存到book.txt文件的联系人信息中的各项目之间用顿号隔开以示区别,但在做读数据时我却没有对对应的设计,没有使用顿号,致使在读数据时出现错误。
七、设计小结课程设计是一次将理论知识运用于解决实际生活中所遇到的问题的实战是一次理解和深化理论知识,树立知识服务生活,知识服务经济发展的的理念。
在本次设计过程中,我通过查阅资料,以及调查身边的人进行系统需求分析,在此基础上建立系统模型,编写代码,进行调试。
过程是曲折的,有时候一个字母的大小写就要花上几个小时的时间去查找。
但正是这个过程让我了解了自己对这么语言的掌握程度,锻炼了我独立解决问题的能力,同时让我意识到严谨的态度对一个系统开发者的重要性。
学以致用,手机通讯录管理系统是我独立开发的第一个系统。
由于能力所限,这个系统还相对简单,且有可能存在一定的缺陷,但这并没有影响到我设计成功后的喜悦。
这是一个契机,给自己今后学习和工作指明了方向。
最后,衷心的感谢本次课程设计的罗烨指导老师,正因为老师的指点,使得我少走了很多弯路,同时授予了我很多作为设计人员应该有的正确理念和行为。
参考文献1 谭浩强著.C++程序设计.北京.清华大学出版社,20062 谭浩强主编.C++程序设计题解与上机指导.北京.清华大学出版社,20063 郑莉,董渊,张瑞峰著.C++语言程序设计(第3版).北京.清华大学出版社,20044 郑莉,董渊,张瑞峰主编.C++语言程序设计案例教程.北京.清华大学出版社,20045 洪永清,黄德才,吕丽民.面向对象建模与设计.北京.人民邮电出版社,19986 邵维忠,杨芙清.面向对象的系统分析.北京.清华大学出版社,19987 吴乃陵.C++程序设计实践教程(第2版).北京.高等教育出版社,20068 钱能.C++程序设计实验指导.北京.清华大学出版社,19999 严蔚敏等.数据结构(C++版).北京.清华大学出版社,199710 (美)Ivor Horton 著.李予敏译.C++入门经典(第3版).北京.清华大学出版社,2002附:本系统源程序1、头文件//book.h#ifndef BOOK_H#define BOOK_Hstruct Book{char No[9];char Name[9];char Nickname[9];char Sex[7];char Mobilenum[15];char Familynum[15];char Addr[30];char qq[10];char Email[15];};#endif2、主函数//主函数文件#include <iostream.h>#include <fstream.h>#include <iomanip.h>#include <string.h>#include "手机通讯录.h"int EnterChoice(); //输入选项void Init(); //数据文件初始化void Add(); //增加一个联系人信息void Display(); //显示所有联系人信息void DisplayOne(Book*); //显示全部联系人重载函数void SortNo(); //按序列号排序(从小到大)void Save (); //保存数据int CheckNo(char *); //输入序列号int CheckName(char *); //输入姓名void PrintTitle(); //显示表头void GetData(Book*); //读取联系人信息void Update(); //修改联系人信息void Delete(); //删除联系人信息void Query(); //查询联系人信息enum Choices{ADD=1,UPDATE,DELETE,QUERY,DISPLAY,SORTNO,END}; const int MaxNum=200; //能够建立的最多联系人人数int CurNum; //当前联系人人数Book book[MaxNum]; //结构数组void main(){Init();int choice;while((choice=EnterChoice())!=END){switch(choice){case ADD:Add();break;case UPDATE:Update();break;case DELETE:Delete();break;case QUERY:Query();break;case DISPLAY:Display();break;case SORTNO:SortNo();break;default:cerr<<"输入序列号不正确,请重新输入!\n";}}Save();}3、函数实现文件//函数实现文件#include <iostream.h>#include <iomanip.h>#include <fstream.h>#include <string.h>#include "手机通讯录.h"int EnterChoice(); //输入选项void Init(); //数据文件初始化void Add(); //增加一个联系人信息void Update(); //修改一个联系人信息void Delete(); //删除一个联系人信息void Query(); //查询一个联系人信息void Display(); //显示全部学生void DisplayOne(Book*); //显示一个学生的重载函数void SortNo(); //按建立时的序号排序(从小到大)void Save (); //保存联系人信息数据int CheckNo(char *); //检查联系人是否存在,存在返回序列号,不存在返回-1 int CheckName(char *); //检查联系人是否存在,存在返回姓名,不存在返回-1 void PrintTitle(); //显示选择菜单void GetData(Book*); //读取联系人信息extern const int MaxNum=200; //最多能够建立联系人人数extern int CurNum; //当前已经建立的人数extern Book book[MaxNum]; //结构数组//========================输入选择函数======================== int EnterChoice(){cout<<"\n\t++++++++欢迎使用手机通讯录管理系统+++++++++++++++++\n"; cout<<" 按【1】: 添加一位联系人信息; "<<endl; cout<<" 按【2】: 修改一位联系人信息; "<<endl; cout<<" 按【3】: 删除一位联系人信息; "<<endl; cout<<" 按【4】: 查询一位联系人信息; "<<endl; cout<<" 按【5】: 显示所有联系人信息; "<<endl; cout<<" 按【6】: 按建立序列号排序; "<<endl; cout<<" 按【7】:结束; "<<endl; cout<<"\n\t+++++++++++++++++++++++++++++++++++++++++++++"<<endl; cout<<"\n\t请选择菜单(1-7):" ;int Choice;cin>> Choice;return Choice;}//===========================初始化函数======================== void Init(){ifstream inCount,inBook;ofstream outCount,outBook;inCount.open("count.txt",ios::in); //打开联系人人数文件if(!inCount) //文件不存在,建立该文件{inCount.close();outCount.open("count.txt",ios::out);outCount<<CurNum; //写入联系人人数0outCount.close(); //关闭文件}else{inCount>>CurNum; //文件存在,读取联系人人数inCount.close();}if(CurNum) //联系人总数不为0,联系人文件存在{inBook.open("Book.txt",ios::in); //打开联系人文件for(int i=0;i<CurNum;i++) //读取联系人数据{inBook>>book[i].No; //读取联系人序号inBook>>book[i].Name; //读取联系人姓名inBook>>book[i].Nickname; //读取联系人昵称inBook>>book[i].Sex; //读取联系人性别inBook>>book[i].Mobilenum; //读取联系人手机号码inBook>>book[i].Familynum; //读取联系人家里电话inBook>>book[i].Addr; //读取联系人地址inBook>>book[i].qq; //读取联系人QQinBook>>book[i].Email; //读取联系人E-mail}inBook.close();}else{outBook.open("Book.txt",ios::out);outBook.close();}}//=====================增加一个联系人信息======================= void Add(){char no[9];cout<<"序列号:";cin>>no;int i=CheckNo(no);if (i>=0)cout<<"序列号已存在,请重新输入"<<endl;else{strcpy(book[CurNum].No,no);cout<<"姓名:";cin>>book[CurNum].Name;cout<<"昵称:";cin>>book[CurNum].Nickname;cout<<"性别:";cin>>book[CurNum].Sex ;cout<<"手机号码:";cin>>book[CurNum].Mobilenum;cout<<"家里电话:";cin>>book[CurNum].Familynum;cout<<"地址:";cin>>book[CurNum].Addr ;cout<<"QQ:";cin>>book[CurNum].qq ;cout<<"E-mail:";cin>>book[CurNum].Email ;Save();DisplayOne(book+CurNum); //排序后重新显示CurNum++;}}//==================按序列号从小到大冒泡排序,并显示=============== void SortNo(){Book temp;int flag;for(int i=0;i<CurNum-1;i++){flag=1;for(int j=0;j<CurNum-1-i;j++){if(strcmp(book[j+1].No ,book[j].No)<0 ){flag=0;temp=book[j+1];book[j+1]=book[j];book[j]=temp;}}if(flag) break;}Display(); //排序后重新显示}//==========================显示表头=========================== void PrintTitle(){cout<<setiosflags(ios::left);cout<<setw(4)<<"序号"<<setw(6)<<"姓名"<<setw(6)<<"昵称"<<setw(4)<<"性别"<<setw(10)<<" 手机号码"<<setw(14)<<" 家里电话"<<setw(10)<<" 地址"<<setw(10)<<" QQ"<<setw(10)<<" E-mail"<<endl;}//=======================显示所有联系人信息===================== void Display(){cout<<setiosflags(ios::left);PrintTitle();for (int i=0;i<CurNum;i++){cout<<setw(4)<<book[i].No;cout<<setw(6)<<book[i].Name;cout<<setw(6)<<book[i].Nickname;cout<<setw(4)<<book[i].Sex;cout<<setw(10)<<book[i].Mobilenum;cout<<setw(10)<<book[i].Familynum;cout<<setw(10)<<book[i].Addr;cout<<setw(10)<<book[i].qq;cout<<setw(10)<<book[i].Email<<endl;}}//======================显示一个联系人信息====================== void DisplayOne(Book *book){cout<<setiosflags(ios::left);PrintTitle();cout<<setw(4)<<book->No;cout<<setw(6)<<book->Name;cout<<setw(6)<<book->Nickname;cout<<setw(4)<<book->Sex;cout<<setw(10)<<book->Mobilenum;cout<<setw(10)<<book->Familynum;cout<<setw(10)<<book->Addr;cout<<setw(10)<<book->qq;cout<<setw(10)<<book->Email;}//======================保存联系人信息到文本文件================= void Save(){ofstream outCount,outBook;outCount.open("count.txt",ios::out);outCount<<CurNum;outCount.close();outBook.open ("book.txt",ios::out);for(int i=0;i<CurNum;i++){outBook<<(book+i)->No<<" ";outBook<<(book+i)->Name<<" ";outBook<<(book+i)->Nickname<<" ";outBook<<(book+i)->Sex<<" ";outBook<<(book+i)->Mobilenum<<" ";outBook<<(book+i)->Familynum<<" ";outBook<<(book+i)->Addr<<" ";outBook<<(book+i)->qq<<" ";outBook<<(book+i)->Email<<" "<<endl;}outBook.close();}//=======检查序列号是否存在,找到返回所在数组下标,找不到返回-1======= int CheckNo(char* no){for(int i=0;i<CurNum;i++)if(strcmp(book[i].No,no)==0)return i;return -1;}//======检查姓名是否存在,找到返回所在数组下标,找不到返回-1========= int CheckName(char* name){for(int i=0;i<CurNum;i++)if(strcmp(book[i].Name,name)==0)return i;return -1;}//==============根据输入的姓名,修改联系人信息,并显示============== void Update(){char uName[9];char a;cout<<"输入姓名:";cin>>uName;int i=CheckName(uName);if(i<0)cout<<"联系人不存在!\n";else{cout<<"确定修改吗?(y/n)\n";cin>>a;if(a=='y'||a=='Y'){cout<<"修改序列号吗?(y/n)";cin>>a;if(a=='y'||a=='Y'){cout<<"输入序列号:";cin>>book[i].No;}cout<<"修改昵称吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入昵称:";cin>>book[i].Nickname;}cout<<"修改性别吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入性别:";cin>>book[i].Sex;}cout<<"修改手机号码吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入手机号码:";cin>>book[i].Mobilenum;}cout<<"修改家里电话吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入家里电话:";cin>>book[i].Familynum;}cout<<"修改地址吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入地址:";cin>>book[i].Addr;}cout<<"修改QQ吗?(y/n)\n"; cin>>a;if(a=='y'||a=='Y'){cout<<"输入QQ:";cin>>book[i].qq;}cout<<"修改E-mail吗?(y/n)\n";cin>>a;if(a=='y'||a=='Y'){cout<<"输入E-mail:";cin>>book[i].Email;}DisplayOne(book+i); //显示当前记录}}}//===============根据输入的姓名,删除对应的联系人================= void Delete(){char dName[9];char a;cout<<"输入姓名:";cin>>dName;int i=CheckName(dName);if(i<0)cout<<"联系人不存在!\n";else{cout<<"确定删除吗?(y/n)\n";cin>>a;if(a=='y'||a=='Y'){for(int j=i+1;j<CurNum;j++)book[j-1]=book[j];CurNum--;}}}//================根据输入的姓名,查找该联系人并显示=============== void Query(){char qName[9];cout<<"输入姓名:";cin>>qName;int i=CheckName(qName);if(i<0)cout<<"联系人不存在!\n";else{DisplayOne(book+i);}}21。