c++ 课程设计 简单电话簿管理报告

更新时间:2023-12-14 15:17:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++语言程序设计》课程设计

实验报告

题目: 简单电话簿管理

班级: 学号: 姓名: 成绩: 指导教师:

日期: 年 月 日

(一)程序功能

电话簿是一个简单的数据库库表,每一个记录(节点)包含一个人的所有信息。 程序的执行过程为:显示主菜单,用户在choice:处输入选项(按照功能输入0-7中的一个数字),按回车后,执行相应的功能。 主菜单如图所示,各菜单项功能如下:

1.增加记录

提示输入各字段。一次输入一个人的数据。 2.按姓名查找,修改一个记录

用户输入输入姓名,系统显示该姓名下的所有信息,同时显示“请输入用户号码和性别”,此时操作者重新输入用户信息,系统提示确认要修改用户信息,再由操作者选择。 3.删除记录

输入待删除记录的姓名,显示该姓名下的信息,让用户确认是否要删除

4.查找(按姓名) 按姓名查找并显示一个记录输入姓名,显示该姓名下的信息。 5.排序

电话簿按指定的顺序排序可输入“5”来修改按1.姓名(升序)2.按电话号码(升序)3.按姓名(降序)4.按电话号码(降序)通过这四种方式来显示电话

簿中的信息。 6.显示记录

显示电话簿中所有信息记录。 7.全删

清空电话簿中的信息记录。 0.退出 退出系统

(二)课题分析

本课程设计的数据有每个人的姓名,性别,电话号码并且所有人的数据默认以姓名为关键字按升序排放,排序方式可修改,同时为了减少执行“添加”、“删除”等过于复杂和繁琐的操作,采用单向链表来进行数据的存储和操作。同时需要一个文本文件来存储联系人信息,数据可从该文本文件中导出。同时也可以从程序中导出数据,从而保存。为了方便,选择了汉化菜单。

(三)设计中遇到的问题及解决方法

1、从文本中写入数据时可能指针指错位置,导致不能正常进行。解决的办法是对指针进行必要跟踪,把该函数写入独立的cpp文件中,单个进行检查。

2、刚开始程序运行的时候有很多错误,不知道从哪儿下手,后来从头开始一个一个的去修改,会发现有很多错误是因为上面的程序错误引发的。

4、程序在调试中出现很大难度,调试有时会出现混乱现象。方法是:逐个逐个功能进行测试,这样便于找到问题所在,相对比较清晰;

5、从文本文件中载入数据时,出现不能读的情况,解决的办法是分情况,写程序分别进行处理。

(四)设计感谢与心得

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

过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

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

#include #include #include #include #include #define M 20 #define N 12 class Fphone { char name[M]; char phone_num[N]; int sex; public: Fphone(char *na=\中间不加空格 char *getname();//获取姓名 char *getphone_num();//获取电话号码 int getsex();//获取性别 void setname(char *na);//设置姓名 void setphone_num(char *num);//设置电话号码 void setsex(int);//置性别 void disp();//输出用户信息 };

//下成员函数为构造函数,缺省值为空

Fphone::Fphone(char *na,char *num,int gender) {

strcpy(name,na); strcpy(phone_num,num); sex=gender; }

//下成员函数用于获取姓名 char *Fphone::getname() { return name; }

//下成员函数用于获取电话号码 char *Fphone::getphone_num() { return phone_num; }

//下成员函数用于设置姓名 void Fphone::setname(char *na) { strcpy (name,na); }

//下成员函数用于设置电话号码

void Fphone::setphone_num(char *num) { strcpy (phone_num,num); }

//下成员函数用于获取性别 int Fphone::getsex() { return sex; }

//下成员函数用于设置性别 void Fphone::setsex(int gender) { sex=gender; }

//下成员函数用于输出用户信息 void Fphone::disp() { cout<<\姓名:\电话号码:\性别:\}

class UserDatabase { int nElem;//用户信息表中元素个数 int Maxu;//最多的用户 Fphone *user;//指向用户信息的指针 public: UserDatabase(int n=10);//构造函数,初始化用户信息表,将user.txt文件中数据读到user[]中 ~UserDatabase();//析构函数,将user[]写入user.txt文件中 void clear();//删除所有用户信息 void add_record(char *na,char *ph_num,int);//添加用户信息,插入用户后仍按升序排列 void delete_record(Fphone *p,int k);//删除用户信息 void modify_record(Fphone *p,char *ph_num,int);//修改用户信息 Fphone *query(char *na);//按姓名查找 顺序查找,这里也可以用折半查找 void sorta_name();//按姓名升序排序 插入排序法 void sorta_phonenum();//按电话号码升序排序 选择排序法 void sort_name();//按姓名降序排序,将排成升序的对象数组逆向放置 void sort_phonenum();//按电话号码降序排序 冒泡排序法 void disp();//输出所有用户信息 void dispmen();//输出所有男同学用户信息 void dispwomen();//输出所有女同学用户信息 Fphone *getuser();//获取头指针

};

