“程序设计(Ⅱ)”综合编程实验报告 ( 2011 – 2012 学年第 2 学期) 实验项目名称: 值班安排 学生姓名: 钱雪峰 专业班级: 计算 1103 学号: 31101178 一、实验内容与要求 医院有 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 种:> 或 < ,分别表示“早”或“晚” 例如:AB2 B>G4 FC1 F=4 EDBFCAG 7 CF1 DC1 BCFAEGD 6 AG5 F=1 FBACDEG 二、系统设计 1、解题思路 分三种情况讨论 1、 带有“=”的情况:这类情况只需先把确定日期的医生排好,然后通过和已经确定的医生比较来确定其他医生的值班情况,剩下的再和之前确定的医生比较,以此类推 2、 没有“=”的情况:只需要定义一个一维 14 长度的数组,然后将第一个医生放入第 7 个位置,再依次和这位医生比较确定其他医生,剩下的再和之前确定的医生比较,以此类推 3、 有“=”但其他条件和有“=”的无关联:先按照情况 2 排好然后将剩下的填入空缺,如果是星期一则放在第一个,星期天则放在最后 2、数据结构描述 存储条件的数组 char [100][5]; 第一种情况定义了数组 char c[7]来存储给出确定值班日期的医生,用一个一维7 长度的数组 int p[7]用来存储每个医生值班的时间,并且用一个二维数组来存储每两个医生之间的值班关系; 第二种情况定义了一个一维 14 长度的数组 char pi[14]用来存放值班医生从中间开始放,用数组 int f[100]来存储下一个和前一字母条件相关联的字幕的位置,用数组 int libai[7]来存储给出确定值班日期的医生; 第三种情况则是前两种情况的结合,所以不用再另外定义 4、 程序框架结构 主函数 int main() 子函数 int set()用来输出第一种情况的结果; 主函数程序流程图: 输入所有条件含有“=”条件但此条件中医生和其他条件无关联 含有“=”条件且此条件中医生和其他条件有关联 不含“=”的条件将含“=”的已确定值班日期医生排入数组,然后找出和这名医生有关联的医生排入值班表,再找出和刚排入值班表的医生有关联的医生排入值班表,以此类推 从第一个不是“NULL”的字符开始输出 将第一个出现在条件中医生存 储 在 pi[7]然后找出和这名医生有关联的医生排入值班表,再找出和刚排入值班表的医生有关联的医生排入值班表,以此类推,其余的用NULL代替用第三种情况的方法将没有“=”条件的医生排入数组 pi中,将含“=”的条件存储在数组 libai 中其余的用 NULL代替,保存一个数据代表在pi 中第一个医生之前的值班医生数量,在pi 中空出来,依次将 pi 中NULL 的地方填入 libai 中已确定值班日期的医生 调用子函数: 按照数组中存储的顺序输出医生值班顺序 5、 关键算法描述 保存所有有关联的医生值班相差的日期,+表示早-表示晚 for(i=0;i') { m[b][a]=-(s[i][3]-'0'); m[a][b]=-m[b][a]; } else { m[a][b]=-(s[i][3]-'0'); m[b][a]=-m[a][b]; } } 没有“=”条件,将打一个医生排在 pi[7]的算法 pi[7]=s[0][0]; f[0]=7; l=1; num=1; while(num<=n){ for(i=0;i') t=s[j][3]-'0'; else t=-(s[j][3]-'0'); f[l]=f[i]+t; pi[f[l]]=s[j][2]; l++; s[j][0]='0'; num++; } else if(s[j][0]!='0'&&s[j][2]==pi[f[i]]){ if(s[j][1]=='>') t=-(s[j][3]-'0'); else t=s[j][3]-'0'; f[l]=f[i]+t; pi[f[l]]=s[j][0]; l++; s[j][0]='0'; num++; } } } 将含“=”但与其他条件不相关的医生存入以确定的无“=”的顺序之中 for(i=0;i<14;i++){ if(pi[i]!=NULL){ qi=i; break; } } for(i=0;i<7;i++){ if(libai[i]!=NULL)qi-=1; else break; } k=0; for(i=qi;i #include static int m[7][7]; int p[7]={-1,-1,-1,-1,-1,-1,-1}; void set(int min,int n) { int i; for(i=0;i-1||m[min][i]==0)continue; p[i]=m[min][i]+p[min]; set(i,n); } } int main() { int f[100],l=0,n,i,j,k=0,num=0,a,b,count=0,t,ji=0,qi; char s[100][5],pi[14],c[7],libai[7]; scanf("%d",&n); for(i=0;i=1){ for(j=0;jcount){ for(i=0;i') { m[b][a]=-(s[i][3]-'0'); m[a][b]=-m[b][a]; } else { m[a][b]=-(s[i][3]-'0'); m[b][a]=-m[a][b]; } } for(i=0;i<7;i++) { if(p[i]>-1)set(i,7); } for(i=0;i<7;i++){ for(b=0;b<7;b++){ if(p[b]==i){ putchar(b+'A'); } } } puts(""); } else if(count==ji){ pi[7]=s[0][0]; f[0]=7; l=1; num=1; while(num<=(n-count)){ for(i=0;i') t=s[j][3]-'0'; else t=-(s[j][3]-'0'); f[l]=f[i]+t; pi[f[l]]=s[j][2]; l++; s[j][0]='0'; num++; } else if(s[j][0]!='0'&&s[j][2]==pi[f[i]]&&s[j][1]!='='){ if(s[j][1]=='>') t=-(s[j][3]-'0'); else t=s[j][3]-'0'; f[l]=f[i]+t; pi[f[l]]=s[j][0]; l++; s[j][0]='0'; num++; } } } } for(i=0;i<14;i++){ if(pi[i]!=NULL){ qi=i; break; } } for(i=0;i<7;i++){ if(libai[i]!=NULL)qi-=1; else break; } k=0; for(i=qi;i') t=s[j][3]-'0'; else t=-(s[j][3]-'0'); f[l]=f[i]+t; pi[f[l]]=s[j][2]; l++; s[j][0]='0'; num++; } else if(s[j][0]!='0'&&s[j][2]==pi[f[i]]){ if(s[j][1]=='>') t=-(s[j][3]-'0'); else t=s[j][3]-'0'; f[l]=f[i]+t; pi[f[l]]=s[j][0]; l++; s[j][0]='0'; num++; } } } } for(i=0;i<14;i++){ if(pi[i]!=NULL) printf("%c",pi[i]); } printf("\n"); } return 0; }