Ir ao conteúdo
  • Cadastre-se

C++ programa com multiplas listas encadeadas


josilva00

Posts recomendados

Já tinha postado aqui sobre este projeto sobre gerir uma mercearia, mas o post foi enterrado e nao consegui resolver o problema

 

 

Portanto, meu programa precisa de 3 listas encadeadas, uma para os produtos da mercearia, uma para cada venda e outra para cada item de uma venda. Por exemplo: Primeiro, adiciono produtos à lista de produtos. Em segundo lugar, quero fazer uma venda, esse método que faz parte da lista de vendas precisa chamar um método da lista de produtos que permita escolher um produto e esse método em si precisa chamar um método da lista de itens de vendas para adicioná-lo lá. Eu só não sei como fazer isso correctamente.

 

Aqui vai o header:

#ifndef _MINIPROJETO_H
#define _MINIPROJETO_H

#include <iostream>
#include <string>
using namespace std;



class no_produto
{
public:
    unsigned int codigo;
    char nome[51];
    char marca[51];
    char tipo[51];
    double preco;
    no_produto* prox; //referencia para o proximo no

};

class lista_produto
{
private:
    no_produto* cabeca;

public:
    lista_produto()
    {
        cabeca=NULL;
    }

    ~lista_produto()
    {
            no_produto *atual, *prox;
            atual=cabeca;
            while(atual!=NULL)
            {
                prox=atual->prox;
                delete atual;
                atual=prox;
            }
    }
    void novoProduto(unsigned int codigo,char nome[],char marca[],char tipo[],double preco);
    void elimina(unsigned int codigo);
    void mostraProdutos(void);
    void mostraProduto(unsigned int codigo);
    void modificaPVP(unsigned int codigo);
    unsigned int contaProdutos(void);
    void escolheProduto(unsigned int codigoVenda,lista_produto* aux,lista_itens_vendas* aux1);
    double devolvePreco(unsigned int codigo);

};




class no_vendas
{
public:
    unsigned int codigoVenda, dia, mes, ano, numeroItens;
    double precoTotal;


    no_vendas* proxi; //referencia para o proximo no

};
class lista_vendas
{
private:
    no_vendas* cabecaV;//1º

public:
    lista_vendas()
    {
        cabecaV=NULL;
    }

    ~lista_vendas()
    {
            no_vendas *atual, *proxi;
            atual=cabecaV;
            while(atual!=NULL)
            {
                proxi=atual->proxi;
                delete atual;
                atual=proxi;
            }
    }
    void novaVenda(unsigned int codigoVenda,lista_produto* aux, lista_itens_vendas* aux1);
    void mostraVenda(unsigned int codigoVenda);
    void mostraVendas(void);
    void mostraPrecoTotal(unsigned int codigoVenda);

};




class no_itens_vendas
{
public:
    unsigned codigoVendaI,codigoProduto,quantidade;
    double custoTotal;


    no_itens_vendas* proxim; //referencia para o proximo no

};

class lista_itens_vendas
{
private:
    no_itens_vendas* cabecaIV;
public:
    lista_itens_vendas()
    {
        cabecaIV=NULL;
    }

    ~lista_itens_vendas()
    {
            no_itens_vendas *atual, *proxim;
            atual=cabecaIV;
            while(atual!=NULL)
            {
                proxim=atual->proxim;
                delete atual;
                atual=proxim;
            }
    }
    void novoItemVenda(unsigned int codigoProduto, unsigned int quantidade, unsigned int codigoVendaI);
    double devolveCustodaVenda(unsigned int codigoVenda);
    unsigned int contaItensVenda(unsigned int codigoVenda);

};

#endif

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Aqui os metodos:

