Lucasfonoli Postado 6 de setembro de 2010 Denunciar Compartilhar Postado 6 de setembro de 2010 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 6 de setembro de 2010 Autor Denunciar Compartilhar Postado 6 de setembro de 2010 só esqueci de dizer que as tags das operações: "=" tem tag 0 "+" tem tag 1 "-" tem tag 2 "*" tem tag 3 "/" tem tag 4 , e os numeros tem as tags iguais a eles, exemplo: 1 tem tag 1, 2 tem tag 2, etc.. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 7 de setembro de 2010 Denunciar Compartilhar Postado 7 de setembro de 2010 (editado) 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 7 de setembro de 2010 por Bruno Delgado Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 7 de setembro de 2010 Autor Denunciar Compartilhar Postado 7 de setembro de 2010 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 8 de setembro de 2010 Denunciar Compartilhar Postado 8 de setembro de 2010 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. } Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 8 de setembro de 2010 Denunciar Compartilhar Postado 8 de setembro de 2010 (editado) 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 8 de setembro de 2010 por Bruno Delgado Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 8 de setembro de 2010 Denunciar Compartilhar Postado 8 de setembro de 2010 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 9 de setembro de 2010 Autor Denunciar Compartilhar Postado 9 de setembro de 2010 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 9 de setembro de 2010 Autor Denunciar Compartilhar Postado 9 de setembro de 2010 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 9 de setembro de 2010 Denunciar Compartilhar Postado 9 de setembro de 2010 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 9 de setembro de 2010 Autor Denunciar Compartilhar Postado 9 de setembro de 2010 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]; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 9 de setembro de 2010 Autor Denunciar Compartilhar Postado 9 de setembro de 2010 Só esqueci de citar que no inicio do programa defino X como qualquer outro valor diferente de 0, para poder entrar nesse laço do while... E esqueci de dizer que o "%.*f" funcionou, e estou muito grato Citar Link para o comentário Compartilhar em outros sites More sharing options...
Bruno Delgado Postado 10 de setembro de 2010 Denunciar Compartilhar Postado 10 de setembro de 2010 Otima idéia! Funcionou certinho... Abraçooos! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Lucasfonoli Postado 11 de setembro de 2010 Autor Denunciar Compartilhar Postado 11 de setembro de 2010 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Participe do debate
Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.