Bueno hasta ahorita esta bastante feo el codigo, estoy seguro que se puede simplificar y mejorar
en teoria puede calcular una cadena mas o menos asi "2+2+2+2+2+2+2+2+2+2" pero por algun bug que tengo que ver solo hace hasta "2+2+2", hace las 4 operaciones básicas, y creo que haciéndolas no tiene errores

aqui el codigo:

Código: Seleccionar todo

public class AnaString 
{
	public static double Calc(String Cadena) 
	{		
		String numeros = "123456790";
		String Operaciones = "+-*/";
		int Tm = 0, i = 0, n = 0, m = 0, k = 0;
		String Num[] = new String[10];
		char ope[] = new char[10], j;
		double res = 0,a;
		
		for(i=0;i<10;i++)
		{
			Num[i]="0";
		}
				
		Tm = Cadena.length();
		
		for(i=0;i<Tm;i++)
		{
			for(n=0;n<9;n++)
			{
				if(Cadena.charAt(i)==numeros.charAt(n))
				{
					j= Cadena.charAt(i);
					Num[k]=Num[k]+j;
				}
				else
				{
					
					for(m = 0;m<4;m++)
					{					
						if(Cadena.charAt(i)== Operaciones.charAt(m))
						{
							
							if(ope[(i-1)]!= Operaciones.charAt(m))
							{
								ope[(i-1)]=Cadena.charAt(i);
								k++;
							}
						}
					}
				}				
			}
		}
		for(i=0;i<10;i++)
		{
			switch(ope[i])
			{
				case '+':
				{
					if(i == 0)
					{
						res = res + Double.parseDouble(Num[i]);
						a = Double.parseDouble(Num[i+1]);						
						res = res + a;		
					}
					else
					{
						a = Double.parseDouble(Num[i]);
						res = res + a;
					}
					break;
				}
				
				case '-':
				{
					if(i == 0)
					{
						res = res - Double.parseDouble(Num[i]);
						a = Double.parseDouble(Num[i+1]);					
						res = res - a;							
					}
					else
					{
						a = Double.parseDouble(Num[i]);
						res = res - a;
					}
					break;
				}
				
				case '*':
				{
					if(i == 0)
					{						
						res = res + Double.parseDouble(Num[i]);
						a = Double.parseDouble(Num[i+1]);						
						res = res * a;							
					}
					else
					{
						a = Double.parseDouble(Num[i]);
						res = res * a;
					}
					break;
				}
				
				case '/':
					if(i == 0)
					{
						if(Double.parseDouble(Num[i])!= 0)
						{
							res = res + Double.parseDouble(Num[i]);
						}
						else
						{
							System.out.println("No se puede dividir por cero");
							System.exit(0);
						}
							a = Double.parseDouble(Num[i+1]);	
						if(a != 0)
						{
							res = res / a;		
						}
						else
						{
							System.out.println("No se puede dividir por cero");
							System.exit(0);
						}
					}
					else
					{
						a = Double.parseDouble(Num[i]);
						if(a != 0)
						{
							res = res / a;		
						}
						else
						{
							System.out.println("No se puede dividir por cero");
							System.exit(0);
						}
					}
			}			
		}
		return res;
	}
}
ejemplo de uso :

Código: Seleccionar todo

public class Calculadora_2 
{
	public static void main(String[] args) 
	{
		String a;
		Double b;
		
		System.out.println("Ingrese la operacion");
		a = Teclado.readString();
		
		b = AnaString.Calc(a);
		System.out.println("La Respuesta es = "+b);
	}
}
voy a seguir arreglándolo para tratar de solucionar los bugs y que permita operaciones del tipo "a+(b+c)"
cualquier sugerencia es buena xD, por ahora esta muy rudimentario pero voy crudo en java xD

clase teclado adjuntada
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Imagen

Regresando de la Muerte :P
Eso está muy bien para empezar. Continua con Java y tal vez llegues a crear grandes programas y me enseñas a mi después.

Saludos.
Me alegra que hayas empezado a jugar con Java y bueno el programa que planteas está muy bien.
Bueno como pedías sugerencias, te las voy a dar, pero como estás empezando.. tomatelo con calma.
Lo primero, trata de organizar bien tu code. Un código con tanto bucle seguido, tanta variable auxiliar... al final lo que hace es que te líes con tu propio código (y que los demás se líen al leerlo).
Trata de separar las partes que hagan lo mismo y unificarlas en una sóla función, para después invocarla en el programa principal con los parámetros que sean. A las variables deberías nombrarlas de forma que te de una idea de cómo se va a usar, qué valores va a tomar o qué tipo de datos tiene y que sea un nombre claro ayuda a la lectura del código.
Respecto al algoritmo en sí, tiene sus fallos como es comprensible, de los cuáles te irás dando cuenta con el tiempo, pero fundamentalmente.. por motivos de eficiencia trata de no hacer bucles for anidados para recorrer Strings. Una buena idea para resolver por ejemplo "2+2+2+2" sería recorriendo la String con un solo bucle desde i=0 hasta la longitud de la String y por cada caracter ir comprobando si es un número o es una operación, almacenar los "operandos" en variables.. acumular el resultado.. etc.

ya si después te animas a ampliar tus conocimientos sobre programación orientada a objetos en Java, puedes crearte una clase calculadora y otra clase operando tal que te vaya creando objetos de la clase operando dentro de la clase calculadora y vaya operándolos (y ahí puedes poner atributos como la preferencia de la operación, el tipo del operando.. si es int, long, float, double... y métodos con las operaciones que soporta)

si necesitas que te explique algo de eso en profundidad no dudes en preguntármelo.

R-007
Gracias a los dos por sus comentarios, Ax claro cuando aprenda bien te enceño :D!

R-007 un honor que pases por mi post, tienes mucha razon tiene mucha confucion lo hacia sobre la marcha corrigiendo errores para saber como funcionaba a pesar que no es de mucha utilidad el code me anima mucho dejarlo sin bugs tratare de simplificarlo ahora que llegue a mi casa y ahora te contacto por pm hay cosas que me dejaron dudas xD

Saludos...
Imagen

Regresando de la Muerte :P
Responder

Volver a “Otros lenguajes”