Equipe6-2015-1

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

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
  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 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.

Avaliação (professor)

Caros alunos!

O programa atendeu basicamente a todos requisitos. Foram feitas novas implementações interessantes e gostei da wiki. Pena o código fonte não estar comentado, e, durante a apresentação, identificamos que programa trabalha diretamente com o arquivo, indo um pouco de encontro ao que eu esperava que era trabalhar diretamente com as listas como havíamos conversado.

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

(Com exceção do Augusto que faltou.)

Douglas A.

Código fonte

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

typedef struct bicicletas{
    char codigo[5];
    char descricao[20];
    float preco;
    int qtdade;
    struct bicicletas *prox;
    struct bicicletas *ant;
} lista;

FILE *fp;
FILE *fp_temp;

/* Abrir .dat */
abrir(char tipo[3]){
    fp=fopen("bicicletas.dat", tipo);
}

/* Função Listar*/
void listar(){
    abrir("r");
    char cod0[5], desc0[20];
    float preco0;
    int qntd0;
    if(fp == NULL)
        printf("Erro, não foi possível abrir o arquivo.\n\n");
	else
        printf("\t\t\t  **IMPRESSAO DA LISTA**\n\n");
    while( (fscanf(fp,"%s %s %f %d\n", cod0, desc0, &preco0, &qntd0))!=EOF )
        printf(" Codigo:%s\n Descricao:%s\n Preco:%.2f\n Quantidade:%d\n\n", cod0, desc0, preco0, qntd0);

	fclose(fp);

	//return 0;
}

/* Função Inserir*/

lista *inserir(lista*atual){
    abrir("a");
    //fseek(fp,0L, SEEK_END);
    lista *novo=NULL,*p=atual;
    int qtd;
    float valor;
    char temp[20],aux[5];
    printf("\t\t\t     **Novo Elemento!**\n");
    printf("\n\n");
    printf("Código: ");
    scanf("%s", aux);
    printf("Descrição: ");
    scanf("%s", temp);
    printf("Preço: ");
    scanf("%f", &valor);
    printf("Quantidade: ");
    scanf("%d", &qtd);
    if(p==NULL){
        p = (lista *) malloc(sizeof(lista));
        if(p==NULL)
            printf("\t\t\tNão foi possível realizar a operação !\n\n");
        else{
            strcpy(p->codigo,aux);
            strcpy(p->descricao,temp);
            p->preco = valor;
            p->qtdade = qtd;
            p->prox = NULL;
            p->ant=NULL;
            fprintf(fp, "%s %s %0.2f %d\n", p->codigo, p->descricao, p->preco, p->qtdade);
            return(p);/*retorna lista com o novo elemento*/
            fclose(fp);

        }
    }
    else{
        novo=(lista*)malloc(sizeof(lista));
        if(novo==NULL)
            printf("\t\tNao foi possivel realizar a operacao !\n\n");
        else{
            strcpy(novo->codigo,aux);
            strcpy(novo->descricao,temp);
            novo->preco = valor;
            novo->qtdade = qtd;
            novo->prox=p;
            novo->ant=NULL;
            p->ant=novo;
            fprintf(fp, "%s %s %0.2f %d\n", novo->codigo, novo->descricao, novo->preco, novo->qtdade);
            return(novo);
            fclose(fp);
        }
    }

}

/* Função Busca */

void busca(){
    abrir("r");
    char cod0[5], desc0[20], codBusca[5];
    float preco0;
    int qntd0, i=0;
    printf("\t\t\t      **BUSCAR BICLETA**\n\n");
    printf("Código da bicicleta:");
    scanf("%s", &codBusca);
    system("clear");
    if(fp == NULL)
        printf("Erro, não foi possível abrir o arquivo.\n\n");
	else
        printf("\t\t\t  **BUSCAR BICICLETA**\n\n");
    while( (fscanf(fp,"%s %s %f %d\n", cod0, desc0, &preco0, &qntd0))!=EOF )
        if(strcmp(codBusca, cod0) == 0){
            printf(" Codigo:%s\n Descricao:%s\n Preco:%.2f\n Quantidade:%d\n\n", cod0, desc0, preco0, qntd0);
            i++;
        }
    if(i==0){
        printf("Nenhuma bicicleta encontrada.\n\n");
    }
	fclose(fp);

	//return 0;

}


/* Função Alterar*/

