Ir ao conteúdo

Posts recomendados

Postado

arquivo.zippessoal, estou com um erro e nao consigo resolver, postei em forma de pasta porque precisa abrir os 3 algoritmos pra calculadora funcionar. basicamente é um esboço de uma calculadora em c++, mais fica dando um erro que eu nao consigo resolver, se alguem puder me ajudar. ah tem um for fora de  ordem tambem que eu preciso por pra ela inverter o numero, que tambem nao estou conseguindo por. se alguem puder me ajudar

Postado
4 horas atrás, souza souza00 disse:

postei em forma de pasta porque precisa abrir os 3 algoritmos pra calculadora funcionar.

você pode postar no replit ou no onlineGDB que fica mais cômodo para  as pessoas visualizarem,

 

Agora vamos ao código eu não sei C++, mas eu acho que essa calculadora está com muitos objetos para uma calculadora.

 

Você já parou para pensar o que o objeto Cpu faz? esse objeto está fazendo serviço de outros como

virtual void setDisplay(Display * display) = 0;

Isso não deveria estar em Display? qual é o sentido de display ser configurado por outro objeto?

 

É aqui nesse trecho

virtual void setDecimalSeparator() = 0;

Pra que ter isso sendo que você poderia ter algo como

void addCharacterToDisplay(const character char);
void removeLastCharacterDisplay();

 

 

  • Curtir 1
Postado

@souza souza00 Pra mim esse seu código não tem salvação, mas se vocẽ ainda quiser tentar recuperar a maior parte dos erros estão no método

void CpuSthefani::converterIntToDigits(int value, Digit *digits, int *count)

na linha 118 do arquivo calc.cpp.

Você não fechou o método com a chave } nem utilizou um bloco {} no while, e no for você está utilizando um ponteiro para contar deveria se uma variável do tipo inteira (int).

 

Eu fiz um código demonstrado um display em C (avisando novamente eu não sei C++) talvez seja útil.

#include <stdio.h>
#include <stdlib.h>

/* Informações internas do display */
/* Seria os campos privados do objeto */
struct info_display
{
    int max_buffer;
    char *buffer;
};

/* Metodos do objeto */

void limpaDisplay(struct info_display *display);
/* 
 * Limpa todos os caracteres no display
 */

void iniciaDisplay(struct info_display *display, int max_caracteres);
/*
 * Inicia o display com a quantidade de caracteres suportados
 */

void atualizaDisplay(struct info_display *display);
/*
 * Mostra o display para o usuario
 */

void adicionaCaractereDisplay(struct info_display *display, char caractere);
/*
 * Coloca caracteres no display
 */

void apagaUltimoCaractereDisplay(struct info_display *display);
/*
 * Remove o ultimo caractere adicionado no display
 */

void liberaDisplay(struct info_display *display);
/*
 * Apaga a memoria reservada para o display
 */

int main(void)
{
    struct info_display display;
    iniciaDisplay(&display, 10);

    printf("Primeira atualizacao\n");

    adicionaCaractereDisplay(&display, '1');
    adicionaCaractereDisplay(&display, '3');
    adicionaCaractereDisplay(&display, '7');
    atualizaDisplay(&display);

    printf("Segunda atualizacao\n");

    apagaUltimoCaractereDisplay(&display);
    adicionaCaractereDisplay(&display, 'C');
    atualizaDisplay(&display);

    printf("Terceira atualizacao\n");

    limpaDisplay(&display);
    atualizaDisplay(&display);
    
    liberaDisplay(&display);
    return(0);
}

void limpaDisplay(struct info_display *display)
{
    int contador = 0;
    for (contador = 0; contador < display->max_buffer; contador++)
    {
        display->buffer[contador] = '\0';
    }
}

void iniciaDisplay(struct info_display *display, int max_caracteres)
{
    /* Reserva a quantidade caracteres maxíma do display */
    display->buffer = malloc(sizeof(*display->buffer)*display->max_buffer);

    /* Se foi possivel reservar memoria então limpa o display */
    if (display->buffer != NULL) {
        display->max_buffer = max_caracteres;
        limpaDisplay(display);
    } else {
        display->buffer = NULL;
    }
}

