Ir ao conteúdo
  • Cadastre-se

C++ termino de um algoritmo em c++


Posts recomendados

pessoal, comecei a desenvolver esse algoritmo e me perdi, nao estou conseguindo terminar. basicamente ele era pra ser uma calculadora, se alguem puder me ajudar a terminar eu agradeceria muito. estou fazendo em c++

 

#include<iostream>
#include<string>

enum Operator{SUBTRACTION, SUM, EQUAL, NOOP};
enum Digit{ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE};
enum Control{CE, DECIMAL_SEPARATOR, OFF, MRC, MEMORY_SUBTRACTION, MEMORY_SUM};

class Display{
    public:
        virtual void clean() = 0;
        virtual addDigit(Digit digit) = 0;
        virtual setDecimalSeparator() = 0;
};

class Cpu{
    public:
        virtual void setDisplay(Display * display) = 0;

        virtual void receiveDigit(Digit digit) = 0;
        virtual void receiveOperator(Operator operador) = 0;
        virtual void receiveControl(Control control) = 0;
};

class Keyboard {
  public:
    virtual void setCpu(Cpu *cpu) = 0;

    virtual void pressZero() = 0;
    virtual void pressOne() = 0;
    virtual void pressTwo() = 0;
    virtual void pressThree() = 0;
    virtual void pressFour() = 0;
    virtual void pressFive() = 0;
    virtual void pressSix() = 0;
    virtual void pressSeven() = 0;
    virtual void pressEight() = 0;
    virtual void pressNine() = 0;

    virtual void pressDecimalSeparator() = 0;

    virtual void pressSum() = 0;
    virtual void pressSubtraction() = 0;

    virtual void pressCE() = 0;
};

class Calculator{
    public:
        virtual *Keyboard getKeyboard() = 0;
        virtual void setKeyboard(Keyboard *keyboard) = 0;
        
        virtual *Display getDisplay() = 0;
        virtual void setDisplay(Display *display) = 0;

        virtual *Cpu getCpu() = 0;
        virtual void setCpu(Cpu *cpu) = 0;
};


void testCalculator(Calculator *calc){
    calc->getKeyboard()->pressOne();
    calc->getKeyboard()->pressTwo();
    calc->getKeyboard()->pressThree();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressFour();
    calc->getKeyboard()->pressFive();
    calc->getKeyboard()->pressSix();
    calc->getKeyboard()->pressEqual();
    
    calc->getKeyboard()->pressCE();

    calc->getKeyboard()->pressTwo();
    calc->getKeyboard()->pressThree();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressFour();
    calc->getKeyboard()->pressFive();
    calc->getKeyboard()->pressSubtraction();
    calc->getKeyboard()->pressSix();
    calc->getKeyboard()->pressSeven();
    calc->getKeyboard()->pressEqual();
}

#include "Calculator.h"
#include "CalculatorLucio.cpp"