//构造函数

UserDatabase::UserDatabase(int n) { int i; char na[M],ph_num[N];int gender; ifstream infile;//定义文件对象 infile.open(\打开数据文件 if(!infile)//if(linfile)//打开文件错误 { cout<<\打开文件错误!'\\n'\ exit(0); } nElem=0; Maxu=n; if(n) user=new Fphone[n]; else user=0; while(infile>>na) { infile>>ph_num>>gender; if(nElem>=Maxu)//实际空间不足 { Fphone *newptr; newptr=new Fphone[Maxu+15];//申请一新表空间 for(i=0;i

user[nElem].setphone_num(ph_num); user[nElem].setsex(gender);//增加元素 nElem++; } infile.close(); }

//析构函数,将user[]写入user.txt文件中 UserDatabase::~UserDatabase() { ofstream outfile; outfile.open(\ if(!outfile) {

cout<<\目标文件无法打开!\ exit(2); } for(int i=0;i

//删除所有用户信息

void UserDatabase::clear() { cout<<\是否删除全部用户信息?是<1> 否<0>\ int a; cin>>a; if(a==1) delete[]user;

else if(a==0) cout<<\未删除!\ else cout<<\您输入不正确,请重新输入:\ }

//添加用户信息,插入用户后仍按升序排列copy

void UserDatabase::add_record(char *na,char*ph_num,int gender) { if (nElem==0)//还没有用户时,首地址赋值 { user->setname(na);

user->setphone_num(ph_num); user->setsex(gender); nElem++; } if(nElem==Maxu)//线性表已满 {

Fphone *p;

p=new Fphone[Maxu+10];//申请空间,一次多申请一些 for(int i=0;i

p[i]=user[i]; //原表复制到新表 delete []user; Maxu+=10;

user=p;//指针指向新表 }

if( query(na)!=NULL )

cout<<'\\t'<<\该用户已存在!\ else

{

user[nElem].setname(na);

user[nElem].setphone_num(ph_num); user[nElem].setsex(gender); nElem++;

} }

//删除用户信息