void atualizaDisplay(struct info_display *display)
{
    int contador;
    /* Mostra uma linha */
    for (contador = 0; contador < display->max_buffer; contador++) {
        putchar('-');
    }

    putchar('\n');

    /* Mostra o conteudo do display */
    printf("%s\n",display->buffer);

    /* Mostra uma linha */
    for (contador = 0; contador < display->max_buffer; contador++) {
        putchar('-');
    }

    putchar('\n');
}

void adicionaCaractereDisplay(struct info_display *display, char caractere)
{
    int contador;
    for (contador = 0; contador < display->max_buffer-1 && display->buffer[contador]; contador++);

    if (contador < display->max_buffer-1) {
        display->buffer[contador] = caractere;
        display->buffer[contador+1] = '\0';
    }
}

void apagaUltimoCaractereDisplay(struct info_display *display)
{
    int contador;
    for (contador = 0; display->buffer[contador]; contador++);

    if (contador > 0) {
        display->buffer[contador-1] = '\0';
    } else {
        display->buffer[contador] = '\0';
    }
}

void liberaDisplay(struct info_display *display)
{
    if (display->buffer != NULL) {
        free(display->buffer);
    }
}

 

Defina o que cada objeto em seu programa faz, e coloque cada um para fazer a sua tarefa com perfeição.

Postado

@kgin acho que voce nao entendeu a minha duvida, eu so quero saber o porque ele ta dando o erro que eu postei o print, so isso, eu nao quero um outro algoritmo em outra linguagem que nao vai adiantar, agradeço seu esforço, mas ele nao ta resolvendo minha duvida 

Postado

 

1 hora atrás, souza souza00 disse:

image.png.376c067f3ab1cc40ab5a1bfed6ecb2d5.png

Talvez você tenha escolhido a opção de projeto errada no seu IDE. Tente criar outro projeto para console.

Postado
2 horas atrás, souza souza00 disse:

acho que voce nao entendeu a minha duvida, eu so quero saber o porque ele ta dando o erro que eu postei o print,

Olha aqui no meu compilador

erro_cpp.png.30ecf1ac406fe4f27795e3a3124a530b.png

 

Que está basicamente dizendo que na linha 189 do arquivo calc.cpp

	while(value > 0)
		convert(value % 10, digits, (*count)++);
		value = value / 10;
	}

Seu while está sem a chave do bloco '{'

e que na linha 123 do mesmo arquivo (calc.cpp) você está utilizando uma variável chamada digit no loop for que não foi declarada

	for(digit = 0; digit < 8; digit++){
		
   numeros[x] = num % 10;
   num /= 10;
  }

 

e que a sua função

void CpuSthefani::converterIntToDigits(int value, Digit *digits, int *count)

você não fechou o bloco da função com a chave '}'

 

 

 

 

Postado
2 horas atrás, souza souza00 disse:

@kgin o que você chamou de porcaria, foi desenvolvido 80% por um professor Dr. na área, se tem o nome que tem e foi escrito em inglês foi por escolha dele. AGORA, se você não queria me ajudar, era só não ter respondido o post, peço ajuda aqui sempre que estou com dificuldades, e é a primeira vez que sou tratada desta forma, completamente sem educação, acho que os moderadores deviam ficar mais atentos a isso. Seja mais respeitoso com as pessoas, ninguém é obrigada a aceitar suas opiniões só porque você se acha melhor que os outros.

 

Postado
10 horas atrás, souza souza00 disse:

arquivo.zippessoal, estou com um erro e nao consigo resolver, postei em forma de pasta porque precisa abrir os 3 algoritmos pra calculadora funcionar. basicamente é um esboço de uma calculadora em c++, mais fica dando um erro que eu nao consigo resolver, se alguem puder me ajudar. ah tem um for fora de  ordem tambem que eu preciso por pra ela inverter o numero, que tambem nao estou conseguindo por. se alguem puder me ajudar

 

