⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lab_5.cpp

📁 有m台不同的机器
💻 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 + -