sexta-feira, 7 de dezembro de 2012

Lista 6 de EDA - Estrutura de dados

Lista de estrutura de dados - 6ª lista

Faça um programa que cadastre 50 produtos.
Cada produto deve ser cadastrado com os seguintes dados: código, nome e preço.

1. Use 3 métodos de ordenação diferentes, liste todos os dados na seguintes formas:
  • Ordem crescente de código;
  • Ordem decrescente de preço;
  • Ordem alfabética de nome;
 2. Verifique no vetor ordenado:
  • O produto mais barato, se houver mais de um com o mesmo preço, mostrá-los.
  • Calcule e mostre a diferença entre os preços do produto mais barato e do mais caro.
3. Mostre quantas comparações devem ser feitas para encontrar um produto pelo código usando:
  • Busca sequencial;
  • Busca binária;
Resolução:
#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>

#define TAMANHO 50

typedef struct
{
    int codigo;
    char nome[80];
    float preco;
} Produto;

/* Protótipos das funções */
void inicializa_vetor (Produto**);
void menu (Produto**, int*);
void cadastrar (Produto**, int*);
void listar (Produto**, int*);
void ordenacao (Produto**, int*, int);
void bubblesort(Produto**, int*);
void selectionsort(Produto**, int*);
void insertionsort(Produto**, int*);
float buscarMaisBarato(Produto**, int*, int);
float buscarMaisCaro(Produto**, int*, int);
int buscaLinear(Produto**, int*, int);
int buscaBinaria(Produto**, int*, int);

int
main (void)
{
    Produto *p[TAMANHO];
    int qtde=0; // quantidade de elementos cadastrados em meu vetor

    inicializa_vetor(p);
    menu(p, &qtde);

    return 0;
}

void
inicializa_vetor(Produto **p)
{
    int i;
    for (i=0; i<TAMANHO; i++) p[i]=NULL;
}

void
menu(Produto **p, int *qtde)
{
    int opcao, ordenado=0;

    while (1)
    {
        printf ("\nInforme a opção desejada\n");
        puts ("1 - Cadastrar");
        puts ("2 - Listar");
        puts ("3 - Ordenar");
        puts ("4 - Produto mais barato");
        puts ("5 - Diferença entre produtos");
        puts ("6 - Busca Linear");
        puts ("7 - Busca Binária");
        puts ("8 - Sair");
        printf (".: ");
        scanf ("%d", &opcao);

        switch (opcao)
        {
            case 1:
                cadastrar(p, qtde);
                ordenado=0;
            break;
            case 2:
                listar(p, qtde);
            break;
            case 3:
                system ("clear");
                puts ("--- Métodos de ordenação ---");
                puts ("1 - Bubble Sort (código)");
                puts ("2 - Selection Sort (preço)");
                puts ("3 - Insertion Sort (alfabética)");
                int ordem;
                scanf ("%d", &ordem);

                if (ordem==1) ordenado=1;

                ordenacao(p, qtde, ordem);
            break;
            case 4:
                system ("clear");
                buscarMaisBarato(p, qtde, 1); // despresando o retorno
            break;
            case 5:
                system ("clear");
                printf ("Mais caro custa = %.2f\nMais barato custa = %.2f\nDiferença = %.2f \n", buscarMaisCaro(p, qtde, 0), buscarMaisBarato(p,qtde,0),
                        buscarMaisCaro(p,qtde,0) -buscarMaisBarato(p,qtde,0));
            break;
            case 6:
                printf ("\nInforme o código.: ");
                int codigo;
                scanf ("%d", &codigo);
                system ("clear");
                printf ("\nForam feitos %d loop(s) para encontrar o número %d.\n", buscaLinear(p, qtde, codigo), codigo);
            break;
            case 7:
                printf ("\nInforme o código.: ");
                scanf ("%d", &opcao);
                if(ordenado)
                {
                    system ("clear");
                    printf ("\nForam feitos %d loop(s) para encontrar o número %d.\n", buscaBinaria(p, qtde, opcao), opcao);
                }
                else puts ("\n -- Primeiro ordene o vetor pelo código antes de realizar a busca binária! -- ");
            break;
            case 8:
                system ("clear");
                puts ("Programa encerrado!");
                exit(0);
            break;
        }
    }
}

void
cadastrar(Produto **p, int *qtde)
{
    int codigo;
    printf ("\nEntre com o código do produto.: ");
    scanf("%d", &codigo);

    int i;
    for (i=0; i<*qtde; i++)
        if (p[i]->codigo == codigo) break;

    if (i != *qtde)
    {
        system ("clear");
        printf ("\n\n--- Esse Código já está cadastrado! ---\n\n");
    }
    else
    {
        // variável qtde diz o indice que o meu vetor deve inserir o novo registro
        p[*qtde] = (Produto*) malloc (sizeof(Produto));
        p[*qtde]->codigo = codigo;
        __fpurge (stdin);
        printf ("\nEntre com a descrição do produto.: ");
        gets (p[*qtde]->nome);
        printf ("\nEntre com o valor do produto.: ");
        scanf ("%f", &p[*qtde]->preco);
        *qtde = *qtde + 1; // incrementa a quantidade de produtos inseridos em meu vetor
        system ("clear");
        puts ("Produto inserido com sucesso!");
    }
}

void
listar(Produto **p, int *qtde)
{
    system ("clear");
    puts ("--- Lista de produtos ---");
    int i;
    for (i=0; i<*qtde; i++)
        printf ("\nCódigo.: %d \tNome.: %s \tPreço.: %.2f\n", p[i]->codigo, p[i]->nome, p[i]->preco);
}

void
ordenacao(Produto **p, int *qtde, int ordem)
{
    if (ordem == 1) bubblesort(p, qtde);
    else if (ordem == 2) selectionsort(p, qtde);
    else if (ordem == 3) insertionsort(p, qtde);
    else
    {
        system ("clear");
        puts ("--- Opção não cadastrada ---");
    }
}

void
bubblesort(Produto **p, int *qtde)
{
    int i,j;
    Produto *aux;

    for (i=0; i<*qtde; i++)
    {
        for (j=0; j<*qtde; j++)
        {
            if (p[i]->codigo<p[j]->codigo)
            {
                aux = p[i];
                p[i] = p[j];
                p[j] = aux;
            }
        }
    }
    puts ("-- Vetor ordenado com sucesso pelo método BUBBLE SORT! -- \n");
}

void
selectionsort(Produto **p, int *qtde)
{
    int i,j;
    Produto *aux;

    for (i=0; i<*qtde; i++)
    {
        for (j=i; j<*qtde; j++)
        {
            if (p[i]->preco < p[j]->preco)
            {
                aux = p[i];
                p[i] = p[j];
                p[j] = aux;
            }
        }
    }
    puts ("-- Vetor ordenado com sucesso pelo método SELECTION SORT! -- \n");
}

void
insertionsort(Produto **p, int *qtde)
{
    int i,j;
    Produto *eleito;

    for (j=1; j<=*qtde-1; j++)
    {
        eleito = p[j];
        i = j-1;

        while (i>=0 && (strcmp(eleito->nome, p[i]->nome) == -1))
        {
            p[i+1] = p[i];
            i--;
        }
        p[i+1] = eleito;
    }
    puts ("-- Vetor ordenado com sucesso pelo método INSERTION SORT! -- \n");
}

float
buscarMaisBarato(Produto **p, int *qtde, int listar)
{
    int i, index=0;
    float v=p[index]->preco;
    for (i=1; i<*qtde; i++)
    {
        if (p[i]->preco<v)
        {
            v=p[i]->preco;
            index=i;
        }
    }

    if (listar)
    {
        puts ("\n -- Produto(s) mais barato(s) da base de dados --");

        for (i=0; i<*qtde; i++)
        {
            if (v==p[i]->preco)
            {
                printf ("\nCódigo.: %d", p[i]->codigo);
                printf ("\nNome.: %s", p[i]->nome);
                printf ("\nPreço.: %.2f", p[i]->preco);
            }
            puts("");
        }
    }
    return v;
}

float
buscarMaisCaro(Produto **p, int *qtde, int listar)
{
    int i, index=0;
    float v=p[index]->preco;
    for (i=1; i<*qtde; i++)
    {
        if (p[i]->preco>v)
        {
            v=p[i]->preco;
            index=i;
        }
    }

    if (listar)
    {
        puts ("\n -- Produto(s) mais Caro(s) da base de dados --");
        for (i=0; i<*qtde; i++)
        {
            if (v==p[i]->preco)
            {
                printf ("\nCódigo.: %d", p[i]->codigo);
                printf ("\nNome.: %s", p[i]->nome);
                printf ("\nPreço.: %.2f", p[i]->preco);
            }
            puts("");
        }
    }
    return v;
}

int
buscaLinear(Produto **p, int *qtde, int codigo)
{
    int i, x=0;
    for (i=0; i<*qtde; i++)
    {
        if (p[i]->codigo == codigo)
        {
            x=1;
            break;
        }
    }
    if (x==0)
        puts ("-- Nenhum registro foi encontrado! --");
    return i;
}

int
buscaBinaria(Produto **p, int *qtde, int codigo)
{
    int esquerda=0, meio, direita=*qtde-1;
    int status=0, x=0;

    while (esquerda <= direita)
    {
        x++;
        meio = (esquerda+direita)/2;
        if (p[meio]->codigo == codigo) status = 1;
        if (p[meio]->codigo < codigo) esquerda = meio + 1;
        else direita = meio - 1;
    }

    if (status == 1)
    {
        printf ("\n \t\t -- Registro número %d", p[meio]->codigo);
        printf ("\n Nome.: %s", p[meio]->nome);
        printf ("\n Preço.: %.2f", p[meio]->preco);
        puts("");
    }
    else
        printf ("\n\t\t -- Nenhum registro foi encontrado!--\n");
    return x;
}

Dúvidas ou sugestões deixe um comentário. Até a próxima!

Nenhum comentário:

Postar um comentário

Novidade!!! Agora vamos ter canal no Youtube =D

Fala pessoal tudo beleza, estou sumido a correria está forte por aqui. Estou querendo dar um start em um projeto antigo que vem desde o temp...