资源描述
程序设计报告
( 2008/ 2009 学年 第 二 学期)
题 目:手机信息管理系统
专 业 微电子
学 生 姓 名
班 级 学 号 B08040122
指 导 教 师 吴敏
指 导 单 位 计算机学院软件基础教学中心
日 期 2008.6.04
评 分 细 则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简 短 评 语
教师签名:
年 月 日
评分等级
备注
评分等级有五种:优秀、良好、中等、及格、不及格
手机信息管理系统
一、 课题内容和要求
手机信息管理系统是手机通讯的重要功能模块,主要负责对通讯录的录入,修改,删除,查找等功能。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用,实现一个简单的手机管理系统。
二、 需求分析
通讯录包括:
(1) 通讯录中的每一条信息包括:姓名、电话号码、分类(可能选项有:A为办公类 B为个人类 C为商务类)、电子邮件。
(2) 通话情况的每一条信息包括:来电号码、去电号码、通话分类(可能选项有:A为已拨、B为已接、C为未接)、来去电时刻、通话时间(调用时间函数)
(3) 将通讯录和通话情况分别用两个文件存储,文件类型可以是文本文件或是二进制文件。
功能需求:
1) 提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的通讯录信息和若干个可选的功能选项。根据输入的选项来运行不同的功能,运行不同的函数。
2) 进行文本信息的载入与输出:将信息录入指定的文件实现添加等功能,再从指定的文件中加载通讯录信息实现数据输出。
3) 查找通讯信息:可以通过查找姓名,通话记录等等进行查找对应的通讯录信息并将它们输出。
4) 添加通讯录:将希望添加的通讯信息添加到通讯录,注意利用文件进行添加。
5) 删除通讯录:将希望删除的某个通讯信息删除。会有菜单选项提示,主要也是文件方面的读取并作出处理。
6) 修改通讯录:输入修改的对象,到文件中查找,由一系列读写函数实现修改过程。
7) 对现有信息的保存:利用文件把信息保存到文本文档,可对其进行调用,修改等过程。
三、概要设计
(1)主要结构体:
void menu(); //主菜单的实现函数
void menu_1();
void menu_1_2();
void menu_2();
void datein(); //对数据的处理函数
void dateout();
void rewrite();
void deletedate();
class Calldate; //通话类结构
class Peopledate //通讯录结构
{
char name[10]; //姓名
char num[20]; //号码
char type; //所属类别
char email[20]; //邮箱
}
(2)主要流程图
菜单函数:
开始
输入各菜单函数
根据选项
相应操作
结束
其间用到指针分配内存,文件的读取,循环的算法。
四、源程序代码
#include "iostream.h"
#include "string.h"
#include "fstream.h"
#include "windows.h"
#include "conio.h"
void menu(); //菜单的目录实现函数
void menu_1();
void menu_1_2();
void menu_2();
int check(char*,char*); //通过指针进行检查
void datein(); //输入数据
void dateout(); //输出数据
void rewrite(); //修改数据
void deletedate(); //删除数据
class Calldate; //定义通话类
class Peopledate //用类实现对通讯录某个体的信息录入
{
char name[10];
char num[20];
char type;
char email[20];
public:
Peopledate(char na[10]="",char nu[20]="",char t='A',char em[20]="")
{
strcpy(name,na);
strcpy(num,nu);
type=t;
strcpy(email,em);
}
char *Getnum(){return num;};
char *Getname(){return name;};
char Gettype(){return type;};
friend istream & operator>>(istream &,Peopledate &);
friend ostream & operator<<(ostream &,const Peopledate &);
friend void rewrite();
};
ostream & operator<<(ostream &out,const Peopledate & obj) //重载函数输出信息
{
if(obj.type=='A')
out<<"姓名:"<<obj.name<<endl<<"号码:"<<obj.num<<endl<<"邮箱:"<<obj.email <<endl
<<"类别:"<<"办公类"<<endl;
else if(obj.type=='B')
out<<"姓名:"<<obj.name<<endl<<"号码:"<<obj.num<<endl<<"邮箱:"<<obj.email <<endl
<<"类别:"<<"个人类"<<endl;
else if(obj.type=='C')
out<<"姓名:"<<obj.name<<endl<<"号码:"<<obj.num<<endl<<"邮箱:"<<obj.email <<endl
<<"类别:"<<"商务类"<<endl;
else
out<<"姓名:"<<obj.name<<endl<<"号码:"<<obj.num<<endl<<"邮箱:"<<obj.email <<endl
<<"类别:"<<"不明"<<endl;
return out;
}
istream & operator>>(istream & in,Peopledate & obj) //重载函数
{
cout<<"请依次输入:姓名,号码,类别,邮箱。"<<endl;
cout<<"姓名:";
in>>obj.name;
cout<<"号码:";
in>>obj.num;
cout<<"类别:";
in>>obj.type;
cout<<"邮箱:";
in>>obj.email;
return in;
}
class Calldate //定义通话类,用于记录通话的详细内容。
{ //函数体内由指针,文件,重载实现
int calltype;
char num[20];
int timecost;
int time_h;
int time_m;
int time_s;
char type;
public:
Calldate(int ct=0,char nu[20]="",int s=0,int th=0,int tm=0,int ts=0,char ty='A')
{
calltype=ct;
strcpy(num,nu);
timecost=s;
time_h=th;
time_m=tm;
time_s=ts;
type=ty;
}
friend ostream & operator<<(ostream &,const Calldate &);
};
ostream & operator<<(ostream &out,const Calldate & obj)
{
int f=0;
if(obj.calltype==1)
out<<"去电 "<<endl;
else if(obj.calltype==2)
out<<"来电 "<<endl;
int i=0;
Peopledate *date=new Peopledate[1000]; //用指针存放信息
ifstream inf("people.dat"); //打开文件
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Peopledate));
inf.close();
for(int j=0;j<i-1;j++)
{
if(strcmp(obj.num,date[j].Getnum())==0)
{
out<<date[j].Getname()<<endl;
f=1;
}
}
if(f==0)
out<<obj.num<<endl;
out<<"通话开始时间:"<<obj.time_h<<"点"<<obj.time_m<<"分"<<obj.time_s<<"秒"<<endl;
out<<"通话持续时间:"<<obj.timecost<<"秒"<<endl;
if(obj.type=='A')
out<<"已拨"<<endl;
else if(obj.type=='B')
out<<"已接"<<endl;
else if(obj.type=='C')
out<<"未接"<<endl;
else
out<<"不明"<<endl;
return out;
}
void main()
{
int choice;
menu();
cin>>choice;
while(choice!=5)
{
switch(choice)
{
case 1:
dateout();
break;
case 2:
datein();
break;
case 3:
rewrite();
break;
case 4:
deletedate();
break;
}
menu();
cin>>choice;
}
}
void menu() //显示通讯录菜单
{
cout<<" 1.查看通讯录 "<<endl;
cout<<" 2.添加通讯录 "<<endl;
cout<<" 3.修改通讯录 "<<endl;
cout<<" 4.删除通讯录 "<<endl;
cout<<" 5.退出信息管理系统 "<<endl;
}
void menu_1()
{
cout<<" 1.查看某类全部信息 "<<endl;
cout<<" 2.查看某人全部信息 "<<endl;
cout<<" 3.查看通讯记录 "<<endl;
cout<<" 4.返回上级菜单 "<<endl;
}
void menu_1_2()
{
cout<<" 1.查看办公类信息 "<<endl;
cout<<" 2.查看个人类信息 "<<endl;
cout<<" 3.查看商务类信息 "<<endl;
cout<<" 4.返回上级菜单 "<<endl;}
void menu_2()
{
cout<<" 1.输入联系人 "<<endl;
cout<<" 2.输入通话记录 "<<endl;
cout<<" 3.返回上级菜单 "<<endl;
}
void dateout() //数据输出
{
int choice1;
menu_1();
cin>>choice1;
if(choice1==1)
{
int choice12;
menu_1_2();
cin>>choice12;
if(choice12==1)
{
int i=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Peopledate));
for(int j=0;j<i-1;j++)
{
if(date[j].Gettype()=='A')
cout<<date[j]<<endl;
}
inf.close();
}
else if(choice12==2)
{
int i=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Peopledate));
for(int j=0;j<i-1;j++)
{
if(date[j].Gettype()=='B')
cout<<date[j]<<endl;
}
inf.close();
}
else if(choice12==1)
{
int i=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Peopledate));
for(int j=0;j<i-1;j++)
{
if(date[j].Gettype()=='C')
cout<<date[j]<<endl;
}
inf.close();
}
else
return;
}
else if(choice1==2)
{
char na[10];
cout<<"输入要查找的姓名:";
cin>>na;
int i=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Peopledate));
for(int j=0;j<i-1;j++)
{
if(strcmp(date[j].Getname(),na)==0)
cout<<date[j]<<endl;
}
inf.close();
}
else if(choice1==3)
{
int i=0;
Calldate *date=new Calldate[1000];
ifstream inf("call.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[i++],sizeof(Calldate));
for(int j=0;j<i-1;j++)
cout<<date[j]<<endl;
inf.close();
}
else
return;
}
void datein() //输入数据
{
menu_2();
int choice2;
cin>>choice2;
int i,n;
cout<<"请输入信息条数:";
cin>>n;
if(choice2==1)
{
int j=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[j++],sizeof(Peopledate));
if(j+n>=15) //这里j用于记忆,对于再次添加数据会考虑原有数据的数量。
cout<<"内存已满,不得超过15条"<<endl;
else
{
ofstream ifile("people.dat",ios::ate);
if(!ifile)
{
cout<<"通讯记录文件无法查询"<<endl;
return;
}
for(i=0;i<n;i++)
{
int flag=0;
Peopledate *p=new Peopledate[1];
cin>>p[0];
for(int t=0;t<j;t++)
{
if(strcmp(p[0].Getname(),date[t].Getname ())!=0)
{
flag=1;
break;
}
}
if(flag==1)
ifile.write((char*)p,sizeof(Peopledate));
else
cout<<"已存在"<<endl;
}
ifile.close();
}
}
else if(choice2==2)
{
Calldate *p=new Calldate[n];
ofstream ifile("call.dat",ios::ate);
if(!ifile)
{
cout<<"无通讯记录文件"<<endl;
return;
}
for(i=0;i<n;i++)
{
int cty;
char num[20];
SYSTEMTIME t1,t2;
int s;
char ty;
cout<<"选择通话类型(来电为1,去电为2)"<<endl;
cin>>cty;
cout<<"请输入电话号码:"<<endl;
cin>>num;
cout<<"现在按任意键开始通话,再按任意键结束通话"<<endl;
cout<<"按任意键开始通话";
getch();
GetLocalTime(&t1);
cout<<endl<<"按任意键结束通话";
getch();
GetLocalTime(&t2);
s=(t2.wMinute-t1.wMinute)*60;
s+=t2.wSecond-t1.wSecond;
cout<<"选择通话类型(选项:A已拨、B已接、C未接)"<<endl;
cin>>ty;
Calldate q(cty,num,s,t1.wHour,t1.wMinute,t1.wSecond,ty);
p[i]=q;
}
ifile.write((char*)p,sizeof(Calldate)*n);
ifile.close();
}
else
return;
}
void rewrite() //修改数据信息
{
char na[10];
cout<<"输入被修改人姓名:";
cin>>na;
int j=0;
Peopledate *date=new Peopledate[1000];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[j++],sizeof(Peopledate));
for(int i=0;i<j;i++)
if(strcmp(date[i].Getname(),na)==0)
{
Peopledate newdate;
cout<<"输入被修改人信息:"<<endl;
cin>>newdate;
date[i]=newdate;
}
ofstream ifile("people.dat");
if(!ifile)
{
cout<<"通讯记录文件无法查询"<<endl;
return;
}
ifile.write((char*)date,sizeof(Peopledate)*j);
ifile.close();
}
void deletedate() //删除数据信息
{
int m=0;
char na[10];
cout<<"输入被删除人姓名:";
cin>>na;
int j=0;
Peopledate *date=new Peopledate[1000];
Peopledate *date1=new Peopledate[100];
ifstream inf("people.dat");
if(!inf)
{
cout<<"联系人信息文件无法查询"<<endl;
return;
}
while(!inf.eof())
inf.read((char*)&date[j++],sizeof(Peopledate));
for(int i=0;i<j;i++)
{
if(strcmp(date[i].Getname(),na)==0)
m++;
date1[i]=date[i+m];
}
ofstream ifile("people.dat");
if(!ifile)
{
cout<<"通讯记录文件无法查询"<<endl;
return;
}
ifile.write((char*)date1,sizeof(Peopledate)*j);
ifile.close();
}
五、测试数据及其结果分析
************************************************
1.查看通讯录信息
2.添加通讯录信息
3.修改通讯录信息
4.删除通讯录信息
5.退出信息管理系统
************************************************;
}
根据菜单显示,查看选1
************************************************
1.查看某类全部信息
2.查看某人全部信息
3.查看通讯记录
4.返回上级菜单
***********************************************
选择1
********************************************
1.查看办公类信息
2.查看个人类信息
3.查看商务类信息
4.返回上级菜单
*******************************************
由于未添加下的操作,系统会跳到主菜单页面;
选择2添加信息:
***********************************************
1.输入联系人信息
2.输入通话记录信息
3.返回上级菜单
**********************************************
输入1:
请输入信息条数:1
请依次输入姓名,号码,类别,邮箱。
姓名:zhou
号码:1519
类别:A
邮箱:123
输入2(输入通话记录信息):
请输入信息条数:1
选择通话类型(来电选1,去电选2)
1
请输入电话号码:
1519
现在按任意键开始通话,再按任意键开始结束通话
按任意键开始通话
选择通话类型(可能选项有:A为已拨、B为已接、C为未接)
A
选择3修该通讯录信息:
请输入被修改人的姓名:zhou
请输入被修改人的全部信息:
请依次输入姓名,号码,类别,邮箱。
姓名:zhou
号码:1519
类别:A
邮箱:1234
选择4删除通讯录信息与修改类似。
按5退出系统!!
注:当备份文件时,如文件事先未建立,系统将自行建立。如许建立的文件为TXT文件,则需要在输入时在文件名后加.txt。
六、调试过程中的问题
(1)对于指针数组和文件的搭配使用经常会出错,在编程的过程中经常会有文件读取造成问题。
(2)程序上安排菜单的排列与连接问题也是很烦琐的,需要耐心仔细。
(3)函数很多,程序相对我们的能力而言比较复杂。
(4)在数据的输入与输出过程,有些关于文件的循环问题容易出错。
七、课程设计总结
经过这次程序设计,在实践中掌握了函数的调用,文件输入输出的方法最重要的是体会了程序设计需要的严密性和耐心,只有严密的分析思考,需找合适的算法,适当的应用函数,才能使程序简洁高效;只有认真的不断调试,才能让程序完美。适当的美化函数界面,也会让自己做的函数更加亲易近人。
这次程序设计完整地让我们体验了程序设计的过程,从分析,计划流程,定义结构体或者类,思索相应算法,写子函数,文件与指针的使用,调试函数功能,改进算法,美化程序等等。在实践中掌握了c/c++的编程方法,使得对c/c++语言有更多地了解。
实验报告的书写让我们实习了工程完成后的收尾总结工作,条理美观的实验报告是以后我们工作上各种报告的预备,程序设计提高了我们实践能力,独立工作能力,十分有意义。希望以后更多的大型作业让我们获得更多的提高。
-
展开阅读全文