Equipe6-2015-1
Integrantes
AUGUSTO DA SILVEIRA WILLEMANN
GABRIEL FARIAS TURNES
JEFERSON RICARDO TICHZ ESPINDOLA
Descrição da atividade principal
Implemente um programa em linguagem C que faça o controle de estoque simplificado de uma loja que vende bicicletas. 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 as bicicletas já cadastradas a venda, poderá acrescentar novas bicicletas, eliminar bicicletas, e buscar um bicicletas específica pelo seu código. Deverá ainda ter as opções de ordenar e imprimir a lista na tela de todas as bicicletas. 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 a quantidade de bicicletas, o maior, menor e valor médio das bicicletas cadastradas.
Descrição da atividade específica
- Fazer uso
- Comando swith
- Lista encadeada
- Ponteiros
- Alocação Dinâmica de Memória
- Funções para tratamento de arquivo
- Exemplo da estrutura (encadeada)
struct TBicicleta{ char codigo[5]; char descricao[20]; float preco; int qtdade; struct TBicicleta *prox; };
- Exemplo de arquivo (bicicletas.dat)
cat bicicletas.dat A111 MEGAULTRA 1920.00 10 FG02 KRONA 280.00 20 1B0A CALOI 1785.00 5 11CA HPS12 850.00 10
Atividades
Distribuição
Gabriel
Pensou na estrutura do programa, ajudou na criação das funções e execução das mesmas para que atendessem os requisitos, procurou a melhor maneira de desenvolver o programa.
Jeferson
Ajudou na criação das funções, auxiliou na correção de erros e fez os testes.
Augusto
Nada
Desenvolvimento
Esqueleto
Primeiramente criamos o esqueleto do programo, a base dele. Escrevemos os códigos mostrando todas as funções necessárias para a execução dele, definimos as estruturas para a bicicletas e planejamos a maneira mais fácil de executar as funções de maneira correta e cumprindo os requisitos.
Funções
Inserir
A primeira função feita foi a de inserir os dados cadastrais, tais como: código, descrição, preço e quantidade, assim como pedido. Existia maneiras mais fáceis para trabalhar com essa função e escrever os dados inseridos em um arquivo, porém usamos lista, ponteiros e alocação dinâmica de memória para atender o requisito que o professor pediu. Focamos em criar um arquivo .bat organizado por meio da estrutura "%s %s %0.2f %d\n", ou seja, "código descrição preço quantidade". Cada bicicleta foi separada por uma quebra de linha ("\n") e cada campo da bicicleta foi separa por um espaço. Usamos a função fprintf para escrever no arquivo "bicicletas.dat".
Abrir
Uma simples função que abre o arquivo "bicicletas.dat" de uma maneira mais simples para agilizar o processo de abrir o arquivo em todas as funções, nada mais que isso.
Listar
Nessa função apenas executamos a função fscanf para ler o nosso arquivo "bicicletas.dat". Ele lê nosso "banco de dados" de maneira organizada, através da estrutura "%s %s %f %d\n", a mesma usada para inserir as bicicletas. Essa maneira de organização facilitou muito o andamento do projeto. Separamos cada campo em uma variável, assim podendo organiza-las no printf para melhor visualização.
Buscar
Muito parecida com a função "Listar", a função que busca as bicicletas no nosso arquivo "bicicletas.dat" se baseia na separação dos campos por meio de variáveis. Pensando nessa maneira, listamos as bicicletas, porém apenas aquela que possuía o código digitado pelo usuário. Comparamos o valor digitado pelo usuário com a variável cod0, que se refere ao código da bicicleta, tudo isso através da função strcmp. Se os valores fossem iguais o programa mostraria as informações da bicicleta.
Alterar
A função "Alterar", um pouco diferente das outras, utiliza da busca usada na função "Buscar". Após digitada pelo usuário o código da bicicleta que ele deseja alterar, o programa faz uma busca e encontra a bicicleta com o código informado. Nessa hora ficou uma duvida: como alterar uma linha inteira no arquivo "bicicletas.dat"? Essa pergunta deu um nó na nossa cabeça até que pensamos: Por que não criar um arquivo temporário e mandar os dados do arquivo antigo para esse temporário? Com esse pensamento, desenvolvemos a função "Alterar" através da cópia dos dados que não seriam alterados para outro arquivo e escrever em uma nova linha os novos dados da bicicleta alterada. Usamos a condição usada na função "Busca", se o código digitado fosse diferente do código da bicicleta toda essa linha seria copiada pro novo arquivo temporário. Caso contrário, se o código digitado fosse igual o código da bicicleta, ele iria escrever essa linha baseada nos dados que o usuário digitou para alterar. O código da bicicleta não poderia ser alterado, porque ele seria considerado uma "chave primária" para identificação da bicicleta(linha). Com o novo arquivo chamado "bicicletas_temp.dat" criado, que possui todos os dados necessários alterados, o arquivo "bicicletas.dat" é excluído, pois ele armazena apenas dados antigos e renomeamos o "bicicletas_temp.dat" para "bicicletas.dat", assim satisfazendo nossa necessidade.
Excluir
Idêntica a função "Alterar", porém com uma diferença: ao invés de escrever essa nova linha alterada no novo arquivo, ela apenas não copiaria a linha desejada para o novo arquivo, assim ele seria excluído.
Estatísticas
Última função, bem simples, apenas usando alguns "if" já foi possível produzir o resultado esperado. Contamos os números de linhas, somamos todos os preços e fizemos a média, primeiro requisito feito! Comparamos todos os valores entre si e achamos o maior preço e o menos preço, já tínhamos feito algo parecido em aula, outros dois requisitos feitos. Depois era só exibir a média dos preços, o maior preço e o menor preço e pronto.
Main
Na nossa MAIN contém nada mais que o básico: um simples menu usando "switch" e "loop", onde o usuário digita a opção que deseja. Cada "case" executa sua função e pronto, o programa já pode ser executado.
Tratamento de erros
Alguns erros foram tratados para evitar a quebra do código, porém alguns acabaram passando, pois acreditamos que esse não seja o objetivo do projeto.
Conclusão
Com esse projeto chegamos a uma conclusão: é muito mais viável, para nós, trabalhar por meio de algo que você tem acesso diretamente. Armazenamento de dados é muito mais simples através de arquivos do que dentro do próprio programa. Quando você manipula o arquivo que serve de "banco de dados" diretamente, linha a linha, você consegue observar, analisar muita coisa e isso facilita muito na criação de novas ferramentas. Esse "programinha" que criamos é o básico, porém mexendo nele, criando outras funções, você consegue construir coisas bem maiores, projetos mais complexos, basta estudar algumas funções, pensar na lógica e colocar os dedos pra trabalhar no teclado. Assim concluímos que esse projeto nos ajudou a pensar de diversas maneiras, achar respostas pras nossas perguntas e que existem diversos caminhos para se percorrer, mas vai de cada um escolher o caminho que prefere.
Código fonte
- include <stdlib.h>
- include <stdio.h>
- 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; }
}