Skip to content

Commit

Permalink
1.1.5
Browse files Browse the repository at this point in the history
--
- Correction du bug sur les exposants qui ne se mettaient pas.
- Correction du bug qui créait des lignes vides dans le tableau.
- Suppression de la double barre sur les lignes de valeur interdite.
- Correction d'un bug qui faisait apparaître 2 colonnes pour un même nombre.
- La flèche s'étend maintenant lorsque x colonnes possèdent le même signe.

En appuyant sur le petit 'i' en haut à droite de la fenêtre vous pouvez envoyer un commentaire/des suggestions/un bug
  • Loading branch information
zonetecde committed Jun 8, 2023
1 parent a0302b0 commit 0fbd6e4
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 38 deletions.
Binary file modified Setup/SignaMath.exe
Binary file not shown.
2 changes: 1 addition & 1 deletion Setup/setup.iss
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "SignaMath"
#define MyAppVersion "1.1.4"
#define MyAppVersion "1.1.5"
#define MyAppPublisher "zonetecde"
#define MyAppURL "github.com/zonetecde/SignaMath"
#define MyAppExeName "SignaMath.exe"
Expand Down
10 changes: 10 additions & 0 deletions SignaMath/Classes/ExpressionElement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ public ExpressionElement(bool interdite, string expression)
Expression = expression;
}

public ExpressionElement(bool isNumerator, string expression, string exposant)
{
IsNumerator = isNumerator;
Exposant = exposant;
Expression = expression;
}

public bool IsNumerator { get; }
public string Exposant { get; }

internal bool Interdite { get; set; }
internal string Expression { get; set; }
}
Expand Down
91 changes: 69 additions & 22 deletions SignaMath/Extension/Sheller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SignaMath.Extension
{
Expand All @@ -16,44 +14,53 @@ internal static class Sheller
/// <param name="function">La nouvelle fonction</param>
internal static List<ExpressionElement> ShellFunction(string function)
{
List<string> lignes = DecouperExpression(function);
List<ExpressionElement> lignes = DecouperExpression(function);

List<string> expressions = new();
List<ExpressionElement> expressions = new();
if (lignes.Any())
{
for (int i = 0; i < lignes.Count; i++)
{
string expression = lignes[i];
if (String.IsNullOrEmpty(lignes[i].Exposant))
{
string expression = lignes[i].Expression;

expression = SupprimerParentheses(expression);
expression = SupprimerParentheses(expression);

List<string> nouvellesExpressions = new List<string>();
List<ExpressionElement> nouvellesExpressions = new List<ExpressionElement>();

var decoupe = DecouperExpression(expression);
nouvellesExpressions.AddRange(decoupe);
var decoupe = DecouperExpression(expression);
nouvellesExpressions.AddRange(decoupe);

nouvellesExpressions.ForEach(ligne =>
nouvellesExpressions.ForEach(ligne =>
{
expressions.Add(new ExpressionElement(lignes[i].Expression.Contains('/'), ligne.Expression.Replace("/", string.Empty).Replace("*", string.Empty)));
});
}
else
{
expressions.Add((lignes[i].Contains('/') ? 'd' : 'n') + ligne.Replace("/", string.Empty).Replace("*", string.Empty));
});
// s'il y a un exposant on ne shell pas l'expression; on garde l'expression
// total avec l'exposant
expressions.Add(lignes[i]);
}
}
}

for (int i = 0; i < expressions.Count; i++)
{
string? expression = expressions[i].Remove(0, 1);
string? expression = expressions[i].Expression.Remove(0, 1);
var decoupe = DecouperExpression(expression, true);
if (decoupe.Count > 1)
{
expressions.RemoveAt(i);
expressions.AddRange(decoupe.ConvertAll(x => expressions[i][0] + x));
expressions.AddRange(decoupe.ConvertAll(x => new ExpressionElement(expressions[i].Interdite, x.Expression)));
i = 0;
}
}

expressions.RemoveAll(x => x.Length == 1);
expressions.RemoveAll(x => x.Expression.Length == 1);

return (expressions.ConvertAll(x => new ExpressionElement(x.StartsWith('d'), x.Remove(0, 1))));
return expressions;
}

private static string SupprimerParentheses(string expression)
Expand All @@ -72,14 +79,14 @@ private static string SupprimerParentheses(string expression)
return expression;
}

