Ir para conteúdo
  • Cadastre-se

Bugs num app próprio de calculadora


Posts Recomendados

Eu estou fazendo uma calculadora para praticar no SDK, a calculadora está funcionando quase perfeita, mas está apresentando 2 bug's que gostaria mt da ajuda de vocês para resolver, se possível:

o primeiro é no uso da virgula, que até 2 digitos após a virgula funciona tudo ok, mas qnd vou digitar o terceiro, ou nao dá reação alguma, ou então ela soma uns valores e muda o numero. ex: tenho 2,55 e digito um 3, alvez de mostrar 2,553, mostra 2,56...

aqui o código comentado apenas da parte específica (resumido):

-(IBAction)dotPressed:(id)sender; //ação de apertar a vírgula

{

virg = 1; //variável para determinar se a vírgula vai ser usada (a variável volta a ser 0 caso o usuário aperte algum botão de operação)

}

-(IBAction)buttonDigitPressed:(id)sender; //ação para quando apertar qualquer botão de número

{

if (virg == 0)

{

currentNumber = currentNumber*10 + (float)[sender tag]; //essa tag é para os digitos, cada botão de digito tem uma respectiva tag

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber];

}

else

{

dot = dot + 1; //(dot - 1) determina quantos números já existem após a virgula

expo = pow(10, dot);

currentNumber = (currentNumber * expo + (float)[sender tag]) / expo;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber];

}

}

e o segundo bug é com o botão de multiplicar, mas esse é o mais intrigante, quando faço operações com 3 ou mais números e no final aperto o "=", ele dá resultado igual a 0, mas o intrigante que só acontece com o botão de multiplicar...

aqui vai o código completo do programa, pra quem quiser conferir (é provável que achem o programa complicado d+ pra algo muito simples. É porque foi o meio que pensei de fazer essas operações):

#import <UIKit/UIKit.h>

@interface CalculadoraAppDelegate : NSObject <UIApplicationDelegate> {

UIWindow *window;

double result, memory, currentNumber, currentNumber2, expo, dot;

IBOutlet UILabel *calculatorScreen;

int currentOperation, currentOperation2, evento, evento2, virg;

}

-(IBAction)buttonDigitPressed:(id)sender;

-(IBAction)buttonOperationPressed:(id)sender;

-(IBAction)dotPressed:(id)sender;

-(IBAction)cancelInput;

-(IBAction)cancelOperation;

-(IBAction)cancelmemory;

-(IBAction)memoryplus:(id)sender;

-(IBAction)memorysub:(id)sender;

-(IBAction)memoryshow;

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

#import "CalculadoraAppDelegate.h"

@implementation CalculadoraAppDelegate

-(IBAction)buttonDigitPressed:(id)sender;

{

if (virg == 0)

{

switch (evento)

{

case 0:

currentNumber = currentNumber*10 + (float)[sender tag];

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber];

break;

case 1:

currentNumber2 = currentNumber2*10 + (float)[sender tag];

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber2];

evento2 = 1;

break;

case 2:

currentNumber = currentNumber*10 + (float)[sender tag];

calculatorScreen.text = [NSString stringWithFormat:@"%.2f",currentNumber];

evento2 = 2;

break;

}

}

else

{

dot = dot + 1;

expo = pow(10, dot);

switch (evento)

{

case 0:

currentNumber = (currentNumber * expo + (float)[sender tag]) / expo;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber];

break;

case 1:

currentNumber2 = (currentNumber2 * expo + (float)[sender tag]) / expo;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", currentNumber2];

evento2 = 1;

break;

case 2:

currentNumber = (currentNumber * expo + (float)[sender tag]) / expo;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f",currentNumber];

evento2 = 2;

break;

}

}

}

-(IBAction)dotPressed:(id)sender;

{

virg = 1;

}

-(IBAction)buttonOperationPressed:(id)sender;

{

dot = 0;

virg = 0;

currentOperation = (float)[sender tag];

if (currentOperation == 0)

{

switch (evento2)

{

case 1:

switch (currentOperation2)

{

case 1:

result = currentNumber + currentNumber2;

break;

case 2:

result = currentNumber - currentNumber2;

break;

case 3:

result = currentNumber * currentNumber2;

break;

case 4:

result = currentNumber / currentNumber2;

break;

}

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", result];

break;

case 2:

switch (currentOperation2)

{

case 1:

result = result + currentNumber;

break;

case 2:

result = result - currentNumber;

break;

case 3:

result = result * currentNumber;

break;

case 4:

result = result / currentNumber;

break;

}

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", result];

currentNumber = 0;

break;

}

}

switch (evento2)

{

case 0:

currentOperation2 = (float)[sender tag];

evento = 1;

break;

case 1:

switch (currentOperation2)

{

case 1:

result = currentNumber + currentNumber2;

break;

case 2:

result = currentNumber - currentNumber2;

break;

case 3:

result = currentNumber * currentNumber2;

break;

case 4:

result = currentNumber / currentNumber2;

break;

}

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", result];

currentOperation2 = (float)[sender tag];

currentNumber = 0;

currentNumber2 = 0;

evento = 2;

break;

case 2:

switch (currentOperation2)

{

case 1:

result = result + currentNumber;

break;

case 2:

result = result - currentNumber;

break;

case 3:

result = result * currentNumber;

break;

case 4:

result = result / currentNumber;

break;

}

currentOperation2 = (float)[sender tag];

currentNumber = 0;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", result];

break;

}

}