int main(){

    Display * d1 = new Display();
    Cpu *cpu1 = new Cpu(d1);
    Keyboard *kb1 = new Keyboard(cpu);

    Calculator *calc = new Calculator(d1, cpu1, kb1);

    testCalculator(calc);

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@arfneto me perdi na ideia. eu preciso terminar esse algoritmo, uma abstração de uma calculadora orientada objeto, mais eu so consegui fazer ate a parte que eu postei, nao sei como continuar ela pra terminar, ela esta incompleta, e eu queria uma ajuda pra conseguir terminar ela 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, souza souza00 disse:

pessoal, comecei a desenvolver esse algoritmo e me perdi, nao estou conseguindo terminar. basicamente ele era pra ser uma calculadora, se alguem puder me ajudar a terminar eu agradeceria muito. estou fazendo em c++

 

 

Meu palpite é que você não "desenvolveu"  assim muito o tal algoritmo.

 

Isso que você postou não funciona.

 

Isso tem um nome: Classes abstratas. É um modelo para gerar outras classes, um 🚄 chamado herança em C++. Se você tivesse "desenvolvido" isso saberia bem o que fazer

 

Usando a classe Display como exemplo

 

class Display{
    public:
        virtual void clean() = 0;
        virtual addDigit(Digit digit) = 0;
        virtual setDecimalSeparator() = 0;
};

 

Você não pode declarar nada como Display. Essas paradas tipo clean() = 0 indicam que clean() é uma função virtual pura (imagino que chamem assim em português).

 

A ideia é genial: para usar Display você precisa escrever clean(), addDigit() e setDecimalSeparator(). 

 

Mas pode fazer isso para tantos Display quanto queira...

 

#include "Calculator.h"
#include "CalculatorLucio.cpp"

 

Onde estão esses arquivos? Neles deve ter uma implementação disso.

 

Exemplos

 

image.thumb.png.4b7de1fcffa63d8309fb562834907a16.png

 

Eis o compilador explicando que você não pode declarar Display na linha 33 porque a classe é abstrata e você precisa implementar as "pure virtual functions", as 3.

 

Seu compilador não mostrou isso se os arquivos que você NÃO mostrou tem a implementação certa.

 

No entanto se você escrever Display

 

class Display
{
    public:
        virtual void    clean() = 0;
        virtual int     addDigit(Digit) = 0;
        virtual int     setDecimalSeparator(char) = 0;

    public:
        char separator;

    Display(char s) : separator(s){};
    Display() : Display('.'){};

};

 

Pode implementar um Tablet assim
 

class Tablet : Display
{
    public:
        void    clean() { std::cout << "Tablet: sou Display\n"; };
        int     addDigit(Digit d)
        {
            std::cout << "Tablet: addDigit " << d << "\n";
            return 0;
        };

        int     setDecimalSeparator(char s)
        { 
            std::cout << "Tablet: separator = " << s << "\n";
            separator = s;
            return 0;
        };

    public:
      Tablet(char s) : Display(s){};
      Tablet() : Display(){};
};

 

E o compilador vai ficar satisfeito. Se diz que a classe Tablet deriva de Display. É o conceito de herança. Em java diria que Tablet estende Display.

 

Pode usar assim:

 

int main(void)
{
    Tablet* t1  = new Tablet();
    std::cout << "Separador do display do tablet = " <<
        ((Display*)t1)->separator << "\n";
    t1->addDigit(FIVE);
    t1->clean();
    return 0;
}

 

E vai ver

 

Separador do display do tablet = .
Tablet: addDigit 5

 

E acho que dá pra entender o mecanismo: Tablet é uma classe derivada de Display e tem que implementar as funções virtuais. 

 

Tablet tem acesso ao separador. O separador padrão é um ponto.

 

Eis o programa todo

 

#include<iostream>
#include<string>

enum Digit{ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE};

class Display
{
    public:
        virtual void    clean() = 0;
        virtual int     addDigit(Digit) = 0;
        virtual int     setDecimalSeparator(char) = 0;

    public:
        char separator;

    Display(char s) : separator(s){};
    Display() : Display('.'){};

};

class Tablet : Display
{
    public:
        void    clean() { std::cout << "Tablet: sou Display\n"; };
        int     addDigit(Digit d)
        {
            std::cout << "Tablet: addDigit " << d << "\n";
            return 0;
        };

        int     setDecimalSeparator(char s)
        { 
            std::cout << "Tablet: separator = " << s << "\n";
            separator = s;
            return 0;
        };

    public:
      Tablet(char s) : Display(s){};
      Tablet() : Display(){};
};
    
int main(void)
{
    Tablet* t1  = new Tablet();
    std::cout << "Separador do display do tablet = " <<
        ((Display*)t1)->separator << "\n";
    t1->addDigit(FIVE);
    t1->clean();
    return 0;
}

 

 

Se você não tem noção do que é isso esqueça esse código que "desenvolveu". Se precisa usar isso sugiro que arrume um livro. Ou dois. E continue perguntando aqui se precisar.

 

 

  • Curtir 2
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...