Pages

segunda-feira, 11 de julho de 2016

Sistema de controle de uma locadora usando arvore binaria em c

Faça um sistema para uma locadora, onde deve-se armazenar as seguintes informações sobre os filmes:
          char titulo[50], diretor[50]
          int anoLancamento
         float precoLocacao
O sistema deve permitir ao usuário fazer as seguintes operações:
    1-Cadastrar filme
    2-Exibir filmes em ordem de cadastro
    3-Exibir filmes em ordem de ano de lançamento
   4-Exibir filmes em ordem de preço de locação
   5-Remover um filme
0-Sair

//bibliotecas padrão
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define T 60
#define ERRO_V "\n\n\tVALOR INVALIDO\n"
#define ERRO_C "\n\n\tNAO HA NADA CADASTRADO\n"
struct FILME{//struct para cadastrar os daddos
char titulo[T], diretor[T];
float preco;
int ano,cod;
struct FILME *ant;
struct FILME *prox;
};
typedef struct FILME F;

struct ARVORE{//1ºArvore para poder ordenar por ano que vai receber os dados das struct FILME
char titulo[T], diretor[T];
float preco;
int ano,cod;
struct ARVORE *left, *right;
};

typedef struct ARVORE ARV;

struct ARVORE2{// 2º ARVORE VAI ORDENAR POR PREÇO 
char titulo[T], diretor[T];
float preco;
int ano,cod;
struct ARVORE2 *left, *right;
};
typedef struct ARVORE2 ARV2;


int menu();// FUNÇÃO MENU PARA ESCOLHER A OPÇÃO DESEJADA
int vazia(ARV *a);// VAI RETORNAR A PRIMAIRA ARVORE VAZIA
int vazia2(ARV2 *a);// VAI RETORNAR A SEGUNDA ARVORE VAZIA
int verificaAno();//VAI VERIFICAR SE O ANO E VALIDO
float verificaPreco();//VAI VERIFICAR SE O PREÇO E VALIDO
ARV *criaArvore();//VAI CRIAR A PRIMEIRA ARVORE
ARV2 *criaArvore2();//VAI CRIAR A SEGUNDA ARVORE
ARV *criaCadastroAno(ARV *a, int cod, char titulo[T],char diretor[T], int ano, float preco);// VAI ORDENAR POR ANO
ARV2 *criaCadastroPreco(ARV2 *a, int cod, char titulo[T], char diretor[T], int ano, float preco);//VAI ORDENAR POR PRECO
F *criaCadastroFilme(F *f, int cod, char titulo[T],char diretor[T], int ano, float preco);// VAI CADASTRAR OS DADOS NUMA LISTA
void ExibiFilmeCadastrado(F *f);//VAI EXIBIR OS FILMES CADASTRADOS
void ExibiAno(ARV *a);// VAI EXIBIR POR ORDEM DOS ANOS CADASTRADOS
void ExibiPreco(ARV2 *a);//VAI EXIBIR POR ORDEM DE PREÇO CADASTRADOS
ARV *procuraNaEsquerda(ARV *a, int cod);//VAI PROCURAR DO LADO ESQUERDO DA ARVORE DA PRIMEIRA ARVORE
ARV2 *procuraNaEsquerda2(ARV2 *a, int cod);//VAI PROCURAR DO LADO ESQUERDO DA SEGUNDA ARVORE
ARV *procuraNaDireita(ARV *a, int cod);// VAI PROCURAR DO LADO DIREITO DA PRIMEIRA ARVORE
ARV2 *procuraNaDireita2(ARV2 *a, int cod);//VAI PROCURAR DO LADO DIREITO DA SEGUNDA ARVORE
F *procuraFilmeCadastrado(F *f, int cod);// VAI PROCURAR OS FILMES CADASTRADOS
void removerFilmeCadastrado(F *f, int cod);// VAI REMOVER O FILME CADASTRADO PASSANDO O COD FORNECIDO PELO USUARIO DA LISTA
ARV *removerCadastroPorAno(ARV *a, int ano);// VAI REMOVER O FILME CADASTRADO DA ARVORE ORDENADO POR ANO
ARV2 *removerCadastroPorPreco(ARV2 *a, float preco);//VAI REMOVER O FILME CADASTRADO DA ARVORE ORDENADO POR PREÇO

