Last active
January 30, 2020 03:17
-
-
Save zerolx/7e293b9eef6bd691361e19fc1aa88e9e to your computer and use it in GitHub Desktop.
Exercício em C que fiz pra outra pessoa sobre uma locadora, besteirinha
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Locadora | |
* Exercicio Reduzido | |
* Armazenamento em memória | |
* Apenas dados | |
Compilação normal com GCC | |
gcc locadora.c | |
*/ | |
// testa se o sistema é Windows, pois o "cls" funciona somente no Windows, | |
// senão utiliza o "clear" que é o comando para limpar a tela no Linux | |
#ifdef __WIN32 | |
#define limpar_tela "cls" | |
#else | |
#define limpar_tela "clear" | |
#endif | |
// inclusão de bibliotecas | |
#include <stdio.h> | |
#include <stdbool.h> | |
#include <stdlib.h> | |
#include <string.h> | |
// quantidade máxima de letras no nome do filme | |
#define MAX 100 | |
// quantidade máxima de filmes | |
#define MAX_FILMES 2000 | |
// definição da struct filme | |
typedef struct Filme | |
{ | |
// campos da struct filme | |
char titulo[MAX]; | |
char sinopse[MAX]; | |
char serie[15]; | |
char ator_principal[MAX]; | |
bool alugado; | |
} TypeFilme; | |
TypeFilme filmes[MAX_FILMES]; | |
// protótipos de funções | |
/** | |
* Exibe o menu com todas as opções do programa | |
* retorno: um caractere do número correspondente a opção | |
*/ | |
char menu(); | |
/** | |
* Cadastra um filme com nome e preço | |
*/ | |
void cadastrar_filme(); | |
/** | |
* Mostra todos os filmes cadastrados e as informações de aluguel | |
*/ | |
void listar_filmes(); | |
/** | |
* Procura um filme pelo nome | |
* | |
* Parâmetros: | |
* nome_file: nome do filme | |
* retorno: um ponteiro para o filme encontrado ou NULL caso o nome não exista | |
*/ | |
TypeFilme *obter_filme(char* nome_file); | |
/** | |
* Procura um filme pelo nome do ator | |
* | |
*/ | |
void listar_filme_por_ator(); | |
/** | |
* Pesquisa um filme e exibe suas informações | |
*/ | |
void pesquisar_filme(); | |
/** | |
* Aluga um filme e atualiza o arquivo | |
*/ | |
void alugar_filme(); | |
/** | |
* Recebe um filme de um cliente e atualiza as informações no arquivo | |
*/ | |
void entregar_filme(); | |
/** | |
* Exclui um filme do arquivo | |
*/ | |
void excluir_filme(); | |
int main(int argc, char *argv[]) | |
{ | |
char resp; | |
// loop infinito do programa | |
while(1) | |
{ | |
// obtém a escolha do usuário | |
resp = menu(); | |
// testa o valor de "resp" | |
if(resp == '1') | |
cadastrar_filme(); | |
else if(resp == '2') | |
listar_filmes(); | |
else if(resp == '3') | |
pesquisar_filme(); | |
else if(resp == '4') | |
listar_filme_por_ator(); | |
else if(resp == '5') | |
alugar_filme(); | |
else if(resp == '6') | |
entregar_filme(); | |
else if(resp == '7') | |
excluir_filme(); | |
else if(resp == '0') // se for igual a 0, então sai do loop while | |
break; | |
else | |
{ | |
printf("\nOpcao invalida! Pressione <Enter> para continuar..."); | |
scanf("%*c"); | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
system(limpar_tela); | |
} | |
printf("\nBye! ;*\n"); | |
return 0; | |
} | |
// função que exibe o menu e retorna a opção escolhida pelo usuário | |
char menu() | |
{ | |
char resp[2]; | |
printf("------------------------------ Locadora ------------------------------"); | |
printf("\n\n1 - Cadastrar um filme\n"); | |
printf("2 - Listar todos os filmes\n"); | |
printf("3 - Pesquisar por filme\n"); | |
printf("4 - Pesquisar filme por ator\n"); | |
printf("5 - Alugar um filme\n"); | |
printf("6 - Entregar um filme\n"); | |
printf("7 - Excluir um filme\n"); | |
printf("0 - Sair\n"); | |
printf("Digite o numero da opcao: "); | |
scanf("%1s%*c", resp); // o *c pega o Enter e descarta | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
// se chegou aqui, é porque a opção é válida | |
return resp[0]; | |
} | |
int ultimo_index_filmes(){ | |
int i = 0; | |
do{ | |
if(filmes[i].titulo[0] == '\0'){ | |
return i; | |
} | |
i++; | |
}while(1); | |
} | |
// função para cadastrar filme | |
void cadastrar_filme() | |
{ | |
// abre o arquivo para escrita | |
// a+b => acrescenta dados ao final do arquivo ou cria | |
// um arquivo binária para leitura e escrita | |
int last_index = ultimo_index_filmes(); | |
TypeFilme *filme = &filmes[last_index]; // Novo elemento na array | |
// obtém o nome do filme | |
// ^\n indica para pegar até a quebra de linha (enter) | |
// %*c descarta o enter | |
printf("\nDigite o nome do filme: "); | |
scanf("%99[^\n]%*c", (*filme).titulo); | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
printf("\nDigite a sinopse do filme: "); | |
scanf("%99[^\n]%*c", (*filme).sinopse); | |
printf("\nDigite o ator principal do filme: "); | |
scanf("%99[^\n]%*c", (*filme).ator_principal); | |
printf("\nDigite a serie do filme (ouro, prata ou bronze): "); | |
scanf("%99[^\n]%*c", (*filme).serie); | |
printf("\nFilme \"%s\" cadastrado com sucesso!\n", filme->titulo); | |
printf("\nPressione <Enter> para continuar..."); | |
scanf("%*c"); // pega o Enter e descarta | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função para listar todos os filmes | |
void listar_filmes() | |
{ | |
// lista de todos os filmes | |
// variável que indica se encontrou pelo menos 1 filme | |
int encontrou_filmes = 0; | |
printf("\nListando todos os filmes...\n"); | |
// loop para percorrer o arquivo | |
int count = sizeof filmes / sizeof filmes[0]; | |
while(encontrou_filmes <= count) | |
{ | |
// fread retorna o número de elementos lidos com sucesso | |
TypeFilme filme = filmes[encontrou_filmes++]; | |
if(filme.titulo[0] == '\0'){ | |
break; | |
} | |
// mostra os dados do filme | |
printf("Titulo do filme: %s\n", filme.titulo); | |
printf("Sinopse do filme: %s\n", filme.sinopse); | |
printf("Ator Principal do filme: %s\n", filme.ator_principal); | |
printf("Serie do filme: %s\n", filme.serie); | |
printf("Alugado? %s\n", filme.alugado == 1 ? "Sim":"Não"); | |
} | |
// verifica se encontrou pelo menos um filme | |
if(encontrou_filmes == 0) | |
printf("\nNenhum filme cadastrado.\n"); | |
printf("\nPressione <Enter> para continuar..."); | |
scanf("%*c"); | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função para pesquisar por algum filme | |
void pesquisar_filme() | |
{ | |
char nome[MAX]; | |
int encontrou_filme = 0; | |
printf("\nDigite o nome do filme: "); | |
scanf("%99[^\n]%*c", nome); | |
printf("\nFilmes com o nome \"%s\":\n\n", nome); | |
// loop para percorrer o arquivo | |
// busca linear, pois o campo nome não possui índice | |
int count = sizeof filmes / sizeof filmes[0]; | |
int i = 0; | |
while(i <= count) | |
{ | |
// fread retorna o número de elementos lidos com sucesso | |
TypeFilme filme = filmes[i++]; | |
if(filme.titulo[0] == '\0'){ | |
break; | |
} | |
// verifica se é igual | |
if(strcmp((filme.titulo), (nome)) == 0) | |
{ | |
// mostra os dados do filme | |
printf("Filme: %s\n", filme.titulo); | |
printf("Sinopse: %s\n", filme.sinopse); | |
printf("Serie: %s\n", filme.serie); | |
printf("Ator: %s\n", filme.ator_principal); | |
encontrou_filme = 1; | |
printf("\n"); | |
} | |
} | |
if(encontrou_filme == 0) | |
printf("Nenhum filme encontrado.\n\n"); | |
printf("Pressione <Enter> para continuar..."); | |
scanf("%*c"); | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função que obtém um filme pelo ID | |
TypeFilme *obter_filme(char* nome) | |
{ | |
// loop para percorrer o arquivo | |
// busca linear O(n), como o ID é crescente é possível fazer uma busca binária O(log(n)) | |
TypeFilme filme; | |
int count = sizeof filmes / sizeof filmes[0]; | |
int i = 0; | |
while(i <= count) | |
{ | |
// fread retorna o número de elementos lidos com sucesso | |
filme = filmes[i]; | |
// verifica se os ID's são iguais | |
if(strcmp((filme.titulo), nome) == 0) | |
return &filmes[i]; | |
i++; | |
} | |
return NULL; | |
} | |
// função que obtém um filme pelo ID | |
void listar_filme_por_ator() | |
{ | |
char nome[MAX]; | |
printf("\nDigite o nome do ator: "); | |
scanf("%99[^\n]%*c", nome); | |
// loop para percorrer o arquivo | |
// busca linear O(n), como o ID é crescente é possível fazer uma busca binária O(log(n)) | |
TypeFilme filme; | |
int count = sizeof filmes / sizeof filmes[0]; | |
int i = 0; | |
while(i <= count) | |
{ | |
// fread retorna o número de elementos lidos com sucesso | |
filme = filmes[i]; | |
i++; | |
// verifica se os ID's são iguais | |
if(strcmp((filme.ator_principal), nome) == 0){ | |
printf("Filme: %s\n", filme.titulo); | |
printf("Sinopse: %s\n", filme.sinopse); | |
printf("Serie: %s\n", filme.serie); | |
printf("Ator: %s\n", filme.ator_principal); | |
} | |
} | |
printf("Pressione <Enter> para continuar..."); | |
scanf("%*c"); | |
// uma forma de "limpar" o buffer de entrada | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função responsável pelo aluguel dos filmes | |
void alugar_filme() | |
{ | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
char str_id_filme[MAX]; | |
printf("\nDigite o nome do filme: "); | |
scanf("%s%*c", str_id_filme); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
// obtém o filme pelo ID | |
TypeFilme *filme = obter_filme(str_id_filme); | |
// testa se o filme existe... | |
if(filme != NULL) | |
{ | |
// se chegou aqui é porque o filme existe | |
// testa se o filme já está alugado | |
printf(filme->alugado == 1 ? "\nO filme \"%s\" ja esta alugado!\n":"\nFilme \"%s\" alugado com sucesso!\n", filme->titulo); | |
if(filme->alugado != 1) | |
{ | |
// se o filme NÃO está alugado, então seta o | |
// id_cliente do filme para associar o cliente | |
// ao aluguel do filme em questão | |
filme->alugado = 1; | |
} | |
} | |
else | |
printf("\nNao existe filme com o nome \"%s\".\n", str_id_filme); | |
printf("\nPressione <Enter> para continuar..."); | |
scanf("%*c"); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função responsável pela entrega dos filmes | |
void entregar_filme() | |
{ | |
char nome[MAX]; | |
printf("\nDigite o nome do filme: "); | |
scanf("%s%*c", nome); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
// obtém o filme pelo ID | |
TypeFilme *filme = obter_filme(nome); | |
// testa se o filme existe... | |
if(filme != NULL) | |
{ | |
// se chegou aqui é porque o filme existe | |
// testa se o filme já foi entregue | |
if(filme->alugado == 0) | |
printf("\nO filme \"%s\" ja esta disponivel!\n", filme->titulo); | |
else | |
{ | |
// se o filme NÃO foi entregue, então seta o | |
// id_cliente para -1 para indicar que ele foi entregue | |
filme->alugado = 0; | |
printf("\nFilme \"%s\" entregue com sucesso!\n", filme->titulo); | |
} | |
} | |
else | |
printf("\nNao existe filme com o nome \"%s\".\n", nome); | |
printf("\nPressione <Enter> para continuar..."); | |
scanf("%*c"); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} | |
// função responsável por excluir filmes | |
void excluir_filme() | |
{ | |
char str_id_filme[MAX]; | |
int id_filme; | |
printf("\nDigite o nome do filme: "); | |
scanf("%s%*c", str_id_filme); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
int count = sizeof filmes / sizeof filmes[0]; | |
for(int i = 0; i < count; i++){ | |
if(strcmp(str_id_filme, filmes[i].titulo) == 0){ | |
for (; i < count; i++){ | |
filmes[i] = filmes[i + 1]; | |
} | |
printf("Filme '%s' achado e excluído\n", str_id_filme); | |
} | |
} | |
printf("\nPressione <Enter> para continuar..."); | |
scanf("%*c"); | |
fseek(stdin, 0, SEEK_END); // não recomendável o uso | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment