La version que je vais mettre sur CS puisque je travaille toujours avant de rendre mes sources. Toutes les sources 1.0 que je mets sont en fait les versions 1.1 chez moi (mes versions 1.0 sont souvent très simples et fonctionnent en utilisant un code souvent laid.)
exemple: partie de code de ma classe de math: Expr = new Regex(@"(^|\+|-|\*|/|\()(?<NUM1>[-]{0,1}[0-9,]+)!"); Matching = Expr.Matches(p_TempParsing); foreach (Match m in Matching) { Max = int.Parse(m.Groups["NUM1"].Value); Result = 1; while (Max > 1) { Result *= Max; Max--; } p_TempParsing = p_TempParsing.Replace(m.Groups["NUM1"].Value+"!", Result.ToString()); }
Expr = new Regex(@"(?<NUM1>[-]{0,1}[0-9,]+)\^(?<NUM2>(cos|tan|sin|rndup|rnddn|rnd|°c|°f|°k|[\s]*)([\s]*)[-]{0,1}[0-9,]+)"); Matching = Expr.Matches(p_TempParsing); string TempOP = p_TempParsing; while (Expr.IsMatch(p_TempParsing)){ foreach (Match m in Matching) { //this.ParseUnderEq(m.Groups["NUM1"].Value); p_Numbers[0] = double.Parse(m.Groups["NUM1"].Value);//p_TempParsing);
this.ParseUnderEq(m.Groups["NUM2"].Value); p_Numbers[1] = double.Parse(p_TempParsing); p_TempParsing = TempOP; p_Numbers[2] = System.Math.Pow(p_Numbers[0],p_Numbers[1]); p_TempParsing = p_TempParsing.Replace(m.Groups["NUM1"].Value+"^"+m.Groups["NUM2"].Value, p_Numbers[2].ToString()); Matching = Expr.Matches(p_TempParsing); TempOP = p_TempParsing; } }
Expr = new Regex(@"(^|\+|-|\*|/|\^)(?<FUNC>cos|tan|sin|rndup|rnddn|rnd|°c|°f|°k)(?<SPACES>[\s]*)(?<NUM1>[-]{0,1}[0-9,]+)(?<EXT>[°cfk]*)(\+|-|\*|/|\^|$)"); while (Expr.IsMatch(p_TempParsing)){ Matching = Expr.Matches(p_TempParsing); foreach (Match m in Matching) { func = m.Groups["FUNC"].Value; p_Numbers[0] = double.Parse(m.Groups["NUM1"].Value); gen = m.Groups["NUM1"].Value; switch (func){ case "cos": p_Numbers[1] = System.Math.Cos(p_Numbers[0]); break; case "tan": p_Numbers[1] = System.Math.Tan(p_Numbers[0]); break; case "sin": p_Numbers[1] = System.Math.Sin(p_Numbers[0]); break; case "rndup": p_Numbers[1] = System.Math.Ceiling(p_Numbers[0]); break; case "rnddn": p_Numbers[1] = System.Math.Floor(p_Numbers[0]); break; case "rnd": p_Numbers[1] = System.Math.Round(p_Numbers[0]); break; case "°c": if (m.Groups["EXT"].Value == "°f") p_Numbers[1] = (p_Numbers[0]-32.0)/1.8; else if (m.Groups["EXT"].Value == "°k") p_Numbers[1] = p_Numbers[0]-273; else p_Numbers[1] = p_Numbers[0]; gen = m.Groups["NUM1"].Value+m.Groups["EXT"].Value; break; case "°f": if (m.Groups["EXT"].Value == "°c") p_Numbers[1] = p_Numbers[0]*1.8+32.0; else if (m.Groups["EXT"].Value == "°k") p_Numbers[1] = (p_Numbers[0]-273)*1.8+32.0; else p_Numbers[1] = p_Numbers[0]; gen = m.Groups["NUM1"].Value+m.Groups["EXT"].Value; break; case "°k": if (m.Groups["EXT"].Value == "°c") p_Numbers[1] = p_Numbers[0]+273; else if (m.Groups["EXT"].Value == "°f") p_Numbers[1] = (p_Numbers[0]-32.0)/1.8+273; else p_Numbers[1] = p_Numbers[0]; gen = m.Groups["NUM1"].Value+m.Groups["EXT"].Value; break; } p_TempParsing = p_TempParsing.Replace(m.Groups["FUNC"].Value+m.Groups["SPACES"].Value+gen, p_Numbers[1].ToString()); } }
//+,-,*,/ Expr = new Regex(@"(?<NUM1>[-]{0,1}[0-9,]+)(?<OP>\*|/)(?<NUM2>[-]{0,1}[0-9,]+)"); Matching = Expr.Matches(p_TempParsing); while (Expr.IsMatch(p_TempParsing)){ foreach (Match m in Matching) { p_Numbers[0] = double.Parse(m.Groups["NUM1"].Value); p_Numbers[1] = double.Parse(m.Groups["NUM2"].Value); if (m.Groups["OP"].Value=="*") p_Numbers[2] = p_Numbers[0]*p_Numbers[1]; else p_Numbers[2] = p_Numbers[0]/p_Numbers[1]; p_TempParsing = p_TempParsing.Replace(m.Groups["NUM1"].Value+m.Groups["OP"].Value+m.Groups["NUM2"].Value, p_Numbers[2].ToString()); Matching = Expr.Matches(p_TempParsing); } }
Avec le reste, cela fonctionne, mais c'est presque incompréhensible. version 1.0 = tant que ca fonctionne version 1.1 = structure repensée.
Donc toutes les versions l'auront. -------------------------------------------------- David L.Pratte, Administrateur Mykeys Software Foundation Making dreams into programs / Du rêve au programme Demandes acceptées gratuitement
|