Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

erik_isidio

Tentando criar um menu de livros para biblioteca

Recommended Posts

Boa tarde, eu tenho um trabalho de faculdade ao qual eu tenho que criar um sistema de gerenciamento de biblioteca (acervo de livros), a parte de quais menus usar, e interligar, para entra no menu e retornar menu, isso eu já consegui fazer, porem eu estou com problemas ao cadastrar, pois estou usando uma struct e ela armazena os dados que digitei, porem se eu digitar de novo, ela sobrepõe os dados, o maior problema que estou tendo é como criar uma estrutura de laço que segure os dados que o usuario digite, sem limite de quantos livros cadastrar, e dps quando listar apareça todas a entradas do usuario, segue abaixo a codificação do menu de livros, que inclui, listagem, cadastro, alteração reserva, entre outro.

P.S: sou iniciante em programação, desculpe se parecer meio estranho, e se alguem tiver algum link que eu possa entender melhor a aplicação de logica de programação, agradeço

 

submenu1()
{
                int oplivros,op2,i;
                printf("Menu de Livros\n\n1-Listar\n2-Cadastrar\n3-Reservar\n4-Devolver\n5-Alterar\n0-Voltar\n");
                scanf("%d",&oplivros);
                switch (oplivros)
                {
                      case 1:
                       system("cls");
                       printf("\t\t\tAcervo\n\n");
                       printf("Titulo\t\tAutor\t\tEditora\n%s\t\t%s\t\t%s\n\n ",ca2.nomelivro,ca2.autor,ca2.editora);
                       printf("\n1-retornar Menu livros\n\n2-retornar Menu principal\n\nAperte qualquer tecla para finalinar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
  system("cls");
  submenu1();
}
else if(op2==2)
{
system("cls");
menu();
}
else
{
system("exit");
}
 break;
  case 2:
  
 
  system("cls");
printf("\t\t\tCadastro de livros\n"); 
printf("\nDigite o nome do livro: ");
                    fflush(stdin);
  gets(ca2.nomelivro);
  printf("\nDigite o Autor: ");
  fflush(stdin);
  gets(ca2.autor);
  printf("\nDigite a Editora: ");
  fflush(stdin);
  gets(ca2.editora);
  
  printf("\nlivro cadastrado com Sucesso!\n\n");
  printf("1-retornar Menu livros\n\n2-retornar Menu principal\n\nAperte qualquer tecla para finalinar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
  system("cls");
  submenu1();
}
else if(op2==2)
{
system("cls");
menu();
}
else
{
system("exit");
}
  break; 
  case 3:
  system("cls");
  printf("1-retornar Menu livros\n\n2-retornar Menu principal\n\nAperte qualquer tecla para finalinar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
  system("cls");
  submenu1();
}
else if(op2==2)
{
system("cls");
menu();
}
else
{
system("exit");
}
break;
case 4:
system("cls");
printf("1-retornar Menu livros\n\n2-retornar Menu principal\n\nAperte qualquer tecla para finalinar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
  system("cls");
  submenu1();
}
else if(op2==2)
{
system("cls");
menu();
}
else
{
system("exit");
}
break;
case 5:
system("cls");
printf("1-retornar Menu livros\n\n2-retornar Menu principal\n\nAperte qualquer tecla para finalinar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
  system("cls");
  submenu1();
}
else if(op2==2)
{
system("cls");
menu();
}
else
{
system("exit");
}
break;
                      case 0:
 system("cls"); 
 menu(); 
                      break;
                      default:
                      system("cls");
  printf("Opcao invalida.");
  printf("\nDeseja retornar ao menu principal ?\n\n 1-Sim\n Outra tecla para finalizar.\n");
  scanf("%d",&op2);
  if(op2==1)
  {
system("cls");
      menu();
}
else
{
system("exit");
}
               }               
} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

como criar uma estrutura de laço que segure os dados que o usuario digite, sem limite de quantos livros cadastrar,


P/ isso você utiliza alocação dinâmica.

