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;
- 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.
- Busca sequencial;
- Busca binária;
#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!