Mudanças entre as edições de "Equipe4-2015-1"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(22 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 43: Linha 43:
  
 
==Distribuição==
 
==Distribuição==
 +
 +
===Adilson - Gustavo - Raphael ===
 +
 +
Trabalhamos em conjunto na estrutura do programa, no desenvolvimento das funções, testes e complementação de dados na wiki, enfatizando que o Gustavo trabalhou com mais afinco na construção do esqueleto principal.
  
 
==Desenvolvimento==
 
==Desenvolvimento==
 +
 +
Em primeiro lugar montamos o esqueleto do projeto, definindo as funções a serem tratadas. Fizemos o Switch Case apontando para as funções. Depois cada função foi trabalhada de forma individual, tivemos uma maior dificuldade na função delete_livro().
  
 
==Conclusão==
 
==Conclusão==
 +
 +
O projeto foi uma forma de exercitarmos a manipulação de diversos tipos de arquivos, trabalho em equipe à distância, gerando algumas dificuldades devido conflito de horários com trabalho e compromissos. Neste programa aprendemos a trabalhar de forma mais "profissional", dividindo o trabalho em módulos para conseguirmos desenvolver o programa a distância, procurando através da linguagem em questão, encontrar de forma criativa e coesa soluções para suprir a necessidade do que foi solicitado. É previsível de que ajustes devem ser realizados no código, minimizando erros e proporcionando uma melhor fluidez em uma descrição mais enxuta. Por ser um programa simples, porém complexo, existem possibilidades de adicionar módulos no código em questão, podendo atender necessidades aparentes.
 +
 +
==Notas==
 +
Nota 9 para ambos os integrantes.
 +
 +
 +
==Avaliação (professor)==
 +
 +
Caros alunos!
 +
 +
A equipe me surpreendeu positivamente. O programa atendeu basicamente aos requisitos iniciais, porém, faltou um cuidado maior com a wiki, o código fonte não está comentado, achei que o programa tá fazendo mais coisas do que propõe, - trabalhando com a lista e arquivo ao mesmo tempo. Ficou faltando a parte das estatísticas entre outras coisas que conversamos ontem.
 +
 +
Por isso minha nota para a equipe toda é: 8.
 +
 +
Douglas A.
  
 
=Código fonte=
 
=Código fonte=
Linha 54: Linha 76:
 
#include <string.h>
 
#include <string.h>
 
FILE *fp;
 
FILE *fp;
 +
FILE *fp_temp;
 
char ch;
 
char ch;
 
struct TLivro {
 
struct TLivro {
  char isbn[20];
+
char isbn[20];
  char titulo[50];
+
char titulo[50];
  char autor[40];
+
char autor[40];
  float preco;
+
float preco;
  struct TLivro *next;
+
struct TLivro *next;
 
}*head1, *tail1;
 
}*head1, *tail1;
  
 +
void add_nodo_tail_livro(){
 +
int res;
  
 +
struct TLivro *p =  malloc (sizeof(struct TLivro));
 +
if (!p){
 +
printf("Erro:Alocação\n");
 +
return;
 +
}
  
 +
printf("Entre com o ID do livro (ex: XXX-XX-XXXX-XXX-X,X)\n");
 +
scanf("%s",p->isbn);
 +
printf("Entre com o nome do livro\n");
 +
scanf("%s",p->titulo);
 +
printf("Entre com o nome do autor \n");
 +
scanf("%s",p->autor);
 +
printf("Entre com o preco \n");
 +
scanf("%f",&p->preco);
 +
if ((fp=fopen("livros.dat", "a")) == NULL) {
 +
  printf("Falha na abertura do arquivo\n");
 +
  return;
 +
}
 +
if((res = fprintf(fp,"%s %s %s %f", p->isbn, p->titulo, p->autor, p->preco)) == EOF) {
 +
printf("Erro\n");
 +
}
 +
fclose(fp);
  
 +
p->next = NULL;
  
void add_nodo_tail_livro()
+
if (tail1==NULL) {
 +
  tail1 = head1 = p;
 +
}
 +
else {
 +
tail1->next = p;
 +
tail1 = p;
 +
}
 +
printf("Livro adicionado com sucesso!\n\n");
 +
return;
 +
}
 +
void print_livro_list(struct TLivro *runner)
 
{
 
{
 +
char isbn[20];
 +
char titulo[50];
 +
char autor[40];
 +
float preco;
 
   int res;
 
   int res;
 
+
struct TLivro *p =  malloc (sizeof(struct TLivro));
  struct TLivro *p =  malloc (sizeof(struct TLivro));
+
printf("Lista de livros:\n\n");
  if (!p){
+
fp=fopen("livros.dat", "r");
        printf("Erro:Alocação\n");
+
while( (fscanf(fp,"%s %s %s %f\n", isbn, titulo, autor, &preco))!=EOF )
        return;
+
printf(" isbn:%s\n titulo:%s\n autor:%s\n preco:%f\n\n",isbn, titulo, autor, preco);
  }
+
fclose(fp);
 
+
if (runner==NULL)
  printf("Entre com o ID do livro (ex: XXX-XX-XXXX-XXX-X,X)\n");
+
return;
  scanf("%s",p->isbn);
 
  printf("Entre com o nome do livro\n");
 
  scanf("%s",p->titulo);
 
  printf("Entre com o nome do autor \n");
 
  scanf("%s",p->autor);
 
  printf("Entre com o preco \n");
 
  scanf("%f",&p->preco);
 
  if ((fp=fopen("livros.dat", "a")) == NULL) {
 
      printf("Falha na abertura do arquivo\n");
 
      return;
 
  }
 
  if((res = fprintf(fp,"\n%s,%s,%s,%f", p->isbn, p->titulo, p->autor, p->preco)) == EOF) {
 
    printf("Erro\n");
 
  }
 
  fclose(fp);
 
 
 
  p->next = NULL;
 
 
 
  if (tail1==NULL) {
 
      tail1 = head1 = p;
 
  }
 
  else {
 
      tail1->next = p;
 
      tail1 = p;
 
  }
 
  printf("Livro adicionado com sucesso!\n\n");
 
  return;
 
 
}
 
}
 
+
void excluir(){
 
+
    fp_temp=fopen("livro_temp.dat", "w");
 
+
    fp=fopen("livros.dat", "r");
void print_livro_list(struct TLivro *runner)
+
    char isbn[20];
{
+
char titulo[50];
int res;
+
char autor[40];
struct TLivro *p =  malloc (sizeof(struct TLivro));
+
float preco;
printf("Lista de livros:\n\n");
+
    char codBusca[20];
  if (runner==NULL)
+
int qntd0, opcao;
      return;
+
    printf("\t\t\t  **EXCLUIR LIVRO**\n\n");
  if ((fp=fopen("livros.dat", "a")) == NULL) {
+
    printf("\n\n");
      printf("Falha na abertura do arquivo\n");
+
    printf("Código do livro:");
      return;
+
    scanf("%s", codBusca);
  }
+
    system("clear");
  while (1) {
+
    if(fp == NULL)
      if((res = fscanf(fp,"\n%s,%s,%s,%f", p->isbn, p->titulo, p->autor, &p->preco))==EOF)     {
+
        printf("Erro, nao foi possivel abrir o arquivo\n");
        printf("Fim de leitura\n");
+
else
          break;
+
          while( (fscanf(fp,"%s %s %s %f\n", isbn, titulo, autor, &preco))!=EOF )
          }
+
            if(strcmp(codBusca, isbn) != 0){
          printf("\n%s,%s,%s,%f", p->isbn, p->titulo, p->autor, p->preco);
+
                fprintf(fp_temp, "%s %s %s %f\n",isbn, titulo, autor, preco);
  }
+
            }else{
 
+
                printf("isbn: %s\n", isbn);
  for (;;){
+
                printf("titulo: %s\n", titulo);
  printf("---->ID: %s\n",runner->isbn);
+
                printf("autor: %s\n", autor);
  printf("---->Nome: %s\n",runner->titulo);
+
                printf("preco: %f\n\n", preco);
  printf("---->Autor: %s\n",runner->autor);
+
                printf("Tem certeza que deseja excluir?(SIM = 1)\n");
  printf("---->Preco: %f\n\n",runner->preco);
+
                scanf("%d", &opcao);
if (runner->next==NULL)
+
                system("clear");
      return;
+
                if(opcao != 1){
  else
+
                    fprintf(fp_temp, "%s %s %s %f\n",isbn, titulo, autor, preco);
      runner=runner->next;
+
                }else{
  }
+
                printf("\nLivro excluído com sucesso!\n\n");
 +
                }
 +
            }
 +
    fclose(fp);
 +
    fclose(fp_temp);
 +
    remove("livros.dat");
 +
    rename("livro_temp.dat","livros.dat");
 
}
 
}
 
 
 
void delete_livro(struct TLivro *runner){
 
void delete_livro(struct TLivro *runner){
char id[20];
+
  char id[20];
struct TLivro *prunner;
+
  struct TLivro *prunner;
  printf("Entre com o ID do livro a ser deletado (ex: XXX-XX-XXXX-XXX-X,X)\n");
+
  printf("Entre com o ID do livro a ser deletado (ex: XXX-XX-XXXX-XXX-X,X)\n");
 
   scanf("%s",id);
 
   scanf("%s",id);
  
Linha 150: Linha 188:
 
       return;
 
       return;
  
  if(runner==head1){
+
  if(runner==head1){
 
       head1=runner->next;
 
       head1=runner->next;
  }
+
  }
  
  for (;runner->next==NULL;runner=runner->next){
+
  for (;runner->next==NULL;runner=runner->next){
 
     if(strcmp(id,runner->isbn)==0){
 
     if(strcmp(id,runner->isbn)==0){
 
         if(prunner!=NULL){
 
         if(prunner!=NULL){
Linha 161: Linha 199:
 
                 tail1=prunner;
 
                 tail1=prunner;
 
             }
 
             }
        if(prunner==NULL && runner==tail1){
+
            if(prunner==NULL && runner==tail1){
 
                 tail1=NULL;
 
                 tail1=NULL;
 
             }
 
             }
        free(runner);
+
            free(runner);
 +
        }
 +
        prunner=runner;
 
     }
 
     }
    prunner=runner;
 
}
 
 
 
}
 
}
 
}
 
}
 +
