Skip to content

Instantly share code, notes, and snippets.

@zerolx
Last active January 30, 2020 03:17
Show Gist options
  • Save zerolx/7e293b9eef6bd691361e19fc1aa88e9e to your computer and use it in GitHub Desktop.
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
/*
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