小区楼盘销售管理系统C++课程设计(共38页).doc
精选优质文档-倾情为你奉上 计算机学院计算机科学与技术专业程序设计综合课程设计报告 (2010/2011学年 第一学期)学生姓名: 学生班级: 学生学号: 指导教师: 2011年1月7日专心-专注-专业小区楼盘销售管理程序目录一、课程设计目的和要求(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 residenceint 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都是创建链表是的中间变量,起辅助传递作用。函数流程图:ifstream inf("data.txt",ios:in);ofstream outf;if(inf=0)outf.open("data.txt",ios:out);a+;cout<<"数据文件不存在,将新建"<<endl;while(1)p1=new residence;YN开始图2-1(1)inf>>p1->lou>>p1->danyuan>>.break;if(inf=0)p2->next=p1;p2=p1;cout<<"共载入"<<a-1<<"个数据"<<endl<<endl;YN图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用于存储原指的尾结点函数流程图:ofstream outf("data.txt",ios:app);p1=head1;while (1)p1->next=NULLbreak;p1=p1->next;YNp2=head;n!=0p1=new residence;p2->next=p1;cin>>p1->lou>>p1->danyuan>>.outf<<p1->lou<<" "<<p1->danyuancin>>n;outf.close;图2-2图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;中间的指针变量函数流程图:p2=head;p1=head->next;1p1->lou=l&&p1->danyuan=d&&p1->fangjian=fp2->next=p1->next;delete p1;break;Yp2=p1;p1->next=NULLbreak;Yp1=p1->next;cin>>n;n!=0p1=head;1p1=p1->next;outf<<p1->lou<<" "<<p1->next=NULL<" "<<NNbreak;YN图2-3(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;中间的指针变量函数流程图:cin>>l>>d>>f;while(1)p2=head;p1=head->next;p1->lou=l&&p1->danyuan=d&&p1->fangjian=fcin>>i;switch (i)while(i!=0);YNbreak;p1->next=NULLcin>>n;n=0p1=p1->next;break;YYNN图2-4(5)、void display(residence *);函数功能说明:查看所有房源信息,以列表的方式显示函数参数说明:residence *head1:存储原链表的头指针residence *p1;中间指针变量函数流程图:p1=head->next;while(1)cout<<setw(6)<<setiosflags(ios:left)<<p1->lou;.p1->next=NULLbreak;p1=p1->next;YN图2-5(6)、void seek(residence *);函数功能说明:条件查询实现的原理:将原链表进行复制,查询的时候对复制链表进行查找,并把不符合条件的节点删除,这样一来剩下的就都是符合条件的节点;如果再次添加条件进行查找,仍旧执行这个操作,从而达到条件查询的目的。其中,使用while(1)进行循环,if语句判断选择的是何种操作。函数参数说明:residence *head2; 存储原链表的头指针int t;用于选择查找条件string s;;存储提供的查询信息:朝向,户型,float m1,m2,q=0; m1,m2分别存储面积范围的左右边界,用于计算已售房源的总金额residence *p1,*p2,*p3,*p4,*head; 除head存储新复制链表的头结点外,其他都是中间指针变量。函数流程图:head=new residence;p3=head;1p2->next=NULLp1=new residence;p3->next=p1;p3->next=p1;YNp2=p2->next;break;图2-6cin>>s;1p2=head;p1=head->next;cin>>t;t=1YN1p1->chaoxiang=scout<<setw(6)<<setiosflags(ios:left)<<p2=p1;p1=p1->next;p2->next=p1->next;delete p3;t=2cout<<"返回主菜单"NY.图2-72、编码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语句中的循环代码是完全一样的,为什么在按户型查询时就出问题,有待解决。初步确定是链表尾结点赋值NULL出错,应属于编译系统的问题。按户型 4-2查找,没问题:图3-11按户型4-1查找,出现错误:图3-12四、软件使用说明1、开始运行程序,显示主菜单。左上角会有提示,显示数据载入的相应情况。按相应数字键即可进入对应功能。2、输入数据输入分为两次,第一次包括:楼号、单元号、房间号、平米单价、建筑面积这5个信息;第二次是朝向、户型、售出状态(yes/no)、业务员(no/业务员姓名)共4个信息;第二次包括:朝向、户型、售出状态(yes/no)、业务员(no/业务员姓名)共4个信息;总价这信息程序会自行计算,用户无需输入。输入完成一次后会提示是否继续:“如果需要结束输入请按0,要继续请按1”用户输入的房源信息会与以前输入的信息放在同一个文件下,不会覆盖。数据时按时间顺序排列的。3、删除数据首先提示输入楼号、单元号、房间号,输入完成后即开始查找删除。如果没有该房源,则会有相应提示。4、修改数据进入修改后,提示按相应键可进行相应修改。用户输入需要修改的房间位置信息,之后按相应的数字即可开始修改。可以修改所以数据。5、显示所有数据显示所有数据,按任意键返回主菜单。6、条件查询提供五总查询方式:朝向(1),户型(2),建筑面积范围(3),显示所有未售出房源(4),查询已售出房源的业务员姓名、成交金额及总额(5);按相应数字进入查找。查找完成后如果想继续添加条件进行查找可继续按相应数字继续,也可按0退出返回菜单。7、退出按0即可。五、课程设计心得与体会这次课程设计让我受益匪浅。学编程这么久,还是头一次写这么大的程序。通过这个,也算体验到了程序设计的艰苦和团队合作的重要性,这也为以后做项目打了一些基础,而且积累了不少程序设计的经验呢。最后,得学习图形用户操作界面的设计了,dos界面确实不怎么好看,而且容易出现一些不必要的问题,比如多输入了一个数据该。总而言之,Still have long way to go.附录1:参考文献1、C+程序设计 钱能 清华大学出版社2、c+程序设计作者:谭浩强 出版时间2004年6月附录2:程序清单#include <iostream>#include <fstream>#include <string>#include <iomanip>using namespace std;struct residence/房源信息结构体int lou,danyuan,fangjian;string chaoxiang,huxing;float danjia,mianji,zongjia;string zhuangtai,renyuan;residence *next;int main()void input(residence *);/ok 输入函数void del(residence *);/ok 删除函数void amend(residence *);/ok 修改函数void display(residence *);/ok 显示所有信息void seek(residence *);/ok 条件查找函数/ 函数定义完毕int i;residence *head,*p1,*p2;head=new residence; head->next=NULL;/打开文件进行,从文件进行输入,进入等待状态ifstream inf("data.txt",ios:in);ofstream outf;if(inf=0)/文件不存在,新建cout<<"数据文件不存在,将新建"<<endl;inf.close; outf.open("data.txt",ios:out); outf.close;cout<<"successfull!"<<endl;else/文件存在,读取数据int a=0;p2=head;while(1)a+;/记录载入的数据的个数p1=new residence;p1->next=NULL;inf>>p1->lou>>p1->danyuan>>p1->fangjian;inf>>p1->danjia>>p1->mianji>>p1->zongjia;inf>>p1->chaoxiang>>p1->huxing>>p1->zhuangtai>>p1->renyuan;if(inf=0) break; delete p1;p2->next=p1;p2=p1;cout<<"数据载入成功!"<<endl;/文件载入完成cout<<"共载入"<<a-1<<"个数据"<<endl<<endl;while(1)/菜单cout<<" *欢迎使用小区楼盘销售管理程序* "<<endl;/菜单cout<<" + + "<<endl;cout<<" + + "<<endl;cout<<" + + "<<endl;cout<<" + >>>>要输入数据请按-1 + "<<endl; cout<<" + >>>>要删除数据请按-2 + "<<endl;cout<<" + >>>>要修改数据请按-3 + "<<endl; cout<<" + >>>>要显示数据请按-4 + "<<endl;cout<<" + >>>>要查询数据请按-5 + "<<endl; cout<<" + >>>>要退出请按-6 + "<<endl;cout<<" + + "<<endl;cout<<" + + "<<endl;cout<<" + + "<<endl;cout<<" *欢迎使用小区楼盘销售管理程序*"<<endl;cout<<endl;cin>>i;switch(i)case 1: input(head); break;case 2: del(head); break;case 3: amend(head); break;case 4: display(head); break;case 5: seek(head); break;case 6: exit(1); break;return 0;void input(residence *head1)/ofstream outf("data.txt",ios:app);/打开文件,等待数据存储residence *p1,*p2,*head;p1=head1;while (1)if(p1->next=NULL) break;p1=p1->next;head=p1;int n;p2=head;cout<<"开始输入"<<endl;dop1=new residence;p1->next=NULL;p2->next=p1;cout<<"楼号、单元号、房间号、平米单价、建筑面积这5个信息"<<endl;cin>>p1->lou>>p1->danyuan>>p1->fangjian;cin>>p1->danjia>>p1->mianji;p1->zongjia=p1->danjia*p1->mianji;cout<<"请分别输入朝向、户型、售出状态(yes/no)、业务员(no/业务员姓名)共4个信息"<<endl;cin>>p1->chaoxiang>>p1->huxing>>p1->zhuangtai>>p1->renyuan;outf<<p1->lou<<" "<<p1->danyuan<<" "<<p1->fangjian<<" "<<p1->danjia<<" "<<p1->mianji<<" "<<" "<<p1->zongjia;outf<<" "<<p1->chaoxiang<<" "<<p1->huxing<<" "<<p1->zhuangtai<<" "<<p1->renyuan<<endl;/输入数据的同时,将数据写入文件cout<<"如果需要结束输入请按0,要继续请按1"<<endl; cin>>n;p2=p1;while(n!=0);outf.close;cout<<"数据已保存!"<<endl;void del(residence * head)/int l,d,f,n,i;residence *p1,*p2;cout<<"请输入您要删除的房间的位置信息:楼号,单元号,房间号"<<endl;cin>>l>>d>>f;doif(head->next=NULL) cout<<"没有数据"<<endl; return;p2=head;p1=head->next;while(1)/查找并删除数据i=0;if(p1->lou=l&&p1->danyuan=d&&p1->fangjian=f)p2->next=p1->next;delete p1; i+;/删除操作break;if(p1->next=NULL) break;p2=p1;p1=p1->next;if(i!=0) cout<<"删除成功"<<endl;else cout<<"没有该数据"<<endl;cout<<"如果需要结束输入请按0,要继续请按1"<<endl;cin>>n;while(n!=0);ofstream outf("data.txt",ios:out);/重新存储数据p1=head;if(p1->next=NULL) cout<<"数据已全部删除!"<<endl;elsewhile(1)p1=p1->next;outf<<p1->lou<<" "<<p1->danyuan<<" "<<p1->fangjian<<" "<<p1->danjia<<" "<<p1->mianji<<" "<<" "<<p1->zongjia;outf<<" "<<p1->chaoxiang<<" "<<p1->huxing<<" "<<p1->zhuangtai<<" "<<p1->renyuan<<endl;if(p1->next=NULL) break;outf.close;cout<<"修改已保存"<<endl;void amend(residence *head)/cout<<"已进入修改,完成一次修改后可按0退出"<<endl;int l,d,f,n,i;residence *p1,*p2;if(head->next=NULL) cout<<"没有数据"<<endl;return;cout<<"相应按键为:楼号 1, 单元号 2, 房间号 3, 平米单价 4, 建筑面积 5, 朝向 6, 户型 7, 售出状态 8, 业务员 9,退出 0"<<endl;cout<<"请输入您要修改的房间的位置信息:楼号,单元号,房间号"<<endl;cin>>l>>d>>f;while(1)p2=head;p1=head->next;while (1)if(p1->lou=l&&p1->danyuan=d&&p1->fangjian=f)/判断条件docout<<"请输入相应的数字"<<endl;cin>>i;switch (i)case 1: cout<<"新楼号"cin>>p1->lou;break;case 2: cout<<"新单元号"cin>>p1->danyuan;break;case 3: cout<<"新房间号"cin>>p1->fangjian;break;case 4: cout<<"新平米单价"cin>>p1->danjia;p1->zongjia=p1->danjia*p1->mianji;break;case 5: cout<<"新建筑面积"cin>>p1->mianji;p1->zongjia=p1->danjia*p1->mianji;break;case 6: cout<<"新朝向"cin>>p1->chaoxiang;break;case 7: cout<<"新户型"cin>>p1->huxing;break;case 8: cout<<"新售出状态"cin>>p1->zhuangtai;break;case 9: cout<<"新业务员"cin>>p1->renyuan;break;case 0: break;while(i!=0);/如果不符合条件,继续查找下一个if(p1->next=NULL) break;p2=p1;p1=p1->next;cout<<"要结束修改吗?是:0,否:1"<<endl;cin>>n;if(n=0) break;ofstream outf("data.txt",ios:out);/数据存储p1=head;if(p1->next=NULL) cout<<"数据已全部删除!"<<endl;elsewhile(1)p1=p1->next;outf<<p1->lou<<" "<<p1->danyuan<<" "<<p1->fangjian<<" "<<p1->danjia<<" "<<p1->mianji<<" "<<" "<<p1->zongjia;outf<<" "<<p1->chaoxiang<<" "<<p1->huxing<<" "<<p1->zhuangtai<<" "<<p1->renyuan<<endl;if(p1->next=NULL) break;outf.close;cout<<"修改已保存"<<endl;cout<<endl;void display(residence *head)/显示数据/int i=1;if(head->next=NULL) cout<<"没有数据"<<endl;return;cout<<"所有房源信息:"<<endl<<endl;cout<<"楼号 单元号 房间号 平米单价 建筑面积 总价 朝向 户型 售出状态 业务员"<<endl;residence *p1;p1=head->next;while(1)cout<<setw(6)<<setiosflags(ios:left)<<p1->lou;/楼号cout<<setw(7)<<setiosflags(ios:left)<<p1->danyuan;/单元号cout<<setw(7)<<setiosflags(ios:left)<<p1->fangjian;/房间号cout<<setw(9)<<setiosflags(ios:left)<<p1->danjia;/平米单价cout<<setw(9)<<setiosflags(ios:left)<<p1->mianji;/建筑面积cout<<setw(10)<<setiosflags(ios:left)<<p1->zongjia;/总价cout<<setw(7)<<setiosflags(ios:left)<<p1->chaoxiang;/朝向cout<<setw(12)<<setiosflags(ios:left)<<p1->huxing;/户型cout<<setw(9)<<setiosflags(ios:left)<<p1->zhuangtai;/售出状态cout<<setw(6)<<setiosflags(ios:left)<<p1->renyuan<<endl;/业务员if(p1->next=NULL) break;p1=p1->next;cout<<endl;cout<<"按任意键返回主菜单。"<<endl;getchar();getc