void alterar(){
    abrir("r");
    fp_temp=fopen("bicicletas_temp.dat", "w");
    char cod0[5], desc0[20], desc1[5];
    float preco0, preco1;
    int qntd0, qntd1;
    char codBusca[5];
    printf("\t\t\t     **ALTERAR BICICLETA!**\n\n");
    printf("Código da bicicleta:");
    scanf("%s", &codBusca);
    system("clear");
    if(fp == NULL)
        printf("Erro, nao foi possivel abrir o arquivo\n");
	else
        printf("\t\t    **ALTERAR BICICLETA - CÓDIGO: %s**\n", codBusca);
    while( (fscanf(fp,"%s %s %f %d\n", cod0, desc0, &preco0, &qntd0))!=EOF )
        if(strcmp(codBusca, cod0) != 0){
            fprintf(fp_temp, "%s %s %0.2f %d\n", cod0, desc0, preco0, qntd0);
        }else{
            printf("\nNova descrição(Antes: %s):", desc0);
            scanf("%s", desc1);
            printf("Novo preço(Antes: %0.2f):", preco0);
            scanf("%f", &preco1);
            printf("Nova quantidade(Antes: %d):", qntd0);
            scanf("%d", &qntd1);
            printf("\n");

            fprintf(fp_temp, "%s %s %0.2f %d\n", cod0, desc1, preco1, qntd1);
        }
    fclose(fp);
    fclose(fp_temp);
    remove("bicicletas.dat");
    rename("bicicletas_temp.dat","bicicletas.dat");

	//return 0;

}

/* Função Excluir */
void excluir(){
    abrir("r");
    fp_temp=fopen("bicicletas_temp.dat", "w");
    char cod0[5], desc0[20];
    float preco0;
    int qntd0, opcao;
    char codBusca[5];
    printf("\t\t\t   **EXCLUIR BICICLETA**\n\n");
    printf("\n\n");
    printf("Código da bicicleta:");
    scanf("%s", &codBusca);
    system("clear");
    if(fp == NULL)
        printf("Erro, nao foi possivel abrir o arquivo\n");
	else
        printf("\t\t\t   **EXCLUIR BICICLETA**\n\n");


        while( (fscanf(fp,"%s %s %f %d\n", cod0, desc0, &preco0, &qntd0))!=EOF )
            if(strcmp(codBusca, cod0) != 0){
                fprintf(fp_temp, "%s %s %0.2f %d\n", cod0, desc0, preco0, qntd0);
            }else{
                printf("Código: %s\n", cod0);
                printf("Descrição: %s\n", desc0);
                printf("Preço: %0.2f\n", preco0);
                printf("Quantidade: %d\n\n", qntd0);
                printf("Tem certeza que deseja excluir?(SIM = 1)\n");
                scanf("%d", &opcao);
                system("clear");
                if(opcao != 1){
                    fprintf(fp_temp, "%s %s %0.2f %d\n", cod0, desc0, preco0, qntd0);
                }else{
                printf("\nBicicleta excluída com sucesso!\n\n");
                }

            }

    fclose(fp);
    fclose(fp_temp);
    remove("bicicletas.dat");
    rename("bicicletas_temp.dat","bicicletas.dat");



}

/* Função Excluir */
void estatisticas(){

    abrir("r");
    char cod0[5], desc0[20];
    float preco0, mediaPrecos, maiorPreco, menorPreco=10000000, somaPrecos = 0;
    int qntd0, i=0;

    if(fp == NULL)
        printf("Erro, nao foi possivel abrir o arquivo\n");
	else
        printf("\t\t\t   **Estatísticas**\n\n");
    while( (fscanf(fp,"%s %s %f %d\n", cod0, desc0, &preco0, &qntd0))!=EOF ){
        i++;
        somaPrecos = somaPrecos + preco0;
        if(maiorPreco < preco0){
            maiorPreco = preco0;
        }

        if(menorPreco > preco0){
            menorPreco = preco0;
        }
    }
    mediaPrecos = somaPrecos/i;

    printf("Média do preços = %0.2f\n", mediaPrecos);
    printf("Maior preço = %0.2f\n", maiorPreco);
    printf("Menor preço = %0.2f\n\n", menorPreco);
    fclose(fp);



}

/* DESALOCA */

lista *desaloca(lista *alocada){
    lista *p=alocada,*aux;
    if(alocada!=NULL){
        while(p!=NULL){
            aux=p->prox;
            free(p);
            p=aux;
        }
    }
    return p;

}

/* Execução do Programa*/

main(){


    lista *atual=NULL;
    int opcao;
    do{
        printf("  ______________________* GERENCIAMENTO DE BICICLETAS *_______________________\n");
        printf("\n\n *MENU*\n\n");
        printf("1:Listar \n2:Inserir \n3:Buscar \n4:Alterar \n5:Excluir \n6:Estatísticas\n0:Sair\n\n");
        scanf("%d", &opcao);
        system("touch bicicletas.dat");
		system("clear");
		switch(opcao){
            case 1: listar(); break;
            case 2: atual=inserir(atual); fclose(fp); break;
            case 3: busca(); break;
            case 4: alterar(); break;
            case 5: excluir(); break;
            case 6: estatisticas(); break;
            case 0: desaloca(atual); exit(1);
            default :printf("\t\t\t   **Opção Inválida !**\n\n");
            printf("\a");
        }
        //fclose(fp);
        fflush(stdin);
  }while((opcao!='0')&& (opcao!='0'));
}



<< Equipe6-2015-1