-(IBAction)cancelInput

{

dot = 0;

virg = 0;

if (evento == 1) currentNumber2 = 0;

else currentNumber = 0;

calculatorScreen.text = @"0.00";

}

-(IBAction)cancelOperation

{

dot = 0;

virg = 0;

currentNumber = 0;

currentNumber2 = 0;

evento = 0;

evento2 = 0;

currentOperation = 0;

currentOperation2 = 0;

calculatorScreen.text = @"0.00";

}

-(IBAction)cancelmemory

{

memory = 0;

}

-(IBAction)memoryplus:(id)sender;

{

dot = 0;

virg = 0;

memory = memory + currentNumber;

currentNumber = 0;

}

-(IBAction)memorysub:(id)sender;

{

dot = 0;

virg = 0;

memory = memory - currentNumber;

currentNumber = 0;

}

-(IBAction)memoryshow

{

dot = 0;

virg = 0;

calculatorScreen.text = [NSString stringWithFormat:@"%.2f", memory];

}

@synthesize window;

Link para o comentário
Compartilhar em outros sites

  • Respostas 13
  • Criado
  • Última resposta

Top Postadores Neste Tópico

Bom, é meio difícil tentar achar os erros sem ver o programa.

O Console te manda alguma mensagem de erro quando você executa a multiplicação, ou quando você põe o 3º numero depois da virgula?

Na exibição da sua NSString, ponha mais casas depois da vírgula. Porque você está definindo para mostrar duas casas depois da virgula, e no caso, esta inserindo a terceira casa depois da virgula. O que pode estar acontecendo é que ele está pegando realmente duas casas depois da virgula e arredondando o valor.

Ex.:

Numero correto = 2,553

Numero com 2 casas (arredondado) = 2,56 / 553 foi arredondado para 56 para exibir as duas casas como você definiu.

Não sei se pode funcionar, mas tenta criar uma variável na sua action mesmo só para contar quantas casas depois da virgula você está usando. Depois imprime 0 %(variável)f. (Só lembrando, isso foi uma idéia, não tenho como testar se funciona agora.) Mas para testar rapido se o problema é esse imprime com 3 ou 4 casas depois da vírgula e testa.

