Professional Documents
Culture Documents
DESENVOLVIMENTO DE SOFTWARE
Sistema de Venda de Passagens
Polo XXXXXXX/UF
Ano
UNIP INTERATIVA
Projeto Integrado Multidisciplinar
Cursos Superiores de Tecnologia
DESENVOLVIMENTO DE SOFTWARE
Sistema de Venda de Passagens
NomeNomeNomeNomeNomeNome
RA: 00000000000
Curso: Anlise e Desenvolvimento de Sistemas
Semestre: 01
Polo XXXXXXX/UF
Ano
Resumo
Abstract
This project aims to develop a bus tickets sale system . The system has been developed
in the C programming language with the use of DEV C ++ tool. Using the knowledge and
skills acquired during the first quarter of the course in Systems Analysis and Development
was possible to grow the application to meet project requirements . The functions are
modularized wherever possible in order to make future maintenance easier. Comments have
been added throughout the code in order to make understanding easier.
Sumrio
Introduo 5
1 Dos Requisitos... 6
2 Do Modelo de Desenvolvimento... 6
2.1 Do Prottipo7
2.2 Da Modelagem10
3 Da Implementao das Funcionalidades11
3.1 Da Implementao dos Veculos. 14
3.2 Da Implementao das Vendas... 16
3.3 Da Implementao do Fluxo de Caixa... 18
Concluso.... 21
Referncias.. 22
5
Introduo
6
1 Dos Requisitos
O sistema desenvolvido neste projeto dever ser capaz de administrar vrios aspectos
da venda de passagens de nibus.
O primeiro requisito que o sistema leve em considerao uma tabela de tarifao
com o valor das passagens. A partir da, dever permitir que estudantes compre passagens
com 50% de desconto. Tambm dever permitir que at duas passagens tenham gratuidade de
100% para idosos.
Aps a finalizao da venda, dever ser emitido um ticket contendo a data e hora da
partida do nibus, o local de destino, o nmero do nibus e o nmero da poltrona.
O sistema no poder permitir que a mesma poltrona seja vendida mais de um
passageiro.
No podem ser vendidos mais lugares do que os disponveis no veculo.
Dever fazer a gesto do caixa, armazenando todas as movimentaes do dia e o saldo
do fechamento.
2 Do Modelo de Desenvolvimento
Considerando o pequeno tamanho do projeto, optei por seguir o conceito dos mtodos
geis, no sentido iniciar o projeto com um prottipo, de intercalar o planejamento com a
escrita do cdigo e de focar no funcionamento, mais do que na documentao. O
desenvolvimento tambm se deu de forma incremental, pois aps a incluso de
funcionalidades o processo retornava fase anlise das necessidades, passando por nova
modelagem, codificao e testes.
Para construo do prottipo, primeiramente foram definidos os menus e opes
necessrios. Assim, foram desenvolvidas as principais telas a serem exibidas pelo aplicativo
porm sem as funcionalidades que seriam implementadas posteriormente.
Toda a modelagem foi realizada por meio de descrio narrativa. As tarefas
necessrias foram definidas e depois foram gradativamente detalhadas e transformadas em
tarefas menores. Assim que estivessem suficientemente detalhadas, as funes eram ento
codificadas.
7
Esta forma de desenvolvimento se mostrou bastante eficiente, para um projeto de
pequeno como este. Porm, necessrio que a descrio narrativa seja capaz de atingir um
nvel de detalhamento adequado e que seja bastante clara.
2.1 Do prottipo
A elaborao do prottipo envolveu a identificao das opes necessrias no menu
principal do aplicativo.
Identifiquei que seria necessria uma opo para cada destino diferente e que a
princpio o sistema trabalharia com 3 destinos: So Paulo, Curitiba e Belo Horizonte. Tambm
seria necessria uma opo para que fosse exibido o fluxo de caixa. Por fim, seria necessria
uma opo para sair do sistema.
Definidas as necessidade do menu principal, foi providenciada sua codificao. Tomei
o cuidado de no inserir o cdigo de exibio do menu diretamente na funo main() a fim de
evitar que ficasse poluda. Optei por delegar essa tarefa uma funo chamada
exibirMenuPrincipal() que chamada pela funo main(). O prottipo do menu ficou da
seguinte forma:
Bem vindo ao sistema de vendas de passagens da Viagens Tour
Menu Principal
1 - Vender passagem para Sao Paulo
2 - Vender passagem para Curitiba
3 - Vender passagem para Belo Horizonte
4 - Gestao do Caixa
9 - Sair
Selecione uma opcao:
A prxima etapa foi elaborar a exibio do menu secundrio, que seria exibido aps a
seleo de um destino pelo usurio. Em minha concepo, o sistema deveria exibir na tela
uma representao das poltronas do nibus. Essa representao deveria exibir o nmero das
poltronas e sua ocupao. A ocupao seria indicada pelo caracteres '-', 'I', 'C' e 'E' que
representam respectivamente, uma poltrona vazia, uma poltrona ocupada por idoso com
8
gratuidade, uma poltrona ocupada por um pagante comum e uma poltrona ocupada por um
estudante. Na tela so exibidas 4 poltronas por linha, representando as duas poltronas do lado
esquerdo e as duas poltronas do lado direito.
Alm de exibir as poltronas e suas ocupaes, tambm exibido o destino, os valores
de todos os tipos de passagens.
Por fim, o usurio solicitado a digitar o nmero da poltrona a ser vendida ou digitar
-1 para retornar ao menu principal. Eis o prottipo do menu:
Exibindo Assentos Disponiveis para Curitiba
01| - | 02| - | 03| - | 04| - |
05| - | 06| - | 07| - | 08| - |
09| - | 10| - | 11| - | 12| - |
13| - | 14| - | 15| - | 16| - |
17| - | 18| - | 19| - | 20| - |
21| - | 22| - | 23| - | 24| - |
25| - | 26| - | 27| - | 28| - |
29| - | 30| - | 31| - | 32| - |
33| - | 34| - | 35| - | 36| - |
37| - | 38| - | 39| - | 40| - |
41| - | 42| - | 43| - | 44| - |
45| - | 46| - | 47| - | 48| - |
O valor da passagem comum eh de R$60.00
Estudantes pagam R$30.00
Idosos pagam R$0.00 (maximo de 2 por veiculo)
Digite o numero do assento a ser vendido ou -1 para voltar:
Os dois menus apresentados finalizaram a etapa inicial de prototipao e a partir de
ento foi possvel inciar a prxima etapa.
Como estamos trabalhando em um modelo incremental, depois de modeladas e
desenvolvidas as funcionalidades dos menus principais e secundrios, retornnei fase de
prototipao por mais duas vezes a fim de desenvolver os prottipos do fluxo de caixa e da
emisso do ticket.
*************************************
Destino Curitiba
Partida as 14:30 do dia 16/12/2015
Onibus numero: 4433 Poltrona: 26
Press any key to continue . . .
10
2.2 Da Modelagem
Com as principais interfaces prontas pude comear a elaborar a lgica a ser seguida
pelo sistema. Como mencionei anteriormente, optei por descrever toda a lgica por meio de
uma descrio narrativa. Conclu que tal abordagem seria mais efetiva em relao utilizao
do portugol ou da elaborao de fluxogramas.
Deitel e Deitel (2011), em seu livro C: Como Programar, tambm se utilizam do
mtodo de descrio narrativa, denominando-o como Pseudocdigo. Em sua definio, o
pseudocdigo uma linguagem artificial e informal, semelhante linguagem do dia a dia que
ajuda os programadores a desenvolver algoritmos.
Voltando ao nosso sistema de passagens, a elaborao da lgica do menu principal foi
bastante simples. Limitando-se conduzir o usurio para o menu secundrio correto. A
descrio narrativa ficou da seguinte forma:
Caso o usurio selecione a opo 1:
Exiba a tela de venda do veculo que ir So Paulo
Caso o usurio selecione a opo 2:
Exiba a tela de venda do veculo que ir Curitiba
Caso o usurio selecione a opo 3:
Exiba a tela de venda do veculo que ir Belo Horizonte
Caso o usurio selecione a opo 4:
Exiba o fluxo de caixa
Caso o usurio selecione a opo 9:
Permite a sada do loop que mantm o menu
11
Exibir as informaes do veculo selecionado
Exibir a tabela dos assentos do veculo selecionado
Exibir os valores para todos os tipos de passagens
Solicitar ao usurio que selecione uma poltrona
Verificar se uma poltrona vlida Se no for exibir mensagem
Verificar se a poltrona est vazia - Se no estiver exibir mensagem
Solicitar ao usurio que informe o tipo de passagem
Se a passagem for de idoso, verificar disponibilidade Se no, exibe msg
Remover um dos lugares disponveis para idosos
Preencher a tabela de assentos do veculo com o caractere adequado
Registrar a transao de acordo com o valor da passagem
Imprimir Ticket
Retornar ao menu de vendas
12
entrada de um inteiro e o armazena na varivel valorDigitado. feita a verificao do retorno
da funo scanf(). Enquanto a funo scanf(%d, %valorDigitado) no retornar o valor 1,
indicando que a atribuio solicitada foi efetuada com sucesso, o sistema ficar em loop
solicitando ao usurio a entrada de um nmero. Quando o usurio digitar um nmero a funo
o armazenar com sucesso na varivel valorDigitado e o retornar funo chamadora.
Mesmo tomando estes cuidados a funo solicitarInt() ainda entrava em loop infinito
quando o usurio entrava com um caractere. Segundo as experincias relatadas no site
stackoverflow.com, isso se devia existncia de sujeira no buffer de entrada.
Ento precisei criar uma funo para esvaziar o buffer de entrada do teclado, pois as
informaes ali armazenadas ainda causavam erros no sistema. Essa funo executada
imediatamente aps um scanf invlido e consiste em executar a funo getchar() at que se
encontre uma quebra de linha (\n) ou um indicador de fim de arquivo (EOF).
Aps esta implementao, os erros deixaram de ocorrer.
int solicitarInt(){
int valorDigitado;
while (scanf("%d", &valorDigitado)!=1){
esvaziarBufferEntrada();
printf("Digite um numero: ");
}
return valorDigitado;
}
void esvaziarBufferEntrada(){
char c;
while((c = getchar()) != '\n' && c != EOF);
}
13
criada. Sua funcionalidade resume-se exibir a mensagem Pressione ENTER para
continuar enquanto uma chamada funo getchar() deixa o sistema espera de uma
entrada. A existncia de resduos de informao em buffer tambm prejudicaram o
funcionamento
da
funo.
Desta
forma
inclu
uma
chamada
funo
14
3.1 - Da Implementao dos Veculos
De posse do prottipo e da descrio narrativa, conclu que a prxima etapa deveria
ser a criao de uma estrutura que pudesse representar um veculo e as informaes deste
veculo que seriam necessrias ao sistema. A utilizao de uma estrutura visa facilitar a adio
de vrios veculos com destinos, datas e horrios diferentes.
Assim, foi criado o struct de nome veiculo que contm as informaes de: Destino,
Valor da Passagem, Data da Partida, Hora da Partida, Nmero do Veculo, Poltronas
Disponveis para Gratuidade de Idosos e um vetor, com 48 posies, representando todas as
poltronas do nibus.
struct veiculo{
char tabelaPoltronas[QUANTIDADE_POLTRONAS];
int idososDisponiveis;
float valorPassagemComum;
char destino[15];
char dataPartida[15];
char horaPartida[15];
int numeroVeiculo;
};
O campo idososDisponiveis foi criado para facilitar o gerenciamento das gratuidades
j oferecidas. Sem este campo, uma das solues alternativas seria percorrer todos os 48
assentos, a fim de identificar quantos idosos com passagens gratuitas estavam no nibus.
O vetor tabelaPoltronas[] foi criado para facilitar a administrao das poltronas e
exibir para o usurio a ocupao do veculo. Optei por criar um vetor do tipo caractere,
criando tambm constantes que representam cada tipo de ocupao possvel. O caractere 'I'
representa um assento ocupado por idoso. O caractere 'E' representa um assento ocupado por
estudante. O caractere 'C' representa um assento ocupado por quem comprou a passagem
comum. Por fim o caractere '-' representa um assento vago. Se o cliente quiser que os assentos
vagos passem a ser representados pelo caractere 'X', basta substituir o valor da respectiva
constante.
Criei o tipo Veiculo referindo-se estrutura veiculo e criei trs variveis deste tipo
15
a fim de representar os nibus com destino So Paulo, Curitiba e Belo Horizonte. As
variveis foram denominadas veiculoSP, veiculoCTB e veiculoBH respectivamente.
/*
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;
A prxima etapa foi providenciar a inicializao das variveis do tipo Veiculo. Criei
a funo inicializarVeiculos(). Nesta funo so inicializadas as informaes todos os
veculos. Segue abaixo a inicializao do veculo com destino So Paulo. Os demais
veculos foram inicializados da mesma forma e dentro da mesma funo mas com seus
respectivos dados.
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);
}
vetor
tabelaPoltronas[]
de
cada
veculo
inicializado
pela
funo
inicializarPoltronas() que preenche todos os itens do vetor com o caractere que representa um
assento vago.
16
/*
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;
}
}
17
Como podemos notar, a funo mnuVenderPassagem() uma forte candidata ser
desmembrada em funes menores e mais especficas. Por falta de tempo e tambm por receio
de fazer com que o cdigo fique de difcil compreenso, optei por manter desta forma.
Ainda assim, a funo se utiliza de vrios outras funes menores como
imprimirTicket() que recebe o nmero da poltrona vendida e uma referncia ao veculo e
imprime todas as informaes da viagem como data de horrio da partida, nmero do nibus,
nmero da poltrona e destino.
/*
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->dataPartida);
printf("Onibus numero: %d Poltrona: %02d\n\n", pVeiculo->numeroVeiculo, numPoltrona);
pausar();
}
18
A fim de facilitar eventual mudana nas regras de preos para idosos e estudantes, a
funo mnuVenderPassagem se utiliza das funes getValorEstudante() e getValorIdoso() que
so responsveis por calcular os valores das passagens para estudantes e idosos com base nas
regras definidas.
/*
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;
}
19
Criei uma estrutura chamada transacao contendo o valor da transao e um ponteiro
para a prxima transao da lista. Futuramente pode-se adicionar outras propriedades
estrutura de forma a detalhar a transao.
/*
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;
Toda vez que a funo mnuVenderPassagem() finaliza uma venda, chamada a funo
void registrarTransacao() que encapsula parte do cdigo e em conjunto com a funo
inserirTransacao() insere o valor da venda na lista.
/*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);
}
20
/*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;
}
O registro do fluxo de caixa foi implementado com utilizao dos conhecimentos
adquiridos na Unidade VII da disciplina de Linguagem e Tcnicas de Programao. Todo o
registro
se
atravs
das
funes
inicializarTransacoes(),
inserirTransacao(),
21
Concluso
22
Referncias: