You are on page 1of 8

#include <stdio.

h>
#include <string.h>
#include <stdlib.h>
#define QUANTIDADE_POLTRONAS 48
/*
As tabelas de poltronas de cada veculo sero representadas
por um vetor de characteres. Neste bloco de constantes so definidos
os caracteres que representaro cada ocupao possvel nas poltronas.
Se houver necessidade de alterao das formas de representao por
algum outro caractere basta efetuar a substituio neste ponto.
*/
const char IDOSO='I';
const char ESTUDANTE='E';
const char PASSAGEM_COMUM='C';
const char ASSENTO_VAGO='-';
/*
Cria a estrutura de uma transacao contendo os campos necessarios
incluindo um ponteiro para o proximo item a fim de criar uma lista
*/
struct transacao{
float valor;
//char descricao[];
struct transacao *proximaTransacao;
};
/*
Cria o tipo Transacao representantdo a estrutura transacao
e cria um objeto listaTransacoes do tipo Transacao que
armazenar as operaes efetuadas, garantindo o controle
do caixa
*/
typedef struct transacao Transacao;
Transacao* listaTransacoes;
/*
Cria a estrutura de um veculo contendo os campos necessarios.
*/
struct veiculo{
char tabelaPoltronas[QUANTIDADE_POLTRONAS];
int idososDisponiveis;
float valorPassagemComum;
char destino[15];
char dataPartida[15];
char horaPartida[15];
int numeroVeiculo;
};
/*
Cria objetos do tipo struct veiculo para cada um dos veculos para o qual
ser disponibilizada a venda de passagens
*/
typedef struct veiculo Veiculo;
Veiculo veiculoSP, veiculoCTB, veiculoBH;
/*Prottipos de funes*/

void inicializarListaTransacoes();
Transacao* inserirTransacao (Transacao *pLista, float num);
void imprimeTransacoes (Transacao *pLista);
void esvaziarBufferEntrada();
int solicitarInt();
void pausar();
void limparTela();
float getValorEstudante(Veiculo *pVeiculo);
float getValorIdoso(Veiculo *pVeiculo);
void inicializarPoltronas(Veiculo *pVeiculo);
void imprimirTicket(int numPoltrona, Veiculo *pVeiculo);
void exibirAssentos(Veiculo *pVeiculo);
int poltronaEstaVaga(int numPoltrona, Veiculo *pVeiculo);
void mnuVenderPassagem(Veiculo *pVeiculo);
void inicializarVeiculos();
void exibirMenuPrincipal();
/*
Inicializa a lista de transaes que representa o fluxo de caixa
*/
void inicializarListaTransacoes(){
listaTransacoes = NULL;
}
/*
Funo para inserir transaes no relatrio de caixa. No deve ser chamada diretamente.
*/
Transacao* inserirTransacao (Transacao *pLista, float num){
Transacao* nova_Transacao = (Transacao*)malloc(sizeof(Transacao));
nova_Transacao->valor = num;
nova_Transacao->proximaTransacao = pLista;
}
/*Funo a ser chamada diretamente para insero de transaes. O objetivo
encapsular uma parte do cdigo necessrio e tornar mais simples a chamada de insero.*/
void registrarTransacao(float num){
listaTransacoes = inserirTransacao(listaTransacoes, num);
}
/*
Imprime o relatrio do caixa e o saldo existente
*/
void imprimeTransacoes (Transacao *pLista){
float total = 0.0;
Transacao* aux;
limparTela();
printf("Movimentacao do Caixa\n\n");
for (aux = pLista; aux !=NULL; aux = aux->proximaTransacao){
printf ("R$%.2f\n", aux->valor);
total += aux->valor;
}
printf("\nO saldo no caixa eh de R$%.2f\n\n", total);
pausar();
}
/*Esvazia o buffer de entrada*/

void esvaziarBufferEntrada(){
char c;
while((c = getchar()) != '\n' && c != EOF);
}
/*Solicita ao usurio que digite um numero. Verifica e trata a possibilidade de di
gitao de
um caractere. Assim se evita o travamento do programa*/
int solicitarInt(){
int valorDigitado;
/*A funo scanf retorna um int indicando a quantidade de atribuies efetuadas com
sucesso.
Se o retorno for menor do que o nmero de atribuies solicitadas significa que h
ouve erro
em alguma delas*/
while (scanf("%d", &valorDigitado)!=1){
esvaziarBufferEntrada();
printf("Digite um numero: ");
}
return valorDigitado;
}
/*Funo para pausar o sistema. Independe do sistema operacional*/
void pausar(){
printf("\nPressione ENTER para continuar.\n");
esvaziarBufferEntrada();
getchar();
}
/*Funo para limpar a tela. Verifica o sistema operacional e
executa o comando adequado*/
void limparTela(){
//#ifdef linux || LINUX || Linux || UNIX
#ifdef linux
system ("clear");
#elif defined WIN32
system ("cls");
#else
printf("\e[H\e[2J");
#endif
}