Poste as partes aqui, por favor. É o simples. Ou coloque o projeto no github de modo que pode ser clonado com um único comando.

 

Fazer download de um arquivo estranho para depois extrair e instalar e testar talvez seja um pouco demais. E esse é um forum público e alguns escrevem aqui esperando ajudar mais gente com problemas semelhantes ou discutir alguma técnica que possa ajudar mais gente.

 

Deixar um link aqui dificulta muito esse objetivo. Você pode ter sucesso e conseguir grande ajuda porque cada um vê o forum a seu modo, e esse modo pode ser como um desafio pessoal ou uma maneira de mostrar conhecimento.

 

No sentido de um forum público sobre C C# e C++ onde se espera multiplicar o alcance de soluções pode não ser um tópico bacana. É só minha opinião. Não representa a opinião do forum e não quero me colocar na posição de moderador :( 

 

Uma outra aproximação

 

Exemplo de como pode ser mais simples: se tivesse postado no GitHub qualquer um pode copiar o projeto aqui: https://github.com/ARFNeto-CH/chp21-2005-calcula ou ver os arquivos aqui https://github.com/ARFNeto-CH/chp21-2005-calcula/tree/master/chp21-2005-calcula sem baixar nada e sem receio de um download desconhecido

 

E Uma outra aproximação

 

Seu projeto tem 3 arquivos apenas: uma classe Calc e o programa principal, então tem Calc.h Calc.cpp e calculadora.cpp

 

Calc.h
 

Spoiler

#pragma once
#include<iostream>
#include<string>

enum Operator { SUBTRACTION, SUM, EQUAL, NOOP };
enum Digit { ZERO, UM, DOIS, TRES, QUATRO, CINCO, SEIS, SETE, OITO, NOVE };
enum Control { CE, DECIMAL_SEPARATOR, OFF, MRC, MEMORY_SUBTRACTION, MEMORY_SUM };

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

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

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

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

    virtual void pressZero() = 0;
    virtual void pressUm() = 0;
    virtual void pressDois() = 0;
    virtual void pressTres() = 0;
    virtual void pressQuatro() = 0;
    virtual void pressCinco() = 0;
    virtual void pressSeis() = 0;
    virtual void pressSete() = 0;
    virtual void pressOito() = 0;
    virtual void pressNove() = 0;

    virtual void pressDecimalSeparator() = 0;

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

    virtual void pressCE() = 0;
    virtual void pressOFF() = 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;
};

 

 

Calc.cpp

 

Spoiler

#pragma once
#include "Calc.h"
using namespace std;

class DisplaySthefani : public Display {
public:
	void clean();
	void addDigit(Digit digit);
	void setDecimalSeparator();
};

void DisplaySthefani::clean() {

	cout << "\n";
}

void DisplaySthefani::addDigit(Digit digit) {
	switch (digit) {

	case ZERO:cout << "0";
		break;

	case UM:cout << "1";
		break;

	case DOIS:cout << "2";
		break;

	case TRES:cout << "3";
		break;

	case QUATRO:cout << "4";
		break;

	case CINCO:cout << "5";
		break;

	case SEIS:cout << "6";
		break;

	case SETE:cout << "7";
		break;

	case OITO:cout << "8";
		break;

	case NOVE:cout << "9";
		break;

	}
}

void DisplaySthefani::setDecimalSeparator() {
	cout << ".";
}

#define DIGIT_MAX 8

class CpuSthefani : public Cpu {
private:
	Digit dig1[DIGIT_MAX], dig2[DIGIT_MAX];

	int dig1Count, dig2Count;

	Operator operador;

	Display* display;

	int operateOperands();
	int converterDigitsToInt(Digit*, int);

	void converterIntToDigits(int, Digit*, int*);
	void receiveDigitEx(Digit, Digit*, int*);
	void sendDigit(Digit);
	void convert(int, Digit*, int);

public:
	CpuSthefani(DisplaySthefani* display);

	void setDisplay(Display* display);