#include <iostream>
    #include "miniprojeto.h"

    using namespace std;



    void lista_produto::novoProduto(unsigned int codigo,char nome[],char marca[],char tipo[],double preco)
    {
        no_produto *novo=new no_produto;
        no_produto *atual;
        int i;
        novo->codigo=codigo;
        for(i=0; nome[i] != '\0'; i++)
        {
            novo->nome[i] = nome[i];
        }
        for(i=0; marca[i] != '\0'; i++)
        {
            novo->marca[i] = marca[i];
        }
        for(i=0; tipo[i] != '\0'; i++)
        {
            novo->tipo[i] = tipo[i];
        }


        novo->preco=preco;
        novo->prox=NULL;

        if(cabeca==NULL)
        {
        cabeca=novo;
        }else
        {
            atual=cabeca;
            while(atual->prox!=NULL)
                atual=atual->prox;
            atual->prox=novo;
        }
    }
    void lista_produto::elimina(unsigned int codigo)
    {
        no_produto *atual=cabeca;//comeco pela cabeca
        no_produto *anterior;
        if(cabeca==NULL) return;
        else{
            anterior=NULL;
            while(atual!=NULL){
                if(atual->codigo==codigo){
                    if(anterior==NULL)
                        cabeca=atual->prox;
                    else
                        anterior->prox=atual->prox;
                    delete(atual);
                    return;
                }
                anterior=atual;
                atual=atual->prox;
            }
        }

    }

    void lista_produto::mostraProdutos()
    {
       no_produto *atual=cabeca;
       if(cabeca==NULL) cout << "Lista Vazia..." << endl;
       else
        {
            while(atual!=NULL)
            {
                cout << atual->codigo << ", "<< atual->nome << ", "<< atual->marca << ", "<< atual->tipo << ", "<< atual->preco << endl; // tarefa a fazer em cada nó
                atual = atual->prox;
            }

        }
    }
    void lista_produto::mostraProduto(unsigned int codigo)
    {
       no_produto *atual=cabeca;
       if(cabeca==NULL) cout << "Lista Vazia..." << endl;
       else
        {
            while(atual!=NULL)
            {
                if(atual->codigo==codigo)
                {
                    cout << atual->codigo << ", "<< atual->nome << ", "<< atual->marca << ", "<< atual->tipo << ", "<< atual->preco << endl;
                    return ;
                }
                atual = atual->prox;

            }
            cout << "Produto nao encontrado" << endl;

        }
    }


    void lista_produto::modificaPVP(unsigned int codigo)
    {
        no_produto *atual=cabeca;//comeco pela cabeca
        if(cabeca==NULL) return;
        else{
            while(atual!=NULL)
            {
                if(atual->codigo==codigo)
                {
                    double preco;
                    cout<<"Insira o novo preco:";
                    cin>>preco;
                    atual->preco=preco;
                    cout<<"\nSucesso\n";
                    return;
                }
                atual=atual->prox;
            }
            cout << "Produto nao encontrado" << endl;
        }
    }


    unsigned int lista_produto::contaProdutos()
    {
        no_produto* aux=cabeca;
        unsigned int count=0;
        while (aux != NULL)
        {
            count++;
            aux = aux->prox;
        }
        return count;

    }
    void lista_produto::escolheProduto(unsigned int codigoVenda,lista_produto* aux,lista_itens_vendas* aux1)
    {
        aux.mostraProdutos();
        unsigned int codigo, quantidade;
        cout<<"Escolha um produto(codigo):";
        cin>>codigo;
        cout<<"\nQuantos deste produto quer adicionar:";
        cin>>quantidade;
        if(quantidade==0) return;

        aux1.novoItemVenda(codigo,quantidade, codigoVenda);


    }
    double lista_produto::devolvePreco(unsigned int codigo)
    {
        no_produto *atual=cabeca;//comeco pela cabeca
        if(cabeca==NULL) return 0;
        else
        {
            while(atual!=NULL)
            {
                if(atual->codigo==codigo)
                {
                    return atual->preco;
                }
                atual=atual->prox;
            }
        }

    }



    void lista_vendas::novaVenda(unsigned int codigoVenda,lista_produto* aux, lista_itens_vendas* aux1)
    {
        no_vendas *novo=new no_vendas;
        no_vendas *atual;

        unsigned int n;
        cout<<"Quantos tipos de produtos quer adicionar a venda:";
        cin>>n;
        for(int i=0;i<n;i++)
        {
            aux.escolheProduto(codigoVenda,aux1);
        }

        novo->codigoVenda=codigoVenda;
        novo->numeroItens=n;
        novo->precoTotal=aux1.devolveCustodaVenda(codigoVenda);
        cout<<"Insira o dia:";
        cin>>novo->dia;
        cout<<"Insira o mes:";
        cin>>novo->mes;
        cout<<"Insira o ano:";
        cin>>novo->ano;


        novo->proxi=NULL;

        if(cabecaV==NULL)
        {
            cabecaV=novo;
        }
        else
        {
            atual=cabecaV;
            while(atual->proxi!=NULL)
            {
                atual=atual->proxi;
            }
            atual->proxi=novo;
        }
    }

    void lista_vendas::mostraVenda(unsigned int codigoVenda)
    {
        no_vendas *atual=cabecaV;
       if(cabecaV==NULL) cout << "Nao existe" << endl;
       else
        {
            while(atual!=NULL)
            {
                if(atual->codigoVenda==codigoVenda)
                {
                    cout << atual->codigoVenda << ", "<< atual->dia << "."<< atual->mes << "."<< atual->ano << ", "<< atual->numeroItens<< ", "<<atual->precoTotal<< endl;
                    return;
                }

                atual = atual->proxi;
            }
            cout<<"Venda nao encontrada";

        }
    }
    void lista_vendas::mostraVendas()
    {
        no_vendas *atual=cabecaV;
       if(cabecaV==NULL) cout << "Nao existem vendas" << endl;
       else
        {
            while(atual!=NULL)
            {
                cout << atual->codigoVenda << ", "<< atual->dia << "."<< atual->mes << "."<< atual->ano << ", "<< atual->numeroItens<< ", "<<atual->precoTotal<< endl;
            }

                atual = atual->proxi;
            }

    }
    void lista_vendas::mostraPrecoTotal(unsigned int codigoVenda)
    {
        no_vendas *atual=cabecaV;
       if(cabecaV==NULL) cout << "Nenhuma venda" << endl;
       else
        {
            while(atual!=NULL)
            {
                if(atual->codigoVenda==codigoVenda)
                {
                    cout<<atual->precoTotal;
                    break;
                }
                atual = atual->proxi;
            }


        }
    }



    double lista_itens_vendas::devolveCustodaVenda(unsigned int codigoVenda)
    {
        no_itens_vendas *atual=cabecaIV;
        double p=0;
       if(cabecaIV==NULL) cout << "Nao existe" << endl;
       else
        {

            while(atual!=NULL)
            {
                if(atual->codigoVendaI==codigoVenda)
                {
                    p=p+atual->custoTotal;
                }
                atual = atual->proxim;
            }
            return p;

        }
    }
    unsigned int lista_itens_vendas::contaItensVenda(unsigned int codigoVenda)
    {
        no_itens_vendas *atual=cabecaIV;
        unsigned int p=0;
       if(cabecaIV==NULL) cout << "Nao existe" << endl;
       else
        {

            while(atual!=NULL)
            {
                if(atual->codigoVendaI==codigoVenda)
                {
                    p=p+1;
                }
                atual = atual->proxim;
            }
            return p;

        }
    }

    void lista_itens_vendas::novoItemVenda(unsigned int codigoProduto, unsigned int quantidade, unsigned int codigoVendaI)
    {
        no_itens_vendas *novo=new no_itens_vendas;
        no_itens_vendas *atual;
        lista_produto aux;

        atual->codigoProduto=codigoProduto;
        atual->quantidade=quantidade;
        atual->codigoVendaI=codigoVendaI;
        double preco=aux.devolvePreco(codigoProduto);
        atual->custoTotal=preco*quantidade;
        novo->proxim=NULL;

        if(cabecaIV==NULL)
        {
        cabecaIV=novo;
        }else
        {
            atual=cabecaIV;
            while(atual->proxim!=NULL)
                atual=atual->proxim;
            atual->proxim=novo;
        }
    }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