int main(){
F *f = NULL;// VAI CRIAR UMA LISTA PARA CADASTRAR OS DADOS
ARV *ANO = criaArvore();//CRIAR UMA ARVORE PARA ORDENAR POR ANO
ARV2 *PRECO = criaArvore2(); //VAI CRIAR UMA ARVORE PARA ORDENAR POR PREÇO
ARV *a1;//ARVORE AUXILIAR
ARV2 *a2;//ARVORE AUXILIAR
int op, ano, cod=1, anoaux, id2;
float precoaux;;
char titulo[T], diretor[T];
float preco;

do{
op = menu();
system("cls");
switch(op){
case 1:{//VAI CADASTRAR OS DADOS
printf("INFORME O TITULO DO FILME: ");
gets(titulo);
printf("INFORME O DIRETOR DO FILME: ");
gets(diretor);
ano = verificaAno();
preco = verificaPreco();
f = criaCadastroFilme(f, cod, titulo,diretor, ano, preco);//VAI QUARDAR NUMA LISTA
ANO = criaCadastroAno(ANO, cod, titulo,diretor, ano, preco);//VAI ORDENAR NA ARVORE POR ANO
PRECO = criaCadastroPreco(PRECO, cod, titulo,diretor, ano, preco);//VAI ORDENAR NA ARVORE POR PRECO
cod = cod + 1;//VAI INCLEMANTAR O CODIGO POR 1
system("cls");
getchar();
printf("\n\n\tCADASTRO REALIZADO COM SUCESSO!");
break;
}
case 2:{// VAI EXIBIR OS FILMES CADASTRADOS POR SEGUENCIA DE CADASTRO
if(f != NULL){//SE A LISTA NÃO ESTIVER FAZIA MOSTRA
ExibiFilmeCadastrado(f);
}else //SE NÃO MOSTRA QUE NÃO HÁ CADASTRO
printf(ERRO_C);
getchar();
break;
}
case 3:{//VAI EXIBIR POR ORDEM DE ANO CADASTRADO DO MENOR POR MAIOR
if(!vazia(ANO))
ExibiAno(ANO);
else
printf(ERRO_C);
getchar();
break;
}
case 4:{//VAI EXIBIR POR ORDEM DE PREÇO DO MENOR AO MAIOR
if(!vazia2(PRECO))
ExibiPreco(PRECO);
else
printf(ERRO_C);

getchar();
break;
}
case 5:{//VAI EXCLUIR UM CADASTRO INFORMANDO O CODIGO 
if(f !=NULL){// SE A LISTA NÃO ESTIVER VAZIA
ExibiFilmeCadastrado(f);//VAI EXIBIR OS FILMES CADASTRADOS PARA PODER ESCOLHER O CODIGO
printf("INFORME O CODIGO PARA EXCLUIR: ");
scanf("%d", &id2);
getchar();
a1 = procuraNaEsquerda(ANO, id2);//VAI PROCURAR O CODIGO NO LADO ESQUERDO DA ARVORE ORDENADA POR ANO
if(a1 == NULL){//SE A1 RETORNAR NULO VAI PARA O LADO DIREITO
a1 = procuraNaDireita(ANO, id2);
}
a2 = procuraNaEsquerda2(PRECO, id2);//VAI FAZER A MESMA COISA PARA ARVORE ORDENADA POR PRECO
if(a2 == NULL){
a2 = procuraNaDireita2(PRECO, id2);
}
if(a1 != NULL){//SE A1 NÃO FOR NULO ELE ENCONTROU O CODIGO E VAI EXCLUIR
system("cls");
printf("CADASTRO EXCLUIDO COM SUCESSO\n");
printf("COD:%d\nTITULO: %s\nDIRETOR: %s\nANO = %d\nPRECO = R$%.2f\n\n", a1->cod ,a1->titulo, a1->diretor, a1->ano, a1->preco);
getchar();
anoaux = a1->ano;
precoaux = a2->preco;
ANO = removerCadastroPorAno(ANO, anoaux);//EXCLUIR DA MEMORIA DA ARVORE DO ANO
PRECO = removerCadastroPorPreco(PRECO, precoaux);//EXCLUIR DA MEMORIA DA ARVORE PRECO
removerFilmeCadastrado(f, id2);//REMOVE DA LISTA DOS FILMES
}
else{
printf(ERRO_C);//SE NÃO ENCONTRAR EXIBI UMA MENSAGEM
getchar();
}
}
else {//NÃO HÁ CADASTRO
printf(ERRO_C);
getchar();;
}
break;
}
case 0: break;// SAIR DO MENU FECHANDO O PROGRAMA
getchar(); 
break;
}
getchar();
}while(op != 0);
return 0;
}