	void receiveDigit(Digit digit);
	void receiveOperator(Operator operador);
	void receiveControl(Control control);

};

int CpuSthefani::converterDigitsToInt(Digit* digits, int count) {
	int result = 0, exp = count - 1;
	for (int i = 0; i < count; i++)
		result += digits[1] * (10 ^ exp);
	return result;
}

int CpuSthefani::operateOperands() {
	int op1 = converterDigitsToInt(dig1, dig1Count);
	int op2 = converterDigitsToInt(dig2, dig2Count);
	int result;

	switch (this->operador) {
	case SUBTRACTION: return op1 - op2;
		break;

	case SUM:return op1 + op2;
		break;

	case EQUAL:;
		break;

	case NOOP:;
		break;
	}

	return 0;

}

void CpuSthefani::converterIntToDigits(int value, Digit* digits, int* count) {
	*count = 0;
	while (value > 0)
		convert(value % 10, digits, (*count)++);
	value = value / 10;
}
for (digit = 0; digit < 8; digit++) {

	numeros[x] = num % 10;
	num /= 10;
}

void CpuSthefani::convert(int value, Digit * digits, int count) {
	switch (value) {
	case 0:digits[count] = ZERO;
		break;

	case 1:digits[count] = UM;
		break;

	case 2:digits[count] = DOIS;
		break;

	case 3:digits[count] = TRES;
		break;

	case 4:digits[count] = QUATRO;
		break;

	case 5:digits[count] = CINCO;
		break;

	case 6:digits[count] = SEIS;
		break;

	case 7:digits[count] = SETE;
		break;

	case 8:digits[count] = OITO;
		break;

	case 9:digits[count] = NOVE;
		break;
	}
}

CpuSthefani::CpuSthefani(DisplaySthefani * display) {
	this->setDisplay(display);
	this->dig1Count = 0;
	this->dig2Count = 0;
	this->operador = NOOP;
}

void CpuSthefani::setDisplay(Display * display) {
	this->display = display;
}


void CpuSthefani::receiveDigitEx(Digit digit, Digit * digits, int* digCount) {
	if (*digCount == 0) this->display->clean();
	digits[(*digCount)++] = digit;

}


void CpuSthefani::receiveDigit(Digit digit) {
	if (this->operador == NOOP) {
		this->receiveDigitEx(digit, dig1, &dig1Count);
	}
	else {
		this->receiveDigitEx(digit, dig2, &dig2Count);
	}
	this->display->addDigit(digit);
}

void CpuSthefani::receiveOperator(Operator operador) {
	int result;
	if (this->operador != NOOP) {
		result = this->operateOperands();
		this->converterIntToDigits(result, this->dig1, &this->dig1Count);
	}

	if (operador != EQUAL) {
		this->operador = operador;
	}
	else {
		this->converterIntToDigits(result, this->dig1, &this->dig1Count);
	}
}

void CpuSthefani::receiveControl(Control control) {
	switch (control) {
	case CE: this->display->clean();
		break;

	case DECIMAL_SEPARATOR:	this->display->setDecimalSeparator();
		break;
	}
}

class KeyboardSthefani : public Keyboard {
public:
	KeyboardSthefani(Cpu* cpu);

	void setCpu(Cpu* cpu);

	void pressZero();
	void pressUm();
	void pressDois();
	void pressTres();
	void pressQuatro();
	void pressCinco();
	void pressSeis();
	void pressSete();
	void pressOito();
	void pressNove();

	void pressDecimalSeparator();

	void pressSum();
	void pressSubtraction();
	void pressEqual();

	void pressCE();
	void pressOFF();

private:
	Cpu* cpu;
	Digit digit;
	Control control;
	Operator operador;
};

KeyboardSthefani::KeyboardSthefani(Cpu * cpu) {
	this->setCpu(cpu);
}

void KeyboardSthefani::setCpu(Cpu * cpu) {
	this->cpu = cpu;
}

void KeyboardSthefani::pressZero() {
	this->cpu->receiveDigit(this->digit = ZERO);
}