E aqui o main:

#include <iostream>
#include "miniprojeto.h"

using namespace std;





int main()
{
    int op;
    unsigned int c;
    char n[51];
    char m[51];
    char t[51];
    double p;
    lista_produto a;
    lista_vendas b;
    lista_itens_vendas d;


    while(1)
    {
        cout << "-------------------------------------------------" << endl;
        cout << "|\tPrograma de Gestao de Supermercados\t|"<< endl;
        cout << "-------------------------------------------------" << endl << endl;
        cout << "Autores: \n\tJoao Moitas 2018297016\n\tJose Silva  2018296125" << endl;

        cout << "Comece por selecionar uma das seguintes opções" << endl << endl;
        cout << "1-> Produtos" << endl;
        cout << "2-> Venda" << endl;
        cout << "3-> Inventario" << endl;
        cout << "4-> Faturacao" << endl;
        cout << "5-> Sair" << endl << endl;


    cin >> op;

    switch (op)
    {
        case 1:
            {
                int op2;
                cout<< "o que pretende fazer?" << endl;
                cout << "1- Inserir produto." << endl;
                cout << "2- Modificar PVP." << endl;
                cout << "3- Apagar Produto." << endl;
                cin >> op2;

                switch (op2)
                {
                    case 1:
                        {
                            cout<<"insira um novo produto:\n";
                            cout<<"codigo:";
                            cin>>c;
                            cout<<endl;
                            cout<<"nome:";
                            cin>>n;
                            cout<<endl;
                            cout<<"marca:";
                            cin>>m;
                            cout<<endl;
                            cout<<"tipo:";
                            cin>>t;
                            cout<<endl;
                            cout<<"preco:";
                            cin>>p;
                            cout<<endl;
                            a.novoProduto(c,n,m,t,p);
                            cout<< "Adicionado com sucesso:";
                            a.mostraProduto(c);
                            cout<<endl;
                            break;
                        }
                    case 2:
                        {
                            unsigned int c2;
                            cout<<"Qual e o produto que quer mudar:"<<endl;
                            a.mostraProdutos();
                            cout<<"Codigo:";
                            cin>>c2;
                            cout<<endl;
                            a.modificaPVP(c2);
                            a.mostraProduto(c2);
                            break;
                        }
                    case 3:
                        {
                            unsigned int c3;
                            cout<<"Qual e o produto que quer eliminar:"<<endl;
                            a.mostraProdutos();
                            cout<<"Codigo:";
                            cin>>c3;
                            a.elimina(c3);
                            break;
                        }
                        break;
                }
                break;
            }
        case 2:
            {
                unsigned int cV;
                cout<<"Insira um codigo para esta venda:";
                cin>>cV;
                b.novaVenda(cV,b,d);
                break;
            }
        case 3:
            {
                int op3;
                cout<<"1) Inventario Total\n";
                cout<<"2) Inventario Parcial\n";
                cout<<"Escolha:";
                cin>>op3;
                switch (op3)
                {
                    case 1:
                    {
                        a.mostraProdutos();
                        break;
                    }
                    case 2:
                    {
                        char nome[51];
                        cout<<"Qual e o produto que quer procurar(nome):";
                        cin>>nome;
                        break;
                        //fazer funçao de pesquisa por nome
                    }
                    break;
                }
                break;
            }
        case 4:
            {
                b.mostraVendas();
            }
        case 5:
            {
                cout<<"\nGoodbye"<<endl;
                return 0;
            }

    return 0;
    }
    }
}

