Jump to content

Base de dados, lista de livros


oliveira1991
 Share

Recommended Posts

Bom dia pessoal

desde já um agradecimento pelo excelente website, português

estou a fazer uma base de dados em c,

a função do programa é criar livros, num ficheiro e ser mostrar dados numa outra opção.

eu sou um principiante, e estou a ter dificuldades, gostaria que me ajudassem, existe erros no programa que não estou a conseguir resolver,

será que me podem ajudar?

obrigado

em baixo o codigo

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

void limpa() {
 printf("");
}

void registra(int nome, int ano, int editora) {
 FILE *fd;
 fd=fopen("BD_livro","a"); /* criar ficheiro*/
 fprintf(fd, "%s\n", nome);
 fprintf(fd, "%d\n", ano);

 fprintf(fd, "%d\n", editora);

 printf("\n\tDados registrados!\n");
 fclose(fd);
 getchar();
}

void listalimp() {
 FILE *fd;
 fd=fopen("BD_livro","w+");
 printf("\n\tLista limpa!\n");
 fclose(fd);
 getchar();
}

void pesquisa(char pesq[])
{
  FILE *fd;
  char curs[15];
  int ano, existe=0;

  int editora;


  fd=fopen("BD_livro","r");
  while ((fscanf(fd,"%s", curs))!=EOF)
     if (!strcmp(curs, pesq)) {
        printf("\n\tNome do Livro: %s", curs);
        fscanf(fd,"\n%d", &ano);
        printf("\n\tAno de Edição: %d\n", ano);
       fscanf(fd,"\n", &editora);
      printf("\n\tAno de Edição: %d\n", editora);
        fscanf(fd,"\n");
        existe=1;
     }
     else fscanf(fd,"\n\n");
  if (existe==0) printf("Informações não disponiveis!\n");
  getchar();
  fclose(fd);
}
void listar() {
 FILE *fd;
 char curs[15];
int i;
 fd=fopen("BD_livro","r");
 while ((fscanf(fd,"%s", curs))!=EOF) {
   printf("\n\tNome: %s",curs);
   fscanf(fd,"\n");
   i++;
 }
 printf("\n\tTotal de registros: %d",i);
}

int main(void) {
 FILE *fd;
 int menu,ano, editora, nome;

 while (menu!=0) {
   limpa();
   printf("\n\t Base de dados de livros.\n");
   printf("\n\t(1)\tRegistrar Livro.");
   printf("\n\t(2)\tProcurar Livro.");
   printf("\n\t(3)\tLista de Livros.");
   printf("\n\t(4)\tLimpar Livro.");
   printf("\n\n\t(0)\tSair.");
   printf(" ");
   scanf("%d",&menu);
   getchar();
   switch (menu) {
     case 1: {
       printf("\n\tIndique o Nome do livro: ");
       scanf("%s",&nome);
       getchar();

    printf("\n\tIndique o Ano de Edição: ");
    scanf("%d",&ano);
    getchar();
    registra(nome, ano, editora);
  }
     } break;
     case 2: {
       printf("\n\tEntre com o Nome: ");
  scanf("%s",&nome);
  getchar();

  else {
    pesquisa(nome);
  }
     } break;
     case 3: {
  listar();
  getchar();
     } break;
     case 4: {
       listalimp();
  getchar();
     } break;
     case 0: break;
     default: {
       printf("\n\tOpcao invalida..\n");
  getchar(); getchar();
     };
   }
 }
 return(0);
}
}
}
Edited by pmg
LP adicionada ao GeSHi

Live for ever

Link to comment
Share on other sites

tens de perceber que para ajudar existem imensas pessoas capazes aqui no forum, no entanto é bem complicado quando o problema não é exposto nas seguintes condições

1- o código não está correctamente apresentado com as tags correctas do geshi (no teu caso falta marcar o código como c)

2- o código não está correctamente indentado

3- não especificas que erros aontecem

4- não especificas que se dá valores não esperados, que valores o são.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

O case nao necessita de ter chavetas({}).

porque que nao fazes o load para um vector ou uma lista e fazes as modificacoes na lista/vector, e no final guardas no ficheiro?

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

muito obrigado desde já pelas rápidas respostas, crlf, podias exemplificar por favor, é que comecei agora a mexer nesta programação, isto ai esta um pouco enferrujado

e' pikax 😄

crias um vector( struct livro vlivros[MAX]😉 ou podes criar uma lista.

depois e' so' encontrar o elemento certo e fazer as modificacoes necessarias.

Tambem tens que escolher uma forma de gravar e fazer load do ficheiro

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

O case nao necessita de ter chavetas({}).

Mas fica bastante mais legível se utilizares as chavetas.

Mas, de facto, parece que é um problema de chavetas... e de código mal feito no geral. Cheira-me a corte e costura com copy-paste.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Mas fica bastante mais legível se utilizares as chavetas.

Se identares bem, ate' pode ficar, senao so' ira atrapalhar. Pessoalmente nao meto chavetas porque a minha identacao ja mostra que o codigo esta dentro do case.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

tens de perceber que para ajudar existem imensas pessoas capazes aqui no forum, no entanto é bem complicado quando o problema não é exposto nas seguintes condições

1- o código não está correctamente apresentado com as tags correctas do geshi (no teu caso falta marcar o código como c)

2- o código não está correctamente indentado

3- não especificas que erros aontecem

4- não especificas que se dá valores não esperados, que valores o são.

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas,

os erros que me estão a acontecer é no prorpio switc case, que ainda não entendi bem o porque.

a base do programa é uma lista telefonica, ao inves de isso foi trocado para um lista de livros, tipo uma biblioteca, será que me podem ajudar!

obrigado bom dia

Live for ever

Link to comment
Share on other sites

por não dizeres quais os erros que te aparecem na execução da aplicação é IMPOSSÍVEL especificar qual o problema em concreto

por essa razão a única coisa que posso fazer é apontar problemas/erros de código

1º - o uso de scanf/fscanf para leitura de strings de uma stream é desaconselhado porque esta função termina a leitura após encontrar qualquer tipo de caracter representativo de espaço. isto implica que qualquer string com mais de uma palavra nunca irá ser correctamente lida. nestes casos usasse o fgets.

2º - a função strcmp retorna um valor relativo entre as duas strings. logo quando as duas strings são iguais, retorna o valor 0. tu tens a comparação a verificar o contrário

3º - na função listar estás a ler somente o título do livro, não estás a ler também a informação restante guardada. isto leva a que (em caso de que se a leitura da linha tivesse correcta, ver caso 1) terias a contabilizar as linhas de informação extra como um novo registo. no final estás a ter o tripulo dos registos realmente em ficheiro

4º - No primeiro caso do teu switch do main, não estás a perguntar a editora, levando a ser enviado para a função regista o "lixo" (porque esta variável nunca foi inicializada) existente na variável "editora"

5º - no segundo caso, tens código "else" sem existência de um "if" anterior. isto leva imediatamente a erro do compilador com a respectiva mensagem.

e quando te pedem para dizer qual o erro que te dá, é esperado QUE APRESENTES OS ERROS QUE TE APARECEM !!!!

6º - o uso indiscriminado da função scanf para leitura de valores do teclado leva imperativamente a erros devido à falta de sanitização do buffer de leitura. isto leva muitas vezes a parecer que a aplicação não executa instruções scanf ou parecer que "responde" sozinha a estas instruções. para resolver este tipo de problemas, é esperado que o programador limpe sempre o buffer de leitura após a chamada do scanf.

isto é uma pequena lista de problemas que vejo à primeira vista no teu código, pode existir muitos mais

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.