Caso ainda de erro,nesa action (-(IBAction)buttonDigitPressed:(id)sender; //ação para quando apertar qualquer botão de número), ao invés de usar if/else joga um DO/While sua virgula == 1 ou while (ou no while para quebrar seu laço pode utilizar tbm sua tags de operação).

Ou seja se eu entendi seu programa... Faz alguma coisa (do) , no caso receber mais números, enquanto (while) virgula == 1. Quando ele digitar algum botão que vá fazer uma operação, sua virgula vai ir para zero, e vai sair do laço.

Testa isso e vamos ver se funciona, para depois irmos para o próximo erro.

Espero que ajude.

Bruno Delgado

Editado por Bruno Delgado
Link para o comentário
Compartilhar em outros sites

Rapaz, sua explicaçao tem muita logica e creio que possa ser isso mesmo com o erro da vírgula... Eu ainda estou começando a pegar os codigos do xCode e nem sabia para que era esse "%.2f"... Vou trocar pra colocar uns 10 numeros depois da vírgula, para ficar um app mais preciso... Mas como faço para nao aparecerem os 2 numeros depois da vírgula quando eles forem 0? Pq se vc digita 225, ele aparece 225.00. Posso simplesmente tirar esse argumento stringWithFormat?

Link para o comentário
Compartilhar em outros sites

Esse argumento não deve ser tirado, ele formata a String a ser exibida, é so arrumarmos ele.

Vamos por partes, primeiro, não convém por 10 casas depois da virgula. Se no caso como você disse, você por '%.10f ' o número retornado vai mostrar 10 casas depois da virgula, existam eles ou não. Ou seja, se você digitar o numero 20, ele vai exibir 20.0000000000

Para arrumar isso é fácil. Você tem duas exibições no seu programa, número com virgula, ou sem vírgula.

No seu IF então arrume o seguinte. Vou resumir seu código somente onde é necessário corrigir.

Sem virgula.

if (virg == 0) // nao tem virgula

{

calculatorScreen.text = [NSString stringWithFormat:@"%.0f", currentNumber];

//Exibir 0(zero) casas depois da virgula. Se digitado 225 vai exibir 225 só.

}

Com virgula.

else

{

calculatorScreen.text = [NSString stringWithFormat:@"%.*f",dot,currentNumber];

//Aqui estamos trabalhando com a impressão de casas depois da virgula de uma forma dinâmica,onde o * representa uma variável do tipo INT que guarda quantas casas serão exibidas, no caso eu utilizei a sua variável dot que já tem como função contar as casas depois da vírgula. Não esqueça de informar ela como parâmetro e na ordem correta ,como grifado.

}

:lol:

Link para o comentário
Compartilhar em outros sites

Sobre o seu segundo bug, não sei se entendi bem, mas se você quis dizer que não consegue realizar a operação, por exemplo: 2*3*4 =

É isso? Porque se for, no seu app não vai dar mesmo...

Você trabalha com duas variáveis somente em cada operação e guarda o resultado. Ou seja se quisesse chegar no mesmo resultado no seu app teria que fazer 2*3 = *4 =

Espero que tenha ajudado...

Editado por Bruno Delgado
Link para o comentário
Compartilhar em outros sites

Sobre o seu segundo bug, não sei se entendi bem, mas se você quis dizer que não consegue realizar a operação, por exemplo: 2*3*4 =

É isso? Porque se for, no seu app não vai dar mesmo...

Você trabalha com duas variáveis somente em cada operação e guarda o resultado. Ou seja se quisesse chegar no mesmo resultado no seu app teria que fazer 2*3 = *4 =

Espero que tenha ajudado...

So para deixar mais explicado, nao da porque vc nao tem o action pronto, se vc reparar, no final do seu codigo, vc so declarou action que utiliza a memoria para somar e subtrair (memoryplus e memorysub respectivamente). So precisa seguir a mesma logica para fazer uma multiplicacao com uso da memoria, bem simples...

Link para o comentário
Compartilhar em outros sites

Mas a questao que eu consigo fazer essas operaçoes com o +, -, /, e apenas dá erro com o multiplicar... Esse é o problema... Pq meu programa usa 2 variaveis para a primeira conta e apartir da terceira ela so usa a variável currentNumber (deixando de usar a currentNumber2) e só retomando a usar o currentNumber qnd eu finalizar um cauculo, usando o AC ou o =. Tirando isso, o resto funciona igual a cauculadora da apple , no iOS

As virgulas vou testar e logo mais lhe aviso se prestou

Desde já muito obrigado pela disposição em me ajudar

Link para o comentário
Compartilhar em outros sites

infelizmente nao está funcionando essa parte do "%.*f", dot, ... sem contar que notei um erro grave de síntese, como, por exemplo, se eu nao usar em nenhum momento a virgula, mas ela pode aparecer numa divisão, por exemplo, entao cometi um erro de síntese.. nao posso usar isso de dizer quantas casas tem, na parte de mostrar o resultado final... entende?

Link para o comentário
Compartilhar em outros sites

Entendi oque você quis dizer. Realmente dessa forma não será possivel utilizar a lógica que imaginei utilizando a variável dot. Mas confirma o %.*f porque eu testei aqui antes de escrever, e até tenho um projetinho que criei se você quiser ver... Checa se ordem está correta. Que erro que deu?

Agora isso, você deve facilmente resolver vendo alguma calculadora pronta em qualquer linguagem. Porque os problemas que você está enfrentando agora são puramente lógicos, então dá uma pesquisada sobre calculadoras em outras linguagens, principalmente java que facilmente você resolve esse seu problema...

<_<

Link para o comentário
Compartilhar em outros sites

tive uma boa idéia para mostrar o resultado com no máximo 7 casas decimais, e sem adicionar 0's desnecessários...

esse código é colocado logo após caucular o resultado, e comanda a amostragem do resultado na calculadora:

Deci = result - floor(result);

if (Deci == 0) calculatorScreen.text = [NSString stringWithFormat:@"%.0f", result];

else

{

while (X != 0)

{

Y = Y + 1;

W = pow(10, Y) * Deci;

X = W - floor (W);

if (Y == 7) X=0;

}

calculatorScreen.text = [NSString stringWithFormat:@"%.*f", Y, result];

}

Link para o comentário
Compartilhar em outros sites

Ja sei ate +/- como vou fazer aquilo do limite maximo de digitos, e usar aquilo do "e+10", qnd tem numero d+... mas ainda nao sei como posso fazer para usar "." para separar as milhares (ex: 345.984.738), e como trocar o símbolo da vírgula, que está usando um "." E nao uma ","

Pensei que talvez fosse só trocar "%.*f" por "%,*f", mas nao funcionou...

Link para o comentário
Compartilhar em outros sites

Participe do debate

Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.

Visitante
Responder este tópico…

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Limpar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.



  • Estatísticas do Fórum

    • Total de Tópicos
      56k
    • Total de Posts
      465.5k
×
×
  • Criar Novo...