private static List<string> DecouperExpression(string nouvelleFonction, bool estDeuxieme = false)
private static List<ExpressionElement> DecouperExpression(string nouvelleFonction, bool estDeuxieme = false)
{
if (estDeuxieme)
{
nouvelleFonction = SupprimerParentheses(nouvelleFonction);
}

List<string> lignes = new List<string>();
List<ExpressionElement> lignes = new List<ExpressionElement>();
int compteurParenthesesOuvertes = 0;
int indexDebutLigne = 0;

Expand All @@ -95,25 +102,65 @@ private static List<string> DecouperExpression(string nouvelleFonction, bool est

if (compteurParenthesesOuvertes == 0)
{
string ligne = nouvelleFonction.Substring(indexDebutLigne, i - indexDebutLigne + 1);
lignes.Add(ligne);
string exposant = string.Empty;

if (nouvelleFonction.Length > i + 1)
if (nouvelleFonction[i + 1] == '^')
{
// il y a un exposant à l'expression, on la garde en entière
// si l'exposant est 1 chiffre (ex : ^2)
if (nouvelleFonction[i + 2] != '(')
{
exposant += nouvelleFonction[i + 2];
}
else
{
// exposant entre les parenthèses
bool endExp = false;
int z = i + 3; // index dans la parenthèse
int tempOuverte = 0;
while (!endExp)
{
exposant += nouvelleFonction[z];
if (nouvelleFonction[z + 1] == '(')
tempOuverte++;
else if (nouvelleFonction[z + 1] == ')' && tempOuverte > 0)
tempOuverte--;
else if (nouvelleFonction[z + 1] == ')')
// fin de l'exposant
endExp = true;


z++;
}
}

}

ExpressionElement exp = new ExpressionElement(true, nouvelleFonction.Substring(indexDebutLigne, i - indexDebutLigne + 1), exposant);

lignes.Add(exp);
indexDebutLigne = i + 1;
}
}
else if (nouvelleFonction[i] == '/' && compteurParenthesesOuvertes == 0)
{
string ligneInterdite = nouvelleFonction.Substring(indexDebutLigne, i - indexDebutLigne).Trim();
lignes.Add(ligneInterdite);
ExpressionElement exp = new ExpressionElement(true, ligneInterdite, string.Empty);
exp.Interdite = true;
lignes.Add(exp);
indexDebutLigne = i;
}
}

if (indexDebutLigne < nouvelleFonction.Length)
{
string derniereLigne = nouvelleFonction.Substring(indexDebutLigne).Trim();
lignes.Add(derniereLigne);
ExpressionElement exp = new ExpressionElement(true, derniereLigne, string.Empty);
lignes.Add(exp);
}