/*
 +
Funçao find_livro()
 +
Proucura um id em uma string enquanto n~ao achar ele vai apontar para a proxima posicao da estrutura, se chegar ao fim da estrutura e n~ao encontrar retorna n~ao encontrado
 +
*/
 
void find_livro(struct TLivro *runner){
 
void find_livro(struct TLivro *runner){
char id[20];
+
  char id[20];
  printf("Entre com o ID do livro a ser encontrado (ex: XXX-XX-XXXX-XXX-X,X)\n");
+
  printf("Entre com o ID do livro a ser encontrado (ex: XXX-XX-XXXX-XXX-X,X)\n");
 
   scanf("%s",id);
 
   scanf("%s",id);
 
  if (runner==NULL){
 
    printf("Livro não encontrado!\n\n");
 
      return;
 
    }
 
 
 
 
   for (;;){
 
   for (;;){
  if(strcmp(id,runner->isbn)==0){
+
    if(strcmp(id,runner->isbn)==0){
  printf("---->ID: %s\n",runner->isbn);
+
        printf("---->ID: %s\n",runner->isbn);
  printf("---->Nome: %s\n",runner->titulo);
+
        printf("---->Nome: %s\n",runner->titulo);
  printf("---->Autor: %s\n",runner->autor);
+
        printf("---->Autor: %s\n",runner->autor);
  printf("---->Preco: %f\n\n",runner->preco);
+
        printf("---->Preco: %f\n\n",runner->preco);
   return;
+
        return;
 +
    }
 +
    if (runner->next==NULL){
 +
      printf("Livro não encontrado!\n\n");
 +
      return;
 +
   }
 +
  else
 +
    runner=runner->next;
 
}
 
}
if (runner->next==NULL){
 
        printf("Livro não encontrado!\n\n");
 
      return;
 
 
}
 
}
  else
 
      runner=runner->next;
 
  }
 
 
 
}
 
 
 
 
 