int menu(){//menu para escolher a opção 
int op;
do{
system("cls");
printf("------------------------BEM VINDO AO SIS - LOCADORA-----------------------------\n");
printf("1-CADASTRAR\n2-EXIBIR POR ORDEM DE CADASTRO\n3-EXIBIR POR ANO \n4-EXIBIR POR PRECO\n5-REMOVER CADASTRO\n0-SAIR\n");
scanf("%d", &op);
if(op<0 || op >5){
printf("OPCAO INVALIDA");
getchar();
}
getchar();

}while(op<0 || op >5);

return op;
}

ARV *criaArvore(){//criar a arvore 1
return NULL; 
}
ARV2 *criaArvore2(){//criar arvore 2
return NULL; 
}
F *criaCadastroFilme(F *f, int cod, char titulo[T],char diretor[T], int ano, float preco){//criar uma lista de cadastro
F *nTemp = (F *)malloc(sizeof(F));
strcpy(nTemp->titulo, titulo);
nTemp->cod = cod; 
strcpy(nTemp->diretor, diretor);
nTemp->ano = ano;
nTemp->preco = preco;
nTemp->ant = NULL; 
nTemp->prox = f;
if(f != NULL){
f->ant = nTemp;

return nTemp;
}

ARV *criaCadastroAno(ARV *a, int cod, char titulo[T],char diretor[T], int ano, float preco){//CADASTRA UMA ARVORE QUE ORDENA POR ANO
ARV *aTemp; 
if(a == NULL)
aTemp = (ARV *)malloc(sizeof(ARV));
strcpy(aTemp->titulo, titulo);
aTemp->cod = cod;
strcpy(aTemp->diretor, diretor);
aTemp->ano = ano;
aTemp->preco = preco;
aTemp->left = criaArvore();
aTemp->right = criaArvore();
return aTemp; 
}else{
int dir = 0;
aTemp = a;
ARV *pai, *raiz = a;
while(!vazia(aTemp)){
if(ano<= aTemp->ano){
pai = aTemp;
aTemp = aTemp->left;
dir = 0;
}else{
pai=aTemp; 
aTemp = aTemp->right;
dir = 1;
}
}
aTemp = (ARV *)malloc(sizeof(ARV));
strcpy(aTemp->diretor, diretor);
aTemp->cod = cod;
strcpy(aTemp->titulo, titulo);
aTemp->ano = ano;
aTemp->preco = preco;
aTemp->left = criaArvore();
aTemp->right = criaArvore();

if(dir)
pai->right = aTemp;
else
pai->left = aTemp;
return raiz;
}
}

