Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
João Victor Simonassi Farias

Cadastro de produtos

Recommended Posts

Fala galera! Estou desenvolvendo um sistema pra uma lanchonete (um trabalho da faculdade) e estou com diversos problemas para criar as listas encadeadas. O sistema consiste em cadastrar novos produtos e realizar uma venda somando o preço dos produtos escolhidos naquele instante. A parte de cadastrar os produtos está praticamente pronta, mas ainda estou com alguns problemas. Já a parte da soma dos produtos, eu não faço a mínima ideia do que fazer. Segue código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <conio.h>  //clrscr
#include <locale.h>

#define BUFFER 64

/* Estrutura da lista declarada para armazenar nossos dados. */
typedef struct lista {
        char *nome;
        float preco;
        char *obs;
        struct lista *proximo;
} Dados;

/* Prototipo das funcoes de manuseio dos dados. */
Dados *inicia_dados(char *nome, float preco, char *obs);
Dados *insere_dados(Dados *dados, char *nome, float preco, char *obs);
void exibe_dados(Dados *dados);
void busca_dados(Dados *dados, char *chave);
Dados *deleta_dados(Dados *dados);
int checa_vazio(Dados *dados);

/* Prototipo das funcoes do menu.*/
void insere(void);
void exibe(void);
void busca(void);
void deleta(void);

/* Inicializa a estrutura de dados principal. */
Dados *principal = NULL;

/* Cria a nova lista apontando o proximo no para NULL. */
Dados *inicia_dados(char *nome, float preco, char *obs) {

        Dados *novo;

        novo = (Dados *)malloc(sizeof(Dados));
        
        novo->nome = (char *)malloc(strlen(nome)+1);
        strncpy(novo->nome, nome, strlen(nome)+1);
        //***************************************
        novo->preco = preco;
        //***************************************
        novo->obs = (char *)malloc(strlen(obs)+1);
        strncpy(novo->obs, obs, strlen(obs)+1);
        //***************************************
        novo->proximo = NULL;

        return novo;
}

/* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */
Dados *insere_dados(Dados *dados, char *nome, float preco, char *obs) {

        Dados *novo;

        novo = (Dados *)malloc(sizeof(Dados));
        
        novo->nome = (char *)malloc(strlen(nome)+1);
        strncpy(novo->nome, nome, strlen(nome)+1);
        
        novo->preco = preco;
        
        novo->obs = (char *)malloc(strlen(obs)+1);
        strncpy(novo->obs, obs, strlen(obs)+1);
        
        novo->proximo = dados;

        return novo;
}

/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */
void exibe_dados(Dados *dados) {

        fprintf(stdout, "Cadastro:\n\n");

        fprintf(stdout, "------------------------\n");

        for (; dados != NULL; dados = dados->proximo) {
                fprintf(stdout, "Nome: %s\n", dados->nome);
                fprintf(stdout, "Idade: %d\n", dados->preco);
                fprintf(stdout, "Observações: %s\n", dados->obs);
                
                fprintf(stdout, "------------------------\n ");
        }
        printf("Pressione uma tecla para continuar.");
        getch();
}

/* Percorre cada ponta comparando o nome com a chave. */
void busca_dados(Dados *dados, char *chave) {

        int achou = 0;

        fprintf(stdout, "Cadastro:\n\n");
        for (; dados != NULL; dados = dados->proximo) {
                if (strcmp(chave, dados->nome) == 0) {

                        fprintf(stdout, "------------------------\n");
                        fprintf(stdout, "Nome: %s\n", dados->nome);
                        fprintf(stdout, "Preço: %d\n", dados->preco);
                        fprintf(stdout, "Observações: %s\n", dados->obs);
                        fprintf(stdout, "------------------------\n");
                        achou++;// muda o valor de achou
                }
        }

        if (achou == 0)
                fprintf(stdout, "Nenhum resultado encontrado.\nPressione uma tecla para continuar.\n");
        else
                fprintf(stdout, "Foram encontrados %d registros. \nPressione uma tecla para continuar.\n", achou);

        sleep(1);
        getch();
}

/* Deleta o ultimo registro inserido. */
Dados *deleta_dados(Dados *dados) {

        Dados *novo;

        novo = dados->proximo;

        free(dados->nome);
        free(dados);
        free(dados->obs);
        
        fprintf(stdout, "O ultimo registro inserido foi deletado com sucesso.\\n");
        sleep(1);

        return novo;
}

/* apenas checa se a lista e NULL ou nao. */
int checa_vazio(Dados *dados) {

        if (dados == NULL) {
                fprintf(stdout, "Lista vazia!\\n");
                sleep(1);
                return 1;
        } else
                return 0;
}

/* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */
void insere(void) {

        char *nome, obs;
        float preco;

        nome = (char *)malloc(BUFFER);
        obs = (char *)malloc(BUFFER);
    
        printf("\n\Nome do produto: \n----> ");
        scanf("%s", nome);
        

        printf("\nPreço do produto: \n----> ");
        scanf("%f", &preco);
        
        
        printf("\nObservações sobre o produto: (Ex: ingredientes, quantidade...)");
        scanf("%s", obs);

        if (principal == NULL)
                principal = inicia_dados(nome, preco, obs);
        else
                principal = insere_dados(principal, nome, preco, obs);
}

void exibe(void) {

        if (!checa_vazio(principal))
                exibe_dados(principal);

}

void busca(void) {

        char *chave;

        if (!checa_vazio(principal)) {

                chave = (char *)malloc(BUFFER);

                fprintf(stdout, "Digite o nome para buscar: \\n--> ");
                scanf("%s", chave);

                busca_dados(principal, chave);
                getch();
        }
}

void deleta(void) {

        if (!checa_vazio(principal))
                principal = deleta_dados(principal);
}

int main(void) {
setlocale(LC_ALL,"portuguese");
        int escolha, volta;

        do {
                system("cls"); 
                printf("\n LANCHONETE\n\n");
                printf(" NOVA VENDA ---------- [1]\n");
                printf(" INSERIR PRODUTO ----- [2]\n");
                printf(" MOSTRAR PRODUTOS ---- [3]\n");
                printf(" BUSCAR PRODUTO ------ [4]\n");
                printf(" EXCLUIR PRODUTO ----- [5]\n");
                printf(" SAIR ---------------- [6]\n\n");
                printf("\n\nEscolha uma opcao: ");

                scanf("%d", &escolha);
                if (escolha == 1)
                                printf("EM CONSTRUÇÃO!");// Não tenho ideia do que fazer aqui
                else if(escolha == 2) 
                                insere();
            	else if (escolha ==2)
                                exibe();
                else if (escolha ==3)
                                busca();
                else if (escolha ==4)
                                deleta();
                else if (escolha ==5)
                                exit(0);
                else {
                                fprintf(stderr," Digite uma opcao valida!\\n");
                                sleep(1);
                }

      printf("\n\n Digite 1 para voltar ao menu, precione outra tecla para sair: ");   
      scanf("%d", &volta);
      
        }while(volta == 1 ); /* Loop Principal. */

        return 0;
}

Estou começando a trabalhar com essa questão de alocamento dinâmico agora e estou muito perdido. Desde já, agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×