目录1 课题需求描述 (3)1.1 教学计划编制问题 (3)1.2 进制转换 (3)2 总体功能与数据结构设计 (4)2.1 总体功能结构 (4)2.2 数据结构设计 (5)3 算法设计和程序设计 (7)3.1 教学计划编制问题 (7)3.2 进制转换问题 (10)4 调试与测试 (24)4.1 教学计划编制问题调试结果 (24)4.2 进制转换问题调试结果 (26)5 设计总结 (28)6 程序代码 (30)1 课题需求描述1.1 教学计划编制问题大学的每个专业都要制订教学计划。
假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。
每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
在这样的前提下设计一个教学计划编制程序。
通过输入实际的课程及先后关系。
结合每学期的学分及课程数,制定好学习计划。
在输入相关数据后,程序会安排好每学期的课程。
1.2 进制转换进制数制是人们利用符号进行计数的科学方法。
数制有很多种,在计算机中常用的数制有:十进制,二进制,八进制和十六进制。
十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制0~15),十六进制数运算规律逢十六进一。
要求:(1)输入一个十进制数N,将它转换成R进制数输出,并可以进行你转换。
(2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16)。
(3)为每个测试实例输出转换后的数,每个输出占一行。
如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
2 总体功能与数据结构设计1.教学计划编制问题根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。
2. 进制转换问题由于计算机只能识别二进制,所以当我们从键盘输入其他进制数的时候,计算机内部的系统会利用自带的程序代码自动转换成二进制,我们是学计算机的,所以我们需要弄懂这种机制转换的原理并且能计算出来。
2.1总体功能结构2.1.1 教学计划编制问题教学计划是学校保证教学质量和人才培养的关键,也是组织教学过程、安排教学过程、安排教学任务、确定教学编制的基本依据和课程安排的具体形式。
是稳定教学秩序、提高教学质量的重要保证。
从教学计划的设计、实施等方面,阐明了如何搞好教学管理,从而为提高教学质量提供保证。
随着教育改革的不断深入和社会发展的需要,原旧的教学计划在定位上的方向性偏差,已经不再适应社会的需求。
因此,应重视教学计划的改革和修订工作,以确保教育教学质量,提高教育教学水平。
教学计划编制中的思路:一是明确培养目标;二是注重学科设置的整体性、统一性和灵活性、全面性;三是与学分制改革有机结合.教学计划是高校实施常规教学活动的基本管理文档,由于传统的手工编制方式存在诸多弊端,开发基于Web应用程序形式的教学计划编制系统具有很好的应用价值。
使用C程序设计语言,研究开发教学计划编制系统Web应用系统。
2.1.2 进制转换问题1.十进制数与非十进制数之间的转换(1)十进制数转换成非十进制数把一个十进制数转换成非十进制数(基数记作R)分成两步.整数部分转换时采用“除R取余法”;小数部分转换时采用“乘R取整法”。
(2)非十进制数转换成十进制数非十进制数(基数记作R,第j个数位的位权记作Rj)转换成十进制数的方法:按权展开求其和。
2.非十进制数之间的转换(1)二进制数与八进制数之间的转换①二进制数转换成八进制数的方法.以小数点分界,整数部分自右向左、小数部分自左向右,每三位一组,不足三位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的八进制数码。
②八进制数转换成二进制数的方法:用八进制数码对应的三位二进制数代替八进制数码本身即可。
(2)二进制数与十六进制数之间的转换①二进制数转换成十六进制数的方法:以小数点分界,整数部分自右向左、小数部分自左向右,每四位一组,不足四位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的十六进制数码。
②十六进制数转换成二进制数的方法:用十六进制数码对应的四位二进制数代替十六进制数码本身即可。
2.2数据结构设计2.2.1 教学计划编制问题LocateVex():图的邻接表存储的基本操作CreateGraph():构造生成树Display():输出图的邻接矩阵FindInDegree():求顶点的入度InitStack():构造一个空栈ClearStack():清空栈StackEmpty():判断是否为空栈Pop():出栈Push():入栈TopologicalSort():输出G顶点的拓扑排序结果2.2.2 进制转换问题void D_B( ):十进制转换为二进制void D_O( ):十进制转换为八进制void D_X( ):十进制转换为十六进制void B_D( ):二进制转换为十进制void B_O( ):二进制转换为八进制void B_X( ):二进制转换为十六进制void O_B( ):八进制转换为二进制void O_D( ):八进制转换为十进制void O_X( ):八进制转换为十六进制void X_B( ):十六进制转换为二进制void X_D( ):十六进制转换为十进制void X_O( ):十六进制转换为八进制3 算法设计和程序设计3.1 教学计划编制问题3.1.1采用C语言定义相关的数据类型。
其中包括字符常量,整型,字符型,字符串型,typedef 定义的类型,结构体型,单链表节点类型,结构体数组。
3.1.2主要函数的流程图1.LocateVex():图的邻接表存储的基本操作。
由初始条件G存在,u和G中顶点有相同特征转而进行判断,若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
2.CreateGraph():构造生成图。
采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图)。
3.Display():输出图的邻接矩阵。
采用循环设置输出图的邻接矩阵。
4.FindInDegree():求顶点的入度。
5.InitStack():构造一个空栈。
6.ClearStack():清空栈。
7.StackEmpty():判断栈是否为空。
若栈S为空栈,则返回TRUE,否则返回F ALSE。
8.Pop():出栈。
若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。
9.Push():入栈。
插入元素e为新的栈顶元素。
10.TopologicalSort():输出G顶点的拓扑排序结果。
有向图G采用邻接表存储结构。
若G无回路,则输出G的顶点的一个拓扑序列并返回OK, 否则返回ERR OR。
3.2 进制转换问题主要流程图:进制转换菜单:1.void D_B( ):十进制转换为二进制for(j=0;a!=0;j++){ p[j]=a%2; a=a/2;}printf("\n转换后的数为:");for(k=j-1;k>=0;k--){printf("%d",p[k]);}printf("\n");2.void D_O( ):十进制转换为八进制for(j=0;a!=0;j++){ p[j]=a%8;a=a/8;}printf("\n转换后的数为:");for(k=j-1;k>=0;k--){printf("%d",p[k]);}printf("\n");3.void D_X( ):十进制转换为十六进制for(j=0;a!=0;j++){p[j]=a%16;a=a/16;if(p[j]<10) p[j]+=48;else{switch(p[j]){case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;}}十进制转换为任意进制:4. void B_D( ):二进制转换为十进制for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;}else{result+=(a%10)*i;a=a/10;}}if(s==1)printf("您的输入有误!请重新输入\n");elseprintf("\n转换后的数为:%d\n",result);5.void O_D( ):八进制转换为十进制for(i=1;a!=0;i*=8){if(a%10>7){ s=1;break;}else{result+=(a%10)*i;a=a/10;}}if(s==1)printf("您的输入有误!请重新输入\n");else{printf("\n转换后的数为:%d\n",result);}任意进制转换为十进制:6.void B_O( ):二进制转换为八进制for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;}else{result+=(a%10)*i;a=a/10;}}for(j=0;result!=0;j++){p[j]=result%8;result=result/8;}if(s==1)printf("您的输入有误!请重新输入\n");else{printf("\n转换后的数为:");for(k=j-1;k>=0;k--){printf("%d",p[k]);}printf("\n");}7.void B_X( ):二进制转换为十六进制for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;}else{result+=(a%10)*i;a=a/10;}}for(j=0;result!=0;j++){p[j]=result%16;result=result/16;if (p[j]>10){switch(p[j]){case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;}}else p[j]+=48;}if(s==1)printf("您的输入有误!请重新输入\n");else{printf("\n转换后的数为:");for(k=j-1;k>=0;k--){printf("%c",p[k]);}printf("\n");}8.void O_B( ):八进制转换为二进制for(i=1;a!=0;i*=8){if(a%10>7){ s=1;break; }else{result+=(a%10)*i;a=a/10;}}for(j=0;result!=0;j++){p[j]=result%2;result=result/2;}if(s==1)printf("您的输入有误!请重新输入\n");else{printf("\n转换后的数为:");for(k=j-1;k>=0;k--){printf("%d",p[k]);}printf("\n");}9.void O_D( ):八进制转换为十进制for(i=1;a!=0;i*=8){if(a%10>7){ s=1;break;}else{result+=(a%10)*i;a=a/10;}}if(s==1)printf("您的输入有误!请重新输入\n");else{printf("\n转换后的数为:%d\n",result);}10.void X_D( ):十六进制转换为十进制for(i=0;i<k;i++){ if(a[i]<='9'&&a[i]>='1') { b[i]=a[i]-48;} else{switch(a[i]){case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;}}11.void O_X( ):八进制转换为十六进制for(i=1;a!=0;i*=8){if(a%10>7){s=1;break;}else{result+=(a%10)*i;a=a/10; }}for(j=0;result!=0;j++){p[j]=result%16;result=result/16;if(p[j]<10)p[j]+=48;else{switch(p[j]){case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;}}12.void X_B( ):十六进制转换为二进制for(i=0;i<k;i++){if(a[i]<='9'&&a[i]>='1')b[i]=a[i]-48;else{switch(a[i]){case 'A': b[i]=10;break;case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;}}13.void X_D( ):十六进制转换为十进制for(i=0;i<k;i++){ if(a[i]<='9'&&a[i]>='1') { b[i]=a[i]-48;} else{switch(a[i]){case 'A': b[i]=10;break;case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;}}14.void X_O( ):十六进制转换为八进制for(i=0;i<k;i++){if(a[i]<='9'&&a[i]>='1')b[i]=a[i]-48;else{switch(a[i]){case 'A': b[i]=10;break;case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;}其他进制间的转换:4 调试与测试4.1 教学计划编制问题调试结果输入学期总数,输入学期学分的上限,输入教学计划的课程数,输入先修关系的边数,输入课程的代表值,输入课程的学分值(如图)输入每条弧的弧尾和弧头(如图):显示的课程计划如下:4.2 进制转换问题调试结果进入系统时的界面:二进制转换为八进制:十进制转换为十六进制:十六进制转换为十进制:5 设计总结我的收获虽然在高中我们已经学了C语言,大一我们已经学习了C++语言,但是,直到本期我们才开设了数据结构这一门课程。