/*
trabalho em pilha e fila:
- elaborar um programa em C que faça a simulação de uma fila de espera para um restaurante, nesse programa a recepcionista cadastra as seguintes informações quando o
cliente chega:
* nome
* qtd pessoas
* hora de chegada
# situação inicial:
* esperando = os garçons em outro terminal irão monitorar as mesas disponiveis e suas respectivas vagas.
Assimque houver vaga para as pessoas na espera, avisam o recepcionista que confirma o atendimento preenchendo a
HORA E O NUMERO DA MESA. situação Na mesa:
Seq nome op h.ent h.ate mesa h.saida sh
1 joao gordo 3 11.30 11.45 05 12.00 atendido
2 bororo 5 11.40 cancelado
3 bruna 2 11.48 esperando
4 bob 2 10.05 12.15 15 na mesa
op: 1-cadastrar 2- atender 3- cancelar 4-baixar 5-sair
caso algum cliente desista da fila, o recepcionista CANCELA a espera da mesa dele (OP3) atravez do numero sequencial,
porem o lancamento ainda fica na fila com a situação cancelado.
se ele for atendido (op2), apos a confirmação do pagamento o caixa faz a baixa (op4) do atendimento registrando a hora
da saida e mudando a situação para atendido. (obs: mesa fica livre).
na opção sair (op5) o sistema devera desenfilerar a relação de clientes, e para cada cliente que sair da fila com a situação
"atendido" ou "cancelado" deverá cancelar o tempo de espera de permanencia copiando estas informações para uma pilha para
calculo estatico. mostrar no final a estatistica ao desempilhar:
-> Atendidos x Cancelados.
-> Media do tempo de espera.
-> Media do tempo de atendimento.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct Cliente {
int seq;
char nome[30];
int qpessoas;
char horcheg[6];
char horate[6];
char nmesa[3];
char horsaida[6];
char sit[15];
struct Cliente *prox;
};
typedef struct Cliente cliente;
int tam;
int menu(void);
void opcao(cliente *FILA, int op);
void inicia(cliente *FILA);
int vazia(cliente *FILA);
cliente *aloca();
void insere(cliente *FILA);
void libera(cliente *FILA);
void atender(cliente *FILA);
void cancelar(cliente *FILA);
void baixar(cliente *FILA);
cliente *procura(int seq, cliente *FILA);
int main(void) {
cliente *fila = (cliente *) malloc(sizeof(cliente));
if(!fila){
printf("Sem memoria disponivel!\n");
exit(1);
}
else {
inicia(fila);
int opt;
do{
opt=menu();
opcao(fila,opt);
}while(opt != 5);
free(fila);
return 0;
}
}
int menu(void) {
int opt;
printf("Escolha a opcao:\n\n");
printf("1. Cadastrar\n");
printf("2. Atender\n");
printf("3. Cancelar\n");
printf("4. Baixar\n");
printf("5. Sair\n");
printf("\nOpcao: ");
scanf(" %d", &opt);
return opt;
}
void opcao(cliente *FILA, int op) {
cliente *tmp;
switch(op){
case 1:
insere(FILA);
break;
case 2:
atender(FILA);
break;
case 3:
cancelar(FILA);
break;
case 4:
baixar(FILA);
break;
case 5:
libera(FILA);
break;
default:
printf("Comando invalido\n\n");
}
}
void copiaString(char destino[], char origem[])
{
int i;
for(i = 0; origem[i] != 0 ; ++i)
destino[i] = origem[i];
}
void inicia(cliente *FILA) {
FILA->prox = NULL;
tam=0;
}
int vazia(cliente *FILA) {
if(FILA->prox == NULL)
return 1;
else
return 0;
}
cliente *aloca() {
cliente *novo=(cliente *) malloc(sizeof(cliente));
if(!novo){
printf("Sem memoria disponivel!\n");
exit(1);
} else{
novo->seq = tam + 1;
printf("\nNome: ");
scanf(" %[^\n]", novo->nome);
printf("Quantidade de pessoas: ");
scanf(" %d", &novo->qpessoas);
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
copiaString(novo->sit, "esperando");
printf("Hora de Chegada %d:%d\n\n",timeinfo->tm_hour, timeinfo->tm_min);
return novo;
}
}
void insere(cliente *FILA) {
cliente *novo=aloca();
novo->prox = NULL;
if(vazia(FILA))
FILA->prox=novo;
else{
cliente *tmp = FILA->prox;
while(tmp->prox != NULL)
tmp = tmp->prox;
tmp->prox = novo;
}
tam++;
}
cliente *procura(int seq, cliente *FILA) {
if(vazia(FILA)){
printf("Fila vazia!\n\n");
return NULL;
}
cliente *tmp;
tmp = FILA->prox;
printf("Fila :");
while( tmp != NULL && tmp->seq != seq){
tmp = tmp->prox;
}
return tmp;
}
void atender(cliente *FILA) {
int opt;
cliente *tmp;
char horate[6];
printf("Cliente: ");
scanf(" %d", &opt);
tmp = procura(opt, FILA);
if(tmp != NULL) {
copiaString(tmp->sit,"na mesa");
printf("Horario de atendimento: ");
scanf(" %[^\n]",horate);
copiaString(tmp->horate, horate);
}
}
void cancelar(cliente *FILA) {
int opt;
cliente *tmp;
printf("Cliente: ");
scanf(" %d", &opt);
tmp = procura(opt, FILA);
if(tmp != NULL) {
copiaString(tmp->sit,"cancelado");
}
}
void baixar(cliente *FILA) {
int opt;
cliente *tmp;
char horsai[6];
printf("Cliente: ");
scanf(" %d", &opt);
tmp = procura(opt, FILA);
if(tmp != NULL) {
copiaString(tmp->sit,"atendido");
printf("Horario de saida: ");
scanf(" %[^\n]",horsai);
copiaString(tmp->horsaida, horsai);
}
}
int converteint(char a, char b) {
return (a-48) *10 + (b-48);
}
int calculatempo(char horini[], char horfim[]) {
int horaini = converteint(horini[0], horini[1]);
int minini = converteint(horini[3], horini[4]);
int horafim = converteint(horfim[0],horfim[1]);
int minfim = converteint(horfim[3],horfim[4]);
horaini = horaini * 60;
horaini = horaini + minini;
horafim = horafim * 60;
horafim = horafim + minfim;
return horafim - horaini;
}
void libera(cliente *FILA) {
if(!vazia(FILA)){
cliente *proxNode;
cliente *atual;
atual = FILA->prox;
while(atual != NULL){
proxNode = atual->prox;
free(atual);
atual = proxNode;
}
}
}