void UserDatabase::delete_record(Fphone *p,int k) { cout<<\确认要删除用户信息? 是<1>,否<0>:\ int a; cin>>a; if(a==0) { cout<<\操作取消,未删除任何用户信息!\ return; } else if(a==1) { for(int i=k;i

//修改用户信息

void UserDatabase::modify_record(Fphone *p,char *ph_num,int gender) { cout<<\确认要修改用户信息? 是<1>,否<0>:\ int a; cin>>a;

if(a==0) { cout<<\操作取消,未修改任何用户信息!\ return; } else if(a==1) { p->setphone_num(ph_num); p->setsex(gender); cout<<\已修改!\ return; } else if(a!=0&&a!=1) cout<<\输入错误!\ return; }

//按姓名查找

Fphone *UserDatabase::query(char *na) {

/* int low=0,mid,up;//折半法查找,可与下面程序替换 Fphone *p=user; up=nElem-1; while(low<=up) { mid=(low+up)/2; if(strcmp(p[mid].getname(),na)==0) return &p[mid]; else if(strcmp(p[mid].getname(),na)>0) up=mid-1; else low=mid+1; } return NULL;*/

Fphone *p=user; //顺序查找 int i=0; while(i<=nElem) { if((strcmp(p->getname(),na))==0) return p; p++; i++; } return NULL; }

//按姓名升序排序

void UserDatabase::sorta_name() { Fphone k; int i,j; for(i=1;i=0&&(strcmp(k.getname(),user[j].getname())<0);j--) { /*strcpy(user[j+1].getname(),user[j].getname()); strcpy(user[j+1].getphone_num(),user[j].getphone_num());*/ user[j+1]=user[j];//采用整体覆盖方式 } /*strcpy(user[j+1].getname(),k.getname()); strcpy(user[j+1].getphone_num(),k.getphone_num());*/ user[j+1]=k;//采用整体覆盖方式 } cout<<\已录入!\}

//按电话号码升序排序

void UserDatabase::sorta_phonenum() { int i,j,p; Fphone k;

for(i=0;i

if(strcmp(user[j].getphone_num(),user[p].getphone_num())<0) if(p!=i) { k=user[p]; user[p]=user[i]; user[i]=k; } }

cout<<\排序完成\}

//按姓名降序排序

void UserDatabase::sort_name() { Fphone tempt; int i,m=(nElem+1)/2; for(i=0;i

//按电话号码降序排序

void UserDatabase::sort_phonenum() { int i,j; Fphone k; for(i=0;i

//输出所有男同学用户信息 void UserDatabase::dispmen() { int i,n=0;

cout<

if((user+i)->getsex()==1) { cout<getname()

<getphone_num()<

if(n==0) {

system(\ system(\

} } }

cout<

//输出所有女同学用户信息 void UserDatabase::dispwomen() { int i,n=0;

cout<

if(!(user+i)->getsex()) { cout<getname()

<getphone_num()<

if(n==0) {

system(\ system(\ } } }

cout<

//输出所有用户信息

void UserDatabase::disp() { if(user==NULL) cout<<\空电话簿。\ int i,n=0;

cout<

if((user+i)->getsex()==1) cout<getname()

<getphone_num()<getname()

<getphone_num()<

if(n==0) {

system(\ system(\ } }

cout<

//获取头指针

Fphone *UserDatabase::getuser() { return user; }

//主函数 void main() { char i; UserDatabase d; for(;;) { cout<<\***\ cout<

cout<

cout<<\ 2-修改记录\

cout<<\ 3-删除记录\ cout<<\ 4-查找(按姓名)\

cout<<\ 5-排序\

cout<<\ 6-显示记录\

cout<<\ 7-全删\

cout<<\ 0-退出\

cout<<\ 请输入选择:\

cin>>i; switch(i) { case '1' : { system(\ cout<<\***\ cout<<\ 增加记录\

int gender; cout<>name; cout<

else { cout<<\请输入用户号码和性别男<1>女<0>:\

cin>>num>>gender; d.add_record(name,num,gender); d.sorta_name(); } system(\ system(\ break; } case '2' : { system(\ cout<<\***\ cout<<\ 修改记录\

cout<<\

***\ char name[20],num[15]; int gender; cout<>name; cout<getsex()==1) cout<<\男\ else cout<<\女\ cout<<\请输入用户号码和性别男<1>女<0>:\ cin>>num>>gender; d.modify_record(d.query(name),num,gender); d.sorta_name(); } else cout<<\不存在此用户,您无法修改,请先添加。\ system(\ system(\ break; } case '3': { system(\ cout<<\***\ cout<<\ 删除记录\

cout<<\***\ char name[20]; cout<>name; cout<

***\ char name[20]; cout<>name; if(d.query(name)!=NULL) { cout<<\姓名:\ cout<<\号码:\ if(d.query(name)->getsex()==1) cout<<\男\ else cout<<\女\ } else cout<<\查无此人!\ system(\ system(\ break; } case '5': { system (\ cout<<\***\ cout<<\ 排序:\ cout<<\***\ char j; cout<

cout<

cout<<\请选择排序方式:\cout<<\按姓名(升序)\cout<<\按电话号码(升序)\cout<<\按姓名(降序)\cout<<\按电话号码(降序)\cout<<\请输入选择:\cin>>j; switch(j) {

case '1': { system (\ d.sorta_name(); d.disp(); system(\ system(\ break; } case '2': { system (\ d.sorta_phonenum(); d.disp(); system(\ system(\ break; } case '3': { system (\ d.sort_name();

d.disp(); system(\ system(\ break; } case '4': { system (\ d.sort_phonenum(); d.disp(); system(\ system(\ break; } default :cout<<\您输入的不正确。\ }; break; } case '6': { system (\ cout<<\***\ cout<<\ 显示记录\ cout<<\***\ char j; cout<<\请选择显示方式:\ cout<<\全部\ cin>>j;

} case '7': {

switch(j)

{

case '1': { system (\ d.disp(); system(\ system(\ break; } case '2': { system (\ d.dispmen(); system(\ system(\ break; } case '3': { system (\ d.dispwomen(); system(\ system(\ break; } default :cout<<\您输入的不正确。\}; break;

system (\ cout<<\***\ cout<<\ 全部删除记录\ cout<<\***\ d.clear(); cout<

} } } }

/*************************************************************** 增加记录

**************************************************************

请输入用户姓名:sunli

请输入用户号码和性别男<1>女<0>:15996356398 0

已排序!

************************************************************** 修改记录

**************************************************************

请输入用户姓名:zhangsheng

原号码:18762406904 男

请输入用户号码和性别男<1>女<0>:187624001102 1

确认要修改用户信息? 是<1>,否<0>:1 已修改! 已排序!

**************************************************************

查找记录

**************************************************************

输入用户姓名:zhaoyinhong 姓名:zhaoyinhong 号码:13851236987 女

************************************************************** 排序:

**************************************************************

请选择排序方式: 1-按姓名(升序) 2-按电话号码(升序) 3-按姓名(降序) 4-按电话号码(降序) 请输入选择:

请按任意键继续. . .

************************************************************** 退出系统,谢谢您的使用,欢迎再次使用本电话簿管理系统

************************************************************** */

本文来源:https://www.bwwdw.com/article/1515.html

Top