void stats(struct TLivro *runner){
 
void stats(struct TLivro *runner){
float max=0;
+
    float max=0;
float min=0;
+
    float min=0;
int nlivros=1;
+
    int nlivros=1;
float vmedio=0;
+
    float vmedio=0;
 
+
    printf("Estatisticas:\n\n");
printf("Estatisticas:\n\n");
+
    if (runner==NULL)
  if (runner==NULL)
+
        return;
    return;
+
    min=runner->preco;
 
+
    for (;;){
  min=runner->preco;
+
        if(max<runner->preco){
 
+
            max=runner->preco;
  for (;;){
+
        }
    if(max<runner->preco){
+
        if(min>runner->preco){
        max=runner->preco;
+
            min=runner->preco;
    }
+
        }
    if(min>runner->preco){
+
        vmedio=vmedio+runner->preco;
        min=runner->preco;
+
        if (runner->next==NULL)
    }
+
          break;
    vmedio=vmedio+runner->preco;
+
      else
 
+
          nlivros++;
 
 
if (runner->next==NULL)
 
      break;
 
  else
 
      nlivros++;
 
 
       runner=runner->next;
 
       runner=runner->next;
  }
+
  }
  vmedio=vmedio/nlivros;
+
  vmedio=vmedio/nlivros;
  printf("---->Preco max: %f\n",max);
+
  printf("---->Preco max: %f\n",max);
  printf("---->Preco min: %f\n",min);
+
  printf("---->Preco min: %f\n",min);
  printf("---->Numero de livros: %d\n",nlivros);
+
  printf("---->Numero de livros: %d\n",nlivros);
  printf("---->Preco medio: %f\n\n",vmedio);
+
  printf("---->Preco medio: %f\n\n",vmedio);
 
 
 
}
 
}
 