void KeyboardSthefani::pressUm() {
	this->cpu->receiveDigit(this->digit = UM);
}

void KeyboardSthefani::pressDois() {
	this->cpu->receiveDigit(this->digit = DOIS);
}

void KeyboardSthefani::pressTres() {
	this->cpu->receiveDigit(this->digit = TRES);
}

void KeyboardSthefani::pressQuatro() {
	this->cpu->receiveDigit(this->digit = QUATRO);
}

void KeyboardSthefani::pressCinco() {
	this->cpu->receiveDigit(this->digit = CINCO);
}

void KeyboardSthefani::pressSeis() {
	this->cpu->receiveDigit(this->digit = SEIS);
}

void KeyboardSthefani::pressSete() {
	this->cpu->receiveDigit(this->digit = SETE);
}

void KeyboardSthefani::pressOito() {
	this->cpu->receiveDigit(this->digit = OITO);
}

void KeyboardSthefani::pressNove() {
	this->cpu->receiveDigit(this->digit = NOVE);
}

void KeyboardSthefani::pressDecimalSeparator() {
	this->cpu->receiveControl(this->control = DECIMAL_SEPARATOR);
}

void KeyboardSthefani::pressCE() {
	this->cpu->receiveControl(this->control = CE);
}

void KeyboardSthefani::pressSum() {
	this->cpu->receiveOperator(this->operador = SUM);
}

void KeyboardSthefani::pressSubtraction() {
	this->cpu->receiveOperator(this->operador = SUBTRACTION);
}

void KeyboardSthefani::pressEqual() {
	this->cpu->receiveOperator(this->operador = EQUAL);
}

void KeyboardSthefani::pressOFF() {
	this->cpu->receiveControl(this->control = OFF);
}

class CalculatorSthefani : public Calculator {
private:
	Display* display;
	Cpu* cpu;
	Keyboard* keyboard;

public:
	CalculatorSthefani(Display* display, Cpu* cpu, Keyboard* keyboard);
	Keyboard* getKeyboard();
	void setKeyboard(Keyboard* keyboard);

	Display* getDisplay();
	void setDisplay(Display* display);

	Cpu* getCpu();
	void setCpu(Cpu* cpu);
};

CalculatorSthefani::CalculatorSthefani(Display * display, Cpu * cpu, Keyboard * keyboard) {
	setDisplay(display);
	setCpu(cpu);
	setKeyboard(keyboard);
}

Keyboard* CalculatorSthefani::getKeyboard() {
	return this->keyboard;
}

void CalculatorSthefani::setKeyboard(Keyboard * keyboard) {
	this->keyboard = keyboard;
}

Display* CalculatorSthefani::getDisplay() {
	return this->display;
}

void CalculatorSthefani::setDisplay(Display * display) {
	this->display = display;
}

Cpu* CalculatorSthefani::getCpu() {
	return this->cpu;
}

void CalculatorSthefani::setCpu(Cpu * cpu) {
	this->cpu = cpu;
}

 

 

E o programa de teste calculadora.cpp

Spoiler

#include "Calc.cpp"

void testCalculator(Calculator *calc);

int main(){

    DisplaySthefani * d1 = new DisplaySthefani();
    CpuSthefani *cpu1 = new CpuSthefani(d1);
    KeyboardSthefani *kb1 = new KeyboardSthefani(cpu1);

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

    testCalculator(calc);

	return 0;
}

void testCalculator(Calculator *calc){
    calc->getKeyboard()->pressUm();
    calc->getKeyboard()->pressDois();
    calc->getKeyboard()->pressTres();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressQuatro();
    calc->getKeyboard()->pressCinco();
    calc->getKeyboard()->pressSeis();
    calc->getKeyboard()->pressSum();

    calc->getKeyboard()->pressCE();

    calc->getKeyboard()->pressDois();
    calc->getKeyboard()->pressTres();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressQuatro();
    calc->getKeyboard()->pressCinco();
    calc->getKeyboard()->pressSubtraction();
    calc->getKeyboard()->pressSeis();
    calc->getKeyboard()->pressSete();
    calc->getKeyboard()->pressEqual();
} 

 

 

