He intentado de muchas formas hacer esto y hay otro post con esa otra idea pero esta es mejor solo que me anda a veces :S
string texto = "2x-8(5+4)-1";
string[] datos = new string[50];
int h = 0;
for (int i = 0; i < texto.Length; i++) // Bucle para recorrer letra por letra
{
if (texto[i].ToString() == ")") // Si la letra que estamos recorriendo es igual a ")" entonces..
{
h--; // Bajamos el index de datos[] para q siga escribiendo las siguientes letras en el index q estaba antes
continue; // salteamos la fase del bucle para q vuelva a generarse con el siguiente valor de i, ya q no queremos que luego al final del bucle agregue el parentesis en datos[h]
}
if (texto[i].ToString() == "(") // Si la letra q estamos recorriendo es igual a "(" entonces..
{
h++; // Subimos el valor del index de datos[] para q empiece a escribir las letras del nuevo "conjunto" de parentesis, en un distinto index de datos[]
continue; // Salteamos la fase del bucle para q se genere otra vez con el siguiente valor de i ya que no queremos que se escriba el parentesis
}
datos[h] += texto[i].ToString(); // Vamos agregando las letras
}
foreach (string r in datos)
MessageBox.Show(r);
Entienden q quiero hacer? los mensajes q tendrian salir serian primero "2x-8-1" y el otro "5+4", es decir datos[0] tendra "2x-8-1" y datos[1] tendra "5+4"
Ese codigo con esa ecuacion funciona, pero la idea es q funcione para texto = "2x-8(5+3(-4+8(1+2)-56)-2)-87+1"
Que tendria q dejar en datos[0] = "2x-8-87+1", en datos[1] = "5+3-2" , en datos[2] = "-4+8-56" y datos[3] = "1+2"
Si sirve para todas estas, es porq anda bien:
2x-8(5+4)-1
-1(2x-8)
(2x-8)-1
2x-8(5+4)-1(3+2)-9+8
2x-8(5+4)-1(3+2(8-4)+5)-9+8
2x-8(5+4(2+7))-1(3+2(8-4)+5)-9+8
2x-8(5+4(2+7))-1(3+2(8-4(3+7))+5)-9+8
pd: No se preocupen por si salen los mensajes q tienen q salir y luego salen el resto en blanco hasta llegar a 50 q es el limite del array, eso no importa ya q lo tengo solucionado y tendra un valor q cambiara siempre para q quede justo.
Espero que alguien lo pueda hacer ya q despues de eso ya creo q puedo seguir adelante solo y esta quedando lindo el proyecto, espero q me ayuden!
pd: Arregle el codigo, espero q entiendan mejor ahora
¡Qué desorden de código hermano!.
Te recomendaría que leyeras un manual al menos básico sobre C#, éste (http://www.sendspace.com/file/8yy7ns) te recomendaría encarecidamente, antes de volver a hacer un código así.
Jajaja xD q tiene de mal? es la idea q me lo corrijan, vs q sabes mas talvez me podes echar una mano ;)
pd: Ese codigo esta hecho para q entiendan q quiero hacer, el verdadero codigo tiene muchas mas cosas, pero no digo q talvez me vendria bien leerme ese manual.. por segunda vez..
Porque el for lo inicias desde 1 ? , si se empieza desde la posicion 0, yo cambiando eso ya me anda asi como tu lo dices y me da el resultado bien como lo indicas para el string "2x-8(5+3(-4+8(1+2)-56)-2)-87+1"
P.D. El codigo lo pase a Java, ya que no tengo C#, pero no hay muchas diferencia en la sintaxis
Ya lo modifique en el post principal, pero por ejemplo para esta ecuacion no anda: 2-8(2x-5(4+8)-2(8-3)-86+84)-96
Esto te puede ayudar tengo problemas con el orden pero despues esta todo bien:
//La exprecion a evaluar
string Cadena = this.textBox1.Text;//colocar aqui la expresion a evaluar
//Convertir a un array de "char"
char[] texto;
texto = Cadena.ToCharArray();
string[] datos;
//Contendra los indices donde se encuentran los "("
List<int> Niveles = new List<int>();
for (int i = 0; i < texto.Length; i++)
{
if (texto[i].ToString() == "(")
Niveles.Add(i);
}
//ahora que ya conocemos el total de niveles inicializamos el tamaño de datos[]
datos = new string[Niveles.Count + 1];
//comenzamos a llenar los datos pero comenzando desde el menor valor los caracteres que ya recorrimos los llenamos con espacios en blanco
for (int i = datos.Length - 1; i >= 0; i--)
{
datos[i] = "";
bool termino = false;//variable que indica si termino la busqueda de ")"
if (i > 0)
{
for (int j = Niveles[i - 1]; j < texto.Length; j++)
{
if (texto[j] == char.Parse(")"))
{
termino = true;
}
if (texto[j] != char.Parse("(") && texto[j] != char.Parse(")") && texto[j] != char.Parse(" "))
{
datos[i] = datos[i] + texto[j].ToString();
}
texto[j] = char.Parse(" ");
if (termino)
break;
}
}
else
{
for (int j = 0; j < texto.Length; j++)
{
if (texto[j] != char.Parse("(") && texto[j] != char.Parse(")") && texto[j] != char.Parse(" "))
{
datos[i] = datos[i] + texto[j].ToString();
}
}
}
}
foreach (string r in datos)
MessageBox.Show(r);
Lo hiciste recien o lo tenias en algun codigo viejo? Sos un kapo! gracias!!!
No era nada facil, me quedo tranquilo xD
Recien lo hice pero para que es no entiendo!!!!!!!!!!!!!!
Para ordenar una ecuacion para q quede formal y luego calcular el valor de x, pero todo eso lo vere de a poco, ahora ya tengo separado los parentesis q es lo q queria, y ahora intentare simplificar y ver como hago las cuentas para simplificar :S
Despues q la ecuacion queda formal es decir ax^2+bx+c o ax+b ya lo calcula mi codigo, esta quedando lindo :P gracias!