📄 lab_5.cpp
字号:
//#include<graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "draw.h"
#include<time.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct
{
int num;//表示机器数量
int time[10];//表示机器完成时间
}machines;
typedef struct
{
int num;//表示工件数目
int sequence[MAXSIZE][MAXSIZE];//表示工件i的第j道工序在机器seguence[i][j]加工
int p[MAXSIZE][MAXSIZE];//表示工件i的第j道工序在机器seguence[i][j]的处理时间
int finish[MAXSIZE][MAXSIZE];//表示第i个工件的第j道工序的实际完成时间
int begin[MAXSIZE][MAXSIZE];//表示第i个工件的第j道工序的开始时间
}works;
machines * machine=NULL;
works * work=NULL;
int s[MAXSIZE]={1,1,1,1,1};//s[i]用来表示每个机器上完成的工序树
int GX[MAXSIZE][MAXSIZE];//表示工序号
int Order[MAXSIZE][MAXSIZE];//表示工件号
int ss[50][50];
int draw(); //定义画图函数
work = (works *)malloc(sizeof(works)*1);
machine = (machines *)malloc(sizeof(machines)*1);
int Max(int i,int j)
{
if(i>=j)
return i;
else
return j;
}
void paixu(int m)
{
int i,j,temp,temp1,temp2;
int k=1;
for(i=1;i<=work->num;i++,k++)
ss[m][k]=i;
for(i=1;i<=work->num;i++)
{//对每个机器上的工件按时间大小排序
for(j=1;j<=work->num-i;j++)
//if(work->sequence[s[k]][m]==work->sequence[j][m])
if(work->p[j][m]<work->p[j+1][m])
{
temp1=work->sequence [j][m];
work->sequence [j][m]=work->sequence [j+1][m];
work->sequence [j+1][m]=temp1;
temp=ss[m][j];
ss[m][j]=ss[m][j+1];
ss[m][j+1]=temp;
// k=j;
temp2=work->p[j][m];
work->p [j][m]=work->p[j+1][m];
work->p[j+1][m]=temp2;
}
}
for(i=1;i<=work->num;i++)
{
printf("%d %d \n",work->sequence[i][m],work->p[i][m]);
}
for(i=1;i<=work->num;i++)
for(j=0;j<machine->num;j++)
{
printf("%d, %d %d ",ss[j][i],work->sequence[i][j],work->p[i][j]);
if(j==machine->num)
printf("\n");
}
}
void Time_Seek(int m)
{
int i,k=1,n;
for(i=1;i <= work->num ;i++)
{//对每个工作遍历,计算相应时间
n=work->sequence[i][m];//工件i的第m道工序所在机器
work->begin[i][m] = Max(machine->time[n],work->finish[i][m-1]);////第i个工件的第m道工序的完成时间
machine->time[n] = work->finish[i][m] = work->begin[i][m] + work->p[i][m]; //第i个工件的第m道工序的完成时间
Order[n][s[n]++] = ss[m][i];//在machine[m]机器上工作的工件
GX[n][ss[m][i]]=m;//记录相应的工序号
printf("\t开始时间是:%d",work->begin[i][m]);
printf("\t完成时间是:%d\n",work->finish[i][m]);
}
}
void main()
{
FILE*fp;
char filename[10];
int i,j;
int result = 0;
clock_t start,end;
work = (works *)malloc(sizeof(works)*1);
machine = (machines *)malloc(sizeof(machines)*1);
printf("please input the filename to test:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("can not open the file");
return;
}
start=clock();
fscanf(fp,"%d %d",&work->num,&machine->num);
printf("%d %d\n",work->num,machine->num);
for(i=1;i<=work->num;i++)
for(j=1;j<=machine->num;j++)
{//读取文件并初始化
fscanf(fp," %d %d",&work->sequence[i][j],&work->p[i][j]);
work->finish[i][j] = 0;
work->finish[i][0] = 0;
work->begin[i][j] = 0;
}
fclose(fp);
for(i=0;i<machine->num;i++)
machine->time[i] = 0;
for(i=1;i<=work->num;i++)
for(j=1;j<=machine->num;j++)
{
printf("%d %d ",work->sequence[i][j],work->p[i][j]);
if(j==machine->num)
printf("\n");
}
for(i=1;i<=machine->num;i++)//求每工件每道工序的完成
paixu(i);
for(i=1;i<=machine->num;i++)//求每工件每道工序的完成
Time_Seek(i);
for(i=0;i<machine->num;i++)
{//求最后时间结果
if(machine->time[i] > result)
result = machine->time[i];
}
printf("\nthe result of this test is:%d\n",result);
end=clock();
printf("the running time is %f\n",(double)(end - start)/CLK_TCK);
for(i = 0;i<machine->num;i++)
{
printf("machine[%d]:\n",i);
for(j =1;j<=work->num;j++)
{
printf("\t工件%d,工序%d",Order[i][j],GX[i][Order[i][j]]);
printf("\t开始时间是:%d",work->begin[Order[i][j]][GX[i][Order[i][j]]]);
printf("\t完成时间是:%d\n",work->finish[Order[i][j]][GX[i][Order[i][j]]]);
}
}
draw();
printf("the running time is %f\n",(double)(end - start)/CLK_TCK);
}
int draw()
{//画图函数,用颜色代表零件,表示零件的工序在哪台机器上运行
unsigned long color[15]={
ezdBlue,
ezdTeal,
ezdGreen,
ezdBrown,
ezdPurple,
ezdTurquoise,
ezdRed,
ezdOrange,
ezdDarkGray,
ezdLightBlue,
ezdLightGray,
ezdGold,
ezdWhite,
ezdPink,
ezdYellow
};
char text[200] = "machine[0] machine[1] machine[2] machine[3] machine[4]";
int fx = 7;
int fy = 7;
int h = 150;//固定图中机器的高度
int w = 12;//固定图中零件宽度
int distance = 20;//图中两机器间的间隔
int i,x1,x2,j;
openWindow();
ezdSetColor(ezdBlue);
ezdDrawText(text,fx,4); //从点(x,4)开始,输出一串文字
char tasord[2];
char dot[2] =".";
for(i=0;i<machine->num;i++)
{
x1=fx+distance*i;
x2=fx+distance*i+w;
ezdDrawRectangle(x1,fy,x2,h); //由两点绘机器空间
fy = 7;
for(j=1;j<=work->num;j++)
{
ezdSetColor(color[Order[i][j]]);
ezdDrawRectangle(x1,fy,x2,fy+6); //由两点绘表示零件的矩形
ezdSetColor(ezdBlack);
ezdDrawText(itoa(Order[i][j],tasord,10),x1+4,fy+3);
ezdDrawText(dot,x1+4,fy+3);
ezdDrawText(itoa(GX[i][Order[i][j]],tasord,10),x1+8,fy+3);//输出文字部分,标记该机器对于的工件工序
fy = fy+6;
}
}
getch();
viewWindow();
closeWindow();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -