计算机学院计算机科学与技术专业《程序设计综合课程设计》报告(2010/2011学年第一学期)学生姓名:学生班级:学生学号:指导教师:2011年1月7日小区楼盘销售管理程序目录一、课程设计目的和要求 (1)二、课程设计任务内容 (2)1、课程设计内容: (2)2、设计内容分析 (2)三、详细设计说明 (3)1、函数功能说明、参数说明及函数流程图 (3)(1)、int main() (3)(2)、void input(residence *); (5)(3)、void del(residence *); (7)(4)、void amend(residence *); (9)(5)、void display(residence *); (11)(6)、void seek(residence *); (12)2、编码 (14)3、测试 (14)四、软件使用说明 (20)五、课程设计心得与体会 (21)附录1:参考文献 (22)附录2:程序清单 (22)一、课程设计目的和要求(1)巩固和加深学生对C++课程的基本知识的理解和掌握,通过这次课程设计,使学生从整体上把握一个学期以来所学的C++程序设计的内容,各种程序设计思路进行贯通,从而熟练掌握。
(2)掌握C++编程和程序调试的基本技能。
C++编程和程序调试是软件设计的重中之重,这两个部分占据了整个程序设计的80%以上的时间。
掌握C++编程和调试,是极其重要的。
(3)利用C++进行简单软件设计的基本思路和方法。
今天我们的程序设计只是一个很小很小的方面而已,从这次课程设计中,我们应该对软件设计有所认识,并且在今后的学习中要为此做出充分的准备。
(4)提高运用C++解决实际问题的能力。
任何知识的学习的最终目的都是解决实际问题。
C++编程在解决实际问题上具有很大的作用。
二、课程设计任务内容1、课程设计内容:小区楼盘销售管理程序要用结构体数组/链表实现,用结构体表示每项记录,包含楼盘数据为:楼编号、单元号、房间号、朝向(如:南北、东西、东南等)、户型、平米单价、建筑面积、总价,售出状态,业务员等,其中总价=单价X 建筑面积。
设计各个函数,分别实现以下功能:(1)录入:实现每套房源信息的输入,最好是追加方式;(2)删除:完成房源信息的删除;(3)修改:允许对已经录入的数据重新进行编辑、修改;(4)显示:显示所有房源信息;(5)查询:a) 输入朝向、户型等数据,显示符合该条件的所有记录,最好做到条件动态添加;b)建筑面积范围,显示符合该条件的所有记录;c) 显示所有未售出房源情况;d)查询已售出房源的业务员姓名,成交额及总额(6)退出程序。
设计菜单,通过选择菜单调用以上各函数。
要求:1)用C语言实现系统;2)函数功能要划分好(结构化程序设计);3)界面友好(良好的人机交互),加必要的注释;4)提供程序测试方案。
2、设计内容分析输入项:楼编号、单元号、房间号、朝向(如:南北、东西、东南等)、户型、平米单价、建筑面积、总价,售出状态,业务员等,其中总价=单价X 建筑面积。
程序中也会有一些其他的循环条件输入。
输出项:小区楼盘房源的相关信息,也就是输入项的用户所需数据。
程序功能的实现:程序设计到数据的动态添加、删除、修改、和查询,应使用链表进行存储较为方便。
而且应使用一个结构体来对应相应的房间,存储其相关信息。
在使用链表上,很多地功能的实现都变得很简单了,条件查找上因该会比较麻烦,应多加考虑。
三、详细设计说明1、函数功能说明、参数说明及函数流程图整个程序共包含6个函数:void input(residence *);// 输入函数void del(residence *);// 删除函数void amend(residence *);// 修改函数void display(residence *);// 显示所有信息void seek(residence *); // 条件查找函数int main(); //主函数程序中使用了一个结构体,用于存储套房间的相应信息:struct residence{int lou,danyuan,fangjian; //楼号/单元号/房间号string chaoxiang,huxing; //朝向/户型float danjia,mianji,zongjia; //平米单价/面积/总价string zhuangtai,renyuan; //售出状态(yes/no)/销售人员(没有的话为no,有的话输入相应的名字)residence *next; //指针用来指向链表的下一个结点};(1)、int main()函数功能说明:主函数,主要是实现两个功能:一是程序开始运行时的文件数据载入,二是显示主菜单文件载入时先判断文件是否存在,如果不存在,使用outf.open("data.txt",ios::out);进行新建;如果存在,从中读取数据并存入链表中。
主菜单放在一个while循环中,通过swicth进行选择相应选项。
函数参数说明:int i; 用于菜单选择,不同的值对应不同的菜单Int a; 用于记录载入的数据个数Residence *head,*p1,*p2; 用于链表的创建,head是链表的头结点,p1,p2都是创建链表是的中间变量,起辅助传递作用。
函数流程图:图2-1(1)图2-1(2)(2)、void input(residence *);函数功能说明:输入数据并保存于文件中。
输入分成了二次,第一次是楼号、单元号、房间号、平米单价、建筑面积这5个信息;第二次是朝向、户型、售出状态(yes/no)、业务员(no/业务员姓名)共4个信息;总价这一信息使用p1->zongjia=p1->danjia*p1->mianji;来计算,减少用户的工作量。
保存数据上,用户每输入完一个房源信息就存储一个,使用的是这个语句:outf<<p1->lou<<" "<<p1->danyuan<<" "<<p1->fangjian<<" "<<p1->danjia<<" "<<p1->mianji<<" "<<" "<<p1->zongjia;outf<<" "<<p1->chaoxiang<<" "<<p1->huxing<<" "<<p1->zhuangtai<<" "<<p1->renyuan<<endl;函数参数说明:residence *head1:存储原链表的头指针residence *p1,*p2,*head; p1,p2为中间指针变量,head用于存储原指的尾结点函数流程图:图2-2(3)、void del(residence *);函数功能说明:删除数据,并将删除后的数据保存在文件中将楼号、单元号。
房间号等信息存储在l、d、f三个变量中,在对查看每个节点时,if(p1->lou==l&&p1->danyuan==d&&p1->fangjian==f)进行判断。
并且,通过判断i是否为零确定删除的数据的个数,如果i为零,提示没有改套房间。
数据保存与输入部分是一样的。
函数参数说明:residence *head1:存储原链表的头指针int l,d,f,n,i; l、d、f分别用于存储需要查询的房间的楼号、单元号、房间号;n用来判断是否结束修改操作返回主菜单;i用来判断是否删除成功。
residence *p1,*p2;中间的指针变量函数流程图:(4)、void amend(residence *);函数功能说明:修改数据,并将修改保存在文件中查找房间所在链表的位置与删除函数是一样的。
提示用户是按相应键以做相应修改,并且可以循环修改:cout<<"相应按键为:楼号1, 单元号2, 房间号3, 平米单价4, 建筑面积5,, 朝向6, 户型7, 售出状态8, 业务员9,退出0"<<endl;当用户按0想要结束修改时,程序退出修改模块,进入存储模块,存储完毕提示cout<<"修改已保存"<<endl;并返回主菜单。
函数参数说明:residence *head1:存储原链表的头指针int l,d,f,n,i; l、d、f分别用于存储需要查询的房间的楼号单元号、房间号;n用来判断是否结束修改操作返回主菜单;i用于判断是否删除成功。
residence *p1,*p2; residence *p1,*p2;中间的指针变量函数流程图:图2-4函数功能说明:查看所有房源信息,以列表的方式显示函数参数说明:residence *head1:存储原链表的头指针residence *p1;中间指针变量函数流程图:图2-5函数功能说明:条件查询实现的原理:将原链表进行复制,查询的时候对复制链表进行查找,并把不符合条件的节点删除,这样一来剩下的就都是符合条件的节点;如果再次添加条件进行查找,仍旧执行这个操作,从而达到条件查询的目的。
其中,使用while(1)进行循环,if语句判断选择的是何种操作。
函数参数说明:residence *head2;存储原链表的头指针int t; 用于选择查找条件string s;;存储提供的查询信息:朝向,户型,float m1,m2,q=0; m1,m2分别存储面积范围的左右边界,用于计算已售房源的总金额residence *p1,*p2,*p3,*p4,*head; 除head存储新复制链表的头结点外,其他都是中间指针变量。
函数流程图:图2-62、编码ASCII。
数据也是存储在ASCII文件中,文件名为:data.txt;可以随时查看数据。
3、测试初始界面:图3-1输入数据:图3-2输入完成后重新打开程序:图3-3 显示所有数据:图3-4删除数据:图3-5图3-6 修改数据:图3-7图3-8 查询数据:图3-9追加条件:图3-10程序的存在一个bug,按户型查询后,程序不能进入菜单,而是卡死。
由于5个if 语句中的循环代码是完全一样的,为什么在按户型查询时就出问题,有待解决。