Ir ao conteúdo

Acervo de livros de Biblioteca em C - Ajudem-me!!


cegordb

Posts recomendados

Postado

Ola pessoal

to com um problema!

eu peguei um programinha simples de acervo e modifiquei ele

coloquei ele um pouco mais completo e tal..

mas agora eu to querendo faze uma coisa mas nao sei como

por exemplo

Ele armazana os livros e tal.. ai fica assim

Numeração | Nome do Livro | Autor | Disponibilidade | Informação

eu gostaria de poder Remover um livro da lista

atraves do numero..

tem la os numeros de listos

0001

0002

0003

0004

.....

Ai no comando de remover ele pedia o numero do livro a ser removido

estou disponibilizando o codigo ai em baixo

se vocês puderem me ajudar eu agradeço de coração!

// Programa p39.c
#include <stdio.h>
#include <stdlib.h>

typedef struct disponivel
{
int nvezes;
} disponivel;

typedef struct emprestado
{
int leitor;
int dia;
int mes;
int ano;
} emprestado;

typedef struct livro
{
int num;
char tit[50];
int status;
char aut[30];
union
{
disponivel disp;
emprestado empr;
};
} livro;

FILE *arq;
livro liv;

char opcao_menu()
{
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" Bem vindo a biblioteca virtual do colegio Sebastiao da Rocha Miranda");
printf("\n\n\n\n\n\n\n\n\n");
printf(" (A)tualizar acervo\n");
printf(" (L)istar acervo\n");
printf(" (E)mprestar livro\n");
printf(" (R)eceber livro\n");
printf(" (F)im\n");
printf(" > ");
return (toupper(getche()));
}

int encontra_livro(int n)
{
fread(&liv,sizeof(livro),1,arq);
while (!feof(arq))
{
if (liv.num == n)
{
fseek(arq,-sizeof(livro),SEEK_CUR);
return 1;
}
fread(&liv,sizeof(livro),1,arq);
}
return 0;
}

void atualizar_acervo()
{
int num;

arq = fopen("acervo.dat","a+b");
if (arq == NULL)
{
printf("\nErro ao abrir arquivo\n");
return;
}
printf("\n");
printf("Numero do livro: ");
scanf("%d",&num);
if (encontra_livro(num) == 1)
printf("Ja existe livro com este numero!\n");
else
{
liv.num = num;
printf("Titulo do livro: ");
fflush(stdin);
gets(liv.tit);
liv.status = 0; // livro disponivel
liv.disp.nvezes = 0; // numero de emprestimos
printf("Autor do livro: ");
fflush(stdin);
gets(liv.aut);
fwrite(&liv,sizeof(livro),1,arq);
printf("Livro %d incorporado ao acervo.\n",num);
}
fclose(arq);
}

void listar_acervo()
{
#define MAX_LINHAS 5
int lin,pag;

arq = fopen("acervo.dat","r+b");
if (arq == NULL)
{
printf("\nErro ao abrir arquivo\n");
return;
}

pag = 0;
lin = MAX_LINHAS;
fread(&liv,sizeof(livro),1,arq);
while (!feof(arq))
{
if (lin == MAX_LINHAS)
{
lin = 0;
pag++;
system("Cls");
printf(" LISTAGEM DO ACERVO %24s Pag. %03d\n"," ",pag);
printf(" +-------+----------------+---------+-------+--------------+\n");
printf(" | NUM | TITULO | Autor | STT | INFORMACAO |\n");
printf(" +-------+----------------+---------+-------+--------------+\n\n\n");
}
lin++;
printf(" %05d | %20s | %20s ",liv.num,liv.tit,liv.aut);
if (liv.status == 0)
printf(" D | E:%04d \n",liv.disp.nvezes);
else
printf(" E | D:%02d/%02d/%04d \n",
liv.empr.dia,liv.empr.mes,liv.empr.ano);
fread(&liv,sizeof(livro),1,arq);
if (feof(arq) || (lin == MAX_LINHAS))
{
if (!feof(arq))
system("Pause");
}
}
fclose(arq);
}

void emprestar()
{
int num;

arq = fopen("acervo.dat","r+b");
if (arq == NULL)
{
printf("\nErro ao abrir arquivo\n");
return;
}
printf("\n");
printf("Numero do livro ..... ");
scanf("%d",&num);
if (encontra_livro(num) == NULL)
printf("Este livro nao existe!\n");
else
{
fread(&liv,sizeof(livro),1,arq);
if (liv.status == 1)
printf("Livro ja emprestado (devolucao ate %02d/%02d/%04d)\n",
liv.empr.dia,liv.empr.mes,liv.empr.ano);
else
{
liv.status = 1;
liv.empr.leitor = liv.disp.nvezes+1;
printf("Data de devolucao ... ");
scanf("%d/%d/%d",&liv.empr.dia,&liv.empr.mes,&liv.empr.ano);
fseek(arq,-sizeof(livro),SEEK_CUR);
fwrite(&liv,sizeof(livro),1,arq);
printf("Emprestimo OK!\n");
}
}
fclose(arq);
}

void receber()
{
int num;

arq = fopen("acervo.dat","r+b");
if (arq == NULL)
{
printf("\nErro ao abrir arquivo\n");
return;
}
printf("\n");
printf("Numero do livro ..... ");
scanf("%d",&num);
if (encontra_livro(num) == 0)
printf("Este livro nao existe!\n");
else
{
fread(&liv,sizeof(livro),1,arq);
if (liv.status == 0)
printf("Este livro ja esta disponivel.\n");
else
{
liv.status = 0;
liv.disp.nvezes = liv.empr.leitor;
fseek(arq,-sizeof(livro),SEEK_CUR);
fwrite(&liv,sizeof(livro),1,arq);
printf("Devolucao OK!\n");
}
}
fclose(arq);
}

int main(int args, char * arg[])
{
char op;

do
{
op = opcao_menu();
switch (op)
{
case 'A': atualizar_acervo(); break;
case 'L': listar_acervo(); break;
case 'E': emprestar(); break;
case 'R': receber(); break;
}
printf("\n");
system("Pause");
}
while (op != 'F');
return 0;
}

Desde de já agradeço!!!

Postado

Eu não programo pra PC, por isso vou dar só uma ideia.

Ao invés de você eliminar o registro que você precisa, e no caso do registro ser gravado em disco, o que implica em ter que reorganizar a lista e depois salvar em disco tudo de novo, porque você simplesmente não marca o registro como deletado e ignora esse registro quando alguém pedir a listagem dos livros? Tem lá na sua estrutura, a numeração dos livros. Marca todos os eliminados como ZERO, e ignora a leitura dos registros que contenham zero como código.

É alguma coisa tipo a FAT do windows. Um arquivo deletado, não é eliminado do disco, ele simplesmente é marcado como "apagado" e depois é ignorado quando se lista o disco e o espaço fica disponível para nova gravaçao por cima.

Mesmo processo! E depois você poderia implementar uma rotina real de limpeza de registros deletados. Coisa de administrador, que, óbvio, não seria feita todo o dia!

É só uma ideia.

[]'s

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!