ARV2 *criaCadastroPreco(ARV2 *a, int cod, char titulo[T],char diretor[T], int ano, float preco){//CADASTRA UMA ARVORE QUE VAI ORDENA POR PREÇO
ARV2 *aTemp; 
if(a == NULL){ 
aTemp = (ARV2 *)malloc(sizeof(ARV2));
strcpy(aTemp->titulo, titulo);
aTemp->cod = cod;
strcpy(aTemp->diretor, diretor);
aTemp->ano = ano;
aTemp->preco = preco;
aTemp->left = criaArvore2();
aTemp->right = criaArvore2();
return aTemp; 
}else{
int dir = 0;
aTemp = a;
ARV2 *pai, *raiz = a;
while(!vazia2(aTemp)){
if(preco<= aTemp->preco){
pai = aTemp;
aTemp = aTemp->left;
dir = 0;
}else{
pai=aTemp; 
aTemp = aTemp->right;
dir = 1;
}
}
aTemp = (ARV2 *)malloc(sizeof(ARV2));
strcpy(aTemp->diretor, diretor);
aTemp->cod = cod;
strcpy(aTemp->titulo, titulo);
aTemp->ano = ano;
aTemp->preco = preco;
aTemp->left = criaArvore2();
aTemp->right = criaArvore2();
if(dir)
pai->right = aTemp;
else
pai->left = aTemp;
return raiz;
}
}

int vazia(ARV *a){//VERIFICAR A PRIMEIRA ARVORE ESTÁ VAZIA
return a==NULL;
}

int vazia2(ARV2 *a){//VERIFICAR SE A SEGUNDA ARVORE ESTÁ VAZIA
return a==NULL;
}

void ExibiFilmeCadastrado(F *f){//EXIBIR OS FILMES POR ORDEM DE CADASTRO
F *temp = f;
while(temp->prox != NULL){
temp = temp->prox;
}
while(temp != NULL) {
printf("COD:%d\nTITULO: %s\nDIRETOR: %s\nANO = %d\nPRECO = R$%.2f\n\n", temp->cod ,temp->titulo, temp->diretor, temp->ano, temp->preco);
temp = temp->ant;
}

}

void ExibiPreco(ARV2 *a){ //EXIBIR OS FILMES CADASTRADOS POR PREÇO
if(a->left != NULL) {
ExibiPreco(a->left);
}
printf("COD:%d\nTITULO: %s\nDIRETOR: %s\nANO = %d\nPRECO = R$%.2f\n\n", a->cod ,a->titulo, a->diretor, a->ano, a->preco);

if(a->right != NULL){
ExibiPreco(a->right);
}
}

void ExibiAno(ARV *a){//EXIBIR OS FILMES POR ORDEM DE ANO
if(a->left != NULL) {
ExibiAno(a->left);
}
printf("COD:%d\nTITULO: %s\nDIRETOR: %s\nANO = %d\nPRECO = R$%.2f\n\n", a->cod ,a->titulo, a->diretor, a->ano, a->preco);
if(a->right != NULL){
ExibiAno(a->right);
}
}

ARV *procuraNaEsquerda(ARV *a, int cod){//VAI PROCURAR NO LADO ESQUERDO DA ARVORE ORDENADO POR ANO
ARV *p;
p = NULL;
while(a != NULL){
if((a->cod) == cod) {
p = a;
break;
}
a = a->left;
}
return p;
}

ARV *procuraNaDireita(ARV *a, int cod){//VAI PROCURAR NO LADO DIREITO DA ARVORE ORDENADO POR ANO
ARV *p;
p = NULL;
while(a != NULL){
if((a->cod) == cod) {
p = a;
break;
}
a = a->right;
}
return p;
}


ARV2 *procuraNaEsquerda2(ARV2 *a, int cod){//VAI PROCURAR DO LADO ESQUERDO DA ARVORE ORDENADO POR PREÇO
ARV2 *p;
p = NULL;
while(a != NULL){
if((a->cod) == cod){
p = a;
break;
}
a = a->left;
}
return p;
}