void carrega_livro_list(){
 
 
 
}
 
 
void salva_livro_list(){
 
 
 
}
 
 
 
main()
 
main()
 
{
 
{
 
 
   head1 = tail1 = NULL;
 
   head1 = tail1 = NULL;
 +
  int opcao;
 +
  printf("\e[H\e[2J");
 +
      MENU:
 +
      printf("Entre com uma opção:\n 1-Adicionar Livro. \n 2-Lista de Livros. \n 3-Remover Livro. \n 4-Estatisticas. \n 5-Procurar Livro. \n 6-Sair.\n");
 +
      scanf ("%d",&opcao);
 +
      switch(opcao) {
 +
      case 1:
 +
printf("\e[H\e[2J");
 +
    add_nodo_tail_livro();
 +
goto MENU;
 +
      case 2:
 +
printf("\e[H\e[2J");
 +
    print_livro_list (head1);
 +
    goto MENU;
 +
      case 3:
 +
    printf("\e[H\e[2J");
 +
        excluir();
 +
              goto MENU;
 +
      case 4:
 +
        printf("\e[H\e[2J");
 +
                stats(head1);
 +
                goto MENU;
 +
      case 5:
 +
                printf("\e[H\e[2J");
 +
                find_livro(head1);
 +
                goto MENU;
 +
      case 6:
 +
                printf("\e[H\e[2J");
 +
                return;
 +
        }
  
int opcao;
+
}
printf("\e[H\e[2J");
 
 
 
  MENU:
 
 
 
  printf("Entre com uma opção:\n 1-Adicionar Livro. \n 2-Lista de Livros. \n 3-Remover Livro. \n 4-Estatisticas. \n 5-Procurar Livro. \n 6-Sair.\n");
 
  scanf ("%d",&opcao);
 
  switch(opcao) {
 
  case 1:
 
          printf("\e[H\e[2J");
 
          add_nodo_tail_livro();
 
          goto MENU;
 
  case 2:
 
          printf("\e[H\e[2J");
 
          print_livro_list (head1);
 
          goto MENU;
 
  case 3:
 
          printf("\e[H\e[2J");
 
          delete_livro(head1);
 
          goto MENU;
 
  case 4:
 
          printf("\e[H\e[2J");
 
          stats(head1);
 
          goto MENU;
 
  case 5:
 
          printf("\e[H\e[2J");
 
          find_livro(head1);
 
          goto MENU;
 
  case 6:
 
          printf("\e[H\e[2J");
 
          return;
 
 
 
  }
 
 
 
 
 
  }
 
