综合编程实验报告--值班安排_第1页
综合编程实验报告--值班安排_第2页
综合编程实验报告--值班安排_第3页
综合编程实验报告--值班安排_第4页
综合编程实验报告--值班安排_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、“程序设计()”综合编程实验报告 ( 2012 - 2013 学年第 2 学期)实验项目名称: 值班安排 一、实验内容与要求医院有A、B、C、D、E、F、G 7位大夫,在一星期内(星期一至星期天)每人要轮流值班一天,如果已知:(1)A大夫比C大夫晚1天值班;(2)D大夫比E大夫晚1天值班;(3)E大夫比B大夫早2天值班(4)B大夫比G大夫早4天值班;(5)F大夫比B大夫晚1天值班;(6)F大夫比C大夫早1天值班;(7)F大夫星期四值班。就可以确定周一至周日的值班人员分别为:E、D、B、F、C、A、G。编写程序,根据输入的条件,输出星期一至星期天的值班人员。输入数据时,先输入一个整数n,再输入n

2、组条件,要求能够根据输入的条件确定唯一的值班表,且输入的n组条件中能够直接或间接得到任意两位大夫的关联关系,例如上面的条件(2)直接显示了D与E间的关系,而通过条件(1)、(6)、(5)可以间接得到A与B的关系。条件的输入格式有2种:格式1:编号 比较运算符 编号 天数其中比较运算符有2种:> 或 < ,分别表示“早”或“晚”例如:A<C1 表示:A大夫比C大夫晚1天值班格式2:编号 = 数值例如:F=4 表示:F大夫在星期四值班输入输出示例7A<C1D<E1E>B2B>G4F<B1F>C1F=4EDBFCAG二、系统设计1、解题思路通过寻

3、找有等号的条件,确定其医生的位置,然后把这个医生及其位置作为已知的结点,寻找与该医生有关的条件,确定另一位医生的位置,并把该位医生作为结点,继续寻找,以此递归。2、数据结构描述可以定义一个二维字符数组保存条件数据,大小为10*20,但从a1开始存放,以便与输入数据(位置值)匹配,另外用a0来标记条件,还有定义为全局变量,因为函数里要用到。3、程序框架结构定义全局字符数组s30来存放排好序的医生的位置。定义 void func(char node,int ka);4、关键算法描述(1)初始化用来存放顺序的数组为'0'for(i=0;i<=29;i+)/初始化用来存放顺序的数

4、组为'0'si='0'(2)存放测试数据的条件及标记这些条件for(i=1;i<=n;i+)/存放测试数据的条件及标记这些条件ai0='0'scanf("%s",&ai1);(3)寻找条件中有等于号的,确定该位医生的值班时间,并通过该位医生 确定其他与这位医生有关医生的值班时间for(i=1;i<=n;i+)/寻找条件中有等于号的,确定该位医生的值班时间,/并通过该位医生确定其他与这位医生有关医生的值班时间if(ai2='=')ka=ai3-'0'ska=ai1;node=a

5、i1;ai0='1'/把已确定时间的条件标记为'1',避免再次确定位置(避免重复搜索该条件)func(node,ka);/调用函数,确定与该医生有关系的医生的值班时间(4) 考虑有些条件没有等于号,且还未确定值班时间的医生,通过假设该医生的位置,同时确定与该医生有关的医生值班时间for(i=1;i<=n;i+)/考虑有些条件没有等于号,且还未确定值班时间的医生,通过假设该医生的位置,同时确定与该医生有关的医生值班时间if(ai0='0')/判断是否被标记过node=ai1;s20=node;/假设该医生的时间是在20ka=20;/记录该医生