lignes.RemoveAll(x => x.Expression.StartsWith('^') || String.IsNullOrEmpty(x.Expression)); // enlève les exposants seul
return lignes;
}
}
Expand Down
14 changes: 11 additions & 3 deletions SignaMath/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public partial class MainWindow : Window
{
internal static MainWindow _MainWindow { get; set; }

private const string VERSION = "1.1.4";
private const string VERSION = "1.1.5";
internal static string BASE_URL { get; } = "https://zoneck.bsite.net";
private Software Software { get; set; }

Expand Down Expand Up @@ -200,15 +200,23 @@ private void NewFunctionWrited(string newFunction, bool callUpdateBoard = true)
// Ajoute les nouvelles rows
foreach(var row in rows)
{
string expression = row.Expression;
if(!String.IsNullOrEmpty(row.Exposant))
{
expression = expression.Insert(0, "(") + ")^("; // ajoute des parenthèses englobante
expression += row.Exposant; // Ajoute l'exposant
expression += ")";
}

if(row.Interdite)
{
Button_AddForbiddenValueRow_Click(this, null);
TableauDeSigne.StackPanel_Row.Children.OfType<UserControl_Row>().Last().TextBox_Expression.textBox_clear.Text = row.Expression;
TableauDeSigne.StackPanel_Row.Children.OfType<UserControl_Row>().Last().TextBox_Expression.textBox_clear.Text = expression;
}
else
{
Button_AddRow_Click(this, null);
TableauDeSigne.StackPanel_Row.Children.OfType<UserControl_Row>().Last().TextBox_Expression.textBox_clear.Text = row.Expression;
TableauDeSigne.StackPanel_Row.Children.OfType<UserControl_Row>().Last().TextBox_Expression.textBox_clear.Text = expression;
}
}

Expand Down
43 changes: 31 additions & 12 deletions SignaMath/UC/Row/UserControl_Row.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,11 +254,13 @@ internal void FormulaChanged(string newFormula, bool callUpdateBoard = true)

foreach (string solution in solutions)
{
string _solution = solution.Trim();

// Calcul une approximation de la solution (dans le cas où elle contient un nombre aux décimals infinis)
double approximation = Extension.Extension.StrToDouble(solution.EvalNumerical().Stringize());
double approximation = Extension.Extension.StrToDouble(_solution.EvalNumerical().Stringize());

// On regarde si une colonne dans le tableau existe déjà contenant cette solution
var column = GlobalVariable.TableColumns.FirstOrDefault(x => x.Expression == solution);
var column = GlobalVariable.TableColumns.FirstOrDefault(x => x.Expression == _solution);

// Si la colonne existe déjà, on ajoute cette row à la liste de la colonne
// contenant toutes les rows pour laquelle elle est une solution
Expand All @@ -269,7 +271,7 @@ internal void FormulaChanged(string newFormula, bool callUpdateBoard = true)
{
// Sinon, on ajoute une nouvelle colonne au tableau
// avec comme row concerné cette row-ci.
ColumnElement columnElement = new ColumnElement(solution, approximation, new List<int> { RowId });
ColumnElement columnElement = new ColumnElement(_solution, approximation, new List<int> { RowId });
GlobalVariable.TableColumns.Add(columnElement);
}
}
Expand All @@ -296,12 +298,15 @@ internal void UpdateRow()
var tableColumns = new List<ColumnElement>(GlobalVariable.TableColumns);
tableColumns.RemoveAll(x => x.Value <= GlobalVariable.IntervalleMin || x.Value >= GlobalVariable.IntervalleMax);

bool? lastArrowUp = null; // contient l'orientation de la flèche de la dernière colonne du tab de variation
// ainsi on peut savoir si on ajoute une nouvelle flèche ou étend la première

// Ajoute, pour chaque colonne du tableau, une colonne dans la ligne
// Le `i` va de 0 à `nombre de colonne + 1` car sinon il manquerait la dernière case dans la row
for (int i = 0; i < tableColumns.Count + 1; i++)
{
// Ajoute la colonne
Grid_RowColumns.ColumnDefinitions.Add(new ColumnDefinition());
Grid_RowColumns.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star)});

// Si c'est la ligne header
if (RowType == RowType.HEADER)
Expand Down Expand Up @@ -389,6 +394,24 @@ internal void UpdateRow()
.First(x => x.RowType == RowType.CONCLUANTE).Grid_RowColumns.Children[i]))
.Label_Sign.Content.ToString() == "+";

if (lastArrowUp == isPlus)
{
// étend la flèche de la dernière colonne; supprime donc celle qui vient d'être créé
Grid_RowColumns.ColumnDefinitions.RemoveAt(Grid_RowColumns.ColumnDefinitions.Count - 1);
Grid_RowColumns.ColumnDefinitions.Last().Width = new GridLength(Grid_RowColumns.ColumnDefinitions.Last().Width.Value + 1, GridUnitType.Star);
break;
}
else
{
lastArrowUp = isPlus;

// si c'est une valeur interdite alors on force le fait que la prochaine row ai sa propre flèche
if (i != tableColumns.Count)
if (tableColumns[i].ValeurInterdite)
lastArrowUp = null;
}


// Set l'image de la flèche
userControl_CellSign.Image_Arrow.Source = isPlus ? MainWindow._MainWindow.img_arrowTemplateTop.Source : MainWindow._MainWindow.img_arrowTemplateBottom.Source;
userControl_CellSign.Image_Arrow.Visibility = Visibility.Visible;
Expand Down Expand Up @@ -521,15 +544,11 @@ internal void UpdateRow()
{
// Set la colonne entière en tant que valeur interdite (pour le tableau de variation)
tableColumns[i].ValeurInterdite = true;

// Affiche la seconde barre
userControl_CellSign.Border_SecondeBarre.Visibility = Visibility.Visible;
}
else
{
// Ce n'est pas une valeur interdite, on affiche le '0'
userControl_CellSign.Label_Zero.Visibility = Visibility.Visible;
}

// on affiche le '0'
userControl_CellSign.Label_Zero.Visibility = Visibility.Visible;

}

// Enfin, place le signe de l'expression entre la colonne d'avant et la colonne actuelle
Expand Down

0 comments on commit 0fbd6e4

Please sign in to comment.