</syntaxhighlight>
 
 
 
 
 
 
 
----
 
{| border="1" cellpadding="5" cellspacing="0"
 
! style="background: #cdc5bf;" | [[AULA 21 - Programação 1 - Graduação | << ]]
 
! style="background: #cdc5bf;" | Equipe4-2015-1
 
|}
 

Edição atual tal como às 11h10min de 1 de julho de 2015

Integrantes

ADILSON GOEDERT SIQUEIRA

GUSTAVO VIEIRA ZACCHI

RAPHAEL WASHINGTON BAPTISTA GIASSI


Descrição da atividade principal

Implemente um programa em linguagem C que faça o controle de estoque simplificado de livros. O programa deverá ter necessariamente um menu onde se poderá fazer a escolha pelas opções disponíveis em loop contínuo, mas com opção de saída. Deverá ler de um arquivo de dados informações sobre os livros(já cadastrados), poderá acrescentar novos livros, eliminar livros, e buscar um livro específico pelo isbn. Deverá ainda ter as opções de ordenar e imprimir a lista na tela de todos os livros. também deverá gravar as alterações no mesmo arquivo de dados lido. Pra terminar, contar com uma opção de estatística dizendo qual o número de livros, o maior, menor e valor médio dos livros.

Descrição da atividade específica (dessa equipe)

Fazer uso
  1. Comando swith
  2. Lista encadeada
  3. Ponteiros
  4. Alocação Dinâmica de Memória
  5. Funções para tratamento de arquivo


Exemplo da estrutura (encadeada)
struct TLivro {
   char isbn[20];
   char titulo[50];
   char autor[40];
   float preco;
   struct TLivro *prox;
};
Exemplo de arquivo (livros.dat)
cat livros.dat
978-85-8041-019-8,O DIA DA CAÇA,JAMES PATTERSON,19.90 
978-85-8044-027-0,A FURIA DOS REIS,GEORGE R.R. MARTIN,56.80 
85-204-1043-X,BODY FOR LIFE,BILL PHILLIPS,99.80
978-85-99296-93-6,CILADA,HARLAN COBEN,21.50
978-85-8041-191-1,NAO BRINQUE COM FOGO,JOHN VERDON,36.70

Atividades

Distribuição

Adilson - Gustavo - Raphael

Trabalhamos em conjunto na estrutura do programa, no desenvolvimento das funções, testes e complementação de dados na wiki, enfatizando que o Gustavo trabalhou com mais afinco na construção do esqueleto principal.

Desenvolvimento

Em primeiro lugar montamos o esqueleto do projeto, definindo as funções a serem tratadas. Fizemos o Switch Case apontando para as funções. Depois cada função foi trabalhada de forma individual, tivemos uma maior dificuldade na função delete_livro().

Conclusão

