数据结构与程序设计实验实验报告课程名称数据结构与程序设计实验课程编号0906550实验项目名称教学计划编制学号2014022104年级2014姓名耿晗晗专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师杨静实验室名称地点计算机中心276室哈尔滨工程大学-1-实验报告五实验课名称:数据结构与程序设计实验实验名称:教学计划编制班级20140612学号2014022104姓名耿晗晗时间2016.4.26一、问题描述学历进修需要学生在一定的时间内完成一定的课程学习,每一门课有一定的学分,修满学分,可获取相应的学历。因为有些课程内容是另一些课程的学习基础,所以课程学习之间存有一定的先后次序。如:某学历的计算机专业需要学习的课程及课程之间的关系如表1所示。二、数据结构设计structbian;structdian{//图中结点boolb;stringname;boolmark;//标识关键路径上的结点boolm;//标识是否被访问过booltt;inttime,ru,num;floatxue_fen;bian*in,*out;};structbian{//图中弧inta,b;bian*next_in,*next_out;-2-bian*next;//创建边的链接关系,用于释放内存。};三、算法设计系统规定的功能设计的算法有:创建教学计划、修改信息、增加课程、删除课程。1创建教学计划:boolInit(dian*&p,bian&a,int&n){//创建教学计划cout请输入课程数:endl;cinn;if(n40){cout课程数目超出要求(大于40)endl;returnfalse;}p=newdian[n];for(inti=0;in;++i){p[i].in=NULL;p[i].out=NULL;p[i].ru=0;}for(inti=0;in;++i){cout请输入第i+1门课程的名字,学时(整数),学分(可为小数)endl;cinp[i].name;cinp[i].time;cinp[i].xue_fen;p[i].num=i+100001;p[i].in=p[i].out=NULL;}guan_xi(p,a,n);returntrue;}2修改课程信息:voidxiu_gai(dian*p,intn){intt,j;strings;cout请输入修改课程数:endl;cint;for(inti=0;it;++i){tc:cout请输入要修改的课程名字:endl;cins;for(j=0;jn;++j){if(s==p[j].name){cout请输入课程的名字学分学时:endl;-3-cinp[j].name;cinp[j].xue_fen;cinp[j].time;break;}}if(j==n){cout没有课程sendl;gototc;}}}3向方案中添加课程:booladd(dian*&p,bian&a,int&n,intrr){//增加课程intt;cout请输入要增加的课程数:endl;cint;n+=t;if(n40){cout课程数目超出要求(大于40)endl;returnfalse;}dian*w=newdian[n];for(inti=0;in-t;++i){w[i]=p[i];}delete[]p;p=w;inttz,r;strings;bian*h=&a,*e;while(h-next!=NULL){h=h-next;}for(inti=n-t;in;++i){cout请输入第i-n+t+1门课程的名字,学时(整数),学分(可为小数)endl;cinp[i].name;cinp[i].time;cinp[i].xue_fen;p[i].num=i+rr*10000;p[i].in=p[i].out=NULL;tx:cout请输入课程p[i].name的先修课程数(无先修课程输入0)-4-endl;cintz;if(tz==0){gototx1;}cout请输入课程p[i].name的先修课程endl;for(intj=0;jtz;++j){cins;for(r=0;rn;++r){if(p[r].name==s)break;}if(r==n){cout没有课程sendl;gototx;}e=newbian;e-next=h-next;h-next=e;h=e;e-a=r;e-b=i;e-next_out=p[r].out;p[r].out=e;e-next_in=p[i].in;p[i].in=e;}tx1:cout请输入课程p[i].name是多少门课程的先修课程(不是其他课程的先修课程输入0)endl;cintz;//用于添加课程是已有课程的先修课程的情况。if(tz==0){continue;}cout请输入课程p[i].name是那些课程的先修课程:endl;for(intj=0;jtz;++j){cins;for(r=0;rn;++r){if(p[r].name==s)break;}if(r==n){cout没有课程sendl;gototx1;-5-}e=newbian;e-next=h-next;h-next=e;h=e;e-a=i;e-b=r;e-next_out=p[i].out;p[i].out=e;e-next_in=p[r].in;p[r].in=e;}}for(inti=0;in;++i){p[i].ru=0;}bian*s1;for(inti=0;in;i++){s1=p[i].in;while(s1!=NULL){p[i].ru++;s1=s1-next_in;}}returntrue;}4从方案中删除课程:voidshan_chu(dian*&p,bian&a,int&n){//删除课程intt,j,x;cout请输入要删除课程的个数:endl;cint;n-=t;strings;for(inti=0;it;++i){ty:cout请输入要删除课程的名字:endl;cins;x=0;for(j=0;jn+t;++j){if(s!=p[j].name){p[x++]=p[j];}}if(x==n+t){-6-cout没有课程p[j].nameendl;gototy;}}dian*w=newdian[n];for(inti=0;in;++i){w[i]=p[i];}delete[]p;p=w;bian*z=a.next,*v;while(z!=NULL){v=z-next;deletez;z=v;}a.next=NULL;for(inti=0;in;++i){p[i].in=NULL;p[i].out=NULL;p[i].ru=0;}guan_xi(p,a,n);}四、界面设计请选择操作:1创建教学方案2修改课程信息3向方案中添加课程4从方案中删除课程五、运行测试与分析(1)运行程序,显示菜单如下:(2)输入“1”并输入课程数大于40,显示如下:-7-(3)输入“1”并输入课程数小于40并输入课程,显示如下:-8-(图片接下一页)(4)输入“2”,并输入要修改的信息,显示如下:-9-(图片接下一页)(5)输入“3”并且添加课程后,课程数超过40时,显示如下:(6)输入“3”并且添加课程后,课程数不超过40时,显示如下:-10-(图片接下一页)(7)输入“4”并输入所需数据,显示如下:-11-(图片接下一页)六、实验收获与思考通过本实验,我对图有了更深的理解,并且在实现过程中解决了很多之前没有想到过的问题。并且通过本实验我增强了个人动手能力,学得了很多书本上没有的知识和经验,对程序语言应用的更加灵活。教师评分:教师签字:注:红色部分根据实验及内容变换注意:实验报告正文字号统一为五号字附录(源代码):#includeiostream#includestring#includequeue#includestackusingnamespacestd;structbian;structdian{//图中结点boolb;stringname;-12-boolmark;//标识关键路径上的结点boolm;//标识是否被访问过booltt;inttime,ru,num;floatxue_fen;bian*in,*out;};structbian{//图中弧inta,b;bian*next_in,*next_out;bian*next;//创建边的链接关系,用于释放内存。};voidhead();boolInit(dian*&p,bian&a,int&n);boolpaixu(dian*p,intn);voidxiu_gai(dian*p,intn);booladd(dian*&p,bian&a,int&n,intrr);voidshan_chu(dian*&p,bian&a,int&n);voidshow(dian*p,intn);intmain(){//主函数dian*p=NULL,*t;biana;a.next=NULL;intcc,n,rr=1;head();while(cincc){switch(cc){case1:{//创建教学计划if(p!=NULL)delete[]p;if(!Init(p,a,n))break;t=newdian[n];for(inti=0;in;++i)t[i]=p[i];if(!paixu(t,n))break;show(t,n);break;}case2:{//修改课程信息t=newdian[n];-13-for(inti=0;in;++i){t[i]=p[i];}xiu_gai(t,n);if(!paixu(t,n))break;show(t,n);break;}case3:{//增加课程t=newdian[n];for(inti=0;in;++i){t[i]=p[i];}if(!add(t,a,n,++rr))break;delete[]p;p=newdian[n];for(inti=0;in;++i){p[i]=t[i];}if(!paixu(t,n))break;show(t,n);break;}case4:{//删除课程bian*z=a.next,*v;while(z!=NULL){v=z-next;deletez;z=v;}a.next=NULL;t=newdian[n];for(inti=0;in;++i)t[i]=p[i];shan_chu(t,a,n);if(!paixu(t,n))break;show(t,n);break;}default:-14-cout序号输入错误!endl;break;}head();}delete[]p;bian*z=a.next,*v;while(z!=NULL){v=z-next;deletez;z=v;}return0;}voidhead(){//操作选项列表coutendl请选择操作:endl;cout1创建教学方案endl;cout2修改课程信息endl;cout3向方案中添加课程endl;cout4从方案中删除课程endl;}voidxiu_gai(dian*p,intn){intt,j;strings;cout请输入修改课程数:endl;cint;for(inti=0;it;++i){tc:cout请输入要修改的课程名字:endl;cins;for(j=0;jn;++j){if(s==p[j].n