资源描述
同济大学
二○一一~二○一二 学年第 二 学期
交通运输工程学院
课程设计报告书
课程名称: C/C++语言课程设计
班 级: 4班
学 号: 1151220
姓 名: 王琎晨
指导教师: 孙丽君
二○一二 年 六 月
一. 需求分析
程序名称:通讯录管理程序。
程序功能概括:
1) 添加:即增加一个人的记录到通信录中
2) 显示:即在屏幕上显示所有通信录中的人员信息,应能分屏显示。
3) 查询:可根据姓名查找某人的相关信息,若找到显示其姓名、地址、电话号码和邮政编码。
4) 修改:可修改一个人的除姓名外其它信息。
5) 分类并显示:可将人员进行分组,例如分为家人,朋友,同事等,选择分组后,只显示该分组内的信息
6) 装入:即将文件中的信息读入程序。
7) 存储:即将通讯录信息保存在一个文件中。
8) 删除:删除通讯录中的联系人。
程序意义:通讯录管理系统针对手机中对联系人的添加,删除等操作,方便用户使用通讯录,起到便利作用。
二. 概要设计
系统核心功能:
Ø 添加联系人
Ø 显示所有联系人信息
Ø 查询联系人并显示
Ø 删除联系人
Ø 分组并显示
Ø 修改联系人信息
功能框图:
通讯录管理
载入数据
分组并显示
查询联系人
删除联系人
显示联系人
插入联系人
保存数据
分组显示
组内添加联系人
创建新组
功能描述:
Ø 插入联系人:通过键盘输入联系人的姓名,电话号码,地址,邮政编码等信息,存入通讯录中。
Ø 显示联系人:在屏幕上分行显示所有联系人的信息。
Ø 删除联系人:通过输入需要删除的联系人的姓名删除该联系人。
Ø 查询联系人:通过输入需要查询的联系人的姓名查询该联系人。
Ø 载入数据:从文件读出数据。
Ø 保存数据:将数据保存入文件。
Ø 分组并显示:1.创建新组:创建新的分类。
2.组内添加联系人:将联系人添加入该组。
3:。分组显示:在屏幕上分组显示联系人。
三. 详细设计
本程序用了如下课本中没有的函数,使界面简洁明了。
getch()//键盘任意输入
system(“CLS”)//清屏
如下为完整程序:
#include"iostream.h"
#include"string.h"
#include"iomanip"
#include"stdlib.h"
#include"stdio.h"
#include"conio.h"
#include"iomanip.h"
struct ben//定义结构
{
char name[20];
char address[80];
char num[20];
char you[10];
char fen[10];
struct ben *next;
};
struct ben *head=NULL;//定义全局变量
char *lei[20];
int i(0);
void csh()
{
for(int i=0;i<20;i++)
lei[i]=NULL;
}
void menu();
void duru()//读入数据
{
system("CLS");
FILE *fp;
if((fp=fopen("txl.txt","r+"))==NULL)
{
cout<<"can't open file";
exit(1);
}
head=new ben;
struct ben *newben;
struct ben *tail;
tail=head;
while(!feof(fp))
{
newben=new ben;
fread(newben,sizeof(ben),1,fp);
tail->next=newben;
tail=newben;
}
tail->next=NULL;
cout<<"读取文件成功"<<endl;
fclose(fp);
cout<<"返回主菜单请安任意键"<<endl;
getch();
menu();
}
void baocun()//保存数据
{
system("CLS");
FILE *fp;
if((fp=fopen("txl.txt","r+"))==NULL)
{
cout<<"can't open file";
exit(1);
}
if(head==NULL)
cout<<"内容空,无需保存"<<endl;
else
{
struct ben*p=head->next;
while(p!=NULL)
{
fwrite(p,sizeof(ben),1,fp);
p=p->next;
}
cout<<"保存成功"<<endl;
}
cout<<"返回主菜单请安任意键"<<endl;
getch();
menu();
}
void tianjia()//添加联系人
{
char n;
do
{
system("CLS");
struct ben *newben;
newben=new ben;
strcpy(newben->fen,"wu");
cout<<"请输入姓名"<<endl;
cin>>newben->name;
cout<<"请输入地址"<<endl;
cin>>newben->address;
cout<<"请输入电话号码"<<endl;
cin>>newben->num;
cout<<"请输入邮政编码"<<endl;
cin>>newben->you;
if(head==NULL)
{
head=new ben;
head->next=newben;
newben->next=NULL;
}
else
{
newben->next=head->next;
head->next=newben;
}
cout<<"添加完成,若想继续添加请按1,返回主菜单请按任意键"<<endl;
n='0';
cin>>n;
}while(n=='1');
system("CLS");
menu();
}
void print()//输出通讯录列表
{
system("CLS");
struct ben *p=head;
if(head==NULL)
{
cout<<"联系人为空,回到主页请按任意键"<<endl;
getch();
menu();
}
else
{
p=p->next;
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<endl;
p=p->next;
}
cout<<"输出完毕,返回主菜单请按任意键"<<endl;
getch();
menu();
}
}
void change()//修改联系人信息
{
system("CLS");
if(head==NULL)
{
cout<<"联系人为空,回到主页请按任意键"<<endl;
getch();
menu();
}
else
{
struct ben *p=head->next;
cout<<"请输入修改人的姓名"<<endl;
char name1[20];
cin>>name1;
while(p!=NULL&&strcmp(name1,p->name))
p=p->next;
if(p!=NULL)
{
cout<<"进行修改"<<endl;
cout<<"请输入地址"<<endl;
cin>>p->address;
cout<<"请输入电话号码"<<endl;
cin>>p->num;
cout<<"请输入政编码"<<endl;
cin>>p->you;
cout<<"修改成功"<<endl;
cout<<"返回主菜单请按任意键"<<endl;
getch();
menu();
}
else
{
cout<<"不存在此人,返回主菜单请按任意键"<<endl;
getch();
menu();
}
}
}
void cz()//创建类
{
system("CLS");
char j;
if(head==NULL)
{
cout<<"联系人为空,回到主页请按任意键"<<endl;
getch();
menu();
}
else
{
cout<<"请输入您要创建的新组"<<endl;
char s[10];
cin>>s;
lei[i]=new char[10];
strcpy(lei[i],s);
i++;
do
{
system("CLS");
cout<<"请选择要您要添加入该类的人(输入人名)"<<endl;
struct ben *p=head->next;
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<setw(10)<<"分类"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<setw(10)<<p->fen<<endl;
p=p->next;
}
p=head->next;
char name2[20];
cin>>name2;
while(p!=NULL&&strcmp(name2,p->name)!=0)
p=p->next;
if(p!=NULL)
{
strcpy(p->fen,s);
cout<<"已成功将"<<p->name<<"添加入"<<s<<"中"<<endl;
}
else
cout<<"不存在这个人"<<endl;
cout<<"继续添加请按1.后退请按2.返回主菜单请按其它键."<<endl;
cin>>j;
}while(j=='1');
if(j=='2')cz();
else
{
menu();
}
}
}
void zt()//在类中添加联系人
{
system("CLS");
int x(0);
for(x=0;x<20;x++)
{
if(lei[x]==NULL)break;
}
if(x==0)
{
cout<<"木有类,返回添加类请按任意键"<<endl;
getch();
cz();
}
char d;
do
{system("CLS");
d=0;
for(int j=0;j<x;j++)
cout<<j+1<<" : "<<lei[j]<<" ";
cout<<"请选择添加的组"<<endl;
int k;
cin>>k;
cout<<"您要添加的组为"<<lei[k-1]<<endl;
cout<<"情输入您要添加的人"<<endl;
struct ben *p=head->next;
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<setw(10)<<"分类"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<setw(10)<<p->fen<<endl;
p=p->next;
}
p=head->next;
char name2[20];
cin>>name2;
while(p!=NULL&&strcmp(name2,p->name)!=0)
p=p->next;
if(p!=NULL)
{
strcpy(p->fen,lei[k-1]);
cout<<"已成功将"<<p->name<<"添加入"<<lei[k-1]<<"中"<<endl;
}
else
cout<<"不存在这个人"<<endl;
cout<<"继续添加请按1.返回主菜单请按其他它键."<<endl;
cin>>d;
}while(d=='1');
menu();
}
void lx()//分类显示
{
system("CLS");
if(head==NULL)
{cout<<"通讯录为空,返回主菜单请按任意键"<<endl;
getch();
menu();
}
int x(0);
for(x=0;x<20;x++)
{
if(lei[x]==NULL)break;
}
if(x==0)
{
cout<<"木有类,返回主菜单请按任意键"<<endl;
getch();
menu();
}
else
{
for(int m=0;m<x;m++)
{
struct ben *p=head->next;
cout<<lei[m]<<endl;
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<endl;
while(p!=NULL)
{
if(strcmp(p->fen,lei[m])==0)
{
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<endl;
}
p=p->next;
}
cout<<endl;
}
cout<<"返回主菜单请任意键"<<endl;
getch();
menu();
}
}
void fenlei()//分类显示总表
{
system("CLS");
cout<<"1.创建新组"<<endl;
cout<<"2.分组添加"<<endl;
cout<<"3.分类显示"<<endl;
cout<<"4.返回主菜单"<<endl;
char c;
cin>>c;
switch (c)
{
case '1':csh();cz();
break;
case '2':zt();
break;
case '3':lx();
break;
case '4':menu();
default:cout<<"wrong";
}
}
void shanchu()//删除联系人
{
if(head==NULL)cout<<"通讯录为空"<<endl;
else
{
char k='0';
do
{
system("CLS");
cout<<"请选择要您要删除的人(输入人名)"<<endl;
struct ben *p=head->next,*q;
q=head;
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<endl;
p=p->next;
}
p=head->next;
char name2[20];
cin>>name2;
while(strcmp(p->name,name2)!=0&&p!=NULL)
{
p=p->next;
q=p;
}
if(p!=NULL)
{
q->next=p->next;
delete(p);
}
else
cout<<"木有这个人"<<endl;
cout<<"继续删除请按1.回到主菜单请按其它键"<<endl;
cin>>k;
}while(k=='1');
getch();
menu();
}
}
void search()//查询联系人
{
char n;
do
{
system("CLS");
cout<<"请输入查询人的姓名"<<endl;
char name1[20];
struct ben *p=head;
if(p==NULL)
{
cout<<"联系人为空,回到主页请按任意键"<<endl;
getch();
menu();
}
else
p=p->next;
cin>>name1;
while(p!=NULL&&strcmp(p->name,name1)!=0)
{
p=p->next;
}
if(p!=NULL)
{
cout<<"姓名"<<setw(10)<<"地址"<<setw(10)<<"电话号码"<<setw(10)<<"邮政编码"<<endl;
cout<<p->name<<setw(10)<<p->address<<setw(10)<<p->num<<setw(10)<<p->you<<endl;
}
else
cout<<"木有此人"<<endl;
cout<<"继续查询请按1,回到主页面请按任意键";
n='0';
cin>>n;
}while(n=='1');
system("CLS");
menu();
}
void menu()//主菜单
{
system("CLS");
cout<<" 欢迎使用通讯录系统"<<endl;
cout<<"1.添加联系人"<<endl;
cout<<"2.显示联系人信息"<<endl;
cout<<"3.查询联系人"<<endl;
cout<<"4.修改联系人信息"<<endl;
cout<<"5.分组并显示"<<endl;
cout<<"6.载入数据"<<endl;
cout<<"7.保存电话本"<<endl;
cout<<"8.删除联系人"<<endl;
cout<<"9.退出"<<endl;
char choose;
do{
cin>>choose;
switch(choose)
{
case '1':tianjia();
break;
case '2':print();
break;
case '3':search();
break;
case '4':change();
break;
case '5':fenlei();
break;
case '6':duru();
break;
case '7':baocun();
break;
case '8':shanchu();
break;
case '9':exit(1);
break;
default:cout<<"请输入正确数字"<<endl;
}
}while(choose!='8');
}
void main()//主函数
{
menu();
}
四. 调试分析过程描述
1、 本程序采用结构链表类型结合功能函数的方式运行,代码简单易懂。
2、 本程序中大量调用menu()函数,简便了函数。
3、 system("cls")这个功能是我自己从网上学到的,其作用是“清屏”,即可以避免内容冗长的现象,使每次执行功能时界面干净明了。
4、 程序的小问题:当页面显示按任意键返回主菜单时,若定义的变量为int,则会陷入死循环,应定义为char。
五. 课程设计小结
通过本次C++大作业的设计与编写,让我基本掌握了结构类型、函数、条件语句等内容的用法,学会了编写一些较为简易的管理系统。C++其实还包括很多比较精深的内容,但即使只是掌握了一些较为基础的技能,就能编出工资管理系统这种比较成熟的管理系统,可见C++在人们日常的应用中扮演着十分重要的作用。因此以此次大作业为契机,我决定好好巩固自己所学过的一切C++的重要知识,并在条件允许的条件下继续深入学习,了解这个神奇且强大的C++世界!
展开阅读全文