“程序设计Ⅱ ”综合编程实验报告  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 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){ scanf("%s",s[i]); libai[i]=NULL; pi[i]=NULL; if(s[i][1]=='='){ } count++; libai[s[i][2]-'1']=s[i][0]; c[k++]=s[i][0]; for(j=0;jcount){ for(i=0;i') { } else p[s[i][0]-'A']=s[i][2]-'1'; m[b][a]=-(s[i][3]-'0'); m[a][b]=-m[b][a]; } else if(count==ji){ } for(i=0;i<7;i++) { } for(i=0;i<7;i++){ } puts(""); { } m[a][b]=-(s[i][3]-'0'); m[b][a]=-m[a][b]; if(p[i]>-1)set(i,7); for(b=0;b<7;b++){ } if(p[b]==i){ } putchar(b+'A'); pi[7]=s[0][0]; f[0]=7; l=1; num=1; while(num<=(n-count)){ for(i=0;i') else f[l]=f[i]+t; pi[f[l]]=s[j][2]; l++; s[j][0]='0'; num++; t=s[j][3]-'0'; t=-(s[j][3]-'0'); if(s[j][1]=='>') else f[l]=f[i]+t; pi[f[l]]=s[j][0]; t=-(s[j][3]-'0'); t=s[j][3]-'0'; } else{ } } for(i=0;i<14;i++){ } for(i=0;i<7;i++){ } k=0; for(i=qi;i') t=s[j][3]-'0'; t=-(s[j][3]-'0'); f[l]=f[i]+t; l++; s[j][0]='0'; num++; if(s[j][1]=='>') t=-(s[j][3]-'0'); t=s[j][3]-'0'; f[l]=f[i]+t; } return 0; } for(i=0;i<14;i++){ } printf("\n"); } if(pi[i]!=NULL) printf("%c",pi[i]);