版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6*******************实践教学*******************兰州理工大学计算机与通信学院2011年春季学期数据结构课程设计题目:教学方案编制问题专业班级:软件一班姓名:学号:指导教师:成绩:_____________________前言本学期开设了算法与数据结构,通过学习算法与数据结构,大家对编程有了更多的了解,为了让大家将自己所学的知识应用到实际当中,学校开设了算法与数据结构课设,通过这次课设大家可以更好地将c语言应用到实际当中,而且可以更好的掌握算法与数据结构,将数据结构和c语言有效的结合起来,使大家的编程能力得到更大的提高。目录摘要------------------------------------------------------------------------------------1关键字----------------------------------------------------------------------------1正文------------------------------------------------------------------------------------21.采用类c语言定义相关的数据类型-----------------------------------------22.各模块的伪码算法-------------------------------------------------------------33函数调用关系图-----------------------------------------------------------------64试调分析--------------------------------------------------------------------------75测试结果--------------------------------------------------------------------------8总结--------------------------------------------------------------------------------9参考文献------------------------------------------------------------------------------9致谢---------------------------------------------------------------------------------10附件Ⅰ1.源程序[带注释]〔结构体文件〕---------------------------------------------------------102.运行结果----------------------------------------------------------------------------28摘要大学的每个专业都要制定教学方案。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。此程序就可以满足这些要求,输出正确的结果,帮助我们实现教学方案编制关键字:数据结构,方案,编制正文1采用类c语言定义相关的数据类型typedefcharVertexType[MAX_NAME];intTotalTerms;//学期总数intMaxScores;//学分上限typedefstructArcNode{intadjvex;//该弧所指向的顶点的位置弧的节点结构structArcNode*nextarc;//指向下一条弧的指针}ArcNode;/*查找图中某个顶点位置*/intLocateVex(ALGraphG,VertexTypeu)/*输出图G的信息*/voidDisplay(ALGraphG)*求顶点的入度*/voidFindInDegree(ALGraphG,intindegree[])structName{charc[20];}name;voidpuanduan(VertexTypestr,structNamename[],intn)/*栈定义*/typedefintSElemType;//栈类型#defineStack_NUM20//存储空间初始分配量#defineStack_MoreNUM5//存储空间分配增量typedefstructSqStack*拓扑排序*/intTopoSort(ALGraphG,AdjListTemp,structNamename[])2.各模块的伪码算法〔1〕-图的邻接表存储表示-intadjvex;该弧所指向的顶点的位置弧的节点结构structArcNode*nextarc;指向下一条弧的指针}ArcNode;链表结点typedefstruct链接表{VertexTypedata;顶点信息intgrades;存储学分信息ArcNode*firstarc;指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];头结点typedefstruct{AdjListvertices;vertices存储课程名intvexnum,arcnum;图的当前顶点数和弧数}ALGraph;voidOUTPUT()输出菜单〔2〕采用邻接表存储结构输出提示,按提示操作程序printf("请输入教学方案的课程数:");printf("请输入各个课程的先修课程的总和(弧总数):");printf("请输入%d个课程的课程号(最多%d个字符,数字+字母):",G.vexnum,MAX_NAME);printf("请输入以下课程的先修课程(无先修课程输入0结束后也输入0)\n");〔3〕输出图G的信息voidDisplay(ALGraphG)printf("有向图\n");printf("%d个顶点",G.vexnum);拓扑排序ArcNode*p;//对输出顶点计数while(!StackEmpty(S)){Pop(S,i);printf("%s(%d分),",G.vertices[i].data,G.vertices[i].grades);Temp[j++]=G.vertices[i];//将当前的拓扑序列保存起来++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc)//对i号顶点的每个邻接点的入度减1{k=p->adjvex;if(!(--indegree[k]))//假设入度减为0,那么入栈Push(S,k);〔4〕voidmain()初始化strucNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}};3函数调用关系图Display(G)Display(G)CreateGraph(G)输出图G的信息TopoSort(G,Temp,name)name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name);TopoSort(G,Temp,name)TopoSort(G,Temp,name)采用邻接表存储结构拓扑排序voidmain()-4试调分析-根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。end采用第二种策略:使课程尽可能地集中在前几个学期中根据教学方案中的课程及其关系和学分定义图的顶点和边的结构体创立图CreateGraph〔〕:结合先修关系的AOV网,采用邻接链表存储菜单OUTPUT():显示代号所对应课程及课程的先修课程前插法main拓扑排序TopoSort(G):将课程排序后并决定出每学期所学课程
输出图G的信息Display(G):将图的顶点和弧边输出5测试结果测试数据:输入的内容如下:
课程编号
课程名称
学分
先决条件
01
程序设计根底
2
无
02
离散数学
3
01
03
数据结构
4
01,02
04
汇编语言
3
01
05
语言的设计和分析
2
03,04
06
计算机原理
3
11
07
编译原理
4
05,03
08
操作系统
4
03,06
09
高等数学
7
无
10
线性代数
5
09
11
普通物理
2
09
12
数值分析
3
09,10,01
学期总数:6;学分上限:10;该专业共开设12门课,课程号从C1到C12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。两种编译都输出结果:第一学期学的课程有:高等数学
第二学期学的课程有:普通物理线性代数计算机原理
第三学期学的课程有:课程设计根底数据结构离散数学
第四学期学的课程有:操作系统汇编语言语言的设计与分析
第五学期学的课程有:编译原理数值分析第六学期学的课程有:总结我们在实验过程中遇到的最大难题是两个课程排序算法的编写。刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。经过三天的修改,终于写出了符合要求的排序算法经过此次课程设计,自己解决编程中从在的问题,我们认识到了理论与实践结合的重要性,仅仅只是从课本上学到算法原理是远远不够的。在实践中,我们总会出现许多错误。这就要求我们以一个脚踏实地的态度来处理问题。我们深刻地认识到自己写程序的缺乏,使我们学到了好多有用的知识,让我们明白了算法与编程的密切关系,使我们受益匪浅。参考文献1《数据结构》〔c语言描述〕冶金工业出版社2《C程序设计》谭浩强3王连相,冯锋编著.C/C++程序设计.北京:中国科学技术出版社,20054严蔚敏,吴伟民编著.数据结构〔C语言版〕.北京:清华大学出版社,19975严蔚敏,吴伟民编著.数据结构题集〔C语言版〕.北京:清华大学出版社,致谢首先感谢我的指导老师张永老师,他在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。并且在课设期间屡次亲身检查给出我程序中的缺乏,也为我拓宽思路,不至于我的程序过于单一,非常感谢张永老师我的同学在设计完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。附件11.源程序代码〔/*************************************************************************************结构体文件|结构体名|作用|备注__________________________________________________________________________________||用于在处理数据时保存各个信息|||1.该门课程是否已经编排|动态数组|CourseHead|2.给课程的直接先修课的个数|与CourseLink一起构成链表||3.以该门课程为先修的后修课程结点|存储结构||4.课程的名字5.课程号6.学分|_________________________________________________________________________________|CourseLink| CourseHead的链|动态结点||1.课程在CourseHead的下标|与CourseHead一起构成链表||2.下一个CourseLink的地址|存储结构_________________________________________________________________________________||保存符合要求的课程安排情况|动态结点,头结点不保存|Topo|1.课程安排的平均性|课程安排情况,但是保存||2.ArryInTopo型数组存储安排情况|课程安排平均的总数目||3.下一中课程安排的结点地址|__________________________________________________________________________________||保存某一门课的开课时间|动态数组,|ArryInTopo|1.该门课在CourseHead的下标|它在Topo的内部||2.该课程的开课时间|___________________________________________________________________________________||保存可以选择的课程|动态结点|Zero|1.课程在CourseHead的下标|在编程是因为递归的需要||2.下一个课程结点的地址|即时地加上去的结构体___________________________________________________________________________________**************************************************************************************//*该结构体用于保存课程的学分和该课程在一维数组的下标因为用到链表存储结构(表头是先修课程,链是与以该课程的为先修的课程)所以有假设下*/〕#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<windows.h>#include<conio.h>#include<fstream.h>structCourseLink//该结构体用于具体运算{//关联了课程的关系intIndex;//该课程在一维数组的下标,绑定他与课程的关系CourseLink*next;//下一门与他同一尾节点的课程};structCourseHead//表头结点的结构体{ intflag;//标记该门课程是否已经编排intpriornum;//给课程的直接先修课的个数CourseLink*first;//以该门课程为先修的后修课程charName[30];//课程的名字charOfcourse[4];//课程号floatScore;//学分};structArryInTopo{ intIndex;//保存课程的序号 intTime;//保存课程的开课时间};structTopo{ intlevel;//标记是否平均分配,也就是课程安排效果标记 ArryInTopo*toporesualt;//一个一维数组保存拓扑排序--保存课程的序号 Topo*next;//拓扑排序的下一种情况};structZero//保存可以选择的课程{ intzero;//课程在原始数据里的下标 Zero*next;//下一个课程结点的地址};//**************函数介绍********************************************voidInitData();//......................1调用一下两个函数完成数据初始化voidInitData(intnum);//.................2由课程数目num来完成数据的细节floatInitData(char*b);//..............2方便判断输入数据的准确性而已voidStartTopoSort();//..................1初始化要用到的各个数据再调用下面这个函数voidTopoSort(inttopotempsum,inttime);//.2递归函数,完成拓扑排序,用到以下四个函数voidCheck(intindex);//...................3中选择course[index]时,相应的链表的 //3头结点的priornum项要减一voidCheckBack(intindex);//...............3当退选course[index]时,相应的链表的 //3头结点的priornum项要加一 intZERO();//............................3统计该层递归可以选择的课程 //并且完成可选课程的记录voidIfsuccessed();//......................3当课程安排成功时将课程安排记录保存 //并对课程安排做评价voidPrint();//............................1根据客户要求输出相应的课程安排voidprintf0();//..........................1界面voidprintf1(int);//......................1负责输出课程信息,并且还调用下面voidprintf2();//...........................2输出课程的联系voidprintf1(FILE*);//......................1负责将课程信息写入文件,并且还调用下面voidprintf2(FILE*);//...........................2将课程的联系写入文件//**************函数介绍********************************************intTime=0;//全局变量学期总数floatMaxSource=0.0;//全局变量一学期的学分上限intSourceNum=0;//全局变量课程总数CourseHead*coursehead;//全局变量链表的有节点数组Topo*topo;//全局变量保存课程的安排情况,//头结点保存课程安排平均的总数目ArryInTopo*topotemp;//全局变量数组临时保存某一种拓扑排序情况Zero*ZeroTemp;//全局变量链式保存入度为零的课程的index//随着递归的进行他的值也在变化int*ClassInTime;//全局变量临时保存每一学期课程的数目voidmain(){chari; printf0(); do { printf("按任意非<Esc>键开始,按<Esc>退出!\n\n");i=getch(); fflush(stdin);//刷新输入流 if(i!=27) { system("cls");//刷新屏幕printf0(); InitData();//输入数据 StartTopoSort();//处理数据Print();//按要求输出结果 } if(i==27) return; }while(i!=27);}//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@数据初始化全部完成voidInitData(){ Time=int(InitData("学期总数"));//输入学期总数 MaxSource=InitData("一学期的学分上限");//输入一学期的学分上限 SourceNum=int(InitData("课程总数"));//输入课程总数InitData(SourceNum);//输入课程有关的各个信息}//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@数据初始化全部完成floatInitData(char*b)//输入学期总数,一学期的学分上限,课程总数{intflag=0; floata=0; do { if(flag==1) printf("请重新输入%s\n",b); else printf("请输入%s:\n",b); scanf("%f",&a); fflush(stdin); flag=1; }while(a<=0.0);//严格检查输入数据的准确性 returna;}voidInitData(intnum)/*输入课程有关的各个信息:每门课的课程名Source->name[];课程号(固定占3位的字母数字串)Source->OfSource[];学分Source->Source;直接先修课的课程号*/{inti=0,j=0; intflag=0;//标记出错coursehead=(CourseHead*)malloc(num*sizeof(CourseHead)); //为全局变量course和coursehead分配内存 CourseLink*courselink=NULL; CourseLink*courselinktemp=NULL; for(i=0;i<num;++i) { coursehead[i].Name[0]='\0'; coursehead[i].Ofcourse[0]='\0'; coursehead[i].Score=0; coursehead[i].flag=0; coursehead[i].first=NULL; coursehead[i].priornum=0; } //为全局变量course和coursehead完成初始化 for(i=0;i<num;++i)//............输入每一门课程的信息 { do {flag=0; if(flag==1) printf("输入的信息不符合要求,请检查后再输入!\n请重新输入第%d门课程的课程名(限长12位),课程号(固定占3位),学分\n",i); printf("请输入第%d门课程的课程名(限长14位),课程号(固定占3位),学分\n",i+1);scanf("%s%s%f",coursehead[i].Name,coursehead[i].Ofcourse,&(coursehead[i].Score)); fflush(stdin); //正确输入课程名 if(strlen(coursehead[i].Name)>28) { printf("警告!课程名太长,请简写!\n\n");flag=1; } //正确输入课程号 if(strlen(coursehead[i].Ofcourse)!=3) { printf("警告!课程号必须是是三位\n\n\n");flag=1; } for(j=0;flag==0&&j<i;++j) if(strcmp(coursehead[i].Ofcourse,coursehead[j].Ofcourse)==0) {printf("警告!已经有了一个同样的课程号!\n\n"); flag=1; break; } if(coursehead[i].Score>MaxSource||coursehead[i].Score<=0.0) { printf("警告!学分必须是在0到最大限制%3.1f之间,请检查后再输入\n\n",MaxSource);flag=1; }//正确输入学分 }while(flag==1); //严格控制输入数据的正确性 }printf1(1);//输出已经输入的课程信息//以下是输入课程的关系intSort=0,NUM=0;//先修课的序号,先修课的的个数chartemp[4];//保存输入的课程号do{printf("请输入课程号与它的先修课的的个数(输入00结束):\n");scanf("%s%d",temp,&NUM);fflush(stdin);Sort=SourceNum; for(i=0;i<SourceNum;++i) if(strcmp(temp,coursehead[i].Ofcourse)==0) { Sort=i; break; }if(NUM>=SourceNum) printf("警告!先修课数目值无意义!\n\n"); if(Sort==SourceNum) printf("警告!该课程不存在!\n\n"); if(Sort<SourceNum&&coursehead[Sort].priornum!=0) { printf("警告!该课程已经输入过!\n\n");Sort=SourceNum; } if(Sort!=SourceNum&&NUM<SourceNum)//输入各个关系 for(i=1;i<=NUM;++i) { if(i==1) coursehead[Sort].priornum=NUM; //先修课程数目 flag=0; do { printf("请"); if(flag==1){printf("重新");flag=0;} printf("输入课程%s的第%d个直接先修课的课程号\n",coursehead[Sort].Ofcourse,i); scanf("%s",temp); fflush(stdin);//*********************检查输入的课程号的正确性 for(j=0;j<SourceNum;++j) if(strcmp(temp,coursehead[j].Ofcourse)==0&&Sort!=j) { break; } //课程号不与自己相同 if(j==SourceNum) {printf("警告!输入的课程号有误!!\n\n");flag=1;} //课程号存在 if(flag==0) { courselinktemp=NULL;courselink=coursehead[Sort].first; while(courselink!=NULL) { if(courselink->Index==j) { printf("警告!课程不能互为先修课!\n\n");flag=1; break; }courselink=courselink->next; } }//不存在a--->b&&b--->a的情况 if(flag==0) { courselinktemp=NULL;courselink=coursehead[j].first; while(courselink!=NULL) { if(courselink->Index==Sort) { printf("警告!关系重复了!\n\n");flag=1; break; }courselink=courselink->next; } }//**********************检查输入的课程号的正确性//######################输入正确时给相应的地方赋值if(flag==0) { courselink=(CourseLink*)malloc(sizeof(CourseLink)); courselink->Index=Sort; courselink->next=coursehead[j].first; coursehead[j].first=courselink; } //######################输入正确时给相应的地方赋值 }while(flag==1);//输入有错那么重新输入//TheEndofdo{}while(); printf1(0); } //TheEndoffor(){}}while(!(Sort==SourceNum&&NUM==0));//判断关系是否结束}//..........................所有的数据存储结构初始化已经完成voidStartTopoSort()//初始化要用到的各个数据{//再调用递归函数TopoSort(inttopotempsum,inttime) //来完成课程的具体安排inti=0; topotemp=(ArryInTopo*)malloc(SourceNum*sizeof(ArryInTopo)); for(;i<SourceNum;++i) {topotemp[i].Time=0; topotemp[i].Index=0; } //为全局变量ArryInTopo*topotemp完成初始化 topo=(Topo*)malloc(sizeof(Topo)); topo->level=0; topo->toporesualt=NULL; topo->next=NULL; //为全局变量Topo*topo完成初始化 ZeroTemp=(Zero*)malloc(sizeof(Zero));ZeroTemp->next=NULL; ZeroTemp->zero=0; //为全局变量Zero*ZeroTemp完成初始化,头结点不用 ClassInTime=(int*)malloc(Time*sizeof(int)); for(i=0;i<Time;i++)ClassInTime[i]=0; //为全局变量int*ClassInTime完成初始化 TopoSort(0,1);//调用递归函数TopoSort完成课程安排}voidTopoSort(inttempsum,inttime){//递归完成拓扑排序//tempsum,已经安排的课程的数目//要安排课程的time学期 inti=0,j=0;intzero=ZERO();//index课程的后继课程中前驱为零的个数 if(zero==0)return;//没有课程可选,返回 int*ZeroArry; ZeroArry=(int*)malloc(zero*sizeof(int)); Zero*zerolink=ZeroTemp->next;for(i=0;i<zero;++i) { ZeroArry[i]=zerolink->zero; zerolink=zerolink->next; }//将Zero*ZeroTemp链里的数据赋给 //局部变量int*ZeroArry赋值,方便操作intxuan=1;//该层递归在ZeroArry[i]已经选择的课程的数目 intsum=tempsum;//已经安排的课程的数目 doubleScoreNum=0;//该层递归选择的课程的学分的和 intflag=0;//标记某一种课程选择是否正确 for(i=1;i<int(pow(2,zero));++i) {//这是本人写这个程序的唯一的得意之处 //将课程的选择情况用二进制的0,1表示 //例如i=6那么i=110(2) //i分别与j100(2),10(2),1(2)进行“与”运算 //分别得到j100(2),10(2),0(2)//j==j110 //那么表示在这种情况下在数组int*ZeroArry里面 //选择ZeroArry[1-1],ZeroArry[2-1]的课程 //不选ZeroArry[3-1] //并且是i从1到pow(2,zero)-1, //这样可以不重不漏地将所有情况都考虑进去 sum=tempsum; //已经安排的第sum课程 ScoreNum=0; flag=0; ClassInTime[time-1]=0; //每一次循环都必须将数据初始化for(j=1,xuan=1;xuan<=zero;xuan++) {if((j&i)==j)//选择ZeroArry[xuan-1]的课程 { coursehead[ZeroArry[xuan-1]].flag=1; //标记已选 topotemp[sum].Index=ZeroArry[xuan-1];topotemp[sum].Time=time; //全局变量数组ArryInTopo*topotemp记录选课情况 Check(ZeroArry[xuan-1]); //将课程Course[index]的后继课程的入度减一 ScoreNum+=coursehead[ZeroArry[xuan-1]].Score; //选择的课程的学分的和 sum++; ClassInTime[time-1]++; //更改全局变量time学期课程的数目 } j=j*2;//也可以用j=j<<1; } if(sum==SourceNum) {//课程安排成功 Ifsuccessed(); flag=1; } if(ScoreNum!=0&&ScoreNum<=MaxSource&&time<Time)TopoSort(sum,time+1); //继续递归 for(j=1,xuan=1;xuan<=zero;xuan++) { if((j&i)==j) { CheckBack(ZeroArry[xuan-1]); coursehead[ZeroArry[xuan-1]].flag=0; } j=j*2; }//这个for循环用于在i=i+1之前将所有的数据复原 if(flag==1) { ClassInTime[time-1]=0; return; } }ClassInTime[time-1]=0;free(ZeroArry);}voidIfsuccessed()//当课程安排成功时将课程安排记录保存{ //并对课程安排做评价inti=0;Topo*temp;temp=(Topo*)malloc(sizeof(Topo));temp->level=0; temp->toporesualt=(ArryInTopo*)malloc(SourceNum*sizeof(ArryInTopo));temp->next=NULL;temp->next=topo->next;topo->next=temp; //当某一种课程安排成立时新建一个 //Topo*temp结点,并且连接到全局变量topo后面for(i=0;i<SourceNum;++i) {temp->toporesualt[i].Index=topotemp[i].Index;temp->toporesualt[i].Time=topotemp[i].Time; }//完成对结点Topo*temp的内容的添加//下面对该种安排做一个评估 intAverage=int(SourceNum/Time);//平均每学期的课程数目 for(i=0;i<Time;++i)if(ClassInTime[i]<Average||ClassInTime[i]>Average+1||ClassInTime[Time-1]==0) break; //判断是否平均 if(i==Time) { temp->level=1;//标记课程安排平均 topo->level++;//课程安排平均的数目+1 }}intZERO()//统计某层递归可以选择的课程{ //并且完成可选课程的记录 Zero*p=ZeroTemp->next; Zero*zerotemp=NULL; ZeroTemp->next=NULL; while(p!=NULL) { zerotemp=p->next; free(p); p=zerotemp; } //释放全局变量Zero*ZeroTemp的内存//为记录新的入度为零的课程做准备 p=ZeroTemp; intzero=0; inti=0;for(i=0;i<SourceNum;++i) if(coursehead[i].priornum==0&&coursehead[i].flag==0) {//入度为零,并且还没有被选中 zerotemp=(Zero*)malloc(sizeof(Zero)); p->next=zerotemp; p=zerotemp; zerotemp->zero=i; zerotemp->next=NULL; zero++;//完成对全局变量Zero*ZeroTemp重新赋值 } returnzero;//返回可选课程的个数}voidCheck(intindex)//将课程coursehead[index]的后继课程的入度减一{ CourseLink*courselinktemp=NULL; courselinktemp=coursehead[index].first; while(courselinktemp!=NULL) {coursehead[courselinktemp->Index].priornum--; courselinktemp=courselinktemp->next; }}voidCheckBack(intindex)//当coursehead[index]课程"推选"时,要将与他有关的课程的入度数复原{CourseLink*courselinktemp; courselinktemp=coursehead[index].first; while(courselinktemp!=NULL) {coursehead[courselinktemp->Index].priornum++; courselinktemp=courselinktemp->next; }}voidPrint()//根据客户要求输出相应的课程安排{ printf1(1);//刷新屏幕 inti=0,j=1,flag=1; FILE*f; Topo*pp=topo->next; do { printf("课程编排结束!!\n\n"); printf("请选择操作!\n");printf("选项(0/1/2):\n");printf("(0)重新初始化课程信息!\n"); printf("(1)学习负担尽量均匀!\n"); printf("(2)所有课程安排情况!\n"); do { if(!(flag==1||flag==2||flag==0)) printf("注意!!!请输入合法选择!\n");scanf("%d",&flag); fflush(stdin); }while(!(flag==1||flag==2||flag==0)); //严格控制输入的准确性 printf("以下是所有符合您要求的课程安排情况!\n");printf1(1);//刷新屏幕 if(flag==1) f=fopen("分配均匀.txt","w"); else f=fopen("所有情况.txt","w"); printf1(f); if(flag==0)return; else { pp=topo->next; j=1;while(pp!=NULL) { if(flag==1&&pp->level==1||flag==2) { printf("第%d种课程安排!\n\n",j); printf("开课时间课程名称课程号学分先修课数目\n"); fprintf(f,"第%d种课程安排!\n\n",j); fprintf(f,"开课时间课程名称课程号学分先修课数目\n"); for(i=0;i<SourceNum;++i) {printf("%8d%20s%11s%7.1f%10d\n",pp->toporesualt[i].Time,coursehead[pp->toporesualt[i].Index].Name,coursehead[pp->toporesualt[i].Index].Ofcourse,coursehead[pp->toporesualt[i].Index].Score,coursehead[i].priornum); fprintf(f,"%8d%20s%11s%7.1f%10d\n",pp->toporesualt[i].Time,coursehead[pp->toporesualt[i].Index].Name,coursehead[pp->toporesualt[i].Index].Ofcourse,coursehead[pp->toporesualt[i].Index].Score,coursehead[i].priornum); } fprintf(f,"\n\n"); printf("\n\n"); j++; } pp=pp->next; } //输出完毕 printf("一共%d种符合您要求的课程安排!\n\n",j-1);fprintf(f,"一共%d种符合您要求的课程安排!\n\n",j-1); fclose(f); } }while(1);}voidprintf0()//界面{printf("*****************************************************************************\n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制药厂发酵车间操作规范手册
- 冠心病患者家庭护理指南
- 物业维修改造年度计划报告
- 招生咨询激励机制方案怎么写
- 昆虫普及活动方案策划
- 《杯酒留痕》中的创伤书写与文化记忆研究
- 活动类型策划方案模板
- 分保施工方案
- 院子冬季施工施工方案
- 弹性工作制对员工创新行为的影响
- 2025年医疗机构输血科(血库)基本标准(试行)
- 2025年高考英语新课标I卷真题及答案
- 2025云南昆明市五华区人民法院招聘合同制司法辅助人员及合同制司法警务辅助人员13人备考考试题库附答案解析
- 兄弟BAS-311G电脑花样机说明书
- 烟草行业新员工入职培训
- 审计咨询服务整体方案
- 《土木工程智能施工》课件 第3章 土方作业辅助工程-土壁支护2
- 中层复合酸在皮肤美容中的应用专家共识(2025)解读 2
- 2025算力并网技术要求
- 2025年蓝海新材料(通州湾)有限责任公司秋季高校毕业生招聘80人笔试参考题库附带答案详解
- (正式版)DB1501∕T 0021-2021 《园林绿地分级养护技术规程》
评论
0/150
提交评论