6、的位置func(node,ka);/同过函数,确定与该医生有关的医生与该医生的相对位置(5) 星期一到星期五是否都有医生值班for(i=1;i<=7;i+)/判断星期一到星期五是否都有医生值班if(si='0')aa=i;flag=1;/如果哪一天没人值班,记下那一天的时间并把flag标记为1;break;(6) 通过假设的位置,填充到数组的相应位置 if(flag=1)/通过假设的位置,填充到数组的相应位置for(i=10;i<=29;i+)if(si!='0')ab=i;break;for(i=aa;i<=7;i+)if(si='0

7、')si=sab-aa+i; (7) 输出医生值班的顺序表for(i=1;i<=7;i+)/输出医生值班的顺序表printf("%c",si);putchar(10);/换行(8) 实现用已知医生及位置确定与其相关的医生的位置void func(char node,int ka)/实现用已知医生及位置确定与其相关的医生的位置char node1,ka1,kb1;int j;for(j=1;j<=n;j+)if(aj0!='1')/判断是否已确定位置的条件if(aj1=node|aj3=node)/判断是否与已知的医生有关的条件aj0=&#

8、39;1'/把该条件标记为'1',避免再次使用/确定该条件中还未确定位置的另一位医生的位置if(aj1!=node)if(aj2='<')kb1=aj4-'0'elsekb1=-(aj4-'0');ska+kb1=aj1;node1=aj1;ka1=ka+kb1;func(node1,ka1);/把该医生作为已知位置的医生来确定其他与这医生有关的医生elseif(aj2='<')kb1=-(aj4-'0');elsekb1=(aj4-'0');ska+kb1=aj

9、3;node1=aj3;ka1=ka+kb1;func(node1,ka1);/把该医生作为已知位置的医生来确定其他与这医生有关的医生三、测试用例测试用例1:输入:7A<C1 D<E1 E>B2 B>G4 F<B1 F>C1 F=4输出:EDBFCAG测试用例2:输入:6A>B1 B>C1 C>D1 D>E1 E>F1 F>G1输出:ABCDEFG测试用例3:输入:7B>D2 D=3 A>D1 C<A2 E<A5 G=6 F>G1输出:BADCFGE测试用例4:输入:6A>B1 C<

10、;B1 C>D1 D>E1 E>F1 G=7输出:ABCDEFG测试用例5:输入:6A>B1 C<B1 C>D1 D>E1 E>F1 G=1输出:GABCDEF测试用例6:输入:7A<C1 D<E1 E>B3 B>G3 F>B1 F>C2 F=3输出:EDFBCAG测试用例7:输入:8A>B1 D<C1 B>E3 E<C2 E=5 F<E1 G<D3 G=7输出:ABCDEFG四、总结介绍程序的完成情况,有待改进之处,以及有何收获、体会等。我觉得我完成的速度和情况还算不错,当

11、然刚开始的时候考虑的方面有限,只考虑到买个医生必须都出现,而且必需直接或间接知道两两医生的相对位置,虽然这就是题目的要求的内容,但作为一个编程的爱好者,我自然加入了一些个人的想法,如:不能直接知道两两医生的相对位置,但可以估测其他医生的位置,且具有唯一真值,如:输入:6A>B1 C<B1 C>D1 D>E1 E>F1 G=7输出:ABCDEFG只知道g的位置和a到f的相对位置,那么a到f只能在星期一到星期六的位置,因此得出星期一到星期日的值班安排。我还是有一些想到的bug,但还是没想到解决办法,这也是这程序的不完美之处,如:5A>C2 C>D1 D&g

12、t;G3 G=7 E>F1这时的答案应为:ABCDEFG收获:在编程时,但我的到我要的预期效果,我会感到很高兴。#include<stdio.h>char s30,a2010;/用来存放值班顺序及题目该给的条件int n;void func(char node,int ka)/实现用已知医生及位置确定与其相关的医生的位置char node1,ka1,kb1;int j;for(j=1;j<=n;j+)if(aj0!='1')/判断是否已确定位置的条件if(aj1=node|aj3=node)/判断是否与已知的医生有关的条件aj0='1'/

13、把该条件标记为'1',避免再次使用/确定该条件中还未确定位置的另一位医生的位置if(aj1!=node)if(aj2='<')kb1=aj4-'0'elsekb1=-(aj4-'0');ska+kb1=aj1;node1=aj1;ka1=ka+kb1;func(node1,ka1);/把该医生作为已知位置的医生来确定其他与这医生有关的医生elseif(aj2='<')kb1=-(aj4-'0');elsekb1=(aj4-'0');ska+kb1=aj3;node1=aj

14、3;ka1=ka+kb1;func(node1,ka1);/把该医生作为已知位置的医生来确定其他与这医生有关的医生int main()int i,ka,aa,ab,flag=0;char node;while(scanf("%d",&n)!=EOF)getchar();for(i=0;i<=29;i+)/初始化用来存放顺序的数组为'0'si='0'for(i=1;i<=n;i+)/存放测试数据的条件及标记这些条件ai0='0'scanf("%s",&ai1);for(i=1;i&

15、lt;=n;i+)/寻找条件中有等于号的,确定该位医生的值班时间,并通过该位医生确定其他与这位医生有关医生的值班时间if(ai2='=')ka=ai3-'0'ska=ai1;node=ai1;ai0='1'/把已确定时间的条件标记为'1',避免再次确定位置(避免重复搜索该条件)func(node,ka);/调用函数,确定与该医生有关系的医生的值班时间for(i=1;i<=n;i+)/考虑有些条件没有等于号,且还未确定值班时间的医生,通过假设该医生的位置,同时确定与该医生有关的医生值班时间if(ai0='0')/判断是否被标记过node=ai1;s20=node;/假设该医生的时间是在20ka=20;/记录该医生的位置func(node,ka);/同过函数,确定与该医生有关的医生与该医生的相对位置flag=0;/flag标记为0;for(i=1;i<=7;i+)/判断星期一到星期五是否都有医生值班if(si='0')aa=i;flag=1;/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论