2011-05-08 12 views
5

Estoy haciendo una calculadora simple donde escribe valores en un cuadro de edición. Necesito dividir la cadena en un número de matrices dependiendo de cuántos * + -/hay en la suma, por ejemploCómo dividir una cadena de solo diez caracteres, por ejemplo, "12345 * 45688" en una matriz

Tengo 22 + 22 * ​​22-22/22 Quiero dividir eso en cinco matrices diferentes porque hay cinco grupos diferentes de números. Luego, más tarde voy a agregar array1 a la matriz dos multiplique eso por array3 y reste eso por array4 y divida eso por la matriz 5.

+0

¿Por qué quieres que sean matrices? ¿Que lenguaje? –

+0

La etiqueta dice delphi, así que supongo que es el idioma – Eponymous

+0

@carl Supongo que el idioma es Delphi, ya que es el único idioma que figura en las etiquetas. –

Respuesta

4

Si quiere leer algo así, especialmente si desea evaluar expresiones matemáticas, necesita más que solo un divisor de matriz; necesitas un analizador real Hacerlo bien requiere un poco de teoría del compilador. Te recomendaría que eches un vistazo al Let's Build A Compiler, un tutorial que cubre todo lo que necesitas saber sobre el análisis de expresiones (y un poco más, ya que en realidad está compilando un compilador simple) y lo hace fácil de entender. Todos los ejemplos están en Turbo Pascal, por lo que debería ser fácil para un codificador Delphi leer.

2

Delphi XE tiene una función SplitString que hace exactamente lo que necesita.

+0

Apenas. El título de la pregunta de OP es engañoso. Dividir es lo fácil, es el análisis de la expresión lo que presenta los desafíos. Como fuera de tema aparte, y como alguien sin XE, ¿qué tan eficiente es 'SplitString'? –

+0

@David: si el desafío es solo evaluar una expresión como se muestra, el enfoque de matriz dividida parece bastante válido para mí y un analizador de expresiones completo podría ser excesivo aquí. En cuanto a la eficacia de SplitString: ¿cómo puedo medir eso o compararlo con qué? –

+1

@Uwe Una vez que ha dividido la cadena, ¿cómo sabe cómo combinar los distintos números? Mi pregunta acerca de 'SplitString()' es, esencialmente, ¿hace algo tonto como el 'SetLength (ResultArray, Length (ResultArray) + 1) 'anti-patrón que' IOUtils.TDirectory.DoGetFiles() 'hace? –

0

Si desea obtener el resultado de esa ecuación, debe probar un componente no visual, llamado CalcExpress. Es gratis y se puede obtener a partir de aquí: CalcExpress

Enlace de descarga se encuentra al final del texto de la página

0

Aquí es una función que le puede ayudar en el camino.

Describe una cadena de entrada en una matriz de subcadenas, en función de un conjunto proporcionado de juegos de caracteres predefinidos.

Le dará una serie de cadenas, que serán ["22", "+", "22", "*", "22", "-", "22", "/", " 22 "].

A partir de allí, deberá identificar los números y los operadores, y deberá agrupar y ejecutar los cálculos de acuerdo con las reglas para la precedencia del operador.

TCharSet = Set of Char; 
TStringArray = Array of String; 

function GetSubStrings(InputString: String; CharacterSets: Array of TCharSet): TStringArray; 
// Get Sub-strings 
var 
    Index: Integer; 
    Character: Char; 
    SubString: String; 
    SubStringArray: TStringArray; 
    CharacterSetIndex: Integer; 
    PreviousCharacterSetIndex: Integer; 
begin 
    // Get 
    SubString := ''; 
    SetLength(SubStringArray, 0); 
    PreviousCharacterSetIndex := -1; 
    for Index := 1 to Length(InputString) do 
    begin 
    // Character 
    Character := InputString[Index]; 

    // Character Set Index 
    CharacterSetIndex := GetCharacterSet(Character, CharacterSets); 

    // Add 
    if (CharacterSetIndex = PreviousCharacterSetIndex) or (Index = 1) then 
     // Add Character to SubString 
     SubString := SubString + Character 
    else 
    begin 
     // Add SubString To SubString Array 
     SetLength(SubStringArray, Length(SubStringArray) + 1); 
     SubStringArray[Length(SubStringArray) - 1] := SubString; 

     // New SubString 
     SubString := Character; 
    end; 

    // Previous Character Set Index 
    PreviousCharacterSetIndex := CharacterSetIndex; 

    // Add last SubString 
    if Index = Length(InputString) then 
    begin 
     // Add SubString To SubString Array 
     SetLength(SubStringArray, Length(SubStringArray) + 1); 
     SubStringArray[Length(SubStringArray) - 1] := SubString; 
    end; 
    end; 

    // Result 
    Result := SubStringArray; 
end; 

function GetCharacterSet(Character: Char; CharacterSets: Array of TCharSet): Integer; 
// Get Character Set 
var 
    Index: Integer; 
    CharacterSet: TCharSet; 
begin 
    // Get 
    Result := -1; 
    for Index := 0 to Length(CharacterSets) - 1 do 
    begin 
    // Character Set 
    CharacterSet := CharacterSets[Index]; 

    // Check 
    if Character in CharacterSet then 
    begin 
     // Result 
     Result := Index; 

     // Break 
     Break; 
    end; 
    end; 
end; 
Cuestiones relacionadas