Sem erro 500 ou 300 ou 400 ... Apenas 200, o OK.

 

 

Sobre seu programa, agora que afinal está aqui acima e também no Github

 

Sua construção não está assim uma beleza: são 3 classes, Display CPU e KeyBoard Todas dentro do que pareceria ser uma classe Calc que sequer existe.

 

 

Não escreva assim. Fica muito difícil trabalhar com isso, mesmo sózinho. Se trabalhar com outros então vai conseguir novos inimigos a menos que pague caro ;)

 

Depois aparece uma classe Calculator que é o nome do programa principal!!! NUNCA faça isso. Faça o simples: cada classe em seu arquivo e com seu header.

 

TODAS essas classes são abstratas. 

 

Mas aí em Calc.cpp aparecem novas classes com um sufixo Sthefani  só que em Calc.h não tem nada sobre isso, de modo que usar essas derivações das clases abstratas originais fica bem complicado de entender.

 

Sugiro escrever isso de um modo mais legível.

 

E corrigir erros estranhos como esse em calc,cpp:124
 

void CpuSthefani::converterIntToDigits(int value, Digit* digits, int* count) {
	*count = 0;
	while (value > 0)
		convert(value % 10, digits, (*count)++);
	value = value / 10;
}
for (digit = 0; digit < 8; digit++) {

	numeros[x] = num % 10;
	num /= 10;
}

 

