综合编程实验报告--值班安排.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
综合编程实验报告--值班安排

“程序设计(Ⅱ)”综合编程实验报告 ( 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组条件,要求能够根据输入的条件确定唯一的值班表,且输入的n组条件中能够直接或间接得到任意两位大夫的关联关系,例如上面的条件(2)直接显示了D与E间的关系,而通过条件(1)、(6)、(5)可以间接得到A与B的关系。 条件的输入格式有2种: 格式1:编号 比较运算符 编号 天数 其中比较运算符有2种: 或 ,分别表示“早”或“晚” 例如:AC1 表示:A大夫比C大夫晚1天值班 格式2:编号 = 数值 例如:F=4 表示:F大夫在星期四值班 输入输出示例 7 AC1 DE1 EB2 BG4 FB1 FC1 F=4 EDBFCAG 二、系统设计 1、解题思路 通过寻找有等号的条件,确定其医生的位置,然后把这个医生及其位置作为已知的结点,寻找与该医生有关的条件,确定另一位医生的位置,并把该位医生作为结点,继续寻找,以此递归。 2、数据结构描述 可以定义一个二维字符数组保存条件数据,大小为10*20,但从a[1]开始存放,以便与输入数据(位置值)匹配,另外用a[][0]来标记条件,还有定义为全局变量,因为函数里要用到。 3、程序框架结构 定义全局字符数组s[30]来存放排好序的医生的位置。 定义 void func(char node,int ka); 4、关键算法描述 (1)初始化用来存放顺序的数组为0 for(i=0;i=29;i++)//初始化用来存放顺序的数组为0 s[i]=0; (2)存放测试数据的条件及标记这些条件 for(i=1;i=n;i++)//存放测试数据的条件及标记这些条件 { a[i][0]=0; scanf(%s,a[i][1]); } (3)寻找条件中有等于号的,确定该位医生的值班时间,并通过该位医生 确定其他与这位医生有关医生的值班时间 for(i=1;i=n;i++)//寻找条件中有等于号的,确定该位医生的值班时间, //并通过该位医生确定其他与这位医生有关医生的值班时间 { if(a[i][2]===) { ka=a[i][3]-0; s[ka]=a[i][1]; node=a[i][1]; a[i][0]=1;//把已确定时间的条件标记为1,避免再次确定位置(避免重复搜索该条件) func(node,ka);//调用函数,确定与该医生有关系的医生的值班时间 } } (4) 考虑有些条件没有等于号,且还未确定值班时间的医生,通过假设该医生的位置,同时确定与该医生有关的医生值班时间 for(i=1;i=n;i++)//考虑有些条件没有等于号,且还未确定值班时间的医生,通过假设该医生的位置,同时确定与该医生有关的医生值班时间 { if(a[i][0]==0)//判断是否被标记过 { node=a[i][1]; s[20]=node;//假设该医生的时间是在20 ka=20;//记录该医生的位置 func(node,ka);//同过函数,确定与该医生有关的医生与该医生的相对位置 } } (5) 星期一到星期五是否都有医生值班 for(i=1;i=7;i++)//判断星期一到星期五是否都有医生值班 if(s[i]==0) { aa=i; flag=1;//如果哪一天没人值班,记下那一天的时间并把flag标记为1; break; } (6) 通过假设的位置,填充到数组的相应位置 if(flag==1)//通过假设的位置,填充到数组的相应位置 { for(i=10;i=29;i++) if(s[i]!=0) { ab=i; break; } for(i=aa;i=7;i++) { if(s[i]==0) s[i]=s[ab-aa+i]; }

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档