E não dê fflush na entrada padrão (comportamento indefinido) e nem use gets (problemas de segurança).

Não entendi as chamadas de menus e submenus que vc fez...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct livro {
   char autor[60];
   char titulo[255];
   int edicao;
};

struct livro ** acervo = NULL;
int tamanho = 0;

void menu_principal_livros() {
   puts("*** MENU - @LIVROS ***");
   puts("1- Listar");
   puts("2- Cadastrar");
   puts("3- Reservar");
   puts("4- Devolver");
   puts("5- Alterar");
   puts("6- Sair");
}

void listar_acervo() {
   for(int i=0; i<tamanho; i++) {
      printf("Título: %s\n\tAutor: %s\n", acervo[i].titulo, acervo[i].autor);
   }
}

void cadastrar_livros() {
    struct livro tmp;
    // Titulo, autor, edicao
    fgets(tmp.titulo, 255, stdin);
    fgets(tmp.autor, 60, stdin);
    scanf("%d%*c", &tmp.edicao);

    (*strchr(tmp.titulo, '\n')) = '\0';
    (*strchr(tmp.autor, '\n')) = '\0';

    // Faça a busca p/ ver se já não existe antes de inserir.

    acervo = (struct livro **) realloc(acervo, (tamanho+1)*sizeof(struct livro **));
    if (!acervo) return -1;

    acervo[tamanho+1] = (struct livro *) malloc(sizeof(struct livro));
    if (!acervo[tamanho+1]) return -1;

    strncpy(acervo[tamanho+1].titulo, tmp.titulo, strlen(tmp.titulo));
    strncpy(acervo[tamanho+1].autor, tmp.autor, srlen(tmp.autor));
    acervo[tamanho+1].edicao = tmp.edicao;

    tamanho++;
}

void dispatch_mprincipal_livros(int opcao) {
   switch (opcao) {
       case 1:
           listar_acervo();
           break;
       case 2:
           cadastrar_livros();
           break;
       case 3:
           reservar_livros();
           break;
       case 4:
           devolver_livros();
           break;
       case 5:
           alterar_dados_livro();
           break;
       default:
           puts("Opção inválida");
   }
}

int main(void) {
   int opcao;
   acervo = (struct livro **)malloc(acervo, sizeof(struct livro *));
   if (!acervo) return -1;

   while(1) {
      menu_principal_livros();
      scanf("%d", &opcao);
      if (opcao == 6) break;

      dispatch_mprincipal_livros(opcao);
   }
   return 0;
}

É mais ou menos isso que vc precisa fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a chamadas de menu e submenu era pra no main chamar o menu principal, e assim da função menu, charmar todas as outras funções.

 

e eu usei fflush pra simplesmente limpar o teclado, pois na opção de cadastro, sempre que eu abria aquela parte do menu para testar, uma das opções pulava automatico sem eu digitar nada, o gets eu pus pq o professor que ensinou esse metodo para armazenar os dados do tipo char.

 

eu não usei alocação dinâmica, justamente por não conhecer o metodo, eu vou procurar algum livro ou algum tutorial na internet para saber a respeito e conseguir entender melhor (não que eu não tenha entendido o exemplo que vc me mostrou, ao contrario me ajudou a entender melhor como criar o programa).

 

só uma pergunta, oq o comando 'puts' faz exatamente, ele tem função semelhante ao do 'printf' ?

 

P.S: Mto obrigado pela ajuda, me ajudou mto a como prosseguir com o programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

o gets eu pus pq o professor que ensinou esse metodo para armazenar os dados do tipo char.

Então seu professor precisa ler mais. :P

Não que o scanf não tenha esse problema (buffer overflow), mas pelo menos ele aceita um delimitador de "tamanho de leitura".

 

O puts é só pra colocar uma string seguida de um \n sem precisar usar os formatadores do printf.

 

http://www.cplusplus.com/reference/cstdio/puts/

 

Esse negócio do fflush na entrada padrão, tem um tópico fixo sobre isso aqui: http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.