ARV2 *procuraNaDireita2(ARV2 *a, int cod){//VAI PROCURAR DO LADO DIREITO DA ARVORE ORDENADO POR PREÇO
ARV2 *p;
p = NULL;
while(a != NULL) {
if((a->cod) == cod){
p = a;
break;
}
a = a->right;
}
return p;
}


F *procuraFilmeCadastrado(F *f, int cod){//VAI PROCURAR OS FILMES CADASTRADOS NA LISTA

F *p; 
p = NULL;
while(f != NULL){
if((f->cod) == cod){
p = f;
break;
}
f = f->prox;
}
return p;
}

void removerFilmeCadastrado(F *f, int cod){// VAI REMOVER OS FILMES CADASTRADOS NA LISTA
F *nTemp;
nTemp = procuraFilmeCadastrado(f, cod);

if(nTemp != NULL){
if(nTemp->prox != NULL)
{
nTemp->prox->ant = nTemp->ant;
}
if(nTemp->ant != NULL){
nTemp->ant->prox = nTemp->prox;
}
else{
f = nTemp->prox;
}
free(nTemp);
}
}


ARV *removerCadastroPorAno(ARV *a, int ano){//VAI REMOVER OS CADASTROS DA ARVORE ORDENADO POR ANO
if(a == NULL)
return NULL;
else if(a->ano > ano)
a->left = removerCadastroPorAno(a->left, ano);

else if(a->ano < ano)
a->right = removerCadastroPorAno(a->right, ano);

else {
if(a->left == NULL && a->right == NULL) {
free(a);
a = NULL;
}
else if(a->left == NULL){
ARV *temp = a;
a = a->right;
free(temp);
}
else if(a->right == NULL){
ARV *temp = a;
a = a->left;
free(temp);
}
else {
ARV *atemp = a->left;
while(atemp->right != NULL) {
atemp = atemp->right;
}
a->ano = atemp->ano;
atemp->ano = ano;
a->left = removerCadastroPorAno(a->left, ano);
}
}
return a;
}

ARV2 *removerCadastroPorPreco(ARV2 *a, float preco){//VAI REMOVER OS CADASTROS DOS FILMES DA ARVORE ORDENADO POR PREÇO
if(a == NULL)
return NULL;
else if(a->preco > preco)
a->left = removerCadastroPorPreco(a->left, preco);

else if(a->preco < preco)
a->right = removerCadastroPorPreco(a->right, preco);

else {
if(a->left == NULL && a->right == NULL){
free(a);
a = NULL;
}
else if(a->left == NULL){
ARV2 *temp = a;
a = a->right;
free(temp);
}
else if(a->right == NULL){
ARV2 *temp = a;
a = a->left;
free(temp);
}
else {
ARV2 *atemp = a->left;
while(atemp->right != NULL) {
atemp = atemp->right;
}
a->preco = atemp->preco;
atemp->preco = preco;
a->left = removerCadastroPorPreco(a->left, preco);
}
}
return a;
}
int verificaAno(){//VAI VERIFICAR POR ANO VALIDO
int ano;
do{
printf("INFORME O ANO DE LANCAMENTO: ");
scanf("%d",&ano);
if(ano<=0 || ano >2016){
printf(ERRO_V);
getchar();
}

}while(ano<=0 || ano >2016);
return ano;
}
float verificaPreco(){// VAI VERIFICAR SE O PREÇO E VALIDO
float preco;
do{
printf("INFORME O PRECO DO FILME: ");
scanf("%f",&preco);
if(preco<=0){
printf(ERRO_V);
getchar();
}

}while(preco<=0);
return preco;
}


Duvidas ou Trabalhos para fazer entre em Contato: marcofernando71@gmail.com

0 comentários:

Postar um comentário