aqui na imagem em baixo estão os erros que me esta dando:

1678008324_CapturadeEcr(35).thumb.png.77113433b70f9cba6da12af03b2cc78e.png

Link para o comentário
Compartilhar em outros sites

Fui arrumando os erros conforme as mensagens de erro apareciam e agora está compilando:

 

https://onlinegdb.com/H1uMvux9L

 

Mas não chequei nada da lógica e do funcionamento do programa.

 

As mudanças que fiz basicamente foram:

 

- A class lista_itens_vendas estava no fim do header, mas as classes declaradas antes dela já usam essa classe, então tive que move-la para cima para ser declarada antes de ser usada.

- No main eu mudei b.novaVenda(cV,b,d); para b.novaVenda(cV,&a,&d); (Não verifiquei como isso altera a lógica, mas a é a única lista_produto declarada no main .)

- Nas chamadas de métodos dos objetos eu troquei alguns . por -> quando o objeto é passado por ponteiro.

 

 

Link para o comentário
Compartilhar em outros sites

 

4 horas atrás, josilva00 disse:

mas o post foi enterrado e nao consegui resolver o problema

 

Que significa "enterrado"? Que faltou para resolver seu problema?

 

4 horas atrás, josilva00 disse:

meu programa precisa de 3 listas encadeadas, uma para os produtos da mercearia, uma para cada venda e outra para cada item de uma venda

 

Talvez não tenha entendido o princípio dessas coisas. Imagino que não possa usar as classes de lista da biblioteca mas talvez te ajudasse ler como elas funcionam antes de continuar com seu programa. http://www.cplusplus.com/reference/list/list/ 

 

Atente para a lista de métodos. O que você precisa é de uma classe Lista antes de tudo. E aí nas suas classes você declara 

Lista de vendas, de produtos ou de itens.

 

Você está escrevendo tudo de novo e o propósito é justamente o contrário...

 

 

adicionado 0 minutos depois
4 horas atrás, josilva00 disse:

Eu só não sei como fazer isso correctamente

 

Crie uma classe Lista antes de tudo

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!