Exemplo n.º 1
0
//function calculates waiting time and q length
float multitaskQ(Task * task0, Task * task1, float * wait0, float * wait1, float * qL)
{
	float currentT = 0;
	int i = 0;
	int * arrt = malloc(sizeof(int)*MAX_LINE_LENGTH);
	Task * head0 = task0;
	Task * head1 = task1;
	while(task0 != NULL &&  task1 !=NULL)		
	{
		if( task1->aritime <= currentT && task0->aritime > currentT )//group 1 has already arrived but not group 0 before previous job done
		{
			* wait1 += (currentT-task1->aritime);
			arrt[i++] = task1->aritime;
			task1->tlq = currentT;
			currentT += task1->stime;
			task1 = task1->next;
		}
		else if(task0->aritime <= currentT) // group 0 arrived before previous job done
		{
			* wait0 += (currentT-task0->aritime);
			arrt[i++] = task0->aritime;
			currentT += task0->stime;
			task0->tlq = currentT - task0->stime;
			task0 = task0->next;
		}
		else if( task1->aritime < task0->aritime)//group 1 arrived first in server's free time
		{
    		arrt[i++]= task1->aritime;
			currentT = task1->aritime + task1->stime;
			task1->tlq = currentT - task1->stime;
			task1 = task1->next;
		}
		else if(task1->aritime >= task0->aritime)//group 0 arrived dirst in server's free time
		{
    		arrt[i++] = task0->aritime;
			currentT = task0->aritime + task0->stime;
			task0->tlq = currentT - task0->stime;
			task0 = task0->next;
		}
		
	}
	while(task0 != NULL && task1 == NULL)//all of group1 have been served
	{
		if(task0->aritime <= currentT)
		{
			* wait0 += (currentT - task0->aritime);
    		arrt[i++] = task0->aritime;
			currentT += task0->stime;
			task0->tlq = currentT - task0->stime;
			task0 = task0->next;
		}
		else
		{
    		arrt[i++] = task0->aritime;
			currentT = task0->aritime + task0->stime;
			task0->tlq = currentT - task0->stime;
			task0 = task0->next;
		}

	}
	while(task1 != NULL && task0 == NULL)//all of group1 have been served
	{
		if( task1->aritime <= currentT)
		{
			*wait1 += (currentT - task1->aritime);
			arrt[i++] = task1->aritime;
			task1->tlq = currentT;
			currentT += task1->stime;
			task1 = task1->next;
		}
		else
		{
    		arrt[i++] = task1->aritime;
			currentT = task1->aritime + task1->stime;
			task1->tlq = currentT - task1->stime;
			task1 = task1->next;
		}
	}


	i = checka(arrt,i);
	int j;
	for(j = 0; j < i; j++)
	{
		* qL += qLength(head0,head1,arrt,j);
	}
	free(arrt);
	return currentT;
}
int main(int argc, char *argv[])
{
    // Define basic variables.
    int input;
    productList *products;
    Queue *q;
    
    // Allocate memory for pointers.
    products = newProductList();
    q = newQueue();
    
    // Load product-price data store and assert that it succeeded.
    if(loadProductList(products, "priceList.csv")!=0)
    {
                                wait();
                                exit(-1);
    }
    
    queueInit(q); // Initialize queue.

    setAppTitle("SUPER MARKET COUNTER");
    
    showSplash("splash.txt");
    
    getch();
    
    // Loops the menu till user chooses to exit.
    do
    {
        // Declare menu options.
        char mainMenu[][16]={"Arrive", "Process", "Print", "Front", "Rear", "Length", "Exit"};
        
        // Display menu and receive user input.
        input = showMenu("Main Menu", mainMenu, 7);
        
        // Choose a function based on user input.
        switch(input)
        {
                        case 1:
                             qArrive(q, products);
                             break;
                             
                        case 2:
                             qProcess(q);
                             break;
                             
                        case 3:
                             qPrint(q);
                             break;
                             
                        case 4:
                             qFront(q);
                             break;
                                  
                        case 5:
                             qRear(q);
                             break;
                                  
                        case 6:
                             qLength(q);
                             break;
                                  
                        case 7:
                                  qExit(q, products);
                                  break;
                                  
                        default: 
                                 printf("Invalid Menu Option. Try again!");
                                 wait();
                                 continue;
        };    
    }while(1);
    
    return 0;
}