Veja se este código te ajuda! Acho que ele está funfando!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max 150
// BRUNO C. PAES E MATHEUS C. BENETTI
void flush_in()
{
int ch;
while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}
}
struct biblioteca
{
char nome[50];
int quantidade,area;
float preco;
};
void upper (char nam[50])
{
int tam,i;
tam=strlen(nam);
for (i=0;i<tam;i++)
{
nam[i]=toupper(nam[i]);
}
}
void zera (int livros[max])
{
int i;
for (i=0;i<max;i++)
{
livros[i]=0;
}
}
int local (int livros[max])
{
int i;
for (i=0;i<max;i++)
{
if (livros[i]==0) return i;
}
return -1;
}
void desloca (struct biblioteca *desloca, int livros[max], int i)
{
int x,j,k;
x=local(livros);
for (j=i+1;j<x+1;j++)
{
k=j-1;
strcpy(desloca[k].nome,desloca[j].nome);
desloca[k].quantidade=desloca[j].quantidade;
desloca[k].area=desloca[j].area;
desloca[k].preco=desloca[j].preco;
}
}
void tira (int livros[max])
{
int i;
for (i=0;i<max;i++)
{
if (livros[i]==0) break;
}
i--;
livros[i]=0;
}
void arruma (struct biblioteca *arruma, int x)
{
int i,j,comp,quantaux,areaux;
char aux[50];
float precoaux;
for (i=0;i<x;i++)
{
for (j=i;j<x;j++)
{
comp=strcmp(arruma[i].nome,arruma[j].nome);
if (comp==1)
{
strcpy(aux,arruma[i].nome);
quantaux=arruma[i].quantidade;
areaux=arruma[i].area;
precoaux=arruma[i].preco;
arruma[i].quantidade=arruma[j].quantidade;
arruma[i].area=arruma[j].area;
arruma[i].preco=arruma[j].preco;
strcpy(arruma[i].nome,arruma[j].nome);
strcpy(arruma[j].nome,aux);
arruma[j].quantidade=quantaux;
arruma[j].area=areaux;
arruma[j].preco=precoaux;
}
}
}
}
void arruma_preco (struct biblioteca *arruma, int livros [max])
{
int x,quantaux,areaux,i,j;
char aux[50];
float precoaux;
x=local(livros);
for (i=0;i<x;i++)
{
for (j=i;j<x;j++)
{
if ((arruma[i].preco)<(arruma[j].preco))
{
strcpy(aux,arruma[i].nome);
quantaux=arruma[i].quantidade;
areaux=arruma[i].area;
precoaux=arruma[i].preco;
arruma[i].quantidade=arruma[j].quantidade;
arruma[i].area=arruma[j].area;
arruma[i].preco=arruma[j].preco;
strcpy(arruma[i].nome,arruma[j].nome);
strcpy(arruma[j].nome,aux);
arruma[j].quantidade=quantaux;
arruma[j].area=areaux;
arruma[j].preco=precoaux;
}
}
}
}
int existe (struct biblioteca *existe, int livros[max],char nam[50])
{
int x,i,res;
x=local(livros);
for (i=0;i<x;i++)
{
res=strcmp(nam,existe[i].nome);
if (res==0) return 1;
}
return 0;
}
int menu()
{
int x;
printf("\n\n\n\nBem-Vindo a Livraria Virtual\n");printf("--------------------------------------\n");
printf("1 - Comprar\n");
printf("2 - Vender\n");
printf("3 - Exibir\n");
printf("4 - Consultar\n");
printf("5 - Salvar\n");
printf("6 - Carregar\n");
printf("0 - Sair\n");
printf("Por favor selecione a opcao desejada:\n");
do
{
scanf("%d",&x);
} while ((x>6) || (x<0));
return x;
}
void compra (struct biblioteca *compra,int livros[max])
{
char nam[50];
int x,y;
x=local(livros);
if (x==-1)
{
printf("\nMemoria cheia!");
exit(1);
}
printf("\n\nDigite o nome do livro:\n");
flush_in();
gets(nam);
upper(nam);
y=existe(compra,livros,nam);
if (y==1) printf ("Livro ja existente!");
else
{
strcpy (compra[x].nome,nam);
printf("Digite a quantidade:\n");
do
{
scanf("%d",&compra[x].quantidade);
} while (compra[x].quantidade<0);
printf("Digite o preco do livro:\n");
do
{
scanf("%f",&compra[x].preco);
} while (compra[x].preco<0);
printf("Digite a area correspondente:\n");
printf("1-Exatas\n2-Humanas\n3-Saude\n4-Sociais\n");
do
{
scanf("%d",&compra[x].area);
} while ((compra[x].area<1) || (compra[x].area>4));
arruma(compra,x);
livros[x]=1;
}
}
void vende (struct biblioteca *vende, int livros[max])
{
int x,i,area,q;
char nam[50];
x=local(livros);
printf("\n\nDigite o nome do livro:\n");flush_in(); gets(nam);
upper(nam);
if (existe(vende,livros,nam)==0)
{
printf("\nLivro nao encontrado!\n");
}
else
{
for (i=0;i<x+1;i++)
{
area=strcmp(nam,vende[i].nome);
if (area==0) break;
}
if (vende[i].quantidade>1)
{
vende[i].quantidade--;
}
else
{
desloca(vende,livros,i);
tira(livros);
}
}
}
void exibe (struct biblioteca *exibe,int livros[max])
{
int x,i,op;
x=local(livros);
printf("\n\nSelecione a ordem de exibicao\n1 - Ordem alfabetica\n2 - Ordem de precos\n");
do
{
scanf("%d",&op);
} while ((op<1) || (op>2));
if (op==1)
{
arruma(exibe,x);
for (i=0;i<x;i++)
{
printf("\n---------------------------------");
printf("\nNome do livro: %s", exibe[i].nome);
printf("\nPreco do livro: %.2f", exibe[i].preco);
printf("\nQuantidade do livro: %d", exibe[i].quantidade);
printf("\nArea do livro: %d", exibe[i].area);
printf("\n=================================");
}
}
if (op==2)
{
arruma_preco(exibe,livros);
for (i=0;i<x;i++)
{
printf("\n---------------------------------");
printf("\nNome do livro: %s", exibe[i].nome);
printf("\nPreco do livro: %.2f", exibe[i].preco);
printf("\nQuantidade do livro: %d", exibe[i].quantidade);
printf("\nArea do livro: %d", exibe[i].area);
printf("\n=================================");
}
}
}
void consulta (struct biblioteca *consulta, int livros[max])
{
float media=0, preco_menos, preco_mais;
int op,area,i,x,a,mais=0,menos=0;
char nm[50];
printf("\n\nQual tipo de consulta?\n1-Dados\n2-Area\n3-Preco\n");
do { scanf("%d",&op); } while ((op<1) || (op>3));
x=local(livros);
if (op==1)
{
printf("\nQual o nome do livro?\n");flush_in(); gets(nm); upper(nm);
if (existe(consulta,livros,nm)==0) printf ("\n\n Livro nao encontrado!");
if (existe(consulta,livros,nm)==1)
{
for (i=0;i<x;i++)
{
area=strcmp(nm,consulta[i].nome);
if (area==0) break;
}
printf ("\n nome %s", consulta[i].nome);
printf ("\n area %d", consulta[i].area);
printf ("\n preco %f", consulta[i].preco);
printf ("\n quantidade %d", consulta[i].quantidade);
}
}
if (op==2)
{
printf("\nQual area?\n");
do { scanf("%d",&a); } while ((a<1) || (a>4));
for (i=0;i<x;i++)
{
if (consulta[i].area==a)
{
printf("\n---------------------------------");
printf("\nNome do livro: %s", consulta[i].nome);
printf("\nPreco do livro: %f", consulta[i].preco);
printf("\nQuantidade do livro: %d", consulta[i].quantidade);
printf("\nArea do livro: %d", consulta[i].area);
printf("\n=================================");
}
}
}
if (op==3)
{
if (livros[0]==0) return;
x=local(livros);
preco_menos=consulta[0].preco;
preco_mais=consulta[0].preco;
for (i=0;i<x;i++)
{
media=media+consulta[i].preco;
if (preco_menos>consulta[i].preco)
{
menos=i;
}
if (preco_mais<consulta[i].preco)
{
mais=i;
}
}
media=(media/x);
printf("\n\nPesquiza concluida!!\n");
printf("A media de precos foi de %.2f",media);
printf("\n---------------------------------");
printf("\nO livro mais barato encontrado:\n");
printf ("\nNome %s", consulta[menos].nome);
printf ("\nArea %d", consulta[menos].area);
printf ("\nPreco %.2f", consulta[menos].preco);
printf ("\nQuantidade %d", consulta[menos].quantidade);
printf("\n---------------------------------");
printf("\nO livro mais caro encontrado:\n");
printf ("\n nome %s", consulta[mais].nome);
printf ("\n area %d", consulta[mais].area);
printf ("\n preco %.2f", consulta[mais].preco);
printf ("\n quantidade %d", consulta[mais].quantidade);
}
}
void salva (struct biblioteca *salva, int livros[max])
{
FILE *arq;
char name[50];
int i,resul,x,op;
x=local(livros);
arruma(salva,x);
printf("\n\nDigite o nome do arquivo sem a extensao\n"); flush_in(); gets(name);
strcat(name,".bkp");
arq=fopen(name,"r");
if (arq!=NULL)
{
printf("\n\n Arquivo ja existente!!");
printf("\n\nDeseja sobrescever?\n1-Sim\n2-Nao\n");
do { scanf("%d",&op); } while ((op<1) || (op>2));
if (op==2) { fclose(arq); return; }
}
arq=fopen(name,"w");
resul=fprintf(arq,"%d\n",x);
for (i=0;i<x;i++)
{
resul=fprintf(arq,"%s\n",salva[i].nome);
resul=fprintf(arq,"%d\n",salva[i].area);
resul=fprintf(arq,"%d\n",salva[i].quantidade);
resul=fprintf(arq,"%f\n",salva[i].preco);
if (resul == EOF)
printf("Erro na Gravacao\n");
}
fclose(arq);
}
void carrega (struct biblioteca *carrega, int livros[max])
{
FILE *arq;
int i,x,area,quantidade,op=1;
float preco;
char nam[50],nome[50];
if (livros[0]==1)
{
printf("Memoria ja alocada! Deseja continuar?\n1-Sim\n2-Nao\n");
do { scanf("%d",&op); } while ((op<1) || (op>2));
}
if (op==1)
{
printf("\n\nDigite o nome do arquivo sem a extensao\n");
flush_in();
gets(nam);
strcat(nam,".bkp");
arq=fopen(nam,"r");
if(arq==NULL) printf("Arquivo nao encontrado");
else
{
zera(livros);
fscanf(arq,"%d\n",&x);
if (x>max-1)
{
printf("\nNumero de livros supera memoria!");
return;
}
for (i=0;i<x;i++)
{
livros[i]=1;
}
for (i=0;i<x;i++)
{
fgets(carrega[i].nome,50,arq);
upper(carrega[i].nome);
fscanf(arq,"%d\n",&carrega[i].area);
fscanf(arq,"%d\n",&carrega[i].quantidade);
fscanf(arq,"%f\n",&carrega[i].preco);
}
fclose(arq);
}
}
}
void sair ()
{
int op;
printf("\nVoce deseja realmente sair?\n1-Sim\n2-Nao\n");
do
{
scanf("%d",&op);
} while ((op>2) || (op<1));
if (op==1) exit(1);
return;
}
main()
{
struct biblioteca livro[max];
int x, livros[max];
zera(livros);
comeco:
x=menu();
switch (x)
{
case 1: compra(livro,livros); goto comeco; break;
case 2: vende(livro,livros); goto comeco; break;
case 3: exibe(livro,livros); goto comeco; break;
case 4: consulta(livro,livros); goto comeco; break;
case 5: salva(livro,livros); goto comeco; break;
case 6: carrega (livro,livros); goto comeco; break;
case 0: sair(); goto comeco; break;
}
}