O projeto foi uma forma de exercitarmos a manipulação de diversos tipos de arquivos, trabalho em equipe à distância, gerando algumas dificuldades devido conflito de horários com trabalho e compromissos. Neste programa aprendemos a trabalhar de forma mais "profissional", dividindo o trabalho em módulos para conseguirmos desenvolver o programa a distância, procurando através da linguagem em questão, encontrar de forma criativa e coesa soluções para suprir a necessidade do que foi solicitado. É previsível de que ajustes devem ser realizados no código, minimizando erros e proporcionando uma melhor fluidez em uma descrição mais enxuta. Por ser um programa simples, porém complexo, existem possibilidades de adicionar módulos no código em questão, podendo atender necessidades aparentes.

Notas

Nota 9 para ambos os integrantes.


Avaliação (professor)

Caros alunos!

A equipe me surpreendeu positivamente. O programa atendeu basicamente aos requisitos iniciais, porém, faltou um cuidado maior com a wiki, o código fonte não está comentado, achei que o programa tá fazendo mais coisas do que propõe, - trabalhando com a lista e arquivo ao mesmo tempo. Ficou faltando a parte das estatísticas entre outras coisas que conversamos ontem.

Por isso minha nota para a equipe toda é: 8.

Douglas A.

Código fonte

<syntaxhighlight lang=c>

  1. include <stdlib.h>
  2. include <stdio.h>
  3. include <string.h>

FILE *fp; FILE *fp_temp; char ch; struct TLivro {

char isbn[20];
char titulo[50];
char autor[40];
float preco;
struct TLivro *next;

}*head1, *tail1;

void add_nodo_tail_livro(){ int res;

struct TLivro *p = malloc (sizeof(struct TLivro)); if (!p){ printf("Erro:Alocação\n"); return; }

printf("Entre com o ID do livro (ex: XXX-XX-XXXX-XXX-X,X)\n"); scanf("%s",p->isbn); printf("Entre com o nome do livro\n"); scanf("%s",p->titulo); printf("Entre com o nome do autor \n"); scanf("%s",p->autor); printf("Entre com o preco \n"); scanf("%f",&p->preco); if ((fp=fopen("livros.dat", "a")) == NULL) { printf("Falha na abertura do arquivo\n"); return; } if((res = fprintf(fp,"%s %s %s %f", p->isbn, p->titulo, p->autor, p->preco)) == EOF) { printf("Erro\n"); } fclose(fp);

p->next = NULL;

if (tail1==NULL) { tail1 = head1 = p; } else { tail1->next = p; tail1 = p; } printf("Livro adicionado com sucesso!\n\n"); return; } void print_livro_list(struct TLivro *runner) { char isbn[20]; char titulo[50]; char autor[40]; float preco;

  int res;

struct TLivro *p = malloc (sizeof(struct TLivro)); printf("Lista de livros:\n\n"); fp=fopen("livros.dat", "r"); while( (fscanf(fp,"%s %s %s %f\n", isbn, titulo, autor, &preco))!=EOF ) printf(" isbn:%s\n titulo:%s\n autor:%s\n preco:%f\n\n",isbn, titulo, autor, preco); fclose(fp); if (runner==NULL) return; } void excluir(){

   fp_temp=fopen("livro_temp.dat", "w");
   fp=fopen("livros.dat", "r");
   char isbn[20];

char titulo[50]; char autor[40]; float preco;

   char codBusca[20];

int qntd0, opcao;

   printf("\t\t\t   **EXCLUIR LIVRO**\n\n");
   printf("\n\n");
   printf("Código do livro:");
   scanf("%s", codBusca);
   system("clear");
   if(fp == NULL)
       printf("Erro, nao foi possivel abrir o arquivo\n");

else