E usar nomes mais claros.  E no for use auto ou o tipo, se precisa mesmo de um raw-loop. E arrume essas chaves

 

	switch (value) {
	case 0:digits[count] = ZERO;
		break;

	case 1:digits[count] = UM;
		break;

	case 2:digits[count] = DOIS;
		break;

	case 3:digits[count] = TRES;
		break;

	case 4:digits[count] = QUATRO;
		break;

 

 

Não tem outro jeito de escrever isso? Uma tabela por exemplo? 

 

Mude o tópico: não parece ter erro no código C já que é um programa em C++

10 horas atrás, souza souza00 disse:

la esta em inglês porque foi uma das exigências no seu desenvolvimento

image.png.376c067f3ab1cc40ab5a1bfed6ecb2d5.png

 

Seu projeto deve ser compilado para a console e o entrypoint é main(). Só que está usando um projeto desktop e aí o entrypoint seria WinMain() e você teria que implementar como tal....

 

É isso que o compilador (o linker ld na verdade) está tentando dizer: procura WinMain() e não achou.

Que sistema e ambiente está usando?

Postado
Em 21/05/2021 às 01:27, arfneto disse:

Sua construção não está assim uma beleza: são 3 classes, Display CPU e KeyBoard Todas dentro do que pareceria ser uma classe Calc que sequer existe

 

Eu já vi esse exemplo em algum lugar. Não é original. E estou quase certo que não era para C++, só que não me lembro agora :(

 

No entanto o que se quer mostrar no caso é o lance da composição de objetos e herança e tal. Uma calculadora seria composta de uma CPU um Display e um Keyboard, essas 3 classes abstratas que tem. 

 

C++ tem herança múltipla então se espera que você possa criar UMA classe Calculadora por exemplo, que estenda (o modo java de dizer) ou derive (o modo C++ de dizer) essas classes e possa instanciar uma Calculadora e fazer funcionar.

 

Para isso deve então implementar todos os métodos virtuais das 3 classes na Calculadora. java não tem herança múltipla mas C++ tem. Se escrever nesse sentido vai ver que seu programa deve ficar bem mais simples

 

 

image.png.71f69845449b2d68a34b88d8083b0816.png

Ainda sobre isso, veja aqui do lado esquerdo em um IDE comum uma possibilidade mais controlada de como começar isso em C++... fase1 :) 

 

As classes abstratas --- CPU, Keyboard e Display --- podem ser header-only porque são muito simples e não tem mesmo código. As funções são todas virtuais puras (aquelas coisas escritas = 0)...

 

Calculator por outro lado deve ter um cpp e bastante código, porque é onde vai criar a calculadora.

 

 

Mas veja como pode começar em Calculator.h
 

#pragma once
#include    "Keyboard.h"

class Calculator : Display, CPU, Keyboard 
{
};

 

E o cpp vazio. E main()?

#include <iostream>

int main(void)
{
    std::cout << "ARFNeto via CH!\n";
}

 

Sim, vazio inicialmente. Mas o projeto já compila e é o que importa nessa fase. Em Essentials.h estão os enum. Deixei esse primeiro include lá porque talvez precise de mais coisas, constantes e coisas globais ao projeto, não variáveis. Mas é bem provável que desapareça em meia hora que trabalhe no código.

 

Isso já compila com o código que tinha para as classes e é a maneira comum de começar.

 

E Depois?

 

Claro que não pode declarar 12 Calculadora escrevendo 
 

	Calculadora		big_calc_set[12];

 

porque a classe ainda é abstrata.

 

Veja:
 

image.png.5c209b38b879ea5c91ec522394294f78.png

 

E pode ver isso como uma to-do list

 

Implemente os métodos virtuais. Não precisam ser mais virtuais, podem ser final, podem virtuais, tanto faz. Apenas implemente todos e comece a testar. 

 

Acho que concorda que é mais simples assim, escrevendo a partir dos dados e usando os arquivos e a nomenclatura do modo usual.

 

 

 

 

 

 

 

Postado

Imagino que isso já esteja pronto há tempos...

 

Ao escrever classes diferentes para CPU, Keyboard e Display se pode criar calculadoras diferentes sem repetir coisas. Esse é outro ponto das classes e objetos.

 

Um display pode ser só uma linha com números, ou pode ter uma tela gráfica colorida com barras montando dígitos com LED coloridos por exemplo.

 

O teclado é a entrada única.

 

EXEMPLO de testCalculator() usando a calculadora do Windows

 

Em partes

 

    calc->getKeyboard()->pressUm();
    calc->getKeyboard()->pressDois();
    calc->getKeyboard()->pressTres();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressQuatro();
    calc->getKeyboard()->pressCinco();
    calc->getKeyboard()->pressSeis();
    calc->getKeyboard()->pressSum();

 

image.png.d524a67492483f88c3f141cf8748549b.png

 

 

Os resultados parciais vão aparecendo na linha acima, mas desaparecem ao apertam '+' pela segunda vez.

 

 


Antes do segundo '+' teria ainda o 123 + acima: image.png.84233e40320380dec6444a92bc5d491c.png

 

 

 

 

 

 

 

    calc->getKeyboard()->pressCE();

 

Isso vai apagar o resultado final. Mas o resultado fica armazenado ainda

 

image.png.54bcbb5c7a4bf9234caf0b97e70c5f8c.png

 

    calc->getKeyboard()->pressDois();
    calc->getKeyboard()->pressTres();
    calc->getKeyboard()->pressSum();
    calc->getKeyboard()->pressQuatro();
    calc->getKeyboard()->pressCinco();
    calc->getKeyboard()->pressSubtraction();
    calc->getKeyboard()->pressSeis();
    calc->getKeyboard()->pressSete();
    calc->getKeyboard()->pressEqual();

 

Eis o progresso dessa parte
 

image.png.c10b45c243e29c356e13a4693bde5ae9.png

 

 

Antes do primeiro '+'

 

 

 

 

image.png.f97cf2e0b30a83c70d73dd8cb488b9b5.png

 

Antes do  '-'

 

 

 

 

 

image.png.e65cc532e9e2f4acb2d4b9d1c620e373.png

 

antes do '='

 

 

 

 

 

 

E ao final

 

image.png.9a28e5256d29ab671415e42922be6bd5.png

 

Qualquer implementação de CPU Keyboard e Display deve escrever a lógica toda, além das funções virtuais puras.

 

Nem todo display precisa ter por exemplo aquela linha bonitinha com as parcelas intermediárias em letras menores. CE pode ter vários níveis por exemplo...

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!