文档库 最新最全的文档下载
当前位置:文档库 › c++实验报告

c++实验报告

实验名称: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).尝试去对页面的美观性进行设计。

相关文档