         while( (fscanf(fp,"%s %s %s %f\n", isbn, titulo, autor, &preco))!=EOF )
           if(strcmp(codBusca, isbn) != 0){
               fprintf(fp_temp, "%s %s %s %f\n",isbn, titulo, autor, preco);
           }else{
               printf("isbn: %s\n", isbn);
               printf("titulo: %s\n", titulo);
               printf("autor: %s\n", autor);
               printf("preco: %f\n\n", preco);
               printf("Tem certeza que deseja excluir?(SIM = 1)\n");
               scanf("%d", &opcao);
               system("clear");
               if(opcao != 1){
                   fprintf(fp_temp, "%s %s %s %f\n",isbn, titulo, autor, preco);
               }else{
               printf("\nLivro excluído com sucesso!\n\n");
               }
           }
   fclose(fp);
   fclose(fp_temp);
   remove("livros.dat");
   rename("livro_temp.dat","livros.dat");

} void delete_livro(struct TLivro *runner){

  char id[20];
  struct TLivro *prunner;
  printf("Entre com o ID do livro a ser deletado (ex: XXX-XX-XXXX-XXX-X,X)\n");
  scanf("%s",id);
  if (runner==NULL)
     return;
 if(runner==head1){
     head1=runner->next;
 }
 for (;runner->next==NULL;runner=runner->next){
   if(strcmp(id,runner->isbn)==0){
       if(prunner!=NULL){
           prunner->next=runner->next;
           if(runner==tail1){
               tail1=prunner;
           }
           if(prunner==NULL && runner==tail1){
               tail1=NULL;
           }
           free(runner);
       }
       prunner=runner;
   }

} } /* Funçao find_livro() Proucura um id em uma string enquanto n~ao achar ele vai apontar para a proxima posicao da estrutura, se chegar ao fim da estrutura e n~ao encontrar retorna n~ao encontrado

  • /

void find_livro(struct TLivro *runner){

  char id[20];
  printf("Entre com o ID do livro a ser encontrado (ex: XXX-XX-XXXX-XXX-X,X)\n");
  scanf("%s",id);
  for (;;){
    if(strcmp(id,runner->isbn)==0){
        printf("---->ID: %s\n",runner->isbn);
        printf("---->Nome: %s\n",runner->titulo);
        printf("---->Autor: %s\n",runner->autor);
        printf("---->Preco: %f\n\n",runner->preco);
        return;
    }
    if (runner->next==NULL){
      printf("Livro não encontrado!\n\n");
      return;
  }
  else
    runner=runner->next;

} } void stats(struct TLivro *runner){

   float max=0;
   float min=0;
   int nlivros=1;
   float vmedio=0;
   printf("Estatisticas:\n\n");
   if (runner==NULL)
       return;
   min=runner->preco;
   for (;;){
       if(max<runner->preco){
           max=runner->preco;
       }
       if(min>runner->preco){
           min=runner->preco;
       }
       vmedio=vmedio+runner->preco;
       if (runner->next==NULL)
         break;
     else
         nlivros++;
     runner=runner->next;
 }
 vmedio=vmedio/nlivros;
 printf("---->Preco max: %f\n",max);
 printf("---->Preco min: %f\n",min);
 printf("---->Numero de livros: %d\n",nlivros);
 printf("---->Preco medio: %f\n\n",vmedio);

} main() {

 head1 = tail1 = NULL;
 int opcao;
 printf("\e[H\e[2J");
     MENU:
     printf("Entre com uma opção:\n 1-Adicionar Livro. \n 2-Lista de Livros. \n 3-Remover Livro. \n 4-Estatisticas. \n 5-Procurar Livro. \n 6-Sair.\n");
     scanf ("%d",&opcao);
     switch(opcao) {
     case 1:

printf("\e[H\e[2J"); add_nodo_tail_livro(); goto MENU;

     case 2:

printf("\e[H\e[2J"); print_livro_list (head1); goto MENU;

     case 3:

printf("\e[H\e[2J");

        	excluir();
      	        goto MENU;
     case 4:
        	printf("\e[H\e[2J");
               stats(head1);
               goto MENU;
     case 5:
               printf("\e[H\e[2J");
               find_livro(head1);
               goto MENU;
     case 6:
               printf("\e[H\e[2J");
               return;
       }

}