实验名称:C++综合与文件操作
姓名:靳成学号:2014301220004 班级:光电(1)班指导老师:赵小红提交日期:2014.05.02
一、实验目的
综合利用前面所学的知识,学习设计并编写面向对象的C++简单应用程序。帮助进一步理解类的抽象、封装、继承和多态性,练习用面向对象程序设计思想解决编程问题。练习使用IO流的方式读写文件,练习用面向对象程序设计思想解决编程问题。
熟练掌握调试工具。
二、实验内容
题目:通信录管理系统
1、题目内容描述:
用C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理,按照姓氏拼音排序。通信名单和信息的文件存储/读取和修改。
A、功能要求
⑴查看功能:选择此功能时,列出下列三类选择:①办公类;②个人类;③商务类。当选中某类时,显示出此类所有数据中的姓名和电话号码。
⑵增加功能:能录入新数据。一个结点包括:姓名、电话号码、分类(可选项有:①办公类;②个人类;③商务类)、电子邮件。
例如:杨春135******** 商务类chuny@https://www.wendangku.net/doc/b014898535.html,
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15 条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
⑶修改功能:选中某个人的姓名时,可对此人的相应数据进行修改
⑷删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
(5)排序功能:按照姓氏拼音顺序排序。
(6) 文件保存和打开读取功能。
B、其它要求:
⑴源程序要有适当的注释,使程序容易阅读; ⑵学生可自动增加新功能模块(视情况可另外加分); ⑶写出课程设计报告。
2、 功能模块图:
A 、类的结构:
类名 CBook
类成员变量 类成员函数
姓名 m_name 电话 phone 姓名首字母 m_word 类型 m_type 邮箱 m_email 联系人人数 m_num 添加 Add () 修改 Alter () 删除 Delete () 排序 Order () 查看 Show () 保存 Save () 菜单 run () 显示 Allshow ()
B、流程:
开始
文件读取
选1
选2
选3
选4
选5
选6 退出程序结束查询添加修改删除排序
选择操作
保存
3、类的设计描述:
本程序在函数设计方面相对比较特点明显,为了可以直观的去读该程序,并且为使程序编写结构清楚,程序语言更有条有理,我选择了将所有函数和变量都设计在类里面,然后在类里实现函数,在主程序中来调用类中的各成员函数,从而建立各函数的关系,并整合各函数的调用进而达到该程序设计要达到的目的。
为避免程序编写时因考虑到运用字符数组时出现的语言复杂的情况,我在查阅资料后决定选择将类中的各变量设计为string类型,这样就避免了在程序编写时代码复杂。
在类的成员函数中我选择了遵循变动即存储的原则,来保证每次有新的数据信息时都可以留下来,例如在调用修改函数(Alter)、添加函数(Add)以及删除函数(Delete)和排序函数(Order)后立即接着调用储存函数(Save),以便存储完立即提取到内存,目的是防止信息意外丢失或信息产生混乱等情况的发生。
本程序中类的设计共使用了6个成员变量,8个成员函数,均为public型。在各成员函数中都有对其他不同功能的函数的调用,在执行完相应的功能后调用菜单函数(run)以返回主菜单。菜单函数(run)在运行时会将通讯录的操作信息展示给用户,然后用户可按照信息提示进行不同功能的选择,在选择不同功能时调用不同函数来完成对该功能的实现。其中让用户选择输入1到6的六的数字来调用不同的功能函数,以完成对不同功能的选择。
通过对类的整体设计,使得各成员函数在调用时会进行相应的插入调用,进而实现了各功能之间的联系。不同的功能调用不同函数来实现,使得程序运行时的错误容易找出,更加方便调试和修改。如此以来,各成员函数彼此独立,而又相互联系,最后整合在一起便完成了该程序的整体编写。
这是类设计的头文件:
class CBook
{
public:
string m_name;//使用string更方便
string phone;
char m_word;
string m_type;
string m_email;
int m_num;
void Add(int n, CBook people[]);//增加联系人函数
void Alter(int n, CBook people[]);//修改信息函数
void Delete(int n, CBook people[]);//删除联系人函数
void Order(int n, CBook people[]);//排序函数
void Show(int n, CBook people[]);//查看函数
void Save(int n, CBook people[]);//保存函数
void run(int n, CBook people[]);//显示菜单函数
void Allshow(int n, CBook people[]);//显示全部联系人
CBook();
~CBook();
};
4、程序代码:已发送至邮箱
5、程序调试:
错误序号列出你认为最重要的10 个错误信息是否
解决
解决方法
1 判断字符数组出错是使用string
2 复制字符数组出错是使用string
3 删除联系人时有信息的混乱是采用对数组角标
的操作
4 添加联系人无法实现“录入重复,并取消录入”
这一功能是采用string,直接
判断姓名和电话
是否相等
5 修改联系人时无法定位需要修改的对象是采用数组,通过判
断姓名是否相等
找到对象
6 开始时在run函数里出现了死循环是增加了第6个选
择,实现退出程序
的功能
7 在Allshow函数里错误的调用了run函数使得程
序无法进入其它功能是删除对run函数的
调用
8 在Order函数运行后排序结果混乱,且有随机数
的出现是利用数组的循环
操作,采用冒泡排
序法进行排序
9 在Show函数中出现数据遗漏的情况是检查并修改进入
循环语句的条件10 运行时主函数被强制结束是修改对各成员函
数的调用顺序
11 类中静态变量的运用出错是修改类中静态变
量,在主函数中定
义个静态变量,然
后将其值传递给
类中的变量
三、实验总结
1、问题总结
本次实验让我对C++类的设计有更大的提高,而且让我对文件的操作有一定的了解,更重要的是本次实验为我练习文件的操作提供了一个实践的机会。
本次编写的程序经过多次的修改和调试已经能实现相应的功能,并通过了测试,结果自己比较满意。虽然此次代码是独立完成,但自己在编写和调试修改程序时遇到了很多尖锐的问题。尽管问题经过询问别人和查询资料均得到解决,可还是感觉自己在有一些方面的知识理解或掌握还是不到位,比如最典型的就是文件的操作。
对于写好的程序自我感觉还有欠缺,比如没有注意对用户在输入指令错误时的处理,这使得程序智能性减弱,对于该欠缺的话应该可以通过增加程序代码进行改进。
2、经验总结
在完成这次实验后,我感觉收获很多,平时上机时,因为题形与结构都大多相似的,而且
可以在课程ppt里找到相应的例题以供参考,所以对平时的上机内容没有太大的难题,但这次不同,题目要求比较复杂加之代码量的大幅度增加,使得遇到的问题更加尖锐难解。
不过经过这么长时间的努力,我还是最终将整个程序设计完毕。从头到尾我选择独立自主,虽然很伤精力,但在程序完成是更多的是喜悦。
从这次实验中,我获得了以下几点经验:
(1).编写程序是要先做好程序结构的设计,要提前想好大致的框架,不能写一步,想一步,只有有了大致的框架后编写程序时才会高效率的进行。
(2).调试程序时要学会巧妙的设计断点,这样才能准确高效率的定位到错误。
(3). 要学会查阅资料,这是自己学习和提高最好的选择。
我在该程序设计中比较满意的是:
(1).对类的成员函数的设计:
void Add(int n, CBook people[]);//增加联系人函数
void Alter(int n, CBook people[]);//修改信息函数
void Delete(int n, CBook people[]);//删除联系人函数
void Order(int n, CBook people[]);//排序函数
void Show(int n, CBook people[]);//查看函数
void Save(int n, CBook people[]);//保存函数
void run(int n, CBook people[]);//显示菜单函数
void Allshow(int n, CBook people[]);//显示全部联系人
该类成员函数设计后,可以相互调用,是程序可读性增强而且是功能结构一目了然。
(2).冒泡排序法的使用:
int i, j,k;
CBook m;
for (i = 1; i <= n;i++)//按拼音首字母从a到z排序
for (j = i; j <= n; j++)
{
if (people[j].m_word < people[i].m_word)
{
m = people[i];
people[i] = people[j];
people[j] = m;
}
}
for (k = 1; k <= n; k++)//重新编号
{
people[k].m_num = k;
}
cout << " ---------------------------------------- \n";
cout << " 排序成功!" << endl;
cout << " ---------------------------------------- \n"; 该冒泡法的使用比选择法更简洁,减少了代码量。
(3).尝试去对页面的美观性进行设计。