/*
Calcula e retorna o valor da passagem de estudante para
o veiculo informado. A existncia desta funo facilita
e centraliza a implementaa de uma eventual alterao
no valor da passagem para estudantes
*/
float getValorEstudante(Veiculo *pVeiculo){
return pVeiculo->valorPassagemComum/2;
}
/*
Calcula e retorna o valor da passagem de idoso para

o veiculo informado. A existncia desta funo facilita


e centraliza a implementaa de uma eventual alterao
no valor da passagem para idosos
*/
float getValorIdoso(Veiculo *pVeiculo){
return 0.0;
}
/*
Inicializa a tabela de poltronas do veiculo. Preenchendo
todos os assentos com o indicador de assento vago.
A tabela representada por um vetor de char e o assento vago
representado pelo char definido na constante ASSENTO_VAGO
*/
void inicializarPoltronas(Veiculo *pVeiculo){
int cont;
for(cont=0; cont<QUANTIDADE_POLTRONAS; cont++){
pVeiculo->tabelaPoltronas[cont] = ASSENTO_VAGO;
}
}
/*
Exibe na tela o comprovante de compra da passagem
*/
void imprimirTicket(int numPoltrona, Veiculo *pVeiculo){
limparTela();
printf("*************************************\n");
printf("* Comprovante de Compra de Passagem *\n");
printf("*************************************\n");
printf("Destino %s\n\n", pVeiculo->destino);
printf("Partida as %s do dia %s\n\n", pVeiculo->horaPartida, pVeiculo->d
ataPartida);
printf("Onibus numero: %d Poltrona: %02d\n\n", pVeiculo->numeroVeiculo,
numPoltrona);
pausar();
}
/*
Exibe na tela uma representao das poltronas do veculo
e sua ocupao
*/
void exibirAssentos(Veiculo *pVeiculo){
int numPoltrona;
for(numPoltrona=0; numPoltrona<QUANTIDADE_POLTRONAS; numPoltrona++){
//Quebra uma linha a cada quatro poltronas
if (numPoltrona % 4 == 0){
printf("\n");
}
//Exibe o nmero da poltrona e um character representando sua ocup
ao
printf("%02d| %c | ", numPoltrona+1, pVeiculo->tabelaPoltronas[n
umPoltrona]);
}
}
/*
Verifica se determinada poltrona de determinado veculo se encontra vaga
*/
int poltronaEstaVaga(int numPoltrona, Veiculo *pVeiculo){

if(pVeiculo->tabelaPoltronas[numPoltrona -1]== ASSENTO_VAGO){


return 1;
}
else{
return 0;
}
}
/*
Exibe ao usurio as informaes do destino, os valores das passagens e
a representao das poltronas com sua ocupao. Solicita ao usurio que
informe o numero da poltrona a ser vendida e depois solicita o tipo de
passagem (comum, idoso ou estudante). Por fim realiza a venda, registra
a transao no fluxo de caixa e emite o comprovante de compra
*/
void mnuVenderPassagem(Veiculo *pVeiculo){
//varivel utilizada para armazenar a entrada do usurio
int numPoltrona=0;
do{
limparTela();
printf("Exibindo Assentos Disponiveis para %s\n", pVeiculo->dest
ino);
exibirAssentos(pVeiculo);
printf("\nO valor da passagem comum eh de R$%.2f\n", pVeiculo->v
alorPassagemComum);
printf("Estudantes pagam R$%.2f\n", getValorEstudante(pVeiculo))
;
printf("Idosos pagam R$%.2f (maximo de 2 por veiculo)\n", getVal
orIdoso(pVeiculo));
printf("\nDigite o numero do assento a ser vendido ou -1 para vo
ltar: ");
numPoltrona = solicitarInt();
//Verifica se o usurio selecionou uma poltrona vlida
if (numPoltrona > 0 && numPoltrona <= QUANTIDADE_POLTRONAS){
if (poltronaEstaVaga(numPoltrona, pVeiculo)==1){
int opcao;
printf("Selecionado o assento %d\n", numPoltrona
);
printf("A passagem eh 1-Comum, 2-Idoso ou 3-Estu
dante? ");
opcao = solicitarInt();
switch (opcao){
case 1: //Vende passagem comum
pVeiculo->tabelaPoltronas[numPol
trona-1]= PASSAGEM_COMUM;
registrarTransacao(pVeiculo->val
orPassagemComum);
imprimirTicket(numPoltrona, pVei
culo);
break;
case 3: //Vende passagem estudante
pVeiculo->tabelaPoltronas[numPol
trona-1]= ESTUDANTE;
registrarTransacao(getValorEstud
ante(pVeiculo));
imprimirTicket(numPoltrona, pVei

culo);
break;
case 2: //Vende passagem idoso
//antes de concluir a venda, ver
ifica se ainda h disponibilidade para gratuidades
if (pVeiculo->idososDisponiveis
> 0){
pVeiculo->tabelaPoltrona
s[numPoltrona-1]= IDOSO;
pVeiculo->idososDisponiv
eis--;
registrarTransacao(getVa
lorIdoso(pVeiculo));
imprimirTicket(numPoltro
na, pVeiculo);
}
else{
printf("\n\nAs gratuidad
es para idosos se esgotaram para esta viagem \n\n");
pausar();
}
break;
default:
printf("Opcao invalida\n\n");
pausar();
}
}
else{
printf ("Assento ja ocupado. Por favor selecione
outro assento\n\n");
pausar();
}
}
else if (numPoltrona == -1){
printf("\nVoltando ao Menu\n");
}
else{
printf("\nAssento Invalido\n\n");
pausar();
}
} while (numPoltrona != -1);
}
/*
Inicializa todos os objetos do tipo struct veiculo com as
suas respectivas informaes. Inicializa tambm a tabela
de poltronas de cada veculo
*/
void inicializarVeiculos(){
//incializa as informaes do veculo com destino So Paulo
strcpy(veiculoSP.destino, "Sao Paulo");
strcpy(veiculoSP.dataPartida, "15/12/2015");
strcpy(veiculoSP.horaPartida, "11:20");
veiculoSP.numeroVeiculo = 7700;
veiculoSP.valorPassagemComum = 45.0;
veiculoSP.idososDisponiveis=2;

inicializarPoltronas(&veiculoSP);
//incializa as informaes do veculo com destino Curitiba
strcpy(veiculoCTB.destino, "Curitiba");
strcpy(veiculoCTB.dataPartida, "16/12/2015");
strcpy(veiculoCTB.horaPartida, "14:30");
veiculoCTB.numeroVeiculo = 4433;
veiculoCTB.valorPassagemComum = 60.0;
veiculoCTB.idososDisponiveis=2;
inicializarPoltronas(&veiculoCTB);
//incializa as informaes do veculo com destino Belo Horizonte
strcpy(veiculoBH.destino, "Belo Horizonte");
strcpy(veiculoBH.dataPartida, "17/12/2015");
strcpy(veiculoBH.horaPartida, "21:45");
veiculoBH.numeroVeiculo = 5522;
veiculoBH.valorPassagemComum = 55.0;
veiculoBH.idososDisponiveis=2;
inicializarPoltronas(&veiculoBH);
}
/*Exibe o menu principal do sistema*/
void exibirMenuPrincipal(){
int opcao = 0;
do{
limparTela();
printf("Bem vindo ao sistema de vendas de passagens da Unip Tour
\n\n");
printf("\tMenu Principal\n\n");
printf("1 - Vender passagem para Sao Paulo\n");
printf("2 - Vender passagem para Curitiba\n");
printf("3 - Vender passagem para Belo Horizonte\n");
printf("4 - Gestao do Caixa\n");
printf("9 - Sair\n");
printf("Selecione uma opcao: ");
opcao = solicitarInt();
switch (opcao){
case 1: //digitou 1
mnuVenderPassagem(&veiculoSP);
break;
case 2: //digitou 2
mnuVenderPassagem(&veiculoCTB);
break;
case 3: // digitou 3
mnuVenderPassagem(&veiculoBH);
break;
case 4: //digitou 4
imprimeTransacoes(listaTransacoes);
break;
case 9: // digitou 9
printf ("\n\n\nSaindo do Sistema");
break;
default:
printf("Opcao Invalida\n");
//printf("Tecla pressionada: %d\n", tecla);

pausar();
}
}while (opcao != 9);//enquanto o valor digitado for diferente de 9
}
/*
A funo main inicializa todos os veculos cadastrados e tambem inicializa
o caixa por meio da lista de transacoes. Depois exibe o menu principal
por onde sero acessadas e realizadas todas as operaes do aplicativo
at que o usurio solicite seu encerramento
*/
int main(){
inicializarVeiculos();
inicializarListaTransacoes();
exibirMenuPrincipal();
return 0;
}

You might also like