/*****************

 Teoria das Filas - M/G/c/c

 ****************/
 

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>

double acha_s(int c,double u);
double fatorial(int n);
void resultado(double u,double p0,double bigb,double lambda_a,double l,double w,double rho,int simul);

FILE *fptr;

void main(void)
{

double lambda;
double mi;
int c;
double u;
double s;
double p0;
double bigb;
double lambda_a;
double l;
double w;
double rho;
float n;
char resp = 's';
int simul = 1;

fptr=fopen("H:\\fila.out","w");

fprintf(fptr,"M/G/c/c\n");

while(resp == 's' || resp == 'S')
{

clrscr();

printf("\n\tSimulacao #%d",simul);
fprintf(fptr,"\n\n\tSimulacao #%d",simul);
 

do{
printf("\n\nTaxa Media de Chegada  no Sistema de Fila: ");
scanf("%lf",&lambda);
fflush(stdin);
}while(lambda <= 0);

fprintf(fptr,"\n\nTaxa Media de Chegada  no Sistema de Fila:  %lf",lambda);

do{
printf("\nTaxa Media de Servico por Servidor: ");
scanf("%lf",&mi);
fflush(stdin);
}while(mi <= 0);

fprintf(fptr,"\nTaxa Media de Servico por Servidor: %lf",mi);

do{
printf("\nNumero de Servidores e Capacidade do Sistema: ");
scanf("%d",&c);
fflush(stdin);
}while(c <= 0);

fprintf(fptr,"\nNumero de Servidores e Capacidade do Sistema: %d",c);

/*****
Calculo da Intensidade do Trafico
*****/

u = lambda/mi;

/*****
Calculo de s
*****/

s = acha_s(c,u);

/*****
Calculo da Probabilidade dos Servidores estarem Ociosos
*****/

p0 = 1/s;

/*****
Calculo da Probabilidade de Todos os Servidores Estarem Ocupados
*****/

n =  pow(u,c)/fatorial(c);
bigb = n/s;

/*****
Calculo da Taxa de Chegada dentro do Sistema
*****/

lambda_a = lambda * (1 - bigb);

/*****
Calculo do Numero Medio de Clientes no Sistema
*****/

l = u * (1 - bigb);

/*****
Calculo do Tempo Medio que o Cliente Espera no Sistema
*****/

w = l/lambda_a;

/*****
Calculo da Utilizacao do Servidor
*****/

rho = (1 - bigb) * u/c;

resultado(u,p0,bigb,lambda_a,l,w,rho,simul);

simul = simul + 1;
printf("\n\n\n\tDeseja Continuar?");
printf("\n\t(S)im         (N)ao");
resp = getch();
fflush(stdin);

}//fecha o while

fclose(fptr);
}

double acha_s(int c,double u)
{

int i;
double s=0;

for(i=0;i<=c;i++)
 {
   s = s + (pow(u,i)/fatorial(i));

 }

return(s);
}
 

double fatorial(int n)
{
double temp;
int i;

temp = 1;
 if(n>0)
   {
     for(i=1;i<=n;i++)
       {
  temp = temp * i;
       }
   }
 return(temp);

}
void resultado(double u,double p0,double bigb,double lambda_a,double l,double w,double rho,int simul)
{

clrscr();

printf("\n\n\t\tResultado da Simulacao #%d",simul);
fprintf(fptr,"\n\n\t\tResultado da Simulacao #%d",simul);

printf("\n\nIntensidade do Trafico no Sistema: %lf",u);
fprintf(fptr,"\n\nIntensidade do Trafico: %lf",u);

printf("\nTaxa de Utilizacao do Servidor: %lf",rho);
fprintf(fptr,"\nUtizacao do Servidor: %lf",rho);

printf("\nProbabilidade dos Servidores estarem Ociosos: %lf",p0);
fprintf(fptr,"\nProbabilidade dos Servidores estarem Ociosos: %lf",p0);

printf("\nProbabilidade de Todos os Servidores estarem Ocupados: %lf",bigb);
fprintf(fptr,"\nProbabilidade de Todos os Servidores estarem Ocupados: %lf",bigb);

printf("\nTaxa Media de Chegada dentro do Sistema: %lf",lambda_a);
fprintf(fptr,"\nTaxa de Chegada dentro do Sistema: %lf",lambda_a);

printf("\nNumero Medio de Clientes no Sistema: %lf",l);
fprintf(fptr,"\nNumero Medio de Clientes no Sistema: %lf",l);

printf("\nTempo Medio que o Cliente Espera no Sistema: %lf",w);
fprintf(fptr,"\nTempo Medio que o Cliente Espera no Sistema: %lf",w);

}